WooCommerce:以编程方式更改默认送货方式

时间:2016-03-30 05:55:03

标签: php wordpress woocommerce

WooCommerce无法优先考虑使用桌面费率的方式,因此我自己尝试这样做,但是却失败了。

我试图在我认为已设置的位置添加一个动作,但它无法正常工作。这是我尝试过的(我只是想在可用的运输方法数组中使用第一种运输方法):

function reset_default_shipping_method() {

    $available_methods = WC()->shipping->packages[0]['rates'];
    $chosen_method = key($available_methods);
    WC()->session->set( 'chosen_shipping_methods', $chosen_method );

}
add_action('woocommerce_shipping_method_chosen', 'reset_default_shipping_method');

我测试了$available_methods$chosen_method,两者都按预期展示(在页面中运行时)但是,一旦我将其添加到动作woocommerce_shipping_method_chosen,它似乎不是更新

e.g。如果我通过另一个钩子运行它:

function output_to_footer() {
    if ( current_user_can( 'administrator' ) ) :

        $current_method = WC()->session->get( 'chosen_shipping_methods');
        $available_methods = WC()->shipping->packages[0]['rates'];
        $chosen_method = key($available_methods);
        WC()->session->set( 'chosen_shipping_methods', $chosen_method );        

        print "\n".'-----'."\n";
        print_r($current_method);
        print "\n".'-----'."\n";
        print_r($available_methods);
        print "\n".'-----'."\n";
        print_r($chosen_method);
        print "\n".'-----'."\n";

    endif;
}
add_action('print_footer_messages', 'output_to_footer');

看起来一切都在做它应该做的事情,但是当我从动作中运行它时:woocommerce_shipping_method_chosen它“出现”做一切但是发货收音机仍然设置为旧的送货方式?

-----
Array
(
    [0] => table_rate-5 : 70
)

-----
Array
(
    [table_rate-7 : 72] => WC_Shipping_Rate Object
        (
            [id] => table_rate-7 : 72
            [label] => Registered Australian Post (2 to 8 Business Days)
            [cost] => 4.0909
            [taxes] => Array
                (
                    [1] => 0.40909
                )

            [method_id] => table_rate
        )

    [table_rate-8 : 90] => WC_Shipping_Rate Object
        (
            [id] => table_rate-8 : 90
            [label] => Tracking and Freight Insurance
            [cost] => 20.055881818182
            [taxes] => Array
                (
                    [1] => 2.0055881818182
                )

            [method_id] => table_rate
        )

    [table_rate-5 : 70] => WC_Shipping_Rate Object
        (
            [id] => table_rate-5 : 70
            [label] => Nation-Wide Delivery (5 to 12 Business Days)
            [cost] => 0
            [taxes] => Array
                (
                )

            [method_id] => table_rate
        )

    [local_pickup] => WC_Shipping_Rate Object
        (
            [id] => local_pickup
            [label] => Local Pickup
            [cost] => 0
            [taxes] => Array
                (
                )

            [method_id] => local_pickup
        )

)

-----
table_rate-7 : 72
-----

我一整天都在努力,并且感觉不到任何解决方案。希望有人在这里帮忙。

2 个答案:

答案 0 :(得分:1)

woocommerce_shipping_chosen_method是一个过滤器钩子而不是一个动作钩子。请尝试以下代码

function reset_default_shipping_method( $method, $available_methods ) {

    // If the shipping method has been chosen don't do anything
    if ( ! empty( $method ) ) {
        return $method;
    }        

    // add code to set 'Table Rate' as the default shipping method 

    $method = 'table_rate-5';

    return $method;    
}

add_filter('woocommerce_shipping_chosen_method', 'reset_default_shipping_method', 10, 2);

P.S:我已经硬编码table_rate-5作为默认方法来为您提供要点,因此将其更改为所需的方法。理想情况下,您需要编写代码以查看您希望设置为默认的方法是否在$available_methods中可用,然后相应地工作。

答案 1 :(得分:1)

这是我最终使用的,根据需要工作:

/*=Use the shipping method filter to set the "selected" shipping method to 
 * the first (default) method in the list
**************************************************************************/
function oley_reset_default_shipping_method( $method, $available_methods ) {

    $method = key($available_methods);
    return $method;

}
add_filter('woocommerce_shipping_chosen_method', 'oley_reset_default_shipping_method', 10, 2);

(注意:这是有效的,因为我想要的运费实际上是列表中的第一个,但默认情况下没有被选中)