2014-09-02 142 views
9

我正在为我的网站创建自定义插件。为Woocommerce订单添加额外元

在这个插件的某些部分,我需要为每个订单在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

的回答是: 我应该使用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

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数据
+1

该代码放置在系统中的位置是什么?在什么文件中?此方法是否会将自定义数据展示给Order API调用,如https://shop.example.com/wc-api/v3/orders/1248 – 2016-07-09 21:00:46

+0

您可以将此代码直接放入主题的'functions.php'文件中。 WooCommerce将在订单创建并保存到数据库后运行该功能。 – gregdev 2017-05-15 23:24:26

12

大厦莫赛义德的回答,我相信这个片段是更符合由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的论坛:

+0

关于如何向订单元添加自定义元字段(即分配给订购该项目的客户/用户)的想法? – Garconis 2017-08-17 18:31:20

5

2018路:

建立在圭多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_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 = wc_get_order($order_id);因为你已经得到$order作为挂钩函数的参数。
  • 你并不需要使用$order->save();,因为这会反正后进行(见源代码)
  • 此外woocommerce_checkout_create_order已经在WooCommerce 3版本已经发布,它针对的女佣了。

因此,这只是工作与一行代码里面的函数。

+0

这非常聪明@LoicTheAztec! 我只有一个疑问:使用'woocommerce_checkout_update_order_meta'作为未来证明吗? WooCommerce开发人员为了更新订单元的特定目的而将'woocommerce_checkout_update_order_meta'放置在那里。 我可能是错的,但为了这个特定的目的使用另一个过滤器让我有点不舒服。 – 2018-02-01 17:58:53

+0

@GuidoWalterPettinari你可以在相同的hooked函数中使用,代码用于不同的目的,或者将两个不同的函数挂钩在同一个钩子中,具有不同的优先级......这不是什么大不了的:) ...所以这两个代码都可以工作......唯一的区别是**我的只是比你轻** **,因为我不记得WC_Order对象的一个​​实例,我不需要使用save()方法... – LoicTheAztec 2018-02-01 18:13:26

+0

Hi Loic!我的解决方案确实比我的解决方案更快,但我不会说这是唯一的区别。 根据过滤器名称,WooCommerce团队可能希望我们使用过滤器“woocommerce_checkout_update_order_meta”更新订单元。 我的观点是,忽视这种提示可能会在执行时间内获得几毫秒的时间,尤其是因为WooCommerce更新过于频繁,并不总是尊重向后兼容性。 我有点偏执,我知道 – 2018-02-02 17:44:15

相关问题