将“免费送货”方法设置为 WooCommerce 中选定的默认送货选项

问题描述 投票:0回答:2

我正在努力更改默认选择的运输选项。仅当客户购物车中的金额超过 70 美元以上时,才会显示“免运费”运输选项。如果购物车中的金额低于 70 美元,运输选项将不会显示在运输选项中。

如果客户的金额超过 70 美元或以上,则会显示“免运费”选项,并且它应该是默认选择的运输选项。

我尝试添加以下代码片段,但它似乎对我不起作用,或者修改 ID 时可能出现错误(不确定)。

add_action( 'woocommerce_before_cart', 'set_default_chosen_shipping_method', 5 );
function set_default_chosen_shipping_method(){
    //
    if( count( WC()->session->get('shipping_method_0')['rates'] ) > 0 ){
        foreach( WC()->session->get('shipping_method_0')['rates'] as $rate_id =>$rate)
            if($rate->method_id == 'free_shipping30'){
                $default_rate_id = array( $rate_id );
                break;
            }

        WC()->session->set('chosen_shipping_methods', $default_rate_id );
    }
}

我得到了这个片段的想法这里

提前谢谢您!!

php wordpress woocommerce hook-woocommerce shipping-method
2个回答
5
投票

您的代码包含一些错误

  • WC()->session->get('shipping_method_0')['rates']
    替换为
    WC()->session->get( 'shipping_for_package_0')['rates']
  • if($rate->method_id == 'free_shipping30'){
    替换为
    if ( $rate->method_id == 'free_shipping' ) {

所以你得到:

function action_woocommerce_before_cart() { 
    // NOT empty (get)
    if ( count( WC()->session->get( 'shipping_for_package_0')['rates'] ) > 0 ) {
        // Loop through
        foreach ( WC()->session->get('shipping_for_package_0')['rates'] as $rate_id => $rate ) {            
            // For free shipping
            if ( $rate->method_id == 'free_shipping' ) {
                $default_rate_id = array( $rate_id );
                break;
            }
        }

        // Set
        WC()->session->set( 'chosen_shipping_methods', $default_rate_id );
    }
}
add_action( 'woocommerce_before_cart', 'action_woocommerce_before_cart', 10, 0 );

0
投票

@7uc1f3r 给出的答案确实会取消选择免费送货(如果有),但如果没有免费送货,也会取消选择其他默认送货方式*,从而导致没有选择送货方式。

如果有可用的免费送货方式,以下内容只会影响默认送货方式。

function select_free_shipping_by_default()
{
    if ($rates = WC()->session->get('shipping_for_package_0')['rates']) {
        foreach ($rates as $rate_id => $rate) {
            if ($rate->method_id == 'free_shipping') {
                WC()->session->set('chosen_shipping_methods', array($rate_id));
                break;
            }
        }
    }
}
add_action('woocommerce_before_cart', 'select_free_shipping_by_default', 10, 0);

根据您的审美,您也可以在不使用

foreach
循环的情况下完成此操作,尽管我承认这可能不太清晰(并且需要 PHP 7.4+ 来实现箭头功能)。

function select_free_shipping_by_default()
{
    if ($rates = WC()->session->get('shipping_for_package_0')['rates']) {
        if ($free = array_filter($rates, fn ($x) => $x->method_id == 'free_shipping')) {
            WC()->session->set('chosen_shipping_methods', array_keys($free));
        }
    }
}
add_action('woocommerce_before_cart', 'select_free_shipping_by_default', 10, 0);

测试于:WooComerce 8.3.1 | WordPress 6.4.3 | PHP 8.1.23

希望这对某人有帮助:)


* 默认选择的运输方式通常在管理员中配置。默认情况下会选择相关运输区域中运输方式拖/放顺序中的第一项(例如位于

/wp-admin/admin.php?page=wc-settings&tab=shipping&zone_id=1
)。

© www.soinside.com 2019 - 2024. All rights reserved.