为Woocommerce中的订单添加额外的元

2022-08-30 13:48:46

我正在为我的网站创建自定义插件。

在这个插件的某些部分,我需要为每个订单存储额外的meta。wp_postmeta

我在插件的类中添加了这个:

add_action ('woocommerce_before_checkout_process', array( &$this, 'add_item_meta', 10, 2) );

这是函数:add_item_meta()

function add_item_meta( $item_id, $values ) {
  wc_add_order_item_meta($item_id, '_has_event', 'yes' );
}

此功能不完整,但此代码没有任何反应;我想我需要使用另一个钩子,但我找不到合适的钩子。

有人知道吗?

我还有另一个问题:这是woocommerce全局变量,但我在我的插件中看不到它!$item_id

我的意思是我无法从我的插件或类似的东西访问此变量!


答案 1

2018年的方式:

基于Guido W.P.答案构建,您可以在更轻巧有效的版本代码中woocommerce_checkout_create_order操作钩子(使用WC 3 + CRUD方法):

add_action('woocommerce_checkout_create_order', 'before_checkout_create_order', 20, 2);
function before_checkout_create_order( $order, $data ) {
    $order->update_meta_data( '_custom_meta_key', 'value' );
}

代码进入函数.php活动子主题(或活动主题)的文件。

在WooCommerce 3 +中进行测试和工作(仅限)。


一些解释:

woocommerce_checkout_create_order操作挂钩只是保存订单数据之前的一个步骤。请参阅下面的方法摘录(带有两个钩子):WC_Checkoutcreate_order()

/**
 * Action hook to adjust order before save.
 * @since 3.0.0
 */
do_action( 'woocommerce_checkout_create_order', $order, $data );

// Save the order.
$order_id = $order->save();

do_action( 'woocommerce_checkout_update_order_meta', $order_id, $data );

return $order_id;

为什么使用woocommerce_checkout_create_order

  • 因为你不需要使用,因为你已经得到了$order作为钩子函数中的参数。$order = wc_get_order( $order_id );
  • 您不需要使用,因为无论如何,这将在之后完成(请参阅源代码)$order->save();
  • 这个钩子自WooCommerce版本3以来已经发布,它是为相同的目的而制作的,允许使用所有可用的方法。WC_Order

因此,这只适用于函数中的一行代码


答案 2

基于Mo Saeedi的答案,我相信这个片段更符合WooCommerce 3.0引入的新CRUD方法

add_action('woocommerce_checkout_update_order_meta',function( $order_id, $posted ) {
    $order = wc_get_order( $order_id );
    $order->update_meta_data( 'my_custom_meta_key', 'my data' );
    $order->save();
} , 10, 2);

另请参阅WordPress论坛上的此主题:


推荐