Woocommerce - cambiar el estado del pedido de en espera a pago pendiente
Estoy tratando de automatizar el cambio en el estado del pedido de "en espera" a "pago pendiente" una vez que un vendedor del producto ha marcado un pedido como completado. Actualmente, el estado predeterminado es "en espera" cuando se crea un pedido y solo una vez que el producto se entrega se debe requerir el pago. ¿Es posible actualizar al estado "pendiente" después de que se haya realizado una acción?

Si alguna vez necesitas cambiar el estado del pedido desde PHP, aquí te mostramos cómo hacerlo.
$order = new WC_Order($order_id);
if (!empty($order)) {
$order->update_status( 'completed' );
}
Valores posibles: processing, on-hold, cancelled, completed
Este código proviene de woocommerce/includes/abstracts/abstract-wc-order.php

un poco tarde, pero aún difícil de encontrar...
Valores posibles
Basado en https://www.bozzmedia.com/posts/get-know-woocommerce-status-definitions/
"processing, on-hold, cancelled, completed, pending, failed, refunded"
y que está soportado en la clase Order de WooCommerce..
/woocommerce/includes/class-wc-order.php - Alrededor de la línea 108 aproximadamente.
Asumiendo que no usas un plugin capaz de agregar más.

Esto funcionará:
add_filter( 'woocommerce_bacs_process_payment_order_status', function( $status = 'on_hold', $order = null ) {
return 'pending';
}, 10, 2 );
PERO si lo usas, el cambio de estado podría causar que los correos no se envíen después de que llegue un pedido, ya que pasa demasiado rápido de 'on hold' (en espera) a 'pending' (pendiente), y WooCommerce no envía correos en estado 'pending'. Probé esto, y después de unos días los correos ya no se enviaban aunque inicialmente funcionó.

Sí, solo debes agregar cuando quieras cambiar el estado y añadirlo dentro de esta función.
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(tu condición va aquí){
//asignar estado a esa orden
$order->status = 'pending';
}
}

Hola sonalip3, ¡gracias por tu respuesta! He añadido mis condiciones, pero el código todavía no funciona... 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' ){
//asignar estado a esa orden
$order->status = 'pending';
}
}

Lo he probado usando solo la condición de estado 'on-hold' y funciona si cambio la asignación de estado a la orden por: $order->update_status('pending'). ¿Puedo preguntarte? Necesito obtener el fulfillment_status de la tabla woocommerce_order_itemmeta, ¿sabes cómo puedo hacer esto usando el mismo order_id?

No sé qué plugin estás usando para 'fulfillment_status', así que simplemente intenta imprimir $order y revisar el objeto de pedido. La mayoría de veces el objeto $order guarda ese fulfillment_status. Imprime esto antes de la condición: echo '<pre>';print_r($order);exit; . Inténtalo y te dará el objeto de pedido.

El plugin es Woocommerce product vendor, de donde viene el fulfillment_status. ¿Cómo puedo ver dónde están los resultados de la impresión para obtener el objeto de pedido?

¿Es un plugin de pago verdad? No lo tengo. Así que simplemente añade esta línea: echo '<pre>';print_r($order);exit; después de esta línea: $order = new WC_Order( $order_id ); y verifica actualizando el estado. Este es el objeto donde debería estar agregado el 'fulfillment_status'.

Sí, es un plugin de pago. He agregado este código, pero no puedo ver nada cuando lo ejecuto. ¿Cómo o dónde puedo ver los resultados del print_r echo?
