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

sam*_*sam 3 php wordpress orders woocommerce 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码不给我任何输出i'e它不是里面进入foreach,这就是为什么循环var_dump()没有给我任何的输出,但如果我提到了order_id专门喜欢create_job_openings($order_id=517)它的作品,即使我尝试呼应$order_idforeach环,它给我的order_id,那么为什么它不进入foreach循环?

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

array(0) {
} 
Run Code Online (Sandbox Code Playgroud)

为什么即使在新订单生成后有产品,也无法获得产品详细信息?

Loi*_*tec 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是对这个问题的有效和可行的答案

相关工作答案:


更新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
    }
}
Run Code Online (Sandbox Code Playgroud)

(不适用于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
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以查看 如何获取WooCommerce订单详细信息,其中解释了很多内容......

(不适用于OP)