Не удается получить сведения о продукте из order_id в новой функции хука заказа

В WooCommerce у меня есть следующий хук в моем function.php после отправки нового заказа:

add_action( 'woocommerce_new_order', 'create_job_openings');
function create_job_openings($order_id) {

    $order = new WC_Order($order_id);
    $items = $order->get_items();

    foreach ($order->get_items() as $key => $item) {
        $product_name = $item['name'];
        var_dump($product_name);
    }
}

Приведенный выше код не дает мне никакого вывода, т.е. он не входит в цикл foreach, поэтому var_dump() не дает мне никакого вывода, но если я упомяну >order_id в частности, как create_job_openings($order_id=517), это работает, даже я попробовал выполнить эхо $order_id перед циклом foreach, это дает мне order_id, то почему он не входит в цикл foreach?

примечание: когда я пытаюсь var_dump($items); перед циклом foreach, это дает мне

array(0) {
} 

Почему он не может получить информацию о продукте, даже если в нем есть продукты после того, как сделан новый заказ?


person sam    schedule 12.01.2017    source источник
comment
вы проверили, что $order_id действительно придет ??   -  person PHP Ninja    schedule 12.01.2017
comment
сделайте одну вещь, вызовите глобальную woocommerce в функции   -  person PHP Ninja    schedule 12.01.2017
comment
@sam проверьте это stackoverflow.com/questions/ 39401393/   -  person PHP Ninja    schedule 12.01.2017
comment
@LoicTheAztec wc_get_order дает мне правильный вывод, отлично! но можно ли его использовать как $items = $order->get_items()?   -  person sam    schedule 12.01.2017


Ответы (3)


Обновление 2 – рабочее решение (используется ловушка уведомлений по электронной почте)

Проблема заключается в том, что использование хука уведомлений по электронной почте может запускать действие 2 раза, например, когда делается новый заказ (уведомление для менеджера магазина и уведомление для покупателя).

Вы хотите использовать это событие "Новый заказ" для заказов, находящихся в состоянии обработки.

Чтобы ваше действие не запускалось дважды с помощью события WooCommerce с уведомлением о новом заказе, мы используем 'customer_processing_order' вместо 'new_order' идентификатора электронной почты (уведомление событие).

Здесь нам не нужно получать объект $order, так как мы получили его в качестве аргумента в этой перехваченной функции.

Итак, вот ваш окончательный функциональный код:

add_action( 'woocommerce_email_before_order_table', 'custom_action_on_completed_customer_email_notification', 10, 4 );
function custom_action_on_completed_customer_email_notification( $order, $sent_to_admin, $plain_text, $email ) {

    if( 'customer_processing_order' == $email->id ){ // for processing order status customer notification…
        foreach ($order->get_items() as $item_id => $item_values) {
            $product_name = $item_values['name'];
            echo $product_name;
            break; // (optional) stop loop to first item
        }
    }
}

Это проверенный и рабочий ответ на этот вопрос

Связанные рабочие ответы:


Обновление 1 (альтернативный хук)

Попытка использовать хук woocommerce_thankyou, который срабатывает при просмотре заказа после его обработки:

add_action( 'woocommerce_thankyou', 'create_job_openings', 10, 1 );
function create_job_openings( $order_id ) {
    if ( ! $order_id )
        return;
    
    $order = wc_get_order( $order_id );
    
    foreach ($order->get_items() as $item_id => $item_values) {
        $product_name = $item_values['name'];
        var_dump($product_name);
        break; // (optional) stop loop to first item
    }
}

(Не работает для OP)


Вы должны попробовать это вместо функции wc_get_order() таким образом, и ваш код будет:

add_action( 'woocommerce_new_order', 'create_job_openings', 10, 1);
function create_job_openings($order_id) {

    $order = wc_get_order( $order_id );
    $order_items = $order->get_items();

    foreach ($order_items as $item_id => $item_values) {
        $product_name = $item_values['name'];
        var_dump($product_name);
        break; // (optional) stops on first item
    }
}

Вы можете посмотреть Как получить информацию о заказе WooCommerce где многое объясняется...

(Не работает для OP)

person LoicTheAztec    schedule 12.01.2017

вы можете использовать действие save_post, когда сообщение добавляется в wordpress. для получения дополнительной информации посетите: Ссылка

function wc_order_add_action($post_id, $post, $update)
{
    $post_type = get_post_type($post_id);

    // If this isn't a 'shop_order' post, don't update it.
    if ("shop_order" != $post_type) return;

    $order = wc_get_order($post_id);

    foreach($order -> get_items() as $key => $item)
    {
        $product_name = $item['name'];
        var_dump($product_name);
    }
}
add_action('save_post', 'wc_order_add_action');
person vrajesh    schedule 12.01.2017
comment
зачем мне save_post? я просто хочу, чтобы хук действия выполнял что-то после размещения нового заказа - person sam; 12.01.2017
comment
заказ добавляется как пост в wordpress. @Сэм - person vrajesh; 12.01.2017
comment
Заказ магазина плагина @sam woocommerce как тип сообщения shop_order в базе данных. :) - person vrajesh; 12.01.2017
comment
@sam Я обновил свой ответ, пожалуйста, проверьте сейчас. надеюсь, что это работает :) - person vrajesh; 12.01.2017
comment
Спасибо за ваш ответ, но я не хочу сохранять каждый заказ как пост! - person sam; 12.01.2017
comment
Привет, @sam, по умолчанию заказ магазина woocommerce как post_type. Я просто добавляю действие, которое выполняется после добавления сообщения. - person vrajesh; 12.01.2017

Столкнулся с той же проблемой. Я исправил это, изменив хук на woocommerce_checkout_order_processed. Он отлично работает как для мгновенной оплаты, так и для наложенного платежа, поскольку запускается сразу после размещения заказа. Обратите внимание, что это будет выполняться до завершения платежа. Таким образом, это не имеет никакого отношения к оплате.

Пользователь нажимает кнопку «Перейти к оформлению заказа», после чего срабатывает этот хук.

person Mehbub Rashid    schedule 01.11.2020