programing

필수 범주의 제품이 카트에 있는 경우에만 체크아웃 허용

powerit 2023. 10. 30. 21:21
반응형

필수 범주의 제품이 카트에 있는 경우에만 체크아웃 허용

저는 어떤 고객이라도 바구니에 특별한 상품 카테고리가 없다면 체크아웃을 진행하는 것을 중단하고 싶습니다.그들에게 특정 제품을 추가해야 한다는 오류 메시지도 전달하고 싶습니다.코드를 찾았는데 작동이 안 됩니다.워드프레스 설치에 코드 스니펫으로 추가했지만 디버깅 스위치를 켰는데도 작동하지 않고 오류 메시지도 없습니다.이것이 작동하기 위해 수정이 필요할 수 있는 Github에서 찾은 코드는 다음과 같습니다.

function sv_wc_prevent_checkout_for_category() {

    // set the slug of the category for which we disallow checkout
    $category = 'sibling';

    // get the product category
    $product_cat = get_term_by( 'slug', $category, 'product_cat' );

    // sanity check to prevent fatals if the term doesn't exist
    if ( is_wp_error( $product_cat ) ) {
        return;
    }

    $category_name = '<a href="' . get_term_link( $category, 'product_cat' ) . '">' . $product_cat->name . '</a>';

    // check if this category is the only thing in the cart
    if ( sv_wc_is_category_alone_in_cart( $category ) ) {

        // render a notice to explain why checkout is blocked
        wc_add_notice( sprintf( 'Hi there! Looks like your cart only contains products from the %1$s category &ndash; you must purchase a product from another category to check out.', $category_name ), 'error' );
    }
}
add_action( 'woocommerce_check_cart_items', 'sv_wc_prevent_checkout_for_category' );

/**
 * Checks if a cart contains exclusively products in a given category
 * 
 * @param string $category the slug of the product category
 * @return bool - true if the cart only contains the given category
 */
function sv_wc_is_category_alone_in_cart( $category ) {

    // check each cart item for our category
    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {

        // if a product is not in our category, bail out since we know the category is not alone
        if ( ! has_term( $category, 'product_cat', $cart_item['data']->id ) ) {
            return false;
        }
    }

    // if we're here, all items in the cart are in our category
    return true;
}

그래서 카트에 'sibling' 카테고리만 있으면 체크아웃(오류 메시지와 함께)을 중지하려고 합니다.고객이 체크아웃하기 전에 바구니에 담아야 하는 '표준' 카테고리가 있습니다.이게 말이 되기를 바랍니다.

여기에 요령을 터득할 수 있는 해결책이 방법이 있습니다.특히 두 가지 주요 기능(마지막 기능)이 있습니다.

  1. 첫 번째 기능(N°3)은 카트에 필수 제품 범주가 아닌 무언가가 있을 때 카트 페이지에 메시지를 표시합니다.필수 제품 보관 페이지에 메시지도 표시합니다(고객이 체크아웃에서 리디렉션될유용함, 아래 참조).
  2. 두 번째 기능(N°4)은 고객이 체크아웃을 시도할 때 제품 필수 카테고리 보관 페이지로 리디렉션하며 카트에 필수 제품 카테고리가 누락되어 있지 않습니다.

필수 범주 슬러그가 기능하기 전에 정의합니다.

코드는 다음과 같습니다.

// Function that define the mandatory product category
 function your_mandatory_category_slug(){

     // DEFINE HERE the SLUG of the needed product category
    $category = 'clothing';
    return $category;
 }


// Conditional function that returns true if the mandatory product category is in cart
function has_mandatory_category(){
    $category_needed = your_mandatory_category_slug();
    $has_cat = false;

    // Iterrating each item in cart and detecting…
    foreach ( WC()->cart->get_cart() as $item ) {

        // Detects if the needed product category is in cart items
        if ( has_term($category_needed, 'product_cat', $item['product_id'] ) ) {
            $has_cat = true;
            break;
        }
    }
    return $has_cat;
 }


// Function that display a message if there is not in cart a mandatory product category
function mandatory_category_display_message() {
        $category_needed = your_mandatory_category_slug();

    // check that cart is not empty (for cart and product category archives)
    if( !WC()->cart->is_empty() && ( is_cart() || is_product_category( $category_needed ) ) ){
        $category_obj = get_term_by( 'slug', $category_needed, 'product_cat' );
        if ( is_wp_error( $category_obj ) ) return;

        // Display message when product category is not in cart items
        if ( !has_mandatory_category() ) {
            $category_name = $category_obj->name;
            $category_url = get_term_link( $category_needed, 'product_cat' );

            // render a notice to explain why checkout is blocked
            wc_add_notice( sprintf( __( '<strong>Reminder:</strong> You have to add in your cart, a product from "%1$s" category, to be allowed to check out. Please return <a href="%2$s"> here to "%1$s" product page</a>', 'your_theme_domain'), $category_name, $category_url ), 'error' );
        }
    }
}
add_action( 'woocommerce_before_main_content', 'mandatory_category_display_message', 30 ); // for product mandatory category archives pages
add_action( 'woocommerce_check_cart_items', 'mandatory_category_display_message' ); // for cat page


// Function that redirect from checkout to mandatory product category archives pages
function mandatory_category_checkout_redirect() {

    // If cart is not empty on checkout page
    if( !WC()->cart->is_empty() && is_checkout() ){
        $category_needed = your_mandatory_category_slug();

        // If missing product category => redirect to the products category page
        if ( !has_mandatory_category() )
            wp_redirect( get_term_link( $category_needed, 'product_cat' ) );
    }
}
add_action('template_redirect', 'mandatory_category_checkout_redirect');

이것은 제 기능을 합니다.활성 하위 테마(또는 테마)의 php 파일 또는 플러그인 파일에 있습니다.

이 코드는 테스트되었으며 완전히 작동합니다.

Loic The Aztec의 답변을 두 가지 카테고리로 작업하도록 각색했습니다.효과가 있는 것 같습니다.텍스트를 수정하지 않았습니다.has_mandatory_categorytextfunction, . 만약 당신이 코드를 따를 수 있다면 당신은 diy를 할 수 있지만, 나는 단지 기능에 집중하고 있었습니다.여기 또 다른 답변이 있는데 저는 이 답변이 더 마음에 들고 다른 답변은 제게 맞지 않았습니다.

// Function that define the 2 mandatory product categories cat1 & cat2
 function your_mandatory_category_slug(){ $category = 'cat1';    return $category; }
 function your_mandatory_category_slug2(){ $category = 'cat2';    return $category; }
// Conditional function that returns true if the mandatory product category is in cart
function has_mandatory_category1(){
    $category_needed = your_mandatory_category_slug();
    $has_cat = false;
    foreach ( WC()->cart->get_cart() as $item ) {
        if ( has_term($category_needed, 'product_cat', $item['product_id'] ) ) {
            $has_cat = true;
            break;
        }
    }
    return $has_cat;
 }
// Conditional function that returns true if the mandatory product category is in cart
function has_mandatory_category2(){
    $category_needed = your_mandatory_category_slug2();
    $has_cat = false;
    foreach ( WC()->cart->get_cart() as $item ) {
        if ( has_term($category_needed, 'product_cat', $item['product_id'] ) ) {
            $has_cat = true;
            break;
        }
    }
    return $has_cat;
 }





// Function that redirect from checkout to mandatory product category archives pages
function mandatory_category_checkout_redirect() {
    // If cart is not empty on checkout page
    if( !WC()->cart->is_empty() && is_checkout() ){
        $category_needed = your_mandatory_category_slug();
        $category_needed2 = your_mandatory_category_slug2();
        if ( !has_mandatory_category1() )
            wp_redirect( get_term_link( $category_needed, 'product_cat' ) );
        if ( !has_mandatory_category2() )
            wp_redirect( get_term_link( $category_needed2, 'product_cat' ) );
    }
}
add_action('template_redirect', 'mandatory_category_checkout_redirect');

Woocommerce v2.6.12로 Wordpress 설치에 매력적으로 작용합니다.

앞으로 3개나 4개 정도의 필수 제품 카테고리를 두 개 추가하고 싶습니다.변경을 시도했습니다.

$category = 'slug1';

로.

$category = 'slug1', 'slug2';

그리고.

$category = array('slug1','slug2');

성공하지 못했습니다.이 코드를 여러 개의 슬러그와 함께 작동시키는 방법이 있습니까?

언급URL : https://stackoverflow.com/questions/39644645/allow-checkout-only-when-a-product-of-a-mandatory-category-is-in-cart

반응형