1

目前,我正在使用此过滤器清除默认的运输选择方法:

add_filter( 'woocommerce_shipping_chosen_method', '__return_false', 99);

但是,这只在客户的初始会话期间清除它。一旦客户选择了一次选项,它就会记住未来的选择。

我试图让结账台强制客户在每次访问结账台时选择运输选项,即使是在同一会话中也是如此。每次加载结帐页面时都可以运行此过滤器吗?

4

2 回答 2

1

您可以使用结帐页面(对于已登录的客户)重置最后选择的运输方式:

 delete_user_meta( get_current_user_id(), 'shipping_method' );

并从会话数据中删除选择的运输方式:

WC()->session->__unset( 'chosen_shipping_methods' );

在像这样的钩子函数中:

add_action( 'template_redirect', 'reset_previous_chosen_shipping_method' );
function reset_previous_chosen_shipping_method() {
    if( is_checkout() && ! is_wc_endpoint_url() && is_user_logged_in() 
    && get_user_meta( get_current_user_id(), 'shipping_method', true ) ) {
        delete_user_meta( get_current_user_id(), 'shipping_method' );
        WC()->session->__unset( 'chosen_shipping_methods' );
    }
}

或者您也可以在结帐页面为每个人设置默认送货方式:

add_action( 'template_redirect', 'reset_previous_chosen_shipping_method' );
function reset_previous_chosen_shipping_method() {
    if( is_checkout() && ! is_wc_endpoint_url() && is_user_logged_in() ) {
        WC()->session->set( 'chosen_shipping_methods', array('flat_rate:14') );
    }
}

要找出要使用的运输方式费率 ID,您可以使用浏览器检查器检查购物车或结帐页面中的运输方式单选按钮,例如:

在此处输入图像描述

代码继续在您的活动子主题(或活动主题)的 function.php 文件中。它应该有效。

于 2019-03-21T01:01:07.447 回答
0

找到了这个解决方案,它可能有点hacky。只需取消设置当前选择的运输方式,然后在验证结账时检查它是否存在。

add_action(
    'woocommerce_before_checkout_form',
    'reset_previous_chosen_shipping_method'
);
function reset_previous_chosen_shipping_method()
{
    if (is_checkout() && !is_wc_endpoint_url()) {
        unset(WC()->session->chosen_shipping_methods);
    }
}

add_action('woocommerce_after_checkout_validation', 'validate', 10, 2);
function validate($data, $errors)
{
    if (!$data['shipping_method']) {
        $errors->add('validation', __('Please select shipping method'));
    }
}
于 2022-01-19T23:41:48.067 回答