在 Woocommerce 结帐页面中重置之前选择的送货方式

Reset previous chosen shipping method in Woocommerce checkout page

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

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

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

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

您可以在结帐页面中使用(对于已登录的客户)重置上次选择的送货方式:

 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 文件中。它应该有效。

找到这个解决方案,它可能有点老套。 只需取消设置当前选择的送货方式,然后在验证结帐时检查它是否存在。

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'));
    }
}