Получение данных заказа в ловушке нового заказа

Я пытаюсь отправлять себе электронное письмо после каждого размещенного заказа. У меня проблема в том, что $order->get_total(), а также get_total_tax возвращают 0 вместо фактической общей стоимости заказа.

add_action( 'woocommerce_new_order', 'custom_after_order_created_hook', 12 , 1);
function custom_after_order_created_hook($order_id) {
    $order = new WC_Order($order_id);

    $with_tax = $order->get_total();
    $tax = $order->get_total_tax();
    $without_tax = $with_tax - $tax;

    $to = "[email protected]";
    $subject = "New order";
    $content = "
    New order {$order->id}
    With tax: {$with_tax}
    Without tax: {$without_tax}
    Tax: {$tax}
    ";

    $status = wp_mail($to, $subject, $content);
}

Каждое значение, кроме $ order_id и $order->id, оценивается как 0. $ order_id имеет правильное значение. Эта проблема возникает только при использовании хука woocommerce_new_order (я также пробовал использовать его на настраиваемой странице - работает правильно), что заставляет меня задуматься.

Я не уверен, в чем проблема, какая-то часть моего кода асинхронна?
Или, может быть, этот хук вызывается перед обновлением заказа с указанием уплаченной цены / налоговой информации?
Что мне делать, чтобы получить здесь информацию о ценах?

Спасибо.


person mmln    schedule 14.04.2017    source источник
comment
какая версия WC?   -  person    schedule 14.04.2017


Ответы (1)


Этот хук действия woocommerce_new_order используется для изменения функции create_order (). Поэтому вам лучше использовать ловушку действия woocommerce_thankyou, которая будет запускать ваше настраиваемое уведомление по электронной почте при создании заказа:

// Tested on WooCommerce versions 2.6+ and 3.0+
add_action( 'woocommerce_thankyou', 'new_order_custom_email_notification', 1, 1 );
function new_order_custom_email_notification( $order_id ) {
    if ( ! $order_id ) return;

    // Getting an instance of WC_Order object
    $order = wc_get_order( $order_id );

    $with_tax = $order->get_total();
    $tax = $order->get_total_tax();
    $without_tax = $with_tax - $tax;
            
    $to = "[email protected]";
    $subject = "New order";
    $content = "
    New order {$order_id}
    With tax: {$with_tax}
    Without tax: {$without_tax}
    Tax: {$tax}
    ";
    
    wp_mail($to, $subject, $content);
}

Код находится в файле function.php вашей активной дочерней темы (или темы) или также в любом файле плагина.

Код проверен и работает.

Использование ловушки действия woocommerce_checkout_order_processed вместо ловушки действия woocommerce_thankyou также является хорошей альтернативой, может быть, даже лучше. Вам просто нужно заменить:

add_action( 'woocommerce_thankyou', 'new_order_custom_email_notification', 1, 1 );

By:

add_action( 'woocommerce_checkout_order_processed', 'new_order_custom_email_notification', 1, 1 );

Аналогичный рабочий ответ: Woocommerce - Как сделать отправлять индивидуальные электронные письма в зависимости от типа оплаты


Перехватчик woocommerce_checkout_order_processed (находится в методе WC_Checkout process_checkout() это тоже может быть удобно для этой цели.

Исходный код WC_Checkout process_checkout() интересен, чтобы получить представление о потоке покупок.

person LoicTheAztec    schedule 14.04.2017
comment
спасибо, вот что я подозревал. Вы случайно не знаете, документирован ли где-то весь процесс покупки? Официальные документы пока не очень полезны. - person mmln; 14.04.2017
comment
@mymlyn Я обновил ответ на вопрос о потоке покупок в WooCommerce (в конце). Я надеюсь, что это вам поможет; Таким образом, вы можете использовать woocommerce_checkout_order_processed - person LoicTheAztec; 15.04.2017