在Woocommerce中为订单添加额外的元数据

时间:2014-09-02 14:39:04

标签: php wordpress woocommerce metadata orders

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

在这个插件的某些部分,我需要在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 个答案:

答案 0 :(得分:22)

2018年的方式:

基于 Guido W.P。回答,您可以使用 woocommerce_checkout_create_order 操作挂钩 更轻松有效的版本代码(使用WC 3+ CRUD methods

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_checkout_create_order已经在WooCommerce版本3中发布了,也是它的佣人。
  •   
     

所以这只是在函数内部使用单行代码

答案 1 :(得分:17)

基于Mo Saeedi的回答,我相信这个片段更符合WooCommerce 3.0引入的new CRUD approach

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论坛上的这些主题:

答案 2 :(得分:4)

回答是: 我应该使用woocommerce_checkout_update_order_meta进行add_action,我也应该使用update_post_meta()为我的订单添加额外的元

    function add_item_meta( $order_id ) {
            //global $woocommerce;
            update_post_meta( $order_id, '_has_event', 'yes' );
        } 

答案 3 :(得分: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,存储为自定义帖子类型
  • $posted是来自$_POST
  • 的所有数据