无法从新订单挂钩功能的order_id获取产品详细信息

时间:2017-01-12 04:41:23

标签: php wordpress woocommerce orders hook-woocommerce

使用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) 它可以工作,即使我尝试了echo $order_id 循环之前> foreach ,它给了我 order_id ,然后它为什么不进入 foreach 循环?

注意:当我在 var_dump($items); 循环之前尝试 foreach 时,它会给我

array(0) {
} 

为什么即使在新订单出现后有产品,也无法获取产品详细信息?

3 个答案:

答案 0 :(得分:5)

  

更新2 - 工作解决方案 (使用电子邮件通知挂钩)

问题是当使用电子邮件通知挂钩可以触发 2次的操作时,例如当新订单是佣人时(商店经理的通知和客户的通知)。

您希望对处于“处理”状态的订单使用此“新订单”事件。

  

为了避免您使用新订单通知WooCommerce事件触发2次操作,我们使用 '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解释了许多事情......

(不适用于OP)

答案 1 :(得分:0)

在wordpress中添加帖子时,您可以使用save_post操作。更多访问: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');

答案 2 :(得分:0)

面对同样的问题。我通过将钩子更改为woocommerce_checkout_order_processed来修复了它。由于它在下订单后立即运行,因此它既适用于即时付款又适用于货到付款。请注意,此操作将在付款完成之前运行。因此,它与付款没有任何关系。

用户单击继续进行结帐按钮,然后此钩子触发。