L'hook per il pulsante AJAX Aggiungi al Carrello?
Analizzando il codice, è abbastanza semplice da trovare.
Innanzitutto, guarda il template utilizzato per gli archivi dei prodotti - /templates/archive-product.php
. Tra le altre cose, imposta le query standard e inizia a costruire il markup della pagina.
Ma quando inizia effettivamente a scorrere ogni prodotto, delega il lavoro a /templates/loop-shop.php
. Questo template viene caricato per ogni prodotto e costruisce un elenco utilizzando il seguente codice:
<?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 che ci interessa è l'ultima azione: woocommerce_after_shop_loop_item
. È collegata in /woocommerce_template_actions.php
alla funzione woocommerce_template_loop_add_to_cart()
.
Scavando ancora più a fondo, sembra che questa funzione sia quella che ti serve.
Come Aggiungerla
Il modo più semplice per utilizzare questa funzione è chiamarla direttamente. Tieni presente che richiede due parametri, $post
e $_product
. Il seguente codice la chiamerebbe correttamente:
global $post; // Assumendo che sia già impostato
$_product = &new woocommerce_product( $post->ID );
woocommerce_template_loop_add_to_cart( $post, $_product );
La funzione stessa chiama i propri echo
, quindi chiamala direttamente.

Questo restituisce esattamente ciò di cui ho bisogno, ma sembra che il pulsante debba essere collegato a qualche JS, perché ora, quando lo clicco, carica il prodotto senza aggiungerlo al carrello anche se il link appare così: {url}/?add-to-cart=9686

Questo significa semplicemente che i file di script di WooCommerce non sono stati accodati. Dai un'occhiata a /woocommerce.phpe vedrai come
woocommerce_frontend_scripts()è collegato all'hook
template_redirect`. Dovrai collegarlo al tuo codice o caricare manualmente gli script front-end specifici di cui hai bisogno.

Posso vedere che sta caricando i file predefiniti woocommerce.min.js e quelli correlati, ma il pulsante non viene rilevato dal gestore live('click')
. Qualche consiglio?

Senza vedere il tuo sito, posso darti solo alcuni consigli generali. Il gestore del click è racchiuso in un altro controllo: if (woocommerce_params.option_ajax_add_to_cart=='yes') {
il codice supera questo controllo?

Ciao, ho verificato e sono andato un po' più avanti, ora sembra che $.post() non riceva alcuna risposta. Sembra che admin-ajax.php non restituisca nulla.

Ciò significa che gli hook AJAX non vengono aggiunti. add_action('wp_ajax_woocommerce_add_to_cart', 'woocommerce_ajax_add_to_cart');
e add_action('wp_ajax_nopriv_woocommerce_add_to_cart', 'woocommerce_ajax_add_to_cart');
. Sfortunatamente, senza poter lavorare direttamente sul tuo sito, non possiamo fare molto altro per aiutarti. Dovrai assumere uno sviluppatore per dare un'occhiata o contattare direttamente il team di WooCommerce.

Questa è una cosa davvero stupida, ma si è scoperto che il tema che sto usando aveva un gestore jQuery click()
che interrompeva la richiesta AJAX. L'ho modificato in modo che non venga inoltrato quando viene cliccato il pulsante .add_to_cart_button
, ma solo per tutto il resto.
