Отключить отложенный заказ для определенной роли пользователя в Woocommerce

В woocommerce я ставлю свои продукты на отложенный заказ с флажком отложенного заказа. Теперь, когда все находится на отложенном заказе, я хочу отключить обратный заказ для обычных клиентов (и пусть это будет для других ролей пользователей, таких как wholesale_customer).

У меня есть следующий код, но когда я добавляю его в качестве плагина, я не могу добавить что-то в свою корзину (я могу нажать кнопку добавления в корзину, но корзина остается пустой):

/*Single product page: out of stock when product stock quantitiy is lower or equal to zero AND customer is not wholesale_customer.*/

add_filter('woocommerce_product_is_in_stock', 'woocommerce_product_is_in_stock' );

function woocommerce_product_is_in_stock( $is_in_stock ) {
    global $product;

    $user = wp_get_current_user();
    $haystack= (array) $user->roles;
    $target=array('wholesale_customer');

    if ($product->get_stock_quantity() <= 0 && count(array_intersect($haystack, $target)) == 0){

        $is_in_stock = false;
    }

    return $is_in_stock;
}

/*Single product page: max add to cart is the product's stock quantity when customer is not wholesale_customer.*/

function woocommerce_quantity_input_max_callback( $max, $product ) {
    $user = wp_get_current_user();
    $haystack= (array) $user->roles;
    $target=array('wholesale_customer');

    if (count(array_intersect($haystack, $target)) == 0){

        $max= $product->get_stock_quantity();
    }

    return $max;
}
add_filter( 'woocommerce_quantity_input_max', 'woocommerce_quantity_input_max_callback',10,2);
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
710
2

Ответы 2

Вместо этого попробуйте использовать фильтр woocommerce_is_purchasable( $is_purchasable, $product ). Он должен возвращать истину или ложь.

Кроме того, вам также не нужно так далеко ходить, чтобы получить роль пользователя. Достаточно простого if ( current_user_can( 'wholesale_customer' ) ).

Итак, что-то вроде:

function my_is_purchasable( $is_purchasable, $product ) {
    if ( current_user_can( 'wholesale_customer' ) ) { 
        return true;
    } elseif ( $product->get_stock_quantity() <= 0 ) {
        return false;
    } else {
        return $is_purchasable;
    }
}
add_filter( 'woocommerce_is_purchasable', 'my_is_purchasable', 10, 2 );

Примечание: это просто демонстрация, так как я не могу правильно протестировать это для вас, так как меня сейчас нет за своим столом.

Попробуйте использовать следующий код, используя специальный перехватчик фильтра woocommerce_product_backorders_allowed:

add_filter( 'woocommerce_product_backorders_allowed', 'products_backorders_allowed', 10, 3 );
function products_backorders_allowed( $backorder_allowed, $product_id, $product ){
    $user       = wp_get_current_user();
    $user_roles = (array) $user->roles;
    if ( in_array( 'customer', $user_roles ) && ! in_array( 'wholesale_customer', $user_roles ) ){
        $backorder_allowed = false;
    }
    return $backorder_allowed;
}

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

Другие вопросы по теме