2017/2018 THE RIGHT WAY (使用新的 CRUD setter 和 Getters 方法)
相关:Replace woocommerce_add_order_item_meta hook in Woocommerce 3.4
自从 woocommerce 3 改进了很多东西并做出了巨大的改变,动作挂钩 woocommerce_add_order_item_meta 即使在 woocommerce 3.3+ 版本中仍然可以完美运行。
此挂钩由 结帐过程中的WC_Checkout 类方法和相关函数启用,而不是在购物车数据不再可用的WC_Order 类中启用。
现在 Woocommmerce 3 引入了新的 CRUD setter 和 getter 方法,要使用的类似替换挂钩是 woocommerce_checkout_create_order_line_item,它具有与购物车数据类似的有用参数。
woocommerce_new_order_item 确实不方便,因为 无法访问购物车数据。
让我们看看如何使用 woocommerce_checkout_create_order_line_item。它有 4 个可用参数:
-
$item 是WC_Order_Item_Product 新引入类的实例
-
$cart_item_key 是购物车项的唯一哈希键
-
$values 是购物车项目
-
$order WC_Order 对象的实例(在某些特定情况下这是一个非常有用的附加参数)
在这个钩子中,我们将用新的 WC_Data 方法替换旧的工作函数 wc_add_order_item_meta() update_meta_data() 与 $item 参数一起使用。
例子:
## --- New way --- ##
add_action( 'woocommerce_checkout_create_order_line_item', 'custom_checkout_create_order_line_item', 20, 4 );
function custom_checkout_create_order_line_item( $item, $cart_item_key, $values, $order ) {
// Get a product custom field value
$custom_field_value = get_post_meta( $item->get_product_id(), '_meta_key', true );
// Update order item meta
if ( ! empty( $custom_field_value ) ){
$item->update_meta_data( 'meta_key1', $custom_field_value );
}
// … … Or … …
// Get cart item custom data and update order item meta
if( isset( $values['custom_data'] ) ) {
$item->update_meta_data( 'meta_key2', $values['custom_data'] );
}
}
最后,我们可以使用 woocommerce_add_order_item_meta 钩子对旧方法做同样的事情,因为它具有几乎相同的有用参数:
## --- Old way --- ##
add_action( 'woocommerce_add_order_item_meta', 'custom_add_order_item_meta', 20, 3 );
function custom_add_order_item_meta( $item_id, $values, $cart_item_key ) {
// Get a product custom field value
$custom_field_value = get_post_meta( $values['data']->get_id(), '_meta_key', true );
// Update order item meta
if ( ! empty( $custom_field_value ) ){
wc_add_order_item_meta( $item_id, 'meta_key1', $custom_field_value );
}
// … … Or … …
// Get cart item custom data and update order item meta
if( isset( $values['custom_data'] ) ) {
wc_add_order_item_meta( $item_id, 'meta_key2', $values['custom_data'] );
}
}
结论:woocommerce_checkout_create_order_line_item 是与 WooCommerce 3+ 以及新的 CRUD setter 和 getter 方法一起使用的正确替代钩子。