web-dev-qa-db-ja.com

WooCommerceでcart_item_dataを取得する方法は?

_add_to_cart_ 関数中に、「カートアイテムデータ」を追加するフィルターがあります。フィルターは_woocommerce_add_cart_item_data_です。これにカスタムプラグインデータを保存する予定でした。これにより、データはアイテムに関連して保存され、複数の製品に異なるデータを追加できます。

これはすべて機能しているように見えましたが、データを取得できません。わかりません。 データがあります、シリアル化された文字列で見ることができますが、引き出すことはできません。

_echo '<pre>';
var_dump( WC() );

foreach( WC()->cart->get_cart() as $cart_item ) {
  var_dump( $cart_item );
  var_dump( WC()->cart->get_item_data( $cart_item ) );
}
echo '</pre>';
_

WC()の最初のダンプには、プロパティsession->_data->cart->(serialized data)があります。ただし、_dataプロパティは保護されていますが、シリアル化されたデータ内にカスタムフィールドが表示されます。

$ cart_itemは_product_id_およびその他のデータを含む配列ですが、カスタムデータは含まれません:(

最後に、 get_item_data() メソッドを使用して、すべてがわかったと思った。カートアイテムオブジェクトを渡した...空の文字列。カートアイテム自体ではなく、キーを渡す場合も同じです。

カートアイテムデータにアクセスするにはどうすればよいですか?


以下に、「カートアイテムデータの追加」機能を示します。これは機能します(少なくとも機能しているようです)。

_function save_class_menu_selection( $cart_item_data, $product_id, $variation_id ) {
  if ( !product_is_class( $product_id ) ) return $cart_item_data;

  // Save the date, or give a fatal warning. Date is required.
  if ( !empty($_REQUEST['class-date']) ) {
    $cart_item_data['class-date'] = stripslashes($_REQUEST['class-date']);
    return $cart_item_data;
  }else{
    wp_die('<h2>Invalid Class Date Selected</h2><p>You tried to add a class to your cart, but the date selected was invalid. Please try again.</p>');
    exit;
  }
}
add_filter( 'woocommerce_add_cart_item_data', 'save_class_menu_selection', 10, 3 );
_
17
Radley Sustaire

私は今日同じ状況にあり、いくつかの研究の後、この質問につまずいた。いくつかのリバースエンジニアリングを行った後、問題を発見し、この質問につまずく可能性のある他のソリューションを提供したいと考えています。

問題は、カートのアイテムがセッションから復元されるときにデータがサニタイズされることです。そのため、追加のカートアイテムデータISはセッションに保存されますが、次のリクエストでは復元されません。

「woocommerce_get_cart_item_from_session」というフィルターがあります。最初のパラメーターとして、サニタイズされたカートアイテム(追加データなし)を取得し、2番目としてセッションに保存されたすべてのデータ(追加データを含む)を取得します。

解決策は、そこにフックし、カスタムカートアイテムのデータを復元することです。

サンプルコード:

add_filter( 'woocommerce_add_cart_item_data', function ( $cartItemData, $productId, $variationId ) {
    $cartItemData['myCustomData'] = 'someCustomValue';

    return $cartItemData;
}, 10, 3 );

add_filter( 'woocommerce_get_cart_item_from_session', function ( $cartItemData, $cartItemSessionData, $cartItemKey ) {
    if ( isset( $cartItemSessionData['myCustomData'] ) ) {
        $cartItemData['myCustomData'] = $cartItemSessionData['myCustomData'];
    }

    return $cartItemData;
}, 10, 3 );

また、カート/チェックアウトページでデータを表示するには、次のコードを使用できます。

add_filter( 'woocommerce_get_item_data', function ( $data, $cartItem ) {
    if ( isset( $cartItem['myCustomData'] ) ) {
        $data[] = array(
            'name' => 'My custom data',
            'value' => $cartItem['myCustomData']
        );
    }

    return $data;
}, 10, 2 );

最後のことは、注文が行われたときにデータを保存することです。

add_action( 'woocommerce_add_order_item_meta', function ( $itemId, $values, $key ) {
    if ( isset( $values['myCustomData'] ) ) {
        wc_add_order_item_meta( $itemId, 'myCustomData', $values['myCustomData'] );
    }
}, 10, 3 );

バックエンド内のデータを表示するために他に何もする必要はありません。すべての注文アイテムのメタデータが自動的に表示されます。

41
Stefan

残念ながら、デフォルトのカートアイテムデータを取得できませんでした。サポートとドキュメントが不足しているため、適切に実装されていないか、廃止される可能性があると感じています。

代わりに、カートセッション変数を使用して同じことを達成しました。各キーが_cart_item_key_である単純な配列です。各配列の値は、カスタムフィールドのキーと値のペアを含むさらに別の配列です。したがって、代わりにカートセッションデータとして保存されることを除いて、本質的には組み込みのカートアイテムデータと同じです。

簡単にするためのユーティリティ関数を含むGistは次のとおりです。

https://Gist.github.com/RadGH/e3444fc661554a0f8c6f


または、自分でビルドしたい場合、魔法はWC()->sessionにあります。これが機能するための2つの重要な機能は次のとおりです。

_WC()->session->get('_my_cart_item_data');
WC()->session->set('_my_cart_item_data', $cart_item_data_array);
_

必要なアクションフックは次のとおりです。

_<<<EXAMPLES
action: woocommerce_add_to_cart
desc: When an item is added to the cart. 
args: $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data

action: woocommerce_add_order_item_meta
desc: When a cart item is converted to an order item, save metadata to the order item
      using the function "wc_add_order_item_meta( $item_id, $key, $value )"
args: item_id, $values, $cart_item_key
_
4
Radley Sustaire