WooCommerce 中特定产品类别的自定义条款和条件复选框

Custom terms and conditions checkbox for a specific product category in WooCommerce

在 Woocommerce 网站上,我有不同的条款和条件需要提供,具体取决于购物车中的产品类别。这部分工作没有问题。

但是,当触发特定于产品的条款时,我需要将它们作为必填字段。这很有效,但当指定的类别不在购物车中时它也会阻止结帐。

这是我的代码:

add_action('woocommerce_review_order_before_submit', 'add_pipletz_terms', 9);
function add_pipletz_terms() {

    // Show Terms 1
    $special_cat = 'insurance'; // HERE set your special category name, slug or ID
    $bool = false;

    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
        $item = $cart_item['data'];
        if ( has_term( 'insurance', 'product_cat', $item->id ) )
            $bool = true;
    }

    if ( $bool ) {
        ?>
        <p class="form-row terms wc-terms-and-conditions">
        <label class="woocommerce-form__label woocommerce-form__label-for-checkbox checkbox">
        <input type="checkbox" class="woocommerce-form__input woocommerce-form__input-checkbox input-checkbox pipletz-terms" name="pipletz-terms" <?php checked( apply_filters( 'woocommerce_terms_is_checked_default', isset( $_POST['terms-1'] ) ), true ); ?> id="pipletz-terms"> <span><a href="https://businessbloomer.com/woocommerce-display-product-specific-tc-checkout/" target="_blank">I&rsquo;ve read and accept the Pipletz product terms &amp; conditions</a></span> <span class="required">*</span>
        </label>
        </p>
        <?php
    }   
}

// If customer does not agree to terms
add_action('woocommerce_checkout_process', 'not_approved_pipletz_terms');
function not_approved_pipletz_terms() {
    if ( empty( $_POST['pipletz-terms'] ) ) {
        wc_add_notice( __( 'Please agree to the Pipletz product terms & conditions' ), 'error' );          }
}

任何关于如何使条款仅在类别存在时才需要的帮助将不胜感激。

已更新 - 首先,这段代码对于 woocommerce 版本 3+ 来说有点过时了……所以我添加了 WC 3+ 兼容性代码。

为避免此问题,您还需要检查购物车项目中特殊产品类别的第二个函数(因此您也需要添加 foreach 循环)…

同样在foreach循环中,一旦找到产品,就可以打破循环…… 最后,在您的代码中,isset( $_POST['terms-1'] ) 应该改为 isset( $_POST['pipletz-terms'] ) 才能工作……

因此您的兼容 WC3+ 代码应该是:

add_action('woocommerce_review_order_before_submit', 'add_pipletz_terms', 9 );
function add_pipletz_terms() {

    $special_cat = 'insurance'; // HERE set your special category name, slug or ID
    $bool = false;

    foreach ( WC()->cart->get_cart() as $cart_item ) {
        // compatibility with WC +3
        $product_id = version_compare( WC_VERSION, '3.0', '<' ) ? $cart_item['data']->id : $cart_item['data']->get_id();
        if ( has_term( $special_cat, 'product_cat', $product_id ) ){ 
            $bool = true;
            break; // added this too
        }
    }

    if ( $bool ) {
        $link = 'https://businessbloomer.com/woocommerce-display-product-specific-tc-checkout/';
        ?>
        <p class="form-row terms wc-terms-and-conditions">
            <label class="woocommerce-form__label woocommerce-form__label-for-checkbox checkbox">
                <input type="checkbox" class="woocommerce-form__input woocommerce-form__input-checkbox input-checkbox pipletz-terms" name="pipletz-terms" <?php checked( apply_filters( 'woocommerce_terms_is_checked_default', isset( $_POST['pipletz-terms'] ) ), true ); ?> id="pipletz-terms">
                <span>
                    <a href="<?php echo $link; ?>" target="_blank">I&rsquo;ve read and accept the Pipletz product terms &amp; conditions</a>
                </span> <span class="required">*</span>
            </label>
        </p>
        <?php
    }
}

// If customer does not agree to terms
add_action('woocommerce_checkout_process', 'not_approved_pipletz_terms');
function not_approved_pipletz_terms() {

    $special_cat = 'insurance'; // HERE set your special category name, slug or ID
    $bool = false;

    // Checking again if the category is in one cart item
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        // compatibility with WC +3
        $product_id = version_compare( WC_VERSION, '3.0', '<' ) ? $cart_item['data']->id : $cart_item['data']->get_id();
        if ( has_term( $special_cat, 'product_cat', $product_id ) ){
            $bool = true;
            break; // added this too
        }
    }

    if ( empty( $_POST['pipletz-terms'] ) && $bool )
        wc_add_notice( __( 'Please agree to the Pipletz product terms & conditions' ), 'error' );
}

我已经在 WC3+ 上成功测试了这段代码,没有任何问题,所以它现在适用于所有情况……