Woocommerce - cambiare lo stato dell'ordine da in attesa a pagamento in sospeso

1 mar 2017, 14:43:36
Visualizzazioni: 33.7K
Voti: 0

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?

0
Tutte le risposte alla domanda 4
0

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

3 lug 2017 13:07:01
1

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.

29 mag 2018 06:08:03
Commenti

come risponde alla domanda?

Mark Kaplun Mark Kaplun
29 mag 2018 07:45:32
0

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.

3 ott 2021 22:34:55
8
-1

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';
        }
   }
1 mar 2017 14:53:46
Commenti

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';
    }

}

Gill Gill
1 mar 2017 15:27:17

Sta entrando nella condizione if, hai verificato?

Sonali Sonali
2 mar 2017 06:44:17

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?

Gill Gill
2 mar 2017 10:27:41

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.

Sonali Sonali
2 mar 2017 10:54:15

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?

Gill Gill
2 mar 2017 11:42:30

È 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'.

Sonali Sonali
2 mar 2017 12:16:39

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?

Gill Gill
2 mar 2017 13:39:10

Hai verificato nel database che il tuo ID ordine abbia 'fulfillment_status' nella tabella woocommerce_order_itemmeta?... Perché la tabella woocommerce_order_itemmeta salva i dati degli articoli dell'ordine, non di quell'ordine specifico.

Sonali Sonali
3 mar 2017 07:44:22
Mostra i restanti 3 commenti