Мне нужно определить, когда новый заказ WooCommerce успешно создан и настроен на «обработку» - это нужно для добавления дополнительных функций и т. д. Это нормально сделать на веб-интерфейсе, поскольку довольно легко подключиться, когда заказ создается с помощью любого хуков WooCommerce woocommerce_thankyou или woocommerce_order_status_processing.
У меня проблема в том, что Я также хочу, чтобы это работало при создании нового заказа вручную через бэкэнд веб-сайта.. Я использую некоторые настраиваемые поля при добавлении заказа вручную, которые используются для управления заказом при его создании. К сожалению, хотя woocommerce_order_status_processing действительно работает для административных приказов, он, кажется, срабатывает до того, как метаданные заказа будут сохранены, поэтому, когда я пытаюсь получить какие-либо метаданные, они пусты.
Чтобы обойти это, я попробовал предложения в Хук WooCommerce для создания заказа от администратора или в этом потоке GitHub, который должен использовать хуки WordPress wp_insert_post или save_post_shop_order (save_post_{$post->post_type}). Это работает для решения моей проблемы с мета-порядком, поскольку, похоже, она срабатывает после сохранения мета-заказа.
Однако - он запускает каждый раз, есть обновление или новое сообщение, поэтому мне нужно найти способ определить, новое это сообщение или нет. На этих хуках есть параметр $update, который предназначен для отображения "Независимо от того, обновляется ли это существующее сообщение или нет", но по какой-то причине он всегда кажется установленным в значение true, даже если это новый пост / заказ.
Единственный потенциально возможный способ сделать это, который я могу придумать, - это в соответствии с это предложение проверки даты публикации и даты изменения, но я просто подумал, что должен быть лучший способ сделать это!
function my_order_created ( $post_id, $post, $update ) {
// Don’t run if $post_id doesn’t exist OR post type is not order OR update is true
if ( ! $post_id || get_post_type( $post_id ) != 'shop_order' || $update == 1 ) {
return;
}
$order = wc_get_order( $post_id );
if ( $order && $order->has_status( 'processing' ) ){
// Do something
}
}
add_action( 'wp_insert_post', 'my_order_created', 10, 3 );
@ user3080408 - Честно говоря, я просто попробовал, и он работает так, как я задумал, так что спасибо! Посмотрим, добавит ли кто-нибудь еще ответ, поскольку я думал, что у WordPress есть более элегантный способ сделать это, но хорошая работа!
@Stuart Dis, вы вместо этого пробовали ловушку woocommerce_new_order?






Начиная с Woocommerce 3, в котором реализован CRUD методы и хранилища данных, существует некоторый специальные хуки, который вы можете использовать конкретно для создание заказа:
В методе Abstract_WC_Order_Data_Store_CPTcreate()woocommerce_new_order_dataкрючок для фильтра позволяет фильтровать данные внутри функции wp_insert_post() перед их сохранением при создании.
В методе WC_Order_Data_Store_CPTcreate()woocommerce_new_orderкрючок действия позволяет запускать некоторый код при создании заказа.
Это много лучший вариант, поскольку это просто Создание заказа Woocommerce.
Вы можете использовать хук woocommerce_new_order:
add_action('woocommerce_new_order', function ($order_id) {
// your code
}, 10, 1);
Я уже решил это раньше, проверив «auto_draft» => 1 в массиве $ _POST. Похоже, было бы более элегантное решение, но в моем случае это сработало. Я не отправляю ответ в надежде, что кто-то с лучшим решением сделает это.