Lorsque j'essaye de mettre à jour par programme une commande lors d'un hook WP_Ajax
. C'EST À DIRE.
$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');
Je reçois les erreurs suivantes:
Avertissement: DOMXPath :: query (): Expression non valide dans /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php à la ligne 299
Avertissement: DOMXPath :: query (): Expression non valide dans /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php à la ligne 299
Avertissement: argument non valide fourni pour foreach () dans /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php à la ligne 302.
Avertissement: DOMXPath :: query (): Expression non valide dans /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php à la ligne 299
Avertissement: DOMXPath :: query (): Expression non valide dans /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php à la ligne 299
Avertissement: argument non valide fourni pour foreach () dans /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php à la ligne 302.
Si je supprime cette fonction update_status
, elle ne commet pas d'erreur.
Les erreurs que vous voyez proviennent du système de notification. Votre code semble capable de mettre à jour le statut très bien. La classe Emogrify est utilisée pour générer des CSS en ligne dans un modèle HTML. Vous rencontrez probablement ces erreurs car A) vous avez remplacé le modèle de courrier électronique "Commande terminée" et créé une erreur d'analyse ou B) il existe un module complémentaire WooCommerce qui entre en conflit avec ce que vous faites.
Pour corriger le problème, la première étape consistera à vérifier qu'il s'agit bien du système de notification en accédant à l'administrateur sous WooCommerce-> Paramètres-> E-mail-> Commande terminée et en décochant la case "Activer cette notification par e-mail". Puis enregistrez cela et refaites un test.
Si votre erreur disparaît, vérifiez dans le répertoire de votre thème le remplacement de ce modèle. Ce serait en <themename>/woocommerce/emails/customer-completed-order.php
. Si vous en avez un, renommez-le pour qu'il ne remplace plus la notification "Commande terminée" et réactivera la notification pour voir si l'utilisation du modèle par défaut corrige le problème.
Si le problème persiste avec le modèle de notification par courrier électronique par défaut, désactivez tous les modules complémentaires WooCommerce que vous avez éventuellement installés et testez à nouveau. À ce stade, si cela fonctionne, vous pouvez les réactiver un par un jusqu'au retour du problème. Une fois que vous avez trouvé l'add-on incriminé, vous devrez soit ajuster votre code pour permettre à l'add-on de ne pas causer de problème, soit contacter le développeur de l'add-on pour résoudre votre problème.
Je ne suis pas sûr mais vous pouvez essayer cette astuce en utilisant new WC_Order( $order_id );
, pour éviter l'erreur:
// 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');
Je conviens que c'est un problème étrange.
Vous deviez demander cela sur Wordpress.Stackexchange.com
Comme il s'agit d'un problème rare, vous feriez mieux d'ouvrir manuellement:
/wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php
et avant la ligne 299, insérez ces lignes et voyez ce que vous obtiendrez:
var_dump($value);
var_dump($this->translateCssToXpath($value['selector']));
var_dump($xpath->query($this->translateCssToXpath($value['selector'])));
J'ai compris cela en essayant différents crochets. Le problème était que le crochet que j'utilisais pour créer l'ordre était déjà en place avant que woocommerce ne initialise le problème.