[javascript] Woocommerce : 장바구니에 추가 버튼을 클릭 한 위치를 감지하고 다른 코드를 실행

전자 상거래 상점에서 :

  • 홈페이지에 항목이 표시되며 각 항목 아래에 “장바구니에 추가”버튼이 있습니다. 이 버튼을 클릭하면 항목이 장바구니에 추가됩니다. 이 버튼을 다시 클릭하면 장바구니에 이미 존재하는 품목의 수량이 1 씩 증가합니다. 이것이 루프라고 생각합니다 . 여태까지는 그런대로 잘됐다.

  • 단일 제품 페이지에는 “장바구니에 추가”버튼이 있습니다. 이 버튼을 클릭하면 항목이 장바구니에 추가됩니다. 수량을 변경하는 데 사용할 수있는 수량 입력 텍스트 상자도 있습니다. 이것도 괜찮습니다.

문제:

루프 내에서 클릭 한 “장바구니에 추가”버튼 (현재 홈페이지에서는 있지만 아카이브 페이지와 같은 다른 페이지에서도 사용 가능)과 클릭 한 “카트에 추가”버튼 을 구별해야합니다 . 단일 제품 페이지에서 이 차별화를 기반으로 내가해야 할 일은 다음과 같습니다.

  • 루프 내에 나타나는 “장바구니에 추가”버튼을 클릭 한 경우을 사용하여 카트에 이미 존재하는이 품목 의 수량 을 잡고 $cart_item_key1 씩 증가시킨 후 추가 처리를 수행하고 세부 사항을 저장하는 사용자 정의 기능으로 보내십시오. 다시 장바구니에 넣습니다.
  • 단일 제품 페이지에 나타나는 “장바구니에 추가”버튼을 클릭 한 경우을 사용하여 카트에 이미 존재하는이 품목 의 수량$cart_item_key 에 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...논리 가없는 상태에서 실행됩니다 .

따라서 루프에있는 “장바구니에 추가”버튼을 클릭하면 (홈페이지, 아카이브 등 위치에 관계없이) “장바구니에 추가”버튼을 클릭하면 다른 코드를 실행하고 싶습니다. 단일 제품 페이지에있는를 클릭하십시오. 어떻게하면 되나요?

다음과 같은 것을 기대하십시오.

  • 루프 안에 나타나는 버튼을 클릭하면->이 작업을 수행하십시오.
  • 단일 제품 페이지에 나타나는 버튼을 클릭하면-> 그렇게하십시오.


답변

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 관련 기능


답변

이 방법으로 시도 할 수 있습니다 :

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.


답변

당신이 사용할 수있는 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);
}


답변

내가 생각할 수있는 몇 가지 해결책이 있습니다. 그러나 여기 하나가 있습니다 :

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 버튼을 관리해야합니다.


답변