Woocommerce:要替换已弃用的挂钩 "woocommerce_add_order_item_meta"
Woocommerce: Which hook to replace deprecated "woocommerce_add_order_item_meta"
需要为订单项添加自定义元数据。用谷歌搜索,大多数文章都说使用 "woocommerce_add_order_item_meta" 钩子。这个钩子在最新版本 2.3.7 中被弃用。有人,请告诉我应该使用哪个钩子。
http://docs.woothemes.com/wc-apidocs/function-woocommerce_add_order_item_meta.html
您的具体用例不是很清楚(您没有指定何时何地需要添加此元信息),但您可以在结帐时使用 woocommerce_checkout_update_order_meta
。
在 customizing checkout fields 阅读更多内容。
如果你看 wc-deprecated-functions.php
你会看到
/**
* @deprecated
*/
function woocommerce_add_order_item_meta( $item_id, $meta_key, $meta_value, $unique = false ) {
return wc_add_order_item_meta( $item_id, $meta_key, $meta_value, $unique );
}
基本上,函数 已重命名为 wc_add_order_item_meta()
,因此如果您需要该函数,请使用它。 动作挂钩 未重命名并保留在 class-wc-checkout.php
中为:
// Allow plugins to add order item meta
do_action( 'woocommerce_add_order_item_meta', $item_id, $values, $cart_item_key );
为了清楚起见,这个功能已被弃用,但 the hook 仍然可以
从 3.0.4 版开始,该钩子似乎也已弃用。
我收到此通知:
The The "woocommerce_add_order_item_meta" hook uses out of date data structures and function is deprecated since version 3.0.4. Replace with woocommerce_new_order_item.
我在一个有问题的插件的 add_action 语句中用 'woocommerce_new_order_item' 替换了操作名称 'woocommerce_add_order_item_meta',弃用通知消失了,问题是一些参数现在出现在里面一个 legacy_values
数组。我使用 YITH WooCommerce Product Add Ons 插件,应该附加到订单的产品元数据没有被插件获取,因此没有与订单一起存储。因此,在插件中修复此问题之前,您必须忍受弃用通知。
我知道这个问题已经得到解答,并且已经有一个被接受的答复。我只是想提供另一种方法来处理这个问题,而不会实际收到已弃用的消息(请参阅 reference);
add_action('woocommerce_new_order_item', 'saveMetaData', 10, 3); // or use just 2 instead of 3; if you don't need order id
/**
* Add meta to order item
*
* @param int $itemId
* @param WC_Order_Item_Product|WC_Order_Item_Shipping $item
* @param int @orderId
*/
function saveMetaData($itemId, $item, $orderId)
{
if (!isItemValid($item))
{
return;
}
wc_add_order_item_meta($itemId, 'my_custom_data', $item->legacy_values['my_custom_data']);
}
/**
* @param WC_Order_Item_Product|WC_Order_Item_Shipping $item
*
* @return bool
*/
function isItemValid($item)
{
return (
$item instanceof WC_Order_Item_Product &&
isset($item->legacy_values) &&
isset($item->legacy_values['my_custom_data']) &&
!empty($item->legacy_values['my_custom_data'])
);
}
不,这个钩子似乎也被弃用了:
PHP 错误:
"woocommerce_add_order_item_meta" 钩子使用过时的数据结构,并且函数自版本 3.1.2 起已弃用。替换为 woocommerce_new_order_item.
我这里也找不到:
https://docs.woocommerce.com/wc-apidocs/hook-docs.html
我想补充 Ilgıt Yıldırım 的回答:在我的例子中,我的自定义值不存在于 item->legacy_values 数组中。为了解决这个问题,我在调用 woocommerce_new_order_item 挂钩之前使用 woocommerce_checkout_create_order_line_item 挂钩将自定义值添加到项目。这是一个例子:
add_action('woocommerce_checkout_create_order_line_item','save_values_in_item',PHP_INT_MAX,4);
函数save_values_in_item($item, $cart_item_key, $values, $order ) {
$item->myCustomValues = $values;
}
//然后调用新的钩子:
add_action( 'woocommerce_new_order_item', 'add_product_input_fields_to_order_item_meta_wc3', PHP_INT_MAX, 3 );
函数add_product_input_fields_to_order_item_meta_wc3($item_id,$item,$order_id){
if ( isset( $item->myCustomValues ) )
{
//iterate through array and place desired values into the meta data using the wc_add_order_item_meta function
}
}
2017/2018 正确的方法 (使用新的 CRUD setter 和 Getters 方法)
Related:
自从 woocommerce 3 改进了许多东西并进行了重大更改后,动作挂钩 woocommerce_add_order_item_meta
即使在 woocommerce 3.3+ 版本中仍然可以完美运行。
此挂钩由 WC_Checkout
class 方法和 结帐过程中的相关函数启用 而不是 WC_Order
Class 购物车数据不再可用。
Now as Woocommmerce 3 has introduced new CRUD setters and getters methods, the similar replacement hook to be used is woocommerce_checkout_create_order_line_item
that has similar useful arguments as cart data.
The woocommerce_new_order_item
is really NOT convenient as cart data is not accessible.
让我们看看如何使用 woocommerce_checkout_create_order_line_item
。它有 4 个可用参数:
$item
是 WC_Order_Item_Product
新引入的实例 Class
$cart_item_key
是购物车商品的唯一哈希键
$values
是购物车商品
$order
WC_Order 对象的实例 (在某些特定情况下这是一个非常有用的附加参数)
在这个钩子中,我们将使用新的 WC_Data
update_meta_data()
方法替换旧的工作函数 wc_add_order_item_meta() $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
hook 用旧方法做同样的事情,因为它有几乎相同的有用参数:
## --- 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'] );
}
}
Conclusion: woocommerce_checkout_create_order_line_item
is the right replacement hook to be used with WooCommerce 3+ and that new CRUD setters and getters methods.
需要为订单项添加自定义元数据。用谷歌搜索,大多数文章都说使用 "woocommerce_add_order_item_meta" 钩子。这个钩子在最新版本 2.3.7 中被弃用。有人,请告诉我应该使用哪个钩子。
http://docs.woothemes.com/wc-apidocs/function-woocommerce_add_order_item_meta.html
您的具体用例不是很清楚(您没有指定何时何地需要添加此元信息),但您可以在结帐时使用 woocommerce_checkout_update_order_meta
。
在 customizing checkout fields 阅读更多内容。
如果你看 wc-deprecated-functions.php
你会看到
/**
* @deprecated
*/
function woocommerce_add_order_item_meta( $item_id, $meta_key, $meta_value, $unique = false ) {
return wc_add_order_item_meta( $item_id, $meta_key, $meta_value, $unique );
}
基本上,函数 已重命名为 wc_add_order_item_meta()
,因此如果您需要该函数,请使用它。 动作挂钩 未重命名并保留在 class-wc-checkout.php
中为:
// Allow plugins to add order item meta
do_action( 'woocommerce_add_order_item_meta', $item_id, $values, $cart_item_key );
为了清楚起见,这个功能已被弃用,但 the hook 仍然可以
从 3.0.4 版开始,该钩子似乎也已弃用。 我收到此通知:
The The "woocommerce_add_order_item_meta" hook uses out of date data structures and function is deprecated since version 3.0.4. Replace with woocommerce_new_order_item.
我在一个有问题的插件的 add_action 语句中用 'woocommerce_new_order_item' 替换了操作名称 'woocommerce_add_order_item_meta',弃用通知消失了,问题是一些参数现在出现在里面一个 legacy_values
数组。我使用 YITH WooCommerce Product Add Ons 插件,应该附加到订单的产品元数据没有被插件获取,因此没有与订单一起存储。因此,在插件中修复此问题之前,您必须忍受弃用通知。
我知道这个问题已经得到解答,并且已经有一个被接受的答复。我只是想提供另一种方法来处理这个问题,而不会实际收到已弃用的消息(请参阅 reference);
add_action('woocommerce_new_order_item', 'saveMetaData', 10, 3); // or use just 2 instead of 3; if you don't need order id
/**
* Add meta to order item
*
* @param int $itemId
* @param WC_Order_Item_Product|WC_Order_Item_Shipping $item
* @param int @orderId
*/
function saveMetaData($itemId, $item, $orderId)
{
if (!isItemValid($item))
{
return;
}
wc_add_order_item_meta($itemId, 'my_custom_data', $item->legacy_values['my_custom_data']);
}
/**
* @param WC_Order_Item_Product|WC_Order_Item_Shipping $item
*
* @return bool
*/
function isItemValid($item)
{
return (
$item instanceof WC_Order_Item_Product &&
isset($item->legacy_values) &&
isset($item->legacy_values['my_custom_data']) &&
!empty($item->legacy_values['my_custom_data'])
);
}
不,这个钩子似乎也被弃用了: PHP 错误: "woocommerce_add_order_item_meta" 钩子使用过时的数据结构,并且函数自版本 3.1.2 起已弃用。替换为 woocommerce_new_order_item.
我这里也找不到: https://docs.woocommerce.com/wc-apidocs/hook-docs.html
我想补充 Ilgıt Yıldırım 的回答:在我的例子中,我的自定义值不存在于 item->legacy_values 数组中。为了解决这个问题,我在调用 woocommerce_new_order_item 挂钩之前使用 woocommerce_checkout_create_order_line_item 挂钩将自定义值添加到项目。这是一个例子:
add_action('woocommerce_checkout_create_order_line_item','save_values_in_item',PHP_INT_MAX,4);
函数save_values_in_item($item, $cart_item_key, $values, $order ) {
$item->myCustomValues = $values;
}
//然后调用新的钩子: add_action( 'woocommerce_new_order_item', 'add_product_input_fields_to_order_item_meta_wc3', PHP_INT_MAX, 3 );
函数add_product_input_fields_to_order_item_meta_wc3($item_id,$item,$order_id){
if ( isset( $item->myCustomValues ) )
{
//iterate through array and place desired values into the meta data using the wc_add_order_item_meta function
}
}
2017/2018 正确的方法 (使用新的 CRUD setter 和 Getters 方法)
Related:
自从 woocommerce 3 改进了许多东西并进行了重大更改后,动作挂钩 woocommerce_add_order_item_meta
即使在 woocommerce 3.3+ 版本中仍然可以完美运行。
此挂钩由 WC_Checkout
class 方法和 结帐过程中的相关函数启用 而不是 WC_Order
Class 购物车数据不再可用。
Now as Woocommmerce 3 has introduced new CRUD setters and getters methods, the similar replacement hook to be used is
woocommerce_checkout_create_order_line_item
that has similar useful arguments as cart data.The
woocommerce_new_order_item
is really NOT convenient as cart data is not accessible.
让我们看看如何使用 woocommerce_checkout_create_order_line_item
。它有 4 个可用参数:
$item
是WC_Order_Item_Product
新引入的实例 Class$cart_item_key
是购物车商品的唯一哈希键$values
是购物车商品$order
WC_Order 对象的实例 (在某些特定情况下这是一个非常有用的附加参数)
在这个钩子中,我们将使用新的 WC_Data
update_meta_data()
方法替换旧的工作函数 wc_add_order_item_meta() $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
hook 用旧方法做同样的事情,因为它有几乎相同的有用参数:
## --- 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'] );
}
}
Conclusion:
woocommerce_checkout_create_order_line_item
is the right replacement hook to be used with WooCommerce 3+ and that new CRUD setters and getters methods.