Woocommerce - cambiare lo stato dell'ordine da in attesa a pagamento in sospeso
Sto cercando di automatizzare il cambio dello stato dell'ordine da "in attesa" a "pagamento in sospeso" una volta che un venditore ha contrassegnato un ordine come evaso. Attualmente, lo stato predefinito è "in attesa" quando viene creato un ordine e il pagamento deve essere richiesto solo dopo che il prodotto è stato consegnato. È possibile aggiornare lo stato a "in sospeso" dopo che è stata eseguita un'azione?

Se hai mai bisogno di cambiare lo stato dell'ordine da PHP, ecco come puoi farlo.
$order = new WC_Order($order_id);
if (!empty($order)) {
$order->update_status( 'completed' );
}
Valori possibili: processing, on-hold, cancelled, completed
Questo codice proviene da woocommerce/includes/abstracts/abstract-wc-order.php

un po' in ritardo, ma comunque difficile da trovare...
Valori possibili
Basato su https://www.bozzmedia.com/posts/get-know-woocommerce-status-definitions/
"processing, on-hold, cancelled, completed, pending, failed, refunded"
e che è supportato nella classe WooCommerce Order..
/woocommerce/includes/class-wc-order.php - Intorno alle righe 108 o giù di lì.
Supponendo che tu non utilizzi un plugin in grado di aggiungerne altri.

Questo funzionerà:
add_filter( 'woocommerce_bacs_process_payment_order_status', function( $status = 'on_hold', $order = null ) {
return 'pending';
}, 10, 2 );
MA se lo usi, il cambio di stato potrebbe causare l'invio mancato delle email dopo che un ordine viene ricevuto, poiché passa troppo rapidamente da 'on hold' a 'pending', e WooCommerce non invia email per lo stato 'pending'. Ho provato questo metodo e dopo alcuni giorni le email non venivano più inviate, nonostante inizialmente funzionasse.

Sì, devi solo aggiungere la funzione quando vuoi cambiare lo stato e inserirla all'interno di questa funzione.
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(tua condizione qui){
//assegna lo stato a quell'ordine
$order->status = 'pending';
}
}

Ciao sonalip3, grazie per la tua risposta! Ho aggiunto le mie condizioni, ma il codice ancora non funziona...
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' ){
//assegna lo stato all'ordine
$order->status = 'pending';
}
}

L'ho testato usando solo la condizione dello stato 'on-hold' e funziona se cambio l'assegnazione dello stato all'ordine con: $order->update_status('pending'). Posso chiederti, ho bisogno di ottenere il fulfillment_status dalla tabella woocommerce_order_itemmeta, sai come posso fare questo usando lo stesso order_id?

Non so quale plugin stai utilizzando per 'fulfillment_status', quindi prova semplicemente a stampare $order e controlla l'oggetto dell'ordine, molto probabilmente l'oggetto $order ha salvato quel fulfillment_status. Stampa questo prima della condizione: echo '<pre>';print_r($order);exit; . e prova, ti darà l'oggetto dell'ordine.

Il plugin è il Woocommerce product vendor plugin, da cui proviene il fulfillment_status. Come posso vedere dove sono i risultati della stampa per ottenere l'oggetto dell'ordine?

È un plugin a pagamento, giusto? Non lo possiedo. Quindi aggiungi questa riga: echo '<pre>';print_r($order);exit; dopo questa riga:$order = new WC_Order( $order_id ); e verifica aggiornando lo stato. Questo è l'oggetto dove dovrebbe essere aggiunto 'fulfillment_status'.

Sì, è un plugin a pagamento. Ho aggiunto questo codice, ma non riesco a vedere nulla quando lo eseguo. Come o dove posso vedere i risultati del print_r echo?
