Метод доставки Woocommerce в зависимости от роли пользователя

Я хочу включить или отключить методы доставки в зависимости от роли пользователя. Я тестировал различные коды и подходы, ни один из которых пока не работал.

Текущий код: (источник: stacklink )

add_filter( 'woocommerce_package_rates', 'hide_specific_shipping_method_based_on_user_role', 30, 2 );
function hide_shipping_method_based_on_user_role( $rates, $package ) {

    $shipping_id = 'shipmondo:3';

    foreach( $rates as $rate_key => $rate ){
        if( $rate->method_id === $shipping_id ){
            if( current_user_can( 'b2b' ) || ! is_user_logged_in()){
                unset($rates[$rate_key]);
                break;
            }
        }
    }
    return $rates;
}

(Также протестировал исходный фрагмент, без изменений, согласен на роль пользователя) У меня не работает. Я также тестировал его с помощью local_pickup. Иногда он работает, но, похоже, очень чувствителен к кешу браузера и сеансу. Также мне нужны 3 метода, которые вызываются под одним и тем же именем, но с дочерним номером, разделяющим их: shipmondo: 3, shipmondo: 4 и т. Д. (Можно найти при проверке браузера в разделе Value). Также есть что-то, называемое ID, которое выглядит так: 'shipping_method_0_shipmondo3' Не знаю, могу ли я использовать это вместо этого, но это довольно сложно понять, когда код не обновляется правильно. Этот фрагмент относится к 2018 году, поэтому он может быть устаревшим, но новые фрагменты, которые я нашел, основаны на одном и том же принципе и, похоже, не сильно отличаются.

Кроме того, почему || ! is_user_logged_in () понадобиться? Мне нужно только отключить 2 из 3 методов для оптового пользователя, не нужно влиять ни на какие другие роли или гостей. Боролся с этим уже несколько дней.

Кроме того, есть ли какой-нибудь совет, как заставить Wordpress и Woocommerce обновляться, а не плавать в кеше?

Заранее спасибо.


person Pandusen    schedule 17.03.2021    source источник


Ответы (1)


Вы путаете метод доставки "Идентификатор метода" и "Идентификатор тарифа". Также ваш код можно упростить. Вместо этого попробуйте следующее:

add_filter( 'woocommerce_package_rates', 'hide_specific_shipping_method_based_on_user_role', 100, 2 );
function hide_specific_shipping_method_based_on_user_role( $rates, $package ) {
    // Here define the shipping rate ID to hide
    $targeted_rate_id    = 'shipmondo:3'; // The shipping rate ID to hide
    $targeted_user_roles = array('b2b');  // The user roles to target (array)

    $current_user  = wp_get_current_user();
    $matched_roles = array_intersect($targeted_user_roles, $current_user->roles);

    if( ! empty($matched_roles) && isset($rates[$targeted_rate_id]) ) {
        unset($rates[$targeted_rate_id]);
    }
    return $rates;
}

Код находится в файле functions.php активной дочерней темы (или активной темы). Он должен работать.

Не забудьте очистить корзину, чтобы очистить кешированные данные о доставке.

person LoicTheAztec    schedule 17.03.2021
comment
Хм, этот фрагмент отключает все способы доставки ... ?? кстати, вы можете добавить точку с запятой к неустановленной строке;) Но, по крайней мере, он что-то делает. Спасибо! - person Pandusen; 18.03.2021
comment
странный. Я проведу дальнейшее тестирование. Для меня роль пользователя b2b не имеет доступных способов доставки, а у всех остальных - 3. - person Pandusen; 18.03.2021
comment
Не знаю почему, но этот код у меня не работает. Когда я установил этот код, все способы доставки исчезли для всех пользователей. Так что это нарушает способы доставки (для меня). - person Pandusen; 24.03.2021
comment
@Pandusen Обновил код: на этот раз он будет работать (сначала очистите корзину). - person LoicTheAztec; 24.03.2021
comment
Спасибо. Это работает! Я изменил его, чтобы скрыть 2 метода для b2b и скрыть 1 для всех остальных, чтобы у b2b был собственный метод доставки. Он работает отлично и кажется твердым, как скала. Так что, похоже, большая часть проблем была связана с current_user_can - person Pandusen; 05.04.2021