Problemă cu add_action('wp_ajax_[nume actiune]', myfunction) în WordPress

1 dec. 2010, 13:58:26
Vizualizări: 48.6K
Voturi: 7

Î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ă?

2
Comentarii

@user1567: Adaugi funcția la hook-urile wp_ajax_myaction și wp_ajax_admin_myaction. Nu ar trebui să fie wp_ajax_myaction (pentru utilizatorii autentificați) și wp_ajax_nopriv_myaction (pentru utilizatorii anonimi)?

Jan Fabry Jan Fabry
1 dec. 2010 15:52:11

da, am corectat, mulțumesc. Apropo, am un apel update_option în interiorul funcției "ajax_function" care pare să eșueze pentru că este apelat după ce întregul proces de încărcare WordPress este finalizat? Există altă metodă de a folosi update_option?

user1567 user1567
1 dec. 2010 18:26:43
Toate răspunsurile la întrebare 2
6

Î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);
});
1 dec. 2010 14:27:06
Comentarii

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 user1567
1 dec. 2010 14:43:49

Apropo, unde setezi valoarea variabilei ajaxurl?

user1567 user1567
1 dec. 2010 14:46:23

Î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 Horttcore
1 dec. 2010 15:46:29

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 user1567
1 dec. 2010 16:35:08

Î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 user1567
1 dec. 2010 17:23:47

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 Horttcore
2 dec. 2010 10:29:55
Arată celelalte 1 comentarii
0

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.

3 iul. 2016 19:09:30