Problema con add_action('wp_ajax_[nome azione]', miafunzione) in WordPress
Sto cercando di integrare AJAX in WordPress seguendo le linee guida del codex WordPress. Nel PHP ho aggiunto:
wp_enqueue_script ( 'my_ajax', ADMIN_URL . 'js/ajax.js','jquery','1.0.0' );
wp_localize_script( 'my_ajax', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
Il codice AJAX è:
jQuery.ajax({url: MyAjax.ajaxurl, type: "POST",data: {action: 'myaction',postID : MyAjax.postID}, success: function(response) {
alert('Ricevuto dal server: ' + response);
}});
e la funzione PHP che dovrebbe essere chiamata da AJAX è:
function ajax_function() {
...fai qualcosa...
}
add_action('wp_ajax_myaction', 'ajax_function');
add_action('wp_ajax_admin_myaction', 'ajax_function');
La chiamata AJAX ha successo (l'"alert" funziona), tuttavia, la funzione PHP "ajax_function" non viene mai chiamata. Dopo aver fatto un po' di debug ho realizzato che anche se la chiamata action add_action('wp_ajax_ imposta un nuovo elemento nell'array globale $wp_filter, quando il corrispondente do_action viene eseguito all'interno di admin-ajax.php, l'array $wp_filter non contiene più quell'elemento.
Pertanto, la funzione "ajax_function" viene ignorata. Qualche idea sul perché la funzione non viene chiamata?
Nei miei progetti lo faccio così
PHP
function foo() {
echo 'bar';
}
add_action('wp_ajax_foo', 'foo' ); // eseguito quando loggato
add_action('wp_ajax_nopriv_foo', 'foo' ); // eseguito quando non loggato
Javascript
data = { action: 'foo', avalue: 'some value', 'anothervalue': 'another value' };
jQuery.post(ajaxurl, data, function(response){
alert(response);
});

Grazie per la risposta. Conosco questa guida, l'ho esaminata anch'io. Ho modificato la funzione per renderla esattamente come la tua ma senza successo :-( La funzione ancora non viene chiamata.

Nel mio esempio ho presupposto che la variabile fosse già impostata. Nel backend di WP la variabile è sempre impostata. Nel frontend la definisco semplicemente nell'header. <script type="text/javascript"> var ajaxurl = <?php bloginfo('url') ?>'/wp-admin/admin-ajax.php'; </script> Scommetto che esiste un modo più intelligente per gestirla.

Capisco. Comunque, la funzione ancora non funziona per me. Ha importanza che l'ajax sia per il back end di amministrazione? O dovrebbero essere usate le stesse funzioni?

Alla fine l'ho sistemato. Il problema era l'ordine di caricamento e la posizione delle chiamate add_action. Ho un'altra piccola domanda: hai scritto data = { action: 'foo', avalue: 'some value', 'anothervalue': 'another value' }; E se volessi includere un array come valore di una delle chiavi?

Questo è legato a jQuery e a come vuoi aggiungere i dati per la richiesta ajax. http://api.jquery.com/jQuery.post/ guarda gli esempi, ci sono diversi modi per includere i dati nella richiesta.

Segui il codice:
add_action( 'wp_ajax_add_myfunc', 'prefix_ajax_add_myfunc' );
add_action( 'wp_ajax_nopriv_add_myfunc', 'prefix_ajax_add_myfunc' );
function prefix_ajax_add_myfunc() {
// Gestisci la richiesta e genera una risposta usando WP_Ajax_Response
}
e nella tua chiamata ajax fai così:
jQuery.post(
ajaxurl,
{
'action': 'add_myfunc',
'data': 'foobarid'
},
function(response){
alert('Il server ha risposto: ' + response);
}
);
Nella chiamata ajax chiamerai la tua funzione senza prefix_ajax_
. Chiamala solo con la parte rimanente. In questo caso è add_myfunc
. Nella risposta invierà done
se tutto va bene. Altrimenti la risposta sarà 0
o -1
.
Spero che ti sia utile. Grazie.
