我正在为我的网站创建一个自定义插件。
在这个插件的某些部分,我需要在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全局变量但我在插件中看不到它!
我的意思是我无法从我的插件或类似的东西访问此变量!
答案 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