Problema con add_action('wp_ajax_[nome azione]', miafunzione) in WordPress

1 dic 2010, 13:58:26
Visualizzazioni: 48.6K
Voti: 7

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?

2
Commenti

@user1567: Aggiungi la funzione agli hook wp_ajax_myaction e wp_ajax_admin_myaction. Non dovrebbe essere wp_ajax_myaction (per gli utenti loggati) e wp_ajax_nopriv_myaction (per gli utenti anonimi)?

Jan Fabry Jan Fabry
1 dic 2010 15:52:11

sì, l'ho corretto, grazie. A proposito, ho una chiamata update_option all'interno della funzione "ajax_function" che sembra fallire perché viene chiamata dopo che il caricamento di WordPress è completato? C'è un altro modo per usare update_option?

user1567 user1567
1 dic 2010 18:26:43
Tutte le risposte alla domanda 2
6

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);
});
1 dic 2010 14:27:06
Commenti

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.

user1567 user1567
1 dic 2010 14:43:49

a proposito, dove imposti il valore della variabile ajaxurl?

user1567 user1567
1 dic 2010 14:46:23

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.

Horttcore Horttcore
1 dic 2010 15:46:29

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?

user1567 user1567
1 dic 2010 16:35:08

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?

user1567 user1567
1 dic 2010 17:23:47

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.

Horttcore Horttcore
2 dic 2010 10:29:55
Mostra i restanti 1 commenti
0

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.

3 lug 2016 19:09:30