2017-01-12 1 views
3

С WooCommerce, у меня есть следующий крюк в моей function.php после того, как новый порядок представляется:Не удается получить сведения о продукте из order_id на новой функции заказа крюка

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

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

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

array(0) { 
} 

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

+0

Вы проверили, что $ order_id действительно подходит? – Gulshan

+0

сделать одно дело глобальная woocommerce в функции – Gulshan

+0

@sam проверить это http://stackoverflow.com/questions/39401393/how-to-get-woocommerce-order-details – Gulshan

ответ

4

Update 2 - Рабочий раствор(используя крючок уведомление по электронной почте)

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

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

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

Здесь нам не нужно, чтобы получить объект $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 
    } 
} 

Вы можете посмотреть на How to get WooCommerce order details где многое объясняется ...

(Нет t для OP)

0

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

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'); 
+0

Почему мне нужно save_post? я просто хочу, чтобы action hook выполнял что-то после размещения нового заказа. – sam

+0

заказ добавлен как сообщение в wordpress. @sam – vrajesh

+0

Но это не очень хорошая практика, чтобы сохранить каждый заказ как сообщение! – sam

Смежные вопросы