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

标签 php wordpress woocommerce checkout payment-method

在我的 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;
}

最佳答案

使用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 文件中。经过测试并有效。


改为处理产品标签

Simply replace in the code the taxonomy 'product_cat' by '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 文件中。经过测试并有效。

关于php - 根据 WooCommerce 结账中的分类术语限制支付网关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57622791/

相关文章:

php - AJAX 功能使我的屏幕变黑

php - 搜索栏上的 Wordpress 图片边框

php - 从 WooCommerce 3+ 的轮播中排除 'hidden' 查询产品

php - 将用户自定义帐户字段添加到 WooCommerce 结帐

php - 函数参数 : default value return of a function?

javascript - 使用 jQuery Validate SubmitHandler 提交表单后重定向到不同的 URL(不使用 Ajax)

javascript - 使用ajax jquery将变量传递给php页面?

javascript - 显示/隐藏 wordpress 子菜单

php - 在 WordPress 数据库中插入单引号和双引号

php - 在 Woocommerce 中选择的运输方式更改时显示或隐藏 html 元素