Woocommerce: actualización programática del estado del pedido

4 minutos de lectura

avatar de usuario
Nicolás Koskowski

Cuando trato de actualizar mediante programación un pedido durante un WP_Ajax gancho. ES DECIR.

$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');

Recibo los siguientes errores:

Advertencia: DOMXPath::query(): expresión no válida en /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php en la línea 299

Advertencia: DOMXPath::query(): expresión no válida en /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php en la línea 299

Advertencia: Se proporcionó un argumento no válido para foreach() en /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php en la línea 302

Advertencia: DOMXPath::query(): expresión no válida en /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php en la línea 299

Advertencia: DOMXPath::query(): expresión no válida en /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php en la línea 299

Advertencia: Se proporcionó un argumento no válido para foreach() en /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php en la línea 302

si quito eso update_status funciona no da errores.

  • Probé el código anterior con un código adicional mío, funciona bien en mi máquina sin ningún error. ¿Puede actualizar su código completo arriba para que pueda reproducirlo exactamente? Será útil si puede proporcionar detalles de la versión de WP, WC, navegador, sistema operativo y dónde obtiene estos errores o una captura de pantalla.

    – Ratnakar – Tienda de aplicaciones

    10/09/2016 a las 15:30

  • Lo que recibió cualquier correo electrónico cuando creó un pedido y cambió el estado completado, su pedido se crea pero no recibió ninguna confirmación por correo electrónico sobre el pedido completo

    – usuario5200704

    10 de septiembre de 2016 a las 21:18

Los errores que está viendo provienen del sistema de notificación. Su código parece poder actualizar el estado correctamente. La clase Emogrify se utiliza para generar CSS en línea en una plantilla HTML. Es probable que vea estos errores porque A) ha anulado la plantilla de correo electrónico “Pedido completado” y ha creado un error de análisis o B) hay un complemento de WooCommerce que está en conflicto de alguna manera con lo que está haciendo.

Para corregir el problema, el primer paso será verificar que se trata del sistema de notificación ingresando al administrador en WooCommerce->Configuración->Correo electrónico->Pedido completado y desmarcando la casilla “Habilitar esta notificación por correo electrónico”. Luego guarde eso y vuelva a probar.

Si su error desaparece, verifique su directorio de temas para anular esa plantilla. estaría en <themename>/woocommerce/emails/customer-completed-order.php. Si tiene uno, cámbiele el nombre para que ya no se anule y reactive la notificación “Pedido completado” y vea si el uso de la plantilla predeterminada corrige el problema.

Si el problema persiste con la plantilla de notificación de correo electrónico predeterminada, deshabilite todos los complementos de WooCommerce que haya instalado y vuelva a probar. En este punto, si funciona, puede volver a habilitarlos uno por uno hasta que vuelva el problema. Una vez que haya encontrado el complemento ofensivo, deberá ajustar su código para permitir que el complemento no cause un problema o comunicarse con el desarrollador del complemento para solucionar su problema.

No estoy seguro, pero podrías probar este truco usando new WC_Order( $order_id );para evitar el error:

// 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');

Estoy de acuerdo en que es un problema extraño.

  • Desafortunadamente, esto no solucionó el error, pero gracias por intentarlo, ¡es un problema tan extraño! ¡Votar!

    – Nicolás Koskowski

    20 de junio de 2016 a las 18:59

  • @NicholasKoskowski No tengo errores al probar su código… Por favor, para recibir ayuda, actualice su pregunta con el código completo y muchos más detalles. Gracias

    – LoicTheAztec

    11 de septiembre de 2016 a las 9:16


Como es un problema raro, será mejor que abras manualmente:

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

y antes de la línea 299, inserte estas líneas y vea lo que obtendrá:

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

Descubrí esto probando una variedad de ganchos diferentes, el problema era que el gancho que estaba usando para crear el pedido sucedió antes de que WooCommerce inicializara lo que causó este problema.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad