Problemă cu add_action('wp_ajax_[nume actiune]', myfunction) în WordPress
Încerc să integrez AJAX în WordPress folosind ghidurile din WordPress Codex. În PHP am adăugat:
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' ) ) );
Codul AJAX este:
jQuery.ajax({url: MyAjax.ajaxurl, type: "POST",data: {action: 'myaction',postID : MyAjax.postID}, success: function(response) {
alert('Am primit acest răspuns de la server: ' + response);
}});
iar funcția PHP care ar trebui să fie apelată prin AJAX este:
function ajax_function() {
...face ceva...
}
add_action('wp_ajax_myaction', 'ajax_function');
add_action('wp_ajax_admin_myaction', 'ajax_function');
Apelul AJAX este realizat cu succes (alerta funcționează), cu toate acestea, funcția PHP "ajax_function" nu este niciodată apelată. După ce am făcut puțină depanare, am realizat că, deși apelul action add_action('wp_ajax_ setează un nou element în array-ul global $wp_filter, când do_action corespunzător rulează în admin-ajax.php, array-ul $wp_filter nu mai conține acel element.
Prin urmare, funcția "ajax_function" este ignorată. Aveți vreo idee de ce funcția nu este apelată?
În proiectele mele fac asta în felul următor
PHP
function foo() {
echo 'bar';
}
add_action('wp_ajax_foo', 'foo' ); // executat când utilizatorul este autentificat
add_action('wp_ajax_nopriv_foo', 'foo' ); // executat când utilizatorul este deconectat
Javascript
data = { action: 'foo', avalue: 'some value', 'anothervalue': 'another value' };
jQuery.post(ajaxurl, data, function(response){
alert(response);
});

Mulțumesc pentru răspuns. Cunosc acest ghid, l-am parcurs și eu. Am modificat funcția să fie exact ca a ta, dar fără succes :-( Funcția încă nu este apelată.

În exemplul meu am presupus că variabila este deja setată. În WP Backend variabila este întotdeauna setată. În frontend eu o definesc pur și simplu în header. <script type="text/javascript"> var ajaxurl = <?php bloginfo('url') ?>'/wp-admin/admin-ajax.php'; </script> Pun pariu că există o metodă mai inteligentă de a gestiona asta.

Am înțeles. Oricum, funcția încă nu funcționează pentru mine. Contează că ajax-ul este pentru administrare (back end)? Sau ar trebui folosite aceleași funcții?

În sfârșit am reparat-o. Problema era ordinea de încărcare și locația apelurilor add_action. Am o altă mică întrebare: ai scris data = { action: 'foo', avalue: 'some value', 'anothervalue': 'another value' }; Ce se întâmplă dacă vreau să includ un array ca valoare pentru una dintre chei?

Aceasta este legată de jQuery și modul în care dorești să adaugi Date pentru cererea ajax. http://api.jquery.com/jQuery.post/ caută exemplele, există diferite modalități de a include date în cerere.

Vă rugăm să urmați codul:
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() {
// Gestionează cererea apoi generează răspunsul folosind WP_Ajax_Response
}
iar în apelul vostru ajax faceți astfel:
jQuery.post(
ajaxurl,
{
'action': 'add_myfunc',
'data': 'foobarid'
},
function(response){
alert('Serverul a răspuns: ' + response);
}
);
în apelul ajax veți apela funcția fără prefix_ajax_
. Apelați doar partea rămasă. În acest caz este add_myfunc
. În răspuns va trimite done
dacă totul merge bine. Altfel răspunsul va fi 0
sau -1
.
Sper că vă va fi de ajutor. Mulțumesc.
