簡體   English   中英

僅當購物車中包含強制性類別的產品時才允許結帳

[英]Allow checkout only when a product of a mandatory category is in cart

如果他們的購物籃中沒有特定的產品類別,我想阻止任何客戶前進到結賬處。 我還想通過錯誤消息告訴他們他們需要添加某個產品。 我找到了一些代碼,但無法正常工作。 我已將它作為代碼片段添加到我的 Wordpress 安裝中,但可惜它不起作用,即使我打開了調試,也沒有錯誤消息。 這是我在 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;
}

因此,如果“兄弟姐妹”類別是購物車中唯一的項目,我希望停止結帳(帶有錯誤消息)。 我有一個“標准”類別,必須在客戶結賬之前放在購物籃中。 希望這是有道理的。

在這里,您有一個可以解決問題的解決方案。 特別是有兩個主要功能(最后一個)

  1. 第一個功能(N°3)在購物車頁面上顯示您的消息,當購物車中有東西但不是強制性產品類別時。 還在強制性產品存檔頁面上顯示消息(當客戶從結帳重定向時很有用,見下文)
  2. 第二個功能(N°4)在客戶嘗試結賬並且他的購物車沒有缺少的強制性產品類別時將客戶重定向到產品強制性類別存檔頁面。

your_mandatory_category_slug()函數中的強制類別 slug 之前定義。

這是代碼:

// 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');

這在您的活動子主題(或主題)或任何插件文件的 function.php 文件中。

此代碼經過測試且功能齊全。

使用 Woocommerce v2.6.12 對我的 Wordpress 安裝很有用。

我想添加兩個強制性產品類別,將來可能會添加 3 或 4 個。 我嘗試改變:

$category = 'slug1';

$category = 'slug1', 'slug2';

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

沒有成功。 有沒有辦法使此代碼與多個 slug 一起使用?

如果我想重定向到產品網址而不是類別,您將如何做不同的事情?

我已經改編了 LoicTheAztec 的答案以處理 2 個類別。 它似乎正在工作。 我沒有改編文字has_mandatory_categorytext函數,. 如果您可以按照代碼進行操作,則可以自己動手做,但我只關注功能。 這里有另一個答案但我更喜歡這個答案,而另一個對我不起作用。

// 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');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM