WooCommerce - изменение статуса заказа с "на удержании" на "ожидает оплаты"
Я пытаюсь автоматизировать изменение статуса заказа с "на удержании" на "ожидает оплаты" после того, как продавец отметил заказ как выполненный. В настоящее время статус по умолчанию - "на удержании", когда создается заказ, и только после доставки товара требуется оплата. Возможно ли обновить статус на "ожидает оплаты" после выполнения определенного действия?

Если вам нужно изменить статус заказа через PHP, вот как это сделать.
$order = new WC_Order($order_id);
if (!empty($order)) {
$order->update_status( 'completed' );
}
Возможные значения: processing (в обработке), on-hold (на удержании), cancelled (отменён), completed (завершён)
Это взято из woocommerce/includes/abstracts/abstract-wc-order.php

Немного запоздало, но все же трудно найти...
Возможные значения
На основе https://www.bozzmedia.com/posts/get-know-woocommerce-status-definitions/
"processing, on-hold, cancelled, completed, pending, failed, refunded"
и это поддерживается в классе WooCommerce Order..
/woocommerce/includes/class-wc-order.php - Примерно около 108 строки.
При условии, что вы не используете плагин, способный добавлять больше статусов.

Это будет работать:
add_filter( 'woocommerce_bacs_process_payment_order_status', function( $status = 'on_hold', $order = null ) {
return 'pending';
}, 10, 2 );
НО если вы используете этот код, изменение статуса может привести к тому, что письма не будут отправляться после поступления заказа, так как переход из статуса 'on hold' в 'pending' происходит слишком быстро, а WooCommerce не отправляет письма для статуса 'pending'. Я пробовал это, и через несколько дней письма перестали отправляться, хотя изначально все работало.

Да, вы просто добавляете проверку, когда хотите изменить статус, внутри этой функции.
add_action('woocommerce_order_status_changed','status_changed_processsing');
function status_changed_processsing( $order_id, $checkout = null ) {
global $woocommerce;
$order = new WC_Order( $order_id );
if(ваше условие здесь){
//назначить статус для этого заказа
$order->status = 'pending';
}
}

Привет sonalip3, спасибо за ответ! Я добавил свои условия, но код все равно не работает... add_action('woocommerce_order_status_changed','status_changed_processsing');
function status_changed_processsing( $order_id, $checkout = null ) {
global $woocommerce;
$order = new WC_Order( $order_id );
if( $order->status == 'on-hold' && $order->fulfillment_status == 'fulfilled' ){
//назначить статус для этого заказа
$order->status = 'pending';
}
}

Я протестировал его, используя только условие статуса 'on-hold', и он работает, если изменить назначение статуса заказа на: $order->update_status('pending'). Могу я спросить, мне нужно получить fulfillment_status из таблицы woocommerce_order_itemmeta, знаете ли вы, как я могу это сделать, используя тот же order_id?

Я не знаю, какой плагин вы используете для 'fulfillment_status', поэтому просто попробуйте вывести $order и проверить объект заказа. Скорее всего, в объекте $order сохраняется этот fulfilment_status. Просто выведите это перед условием: echo '<pre>';print_r($order);exit; . Это даст вам объект заказа.

Плагин - это Woocommerce product vendor plugin, откуда берется fulfillment_status. Как мне увидеть результаты вывода, чтобы получить объект заказа?

Это платный плагин, верно? У меня его нет. Просто добавьте эту строку: echo '<pre>';print_r($order);exit; после этой строки: $order = new WC_Order( $order_id ); и проверьте, обновив статус. Это объект, в котором должен быть добавлен 'fulfillment_status'.

Да, это плагин. Я добавил этот код, но при его запуске ничего не вижу. Как и где я могу увидеть результаты print_r echo?
