Eコマースストア:
ホームページにアイテムが表示されており、各アイテムの下に[カートに追加]ボタンがあります。このボタンをクリックすると、アイテムがカートに追加されます。このボタンをもう一度クリックすると、カートに既に存在する商品の数量が1ずつ増加しますこれはループだと思います。ここまでは順調ですね。
単一の製品ページに、「カートに追加」ボタンがあります。このボタンをクリックすると、アイテムがカートに追加されます。数量の変更に使用できる数量入力テキストボックスもあります。これも結構です。
問題:
ループ内でクリックされた「カートに追加」ボタン(現在はホームページですが、アーカイブページなどの他のページでも使用できます)と「追加」を区別する必要があります。単一製品ページでクリックされた「カートへ」ボタン。この差別化に基づいて、ここに私がする必要があるものがあります:
$cart_item_key
を使用してカートに既に存在するこのアイテムのQuantityを取得し、1増やして、これを追加の処理を行い、詳細を再度カートに保存するカスタム関数。$cart_item_key
を使用してカートに既に存在するこのアイテムのQuantityを取得し、3を掛けて送信しますこれを追加の処理を行い、詳細を再度カートに保存するカスタム関数に追加します。何を試したか:
私は次のコードを試しました:
add_action('woocommerce_add_to_cart', 'custom_action_add_to_cart', 20, 6);
function custom_action_add_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data)
{
$cart = WC()->cart->get_cart();
$product = wc_get_product($product_id);
// NEED TO RUN CUSTOM CODE HERE BASED ON THE CHECKS
if (add to cart within loop is clicked) {
// Get existing $quantity_from_cart from cart using $cart_item_key, but how????
$new_quantity = $quantity_from_cart + 1;
}
else if (add to cart on single product page is clicked) {
// Get existing $quantity_from_cart from cart using $cart_item_key, but how????
$new_quantity = $quantity_from_cart * 3;
}
// Need to send the $new_quantity along with the $cart_item_key to the custom function so that the data can be saved using $cart_item_key
my_custom_function($new_quantity, $cart_item_key);
}
function my_custom_function($new_quantity, $cart_item_key)
{
echo $new_quantity;
WC()->cart->cart_contents[$cart_item_key]['custom_quantity'] = $new_quantity;
WC()->cart->set_session();
}
上記のコードの問題は、if... else if...
ロジックがない場合、[カートに追加]ボタンの場所に関係なくコードが実行されることです。つまり、ループ(ホームページ、アーカイブページ、またはループを使用する任意のページ)にある[カートに追加]ボタンをクリックするか、単一の製品ページにある[カートに追加]ボタンをクリックするか、上記のコードは、if... else if...
ロジックがない場合に実行されます。
ループ内にある[カートに追加]ボタンがクリックされたときに別のコードを実行し(その場所、ホームページ、アーカイブなどに関係なく)、別のコードを実行したい単一製品ページにある「カートへ」ボタンをクリックします。これを達成するにはどうすればよいですか?
次のようなものが期待されます:
is_product()
、is_product_category()
functionを使用できます
function custom_action_add_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data)
{
$cart = WC()->cart->get_cart();
$product = wc_get_product($product_id);
if ( is_product() ) {
global $product;
$id = $product->get_id();
foreach ( WC()->cart->get_cart() as $cart_item ) {
if($cart_item['product_id'] == $id ){
$quantity_from_cart = $cart_item['quantity'];
break; // stop the loop if product is found
}
}
$new_quantity = $quantity_from_cart * 3;
}
else if (is_product_category()) {
$new_quantity = $quantity_from_cart + 1;
}
my_custom_function($new_quantity, $cart_item_key);
}
あなたはこの方法を試すことができます:
add_action('woocommerce_add_to_cart', 'custom_action_add_to_cart', 20, 6);
function custom_action_add_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
$cart = WC()->cart->get_cart();
$product = wc_get_product($product_id);
$referer = $_SERVER['HTTP_REFERER'];
$route = parse_url( $referer );
$path = $route['path'] ?? 'home' ;
$args = array_filter( ( explode('/', $path) ) );
if (in_array( 'product', $args) ) {
// Product Page
} elseif (in_array('product-category', $args)) {
// Product Category
} else {
// Default
}
}
ただし、設定を確認する必要があります。 Settings > Permalinks
。
wp_get_referer または check_ajax_referer() を使用できます。次に例を示します。
function custom_action_add_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data)
{
$cart = WC()->cart->get_cart();
$product = wc_get_product($product_id);
$referer = wp_get_referer();
// HOMEPAGE
if (strpos($referer ,'http://yourwebsite.com/') !== false) {
$new_quantity = $quantity_from_cart + 1;
}
//from some product page like http://yourwebsite.com/product/my-product-page
else if (strpos($referer ,'http://yourwebsite.com/product/') !== false) {
$new_quantity = $quantity_from_cart * 3;
}
// Need to send the $new_quantity along with the $cart_item_key to the custom function so that the data can be saved using $cart_item_key
my_custom_function($new_quantity, $cart_item_key);
}
参照してください: Wordpress Nonces関連関数
考えられる解決策はいくつかあります。しかし、ここに1つあります。
add_action( 'woocommerce_after_add_to_cart_button', 'rmg_woocommerce_after_add_to_cart_button' );
function rmg_woocommerce_after_add_to_cart_button() {
$button_location = 0;
// if (is_home() || is_front_page()) {
// // we're at the home page
// $button_location = 1;
// }
if (is_product()) {
// where at product page
$button_location = 2;
} else {
// pages other than product page
$button_location = 1;
}
echo '<input type="hidden" name="button-location" value="'. $button_location .'" />';
}
フォーム内に非表示の入力を追加できます。上記のコードでそれを実行します。
その後、次のような値を確認できます。
$button_location = $_REQUEST['button-location'];
if ($button_location && $button_location === 2) {
// add to cart button clicked at or came from product page..
$new_quantity = $quantity_from_cart + 1;
}
これは単なるアイデアであり、完全な解決策ではないことに注意してください... ajaxボタンを処理する必要があります。