【问题标题】:Restrict payment gateways based on taxonomy terms in WooCommerce checkout根据 WooCommerce 结帐中的分类术语限制支付网关
【发布时间】:2019-12-28 13:44:02
【问题描述】:

在我的 WooCommerce 商店中,我想限制并仅在产品具有类别 ID 为“266”的特定产品类别时才显示支付网关(支票)。现在我有了这个 sn-p,但它的作用恰恰相反——它在特定产品类别的结账时禁用了网关:

add_filter( 'woocommerce_available_payment_gateways', 'bbloomer_unset_gateway_by_category' );
  
function bbloomer_unset_gateway_by_category( $available_gateways ) {
    if ( is_admin() ) return $available_gateways;
    if ( ! is_checkout() ) return $available_gateways;
    $unset = false;
    $category_ids = array( 8, 37 );
    foreach ( WC()->cart->get_cart_contents() as $key => $values ) {
        $terms = get_the_terms( $values['product_id'], 'product_cat' );    
        foreach ( $terms as $term ) {        
            if ( in_array( $term->term_id, $category_ids ) ) {
                $unset = true;
                break;
            }
        }
    }
    if ( $unset == true ) unset( $available_gateways['cheque'] );
    return $available_gateways;
}

【问题讨论】:

    标签: php wordpress woocommerce checkout payment-method


    【解决方案1】:

    使用has_term() WordPress 条件函数将简化代码使其更有效,这样:

    add_filter( 'woocommerce_available_payment_gateways', 'filter_available_payment_gateways' );
    function filter_available_payment_gateways( $available_gateways ) {
        // Only on checkout page
        if ( is_checkout() && ! is_wc_endpoint_url() ) {
            // Here define your product categories
            $product_categories = array( 't-shirts', 'posters' ); // Can be term names, term slugs or term ids
            $taxonomy = 'product_cat'; // For WooCommerce product category terms (or 'product_tag' for WooCommerce product tag terms)
    
            $payment_method     = 'cheque'; // Here define your payment method id to be removed
            $hide_payment       = false;
    
            // Loop through cart items
            foreach ( WC()->cart->get_cart_contents() as $item ) {
                if ( ! has_term( $product_categories, $taxonomy, $item['product_id'] ) ) {
                    $hide_payment = true;
                }
            }
            
            if ( $hide_payment ) {
                unset( $available_gateways[$payment_method] );
            }
        }
        return $available_gateways;
    }
    

    代码在您的活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。


    改为处理产品标签

    只需将代码中的分类法'product_cat' 替换为'product_tag'


    也定位父产品类别

    如果您还需要定位父产品类别,则必须改用它:

    // Custom conditional function that handle parent product categories too
    function has_product_categories( $categories, $product_id = 0 ) {
        $parent_term_ids = $categories_ids = array(); // Initializing
        $taxonomy        = 'product_cat';
        $product_id      = $product_id == 0 ? get_the_id() : $product_id;
    
        if( is_string( $categories ) ) {
            $categories = (array) $categories; // Convert string to array
        }
    
        // Convert categories term names and slugs to categories term ids
        foreach ( $categories as $category ){
            $result = (array) term_exists( $category, $taxonomy );
            if ( ! empty( $result ) ) {
                $categories_ids[] = reset($result);
            }
        }
    
        // Loop through the current product category terms to get only parent main category term
        foreach( get_the_terms( $product_id, $taxonomy ) as $term ){
            if( $term->parent > 0 ){
                $parent_term_ids[] = $term->parent; // Set the parent product category
                $parent_term_ids[] = $term->term_id; // (and the child)
            } else {
                $parent_term_ids[] = $term->term_id; // It is the Main category term and we set it.
            }
        }
        return array_intersect( $categories_ids, array_unique($parent_term_ids) ) ? true : false;
    }
    
    add_filter( 'woocommerce_available_payment_gateways', 'filter_available_payment_gateways' );
    function filter_available_payment_gateways( $available_gateways ) {
        // Only on checkout page
        if ( is_checkout() && ! is_wc_endpoint_url() ) {
            // Here define your product categories
            $product_categories = array( 't-shirts', 'posters' ); // Can be term names, term slugs or term ids
            $taxonomy = 'product_cat'; // For WooCommerce product category terms (or 'product_tag' for WooCommerce product tag terms)
    
            $payment_method     = 'cheque'; // Here define your payment method id to be removed
            $hide_payment       = false;
    
            // Loop through cart items
            foreach ( WC()->cart->get_cart_contents() as $item ) {
                if ( ! has_product_categories( $product_categories, $item['product_id'] ) ) {
                    $hide_payment = true;
                }
            }
            
            if ( $hide_payment ) {
                unset( $available_gateways[$payment_method] );
            }
        }
        return $available_gateways;
    }
    

    代码在您的活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

    【讨论】:

      【解决方案2】:

      你能在你的代码中改变你的条件吗

      if ( $unset == true ){
           $index = 0;
          foreach($available_gateways as $single){
              if($single != "cheque"){
                  unset($available_gateways[$index]);
              }   
              $index++;
          }
       }
      

      【讨论】:

        猜你喜欢
        • 2019-05-03
        • 2021-04-27
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        • 2019-01-21
        • 2020-06-30
        • 2012-12-28
        • 2021-06-10
        相关资源
        最近更新 更多