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ă.
user1567
Î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.
Horttcore
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?
user1567
Î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?
user1567
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.
Horttcore
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.