2016-06-15 51 views
14

Quando si tenta di aggiornare a livello di codice un ordine durante un hook WP_Ajax. IE.Woocommerce: aggiornamento programmatico dello stato dell'ordine

$order = wc_create_order($order_data); 
$order->add_product(get_product($membership_product_ids[0]), 1); 
$order->set_address($address, 'billing'); 
$order->set_address($address, 'shipping'); 
$order_id = $order->id; 
$order->update_status('completed'); 

ottengo i seguenti errori:

Warning: DOMXPath::query(): Invalid expression in /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php on line 299

Warning: DOMXPath::query(): Invalid expression in /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php on line 299

Warning: Invalid argument supplied for foreach() in /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php on line 302

Warning: DOMXPath::query(): Invalid expression in /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php on line 299

Warning: DOMXPath::query(): Invalid expression in /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php on line 299

Warning: Invalid argument supplied for foreach() in /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php on line 302

Se rimuovo che update_status funzione non è così errori.

+1

Ho provato sopra il codice con un altro codice mio, funziona perfettamente sulla mia macchina senza errori. Puoi aggiornare il tuo codice completo qui sopra in modo che io possa riprodurlo esattamente. Sarà utile se puoi fornire i dettagli della versione di WP, WC, browser, sistema operativo e dove ricevi questi errori o screenshot. –

+0

Che cosa hai ricevuto via email quando crei un ordine e hai cambiato lo stato completato, il tuo ordine è stato creato ma non hai ricevuto nessuna e-mail di conferma dell'ordine – user5200704

risposta

3

non sono sicuro, ma si potrebbe provare questo trucco utilizzando new WC_Order($order_id);, per evitare l'errore:

// global $woocommerce; // in case of need… 
$order = wc_create_order($order_data); 
$order_id = $order->id; // moving this here 
$_order = new WC_Order($order_id); // here 
$_order->add_product(get_product($membership_product_ids[0]), 1); 
$_order->set_address($address, 'billing'); 
$_order->set_address($address, 'shipping'); 
$_order->update_status('completed'); 

Sono d'accordo che questo è un problema strano.

+0

Questo non ha risolto l'errore per me sfortunatamente, ma grazie per aver provato un simile strano problema! Upvote! –

+2

@NicholasKoskowski Non ho ancora errori nel testare il tuo codice ... Per favore, per essere veramente aiutato, aggiorna la tua domanda con il codice completo e molti altri dettagli. Grazie – LoicTheAztec

5

Gli errori che stai vedendo provengono dal sistema di notifica. Il tuo codice sembra in grado di aggiornare lo stato bene. La classe Emogrify viene utilizzata per generare CSS in linea in un modello HTML. Probabilmente vedrai questi errori perché A) hai sovrascritto il modello di email "Ordine completato" e hai creato un errore di parsing o B) c'è un componente aggiuntivo WooCommerce che è in qualche modo in conflitto con quello che stai facendo.

Per correggere il problema, il primo passo sarà verificare che si tratti del sistema di notifica andando nell'amministratore sotto WooCommerce-> Impostazioni-> Email-> Ordine completato e deselezionando "Abilita questa notifica via email" scatola. Quindi salvalo e riprova.

Se il tuo errore scompare, controlla la directory del tema per un override di quel modello. Sarebbe in <themename>/woocommerce/emails/customer-completed-order.php. Se ne hai uno, lo rinominano in modo tale che non eseguano più l'override e riattiva la notifica "Ordine completato" e verifica se l'utilizzo del modello predefinito corregge il problema.

Se il problema persiste con il modello di notifica e-mail predefinito, disabilitare tutti i componenti aggiuntivi WooCommerce che è possibile installare e ripetere il test. A questo punto, se funziona, puoi riattivarli uno alla volta fino a quando il problema non ritorna. Una volta trovato il componente aggiuntivo offendente, sarà necessario modificare il codice per consentire al componente aggiuntivo di non causare un problema o contattare lo sviluppatore aggiuntivo per risolvere il problema.

1

Come è problema raro, è meglio manualmente aperta:

/wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php

e prima linea di 299, inserire queste righe, e vedere che cosa si otterrà:

var_dump($value); 
var_dump($this->translateCssToXpath($value['selector'])); 
var_dump($xpath->query($this->translateCssToXpath($value['selector']))); 
0

ho capito questo provando una serie di diversi ganci, il problema era che il gancio stavo usando per c Riattiva l'ordine prima che il woocommerce inizializzasse quello che ha causato questo problema.