¿El hook para el botón AJAX de Añadir al Carrito?
¿Alguien ha tenido la necesidad de agregar el botón AJAX de añadir al carrito (el que se encuentra en los archivos de productos) en una salida de consulta personalizada de productos?
¿Podrían compartir el hook? No logro encontrar el correcto.

Analizando el código, es bastante sencillo de encontrar.
Primero, mira la plantilla utilizada para los archivos de productos - /templates/archive-product.php
. Entre otras cosas, configura las consultas regulares y comienza a construir el marcado de la página.
Pero cuando realmente comienza a iterar a través de cada producto, delega el trabajo a /templates/loop-shop.php
. Esta plantilla se carga para cada producto y construye un listado utilizando el siguiente código:
<?php do_action('woocommerce_before_shop_loop_item'); ?>
<a href="<?php the_permalink(); ?>">
<?php do_action('woocommerce_before_shop_loop_item_title', $post, $_product); ?>
<h3><?php the_title(); ?></h3>
<?php do_action('woocommerce_after_shop_loop_item_title', $post, $_product); ?>
</a>
<?php do_action('woocommerce_after_shop_loop_item', $post, $_product); ?>
La parte que nos interesa es la última acción: woocommerce_after_shop_loop_item
. Está conectada en /woocommerce_template_actions.php
a la función woocommerce_template_loop_add_to_cart()
.
Profundizando aún más, parece que esta función es la que necesitas.
Cómo Añadirla
La forma más fácil de usar esta función es llamarla directamente. Solo ten en cuenta que requiere dos parámetros, $post
y $_product
. El siguiente código la llamaría correctamente:
global $post; // Asumiendo que ya está configurado
$_product = &new woocommerce_product( $post->ID );
woocommerce_template_loop_add_to_cart( $post, $_product );
La función misma llama a sus propios echo
, así que simplemente llámala directamente.

Esto muestra exactamente lo que necesito, excepto que parece que el botón debe estar vinculado a algún JS, porque ahora, cuando hago clic, carga el producto sin añadirlo al carrito aunque el enlace luce así: {url}/?add-to-cart=9686

Eso simplemente significa que los archivos de scripts de WooCommerce no están siendo encolados. Mira en /woocommerce.phpy verás cómo
woocommerce_frontend_scripts()está vinculado al hook
template_redirect`. Necesitarás enlazar esto a tu propio código o cargar manualmente los scripts específicos del front-end que necesites.

Puedo ver que está cargando los archivos predeterminados woocommerce.min.js y relacionados, pero el botón no es capturado por el manejador live('click')
. ¿Algún consejo?

Sin ver tu sitio, solo puedo dar consejos limitados. El manejador de clic está envuelto en otra verificación: if (woocommerce_params.option_ajax_add_to_cart=='yes') {
¿El código está pasando este punto?

Hola, verifiqué eso y he avanzado un poco más. Ahora parece que $.post() no recibe ninguna respuesta. Parece que admin-ajax.php no devuelve nada.

Eso significa que los hooks AJAX no se están agregando. add_action('wp_ajax_woocommerce_add_to_cart', 'woocommerce_ajax_add_to_cart');
y add_action('wp_ajax_nopriv_woocommerce_add_to_cart', 'woocommerce_ajax_add_to_cart');
. Desafortunadamente, sin tener acceso directo a tu sitio, no hay mucho más que podamos hacer para ayudar. Necesitarás contratar a un desarrollador para que lo revise, o quizás contactar directamente al equipo de WooCommerce.
