Сокращать запас только для определенных статусов заказа и способа оплаты в Woocommerce
Я работаю над некоторыми пользовательскими функциями Woocommerce для клиента. Они используют платежный шлюз BACS для обработки ручных платежей.
Тем не менее, шлюз в настоящее время уменьшает запас слишком рано для наших нужд, то есть, когда заказ находится в режиме ожидания. Я хотел бы ТОЛЬКО уменьшить запас, когда заказ помечен как "Обработка" или "Завершено" (избегая дублирования сокращений).
Мне удалось предотвратить снижение запаса, пока он находится в режиме ожидания, с помощью следующего фрагмента:
function wcs_do_not_reduce_onhold_stock( $reduce_stock, $order ) {
if ( $order->has_status( 'on-hold' ) ) {
$reduce_stock = false;
}
return $reduce_stock;
}
add_filter( 'woocommerce_can_reduce_order_stock', 'wcs_do_not_reduce_onhold_stock', 10, 2 );
Я не слишком уверен, как поступить, хотя. Хотя приведенный выше код работает, добавление следующего условия не работает:
else if ( $order->has_status( 'processing' ) || $order->has_status( 'completed' ) ) {
$reduce_stock = true;
}
Короче говоря, я бы хотел, чтобы акции менялись в зависимости от следующих статусов акций:
- На удержании - ничего не делает
- Завершено или выполняется обработка - уменьшить запас (только один раз)
- Отменено - увеличение запаса (только если изначально уменьшено)
Любая помощь высоко ценится!
3 ответа
Использование пользовательской функции подключено woocommerce_order_status_changed
Вы сможете настроить изменение статусов "обработка" и "завершение", уменьшая количество позиций заказа.
Я добавил в вашу функцию условие нацеливания только на платежный шлюз "BACS" для заказов.
add_filter( 'woocommerce_can_reduce_order_stock', 'wcs_do_not_reduce_onhold_stock', 10, 2 );
function wcs_do_not_reduce_onhold_stock( $reduce_stock, $order ) {
if ( $order->has_status( 'on-hold' ) && $order->get_payment_method() == 'bacs' ) {
$reduce_stock = false;
}
return $reduce_stock;
}
add_action( 'woocommerce_order_status_changed', 'order_stock_reduction_based_on_status', 20, 4 );
function order_stock_reduction_based_on_status( $order_id, $old_status, $new_status, $order ){
// Only for 'processing' and 'completed' order statuses change
if ( $new_status == 'processing' || $new_status == 'completed' ){
$stock_reduced = get_post_meta( $order_id, '_order_stock_reduced', true );
if( empty($stock_reduced) && $order->get_payment_method() == 'bacs' ){
wc_reduce_stock_levels($order_id);
}
}
}
Код помещается в файл function.php активной дочерней темы (или активной темы).
Проверено и работает
Принятый ответ не сработал для меня. Первая часть сделала, а вторая нет, вот как я ее модифицировал:
// This is the same as the accepted answer
add_filter( 'woocommerce_can_reduce_order_stock', 'wcs_do_not_reduce_onhold_stock', 10, 2 );
function wcs_do_not_reduce_onhold_stock( $reduce_stock, $order ) {
if ( $order->has_status( 'on-hold' ) && $order->get_payment_method() == 'bacs' ) {
$reduce_stock = false;
}
return $reduce_stock;
}
// This is what I changed
add_action( 'woocommerce_order_status_processing', 'reduce_stock_on_bacs_order_status_change', 10, 1 );
add_action( 'woocommerce_order_status_completed', 'reduce_stock_on_bacs_order_status_change', 10, 1 );
function reduce_stock_on_bacs_order_status_change( $order_id ) {
// Get the order object
$order = wc_get_order( $order_id );
// Check if the order was paid using BACS
if ( 'bacs' == $order->get_payment_method() ) {
// Check if the stock reduction has already been done for this order
$stock_reduction_done = get_post_meta( $order_id, '_stock_reduction_done', true );
if ( ! $stock_reduction_done ) {
// Iterate over the order items
foreach( $order->get_items() as $item_id => $item ) {
// Reduce stock for each item
$product = $item->get_product();
$qty = $item->get_quantity();
$product->reduce_stock( $qty );
}
// Mark the stock reduction as done for this order
update_post_meta( $order_id, '_stock_reduction_done', true );
}
}
}
Это не уменьшит запас наBACS
платежи до тех пор, пока заказ не будет отмечен какprocessing
илиcompleted
.
Может ли кто-нибудь поддержать, пожалуйста, у меня есть индивидуальный статус, который называется "wc-pack" и "wc-shipped". Мне нужно, чтобы уровень запасов уменьшался, когда я выбираю один из них, и не действует при любом другом статусе
и даже я перехожу с этого статуса на другой, уровень запасов восстановлен
и у меня есть еще один пользовательский статус под названием "WC-RTRN"