фильтр «woocommerce_can_reduce_order_stock» не работает на серверной части

#wordpress #woocommerce #backend #hook-woocommerce #orders

#wordpress #woocommerce #серверная часть #крюк-woocommerce #заказы

Вопрос:

У меня есть пользовательский статус заказа с именем «предложение», и я добавил следующий код, чтобы попытаться предотвратить уменьшение уровня запасов для заказов с этим статусом.

 function bw_do_not_reduce_quote_stock( $reduce_stock, $order ) {
    if ( $order->has_status( 'quote' ) ) {
        $reduce_stock = false;
    }
    return $reduce_stock;
}

add_filter( 'woocommerce_can_reduce_order_stock', 'bw_do_not_reduce_quote_stock', 10, 2 );
 

Это работает для заказов, размещенных на интерфейсном веб-сайте. Но если администратор добавляет или редактирует заказ на серверной части, запас уменьшается.

Есть ли альтернативный хук для серверной части? Или я что-то еще упускаю?

Ответ №1:

В дополнение к вашему текущему коду добавьте woocommerce_prevent_adjust_line_item_product_stock перехват фильтра

 /**
 * Prevent adjust line item
 * 
 * @param $prevent
 * @param $item
 * @param $quantity
 */
function filter_woocommerce_prevent_adjust_line_item_product_stock ( $prevent, $item, $quantity ) {
    // Get order
    $order = $item->get_order();
    
    if ( $order->has_status( 'quote' ) ) {
        $prevent = true;
    }

    return $prevent;
}
add_filter( 'woocommerce_prevent_adjust_line_item_product_stock', 'filter_woocommerce_prevent_adjust_line_item_product_stock', 10, 3 );
 

Комментарии:

1. Спасибо. К сожалению, у меня это не работает. Например, если я изменю статус заказа с «отменен» на «котировка», запасы все равно уменьшатся. Может ли это быть связано с тем, что он проверяет статус старого заказа (отменен) вместо нового статуса (котировка)? Я пробовал разные приоритеты подключений вместо 10 (например, 1 и 20), но результат все тот же.

2. это действительно причина, вы можете попробовать это с помощью has_status «отменено», и тогда вы увидите, что это действительно имеет свой эффект. Поскольку заказ уже имеет статус во внешнем интерфейсе, предполагается, что это также относится и к серверной части.

3. Блестяще! Большое вам спасибо за вашу помощь. Для моего рабочего процесса я смог просто добавить «отменено» в список статусов: $order->has_status ( array ('quote', 'cancelled') ) теперь это работает отлично