Хуки для создания заказов исключительно в Woocommerce 3

Мне нужно определить, когда новый заказ 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, даже если это новый пост / заказ.

Обобщить:

  • Мне нужен хук WordPress / WooCommerce, который запускается после создания метаданных заказа / публикации через бэкэнд и каким-то образом запускать его только тогда, когда заказ создается заново и не обновляется.

Единственный потенциально возможный способ сделать это, который я могу придумать, - это в соответствии с это предложение проверки даты публикации и даты изменения, но я просто подумал, что должен быть лучший способ сделать это!

Вот мой текущий код на всякий случай

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 );

Я уже решил это раньше, проверив «auto_draft» => 1 в массиве $ _POST. Похоже, было бы более элегантное решение, но в моем случае это сработало. Я не отправляю ответ в надежде, что кто-то с лучшим решением сделает это.

user3080408 30.08.2018 12:22

@ user3080408 - Честно говоря, я просто попробовал, и он работает так, как я задумал, так что спасибо! Посмотрим, добавит ли кто-нибудь еще ответ, поскольку я думал, что у WordPress есть более элегантный способ сделать это, но хорошая работа!

Stuart 30.08.2018 12:54

@Stuart Dis, вы вместо этого пробовали ловушку woocommerce_new_order?

LoicTheAztec 02.09.2018 19:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
3
5 650
2

Ответы 2

Начиная с 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);

Другие вопросы по теме