30

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

在这个插件的某些部分,我需要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' );
}

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

有人对这个有了解吗?

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

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

4

4 回答 4

53

2018年的方式:

建立在Guido WP答案上,您可以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' );
}

代码位于您的活动子主题(或活动主题)的 function.php 文件中。

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


一些解释:

操作挂钩只是保存订单数据之前的woocommerce_checkout_create_order一步。请参阅下面的方法摘录WC_Checkout create_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 = wc_get_order( $order_id );你已经得到$order的作为钩子函数中的参数。
  • 您不需要使用$order->save();,因为无论如何这将在之后完成(请参阅源代码)
  • 这个钩子自 WooCommerce 版本 3 以来已经发布,它的目的是相同的,允许使用所有可用的WC_Order方法。

所以这只适用于函数内的一行代码

于 2018-01-29T13:53:55.853 回答
30

基于 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 论坛上的此主题:

于 2017-05-22T11:35:35.397 回答
5

答案是:我应该使用woocommerce_checkout_update_order_metaadd_action 并且我应该简单地使用update_post_meta()为我的订单添加额外的元数据

    function add_item_meta( $order_id ) {
            //global $woocommerce;
            update_post_meta( $order_id, '_has_event', 'yes' );
        } 
于 2014-09-03T06:56:33.247 回答
3

2016年的方式:

add_action('woocommerce_checkout_update_order_meta',function( $order_id, $posted ) {  
    update_post_meta( $order_id, 'my_custom_meta_key', 'my data' );  
} , 10, 2);
  • $order_id是订单的id,存储为自定义post类型
  • $posted是来自的所有数据$_POST
于 2016-06-11T17:30:58.280 回答