web-dev-qa-db-ja.com

Woocommerce:非推奨の「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

12
user3339988

_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 );
}
_

基本的に、functionwc_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 );
_
17
helgatheviking

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セッターとゲッターメソッドで使用される適切な置換フックです。

14
LoicTheAztec

バージョン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を使用していますが、注文に添付する必要のある製品メタデータはプラグインによって取得されないため、注文とともに保存されません。したがって、これがプラグインで修正されるまでは、非推奨の通知を受け入れる必要があります。

5

私はこれが答えられたことを知っています、そしてすでに受け入れられた返事があります。非推奨のメッセージを実際に受け取らずにこれを処理する別の方法を提供したかっただけです( 参照 を参照)。

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'])
    );
}
3

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
            }

}

1
sc8704

特定の使用例はあまり明確ではありませんが(このメタ情報をいつどこに追加する必要があるかを指定していません)、チェックアウト時にwoocommerce_checkout_update_order_metaを使用できます。

詳細については、 チェックアウトフィールドのカスタマイズ をご覧ください。

1
rnevius

いいえ、フックも非推奨のようです:PHPエラー: "woocommerce_add_order_item_meta"フックは古いデータ構造を使用しており、関数はバージョン3.1.2以降非推奨になっています。woocommerce_new_order_itemに置き換えてください。

ここにも見つかりません: https://docs.woocommerce.com/wc-apidocs/hook-docs.html

0
tperschon

明確にするために、この関数は非推奨になりましたが、 フック はまだ問題ありません

0