web-dev-qa-db-ja.com

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

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

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

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

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

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

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

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

1
Dmitry

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
Ronak Dhoot

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

0
Reigel