为了账号安全,请及时绑定邮箱和手机立即绑定

根据 WooCommerce 结账中的分类术语限制支付网关

根据 WooCommerce 结账中的分类术语限制支付网关

PHP
蓝山帝景 2021-12-03 15:51:48
在我的 WooCommerce 商店中,只有当产品具有类别 ID 为“266”的特定产品类别时,我才想限制和显示支付网关(支票)。现在我有了这个片段,但它的作用正好相反——它禁用了特定产品类别结账时的网关: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;}
查看完整描述

2 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

使用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 文件中。测试和工作。


查看完整回答
反对 回复 2021-12-03
?
郎朗坤

TA贡献1921条经验 获得超9个赞

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


if ( $unset == true ){

     $index = 0;

    foreach($available_gateways as $single){

        if($single != "cheque"){

            unset($available_gateways[$index]);

        }   

        $index++;

    }

 }


查看完整回答
反对 回复 2021-12-03
  • 2 回答
  • 0 关注
  • 200 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信