_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 );
_
私は今日同じ状況にあり、いくつかの研究の後、この質問につまずいた。いくつかのリバースエンジニアリングを行った後、問題を発見し、この質問につまずく可能性のある他のソリューションを提供したいと考えています。
問題は、カートのアイテムがセッションから復元されるときにデータがサニタイズされることです。そのため、追加のカートアイテムデータ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 );
バックエンド内のデータを表示するために他に何もする必要はありません。すべての注文アイテムのメタデータが自動的に表示されます。
残念ながら、デフォルトのカートアイテムデータを取得できませんでした。サポートとドキュメントが不足しているため、適切に実装されていないか、廃止される可能性があると感じています。
代わりに、カートセッション変数を使用して同じことを達成しました。各キーが_cart_item_key
_である単純な配列です。各配列の値は、カスタムフィールドのキーと値のペアを含むさらに別の配列です。したがって、代わりにカートセッションデータとして保存されることを除いて、本質的には組み込みのカートアイテムデータと同じです。
簡単にするためのユーティリティ関数を含むGistは次のとおりです。
または、自分でビルドしたい場合、魔法は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
_