注文アイテムにカスタムメタを追加する必要があります。グーグルで検索したところ、ほとんどの記事で「woocommerce_add_order_item_meta」フックを使用すると書かれています。このフックは、最新バージョン2.3.7で非推奨になりました。誰か、代わりにどのフックを使うべきか教えてください。
http://docs.woothemes.com/wc-apidocs/function-woocommerce_add_order_item_meta.html
_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 );
}
_
基本的に、functionは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 );
_
2017/2018 THE RIGHT WAY(新しいCRUDセッターとゲッターメソッドの使用)
関連: Woocommerce 3.4のwoocommerce_add_order_item_metaフックを置き換えます
大幅な変更を加えて多くの点を改善したwoocommerce3以降、アクションフック_woocommerce_add_order_item_meta
_は、woocommerceバージョン3.3以降でも完全に機能します。
このフックは、チェックアウトプロセスの_WC_Checkout
_クラスメソッドと関連関数によって有効になり、カートデータが利用できなくなった_WC_Order
_クラスでは有効になりません。
Woocommmerce3が新しいCRUDセッターとゲッターメソッドを導入しましたので、使用される同様の置換フックは_
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_add_order_item_meta()を、_WC_Data
_引数で使用される新しい_$item
_ update_meta_data()
メソッドに置き換えます。
例:
_## --- 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
_は、WooCommerce3 +およびその新しいCRUDセッターとゲッターメソッドで使用される適切な置換フックです。
バージョン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_add_order_item_meta」を「woocommerce_new_order_item」に置き換えましたが、非推奨の通知が消えます。問題は、一部のパラメーターがlegacy_values
配列内に表示されるようになったことです。プラグインYITHWooCommerce Product Add Onsを使用していますが、注文に添付する必要のある製品メタデータはプラグインによって取得されないため、注文とともに保存されません。したがって、これがプラグインで修正されるまでは、非推奨の通知を受け入れる必要があります。
私はこれが答えられたことを知っています、そしてすでに受け入れられた返事があります。非推奨のメッセージを実際に受け取らずにこれを処理する別の方法を提供したかっただけです( 参照 を参照)。
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'])
);
}
IlgıtYı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);
function 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
}
}
特定の使用例はあまり明確ではありませんが(このメタ情報をいつどこに追加する必要があるかを指定していません)、チェックアウト時にwoocommerce_checkout_update_order_meta
を使用できます。
詳細については、 チェックアウトフィールドのカスタマイズ をご覧ください。
いいえ、フックも非推奨のようです:PHPエラー: "woocommerce_add_order_item_meta"フックは古いデータ構造を使用しており、関数はバージョン3.1.2以降非推奨になっています。woocommerce_new_order_itemに置き換えてください。
ここにも見つかりません: https://docs.woocommerce.com/wc-apidocs/hook-docs.html
明確にするために、この関数は非推奨になりましたが、 フック はまだ問題ありません