Woocommerce:[カートに追加]ボタンがクリックされた場所を検出し、別のコードを実行します


10

eコマースストア:

  • ホームページに表示されているアイテムがあり、各アイテムの下に[カートに追加]ボタンがあります。このボタンをクリックすると、アイテムがカートに追加されます。このボタンをもう一度クリックすると、カートに既に存在する商品の数量が1増えますこれはループだと思います。ここまでは順調ですね。

  • 単一の製品ページに、「カートに追加」ボタンがあります。このボタンをクリックすると、アイテムがカートに追加されます。数量を変更するために使用できる数量入力テキストボックスもあります。これも結構です。

問題:

ループ内でクリックされた[カートに追加]ボタン(現在はホ​​ームページですが、アーカイブページなどの他のページでも使用できます)とクリックされた[カートに追加]ボタンを区別する必要があります単一の製品ページ。この差別化に基づいて、ここに私がする必要があるものがあります:

  • ループ内に表示される[カートに追加]ボタンがクリックされた場合は、を使用してカートに既に存在するこのアイテムの数量を 取得し、$cart_item_key1増やして、追加の処理を実行して詳細を保存するカスタム関数に送信します再びカートに入れます。
  • [単一の商品]ページに表示される[カートに追加]ボタンをクリックした場合は、を使用してカートに既に存在するこのアイテムの数量を 取得し、$cart_item_key3を掛けて、追加の処理を実行して保存するカスタム関数に送信します再度カートに入れる詳細。
  • 上記のどちらの場合も、さまざまなロジックに基づいて数量が変更され、この数量をカスタム関数呼び出しに送信する必要があります。

私が試したもの:

私は次のコードを試しました:

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...ロジックがない場合に実行されます。

したがって、ループにある[カートに追加]ボタンがクリックされたときに別のコードを実行し(場所、ホームページ、アーカイブなどに関係なく)、[カートに追加]ボタンがクリックされたときに別のコードを実行したい単一の製品ページにあるそれをクリックします。どうすればこれを達成できますか?

次のようなものが期待されます:

  • ループ内に表示されるボタンをクリックした場合->これを行います。
  • 単一製品ページに表示されるボタンをクリックした場合->それを行います。

回答:


1

たとえば、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関連関数


ホームページ、製品ページなどの手動チェックはやり過ぎです。ページ名をハードコードせず、WPで内部的に処理するようにしています。
Devner

1

あなたはこの方法を試すことができます:

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で内部的に処理するようにしています。
Devner

1

あなたはis_product()is_product_category()関数を使用することができます

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

私はあなたの解決策に疲れました。[単一の製品]ページでカートに製品を追加すると、コード$new_quantity = $quantity_from_cart * 3;が機能することを期待していました。しかし、そうではありません。カート内の現在の数量を単純に増加させますが、数量に3を掛けませ。これを修正するには?
Devner

今すぐ試す数量に3を掛けます
RBT

私はあなたの修正された解決策を試しました。しかし、どういうわけか、結果は私の以前のコメントと同じです。奇妙な理由で、コードif ( is_product() )が実行されていないようです。理由が分からないようです!AJAXの[カートに追加]ボタンであることは重要ですか?
Devner

0

考えられる解決策はいくつかあります。しかし、ここに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ボタンを処理する必要があります。


何らかの奇妙な理由で、if is(product())が実行されていないようです。理由が分からないようです!AJAXの[カートに追加]ボタンであることは重要ですか?
Devner

アヤックスで、次の値を渡す必要が$button_locationリクエストに...
Reigel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.