php 为Woocommerce中的订单添加额外的 meta

5fjcxozz  于 2022-11-28  发布在  PHP
关注(0)|答案(4)|浏览(163)

我正在为我的网站创建一个自定义插件。
在这个插件的某些部分,我需要为每个订单在wp_postmeta中存储额外的 meta。
我在我的插件的类中添加了这个:

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全局变量,但我在插件中看不到它!
我的意思是我没有访问这个变量从我的插件或类似的东西!

hsgswve4

hsgswve41#

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_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版本3,它的目的是相同的,允许使用所有可用的WC_Order方法。

这只需要在函数中的一行代码就可以了。

hrirmatl

hrirmatl2#

基于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论坛上也可以看到这个主题:

k3fezbri

k3fezbri3#

答案是:我应该使用woocommerce_checkout_update_order_meta来执行add_action,而且我还应该简单地使用update_post_meta()来向我的订单添加额外的 meta

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

mspsb9vt4#

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中的所有数据

相关问题