Tengo un problema recurrente en mi sitio de Woocommerce que es que el carrito no se borra después de realizar un pedido en mi sitio.
Quiero agregar un código en my_theme/functions.php para asegurarme de que el carrito esté vacío. Logré crear este código (abajo).
¿Será esto suficiente para obtener lo que necesito?
add_action('woocommerce_new_order','clear_the_cart'); function clear_the_cart() { global $woocommerce; $woocommerce->cart->empty_cart(); }¿Necesito agregar un código para obtener la ID de usuario y luego borrar el carrito para ese usuario?
Si el carrito se borra para cada usuario en lugar de para todos los usuarios, supongo que necesitaré obtener la identificación del usuario actual y luego ejecutar la línea de código para borrar el carrito para ese usuario.
Mi pregunta es si debo limpiar el carrito por usuario o globalmente?
Sé cómo agarrar la identificación del usuario:
$user_ID = get_current_user_id(); ....Su método debería funcionar como se esperaba cuando se agrega a function.php.
También puede llamarlo usando WC()->cart->empty_cart(); . el empty_cart() tiene un parámetro $clear_persistent_cart , pero es verdadero por defecto, por lo que su código está bien.
Puede verificar su tema y complementos si no hay nada extraño enganchado en el woocommerce_before_cart_emptied , que se activa al comienzo del método empty_cart() .
El empty_cart() solo vaciará el carrito del usuario actual (el que pasa el pedido), y si este código no es ejecutado por otro servidor (ej: cola) o proceso PHP: los datos de la sesión del cliente estarán disponibles, y así el carrito se puede vaciar. Esto no borrará todos los contenidos del carrito del cliente (para reanudar, se debe llamar a empty_cart() desde una solicitud del cliente (ajax o no), y borrará este carrito del cliente).
Por el contrario, un webhook o una solicitud admin-ajax de su proveedor de pagos a su pasarela de Woocommerce, o un CRON, no borrará ningún carrito (no tiene datos de sesión). Si ese es su caso, necesitará algo como: guardar la identificación de los clientes en algún lugar de la base de datos, luego conectarla en algún lugar (como init ) con un método que verifique "Si la identificación del usuario está en la matriz de la base de datos, clear_cart() , luego elimínela de la matriz de la base de datos".
Ahora, Woocommerce debería borrar el carrito de forma predeterminada una vez que se completa el pedido. Aquí hay algunas cosas para probar y probar:
add_action( 'woocommerce_new_order', 'clear_the_cart', 50, 3 ); , aumentando la prioridad de $ para que se ejecute al finalwoocommerce_order_status_completed si cumple con sus requisitoswp_die() o relacionado, en su método clear_the_cart() para validar que este código se active después de su pedido?Tenga en cuenta que algunos complementos (y, por lo tanto, algunos códigos personalizados en los ganchos) pueden evitar que el carrito se vacíe después de completar el pedido ( ver )