woocommerce_process_shop_order_meta не срабатывает при массовом редактировании заказов? - PullRequest
0 голосов
/ 03 февраля 2020

Я сделал простую функцию, которая будет запускаться, когда администратор редактирует заказ Woocommerce:

add_action( 'woocommerce_process_shop_order_meta', 'myfunction' );

myfunction отлично работает, когда я редактирую один заказ. Он проверяет, содержит ли заказ указанный c продукт, и если продукт найден в заказе, некоторые данные добавляются в MailChimp.

Когда я массово редактирую свои заказы, в частности, меняю статус заказа на «Завершено», крюк, кажется, не работает. Заказы изменяются на статус «завершен», но данные не отправляются в MailChimp.

Здесь на всякий случай myfunction, но я подозреваю, что это проблема с woocommerce_process_shop_order_meta, не работающим в режиме массового редактирования.

function myfunction( $order_id ){
    $order = wc_get_order( $order_id );
    $items = $order->get_items(); 
    foreach ( $items as $item_id => $item ) {
        $product_id = $item->get_variation_id() ? $item->get_variation_id() : $item->get_product_id();
        if ( $product_id === 4472 ) {
            $email = $order->get_billing_email();
            $first_name = $order->get_billing_first_name();
            $last_name = $order->get_billing_last_name();
            sample_order_mailchimp($email, $first_name, $last_name);
            break;
        }
    }
}

Я что-то упускаю здесь очевидное?

1 Ответ

0 голосов
/ 08 февраля 2020

Таким образом, способ работы ловушек таков: woocommerce_process_shop_order_meta не срабатывает при массовом редактировании заказов.

Вместо массового редактирования заказов Woocommerce вы можете использовать хук, называемый handle_bulk_actions-edit-shop_order.

Я думаю, что Woocommerce действительно должна гораздо лучше документировать все это. Я просто должен был понять это методом проб и ошибок. Вот окончательное решение:

add_filter( 'handle_bulk_actions-edit-shop_order', 'myfunction', 10, 3 ); // the last two parameters are critically important. They specify: 10 for priority, 3 for how many arguments you pass to your function! Without this, you can't process the order ids
function myfunction( $redirect_to, $action, $order_ids ) {
    if ( $action === 'mark_completed' ) {
       // Do your magics here. This is only fired if the bulk edit action was to mark the orders completed. You can change that as you need.
    }
}
...