使用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) {
}
为什么即使在新订单出现后有产品,也无法获取产品详细信息?
答案 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
来修复了它。由于它在下订单后立即运行,因此它既适用于即时付款又适用于货到付款。请注意,此操作将在付款完成之前运行。因此,它与付款没有任何关系。
用户单击继续进行结帐按钮,然后此钩子触发。