Acțiunea wp_ajax nu rulează - rezolvare WordPress

22 apr. 2014, 13:31:53
Vizualizări: 14K
Voturi: 2

Scriu un plugin WordPress. Vreau să rulez metoda get_my_option când cineva apasă un buton în pagina de setări a pluginului meu. Apelul AJAX este făcut, dar metoda nu rulează niciodată.

În pagină am următorul cod:

<div class="wrap">
<input type="button" value="test" onclick="my_js_function();"/>
</div>
<?php
wp_enqueue_script( 'function', plugins_url( '/js/synchandler.js',__FILE__), array('jquery'));
wp_localize_script( 'function', 'my_ajax_script', array( 'ajaxurl' => admin_url('admin-ajax.php') ) );


function get_my_option()
{
    //fă ceva
    die();
}

add_action("wp_ajax_nopriv_get_my_option", "get_my_option");
add_action("wp_ajax_get_my_option", "get_my_option");
?>

Fișierul adăugat synchandler.js:

function my_js_function() 
{
    jQuery.ajax({
    url: my_ajax_script.ajaxurl,
    type: 'POST',
    data: ({ action: 'get_my_option', affiliate: 'daisycon' }),
    success: function (response) {
        console.log("Am primit: " + response);
        }
    });
}

Există un răspuns dar este 0, deci JavaScript-ul este adăugat corect dar cam atât. Nu primesc erori în log când rulez asta. AjaxURL este adăugat în pagină (pare a fi o greșeală comună).

/* <![CDATA[ */
var my_ajax_script = {"ajaxurl":"http:\/\/mywebsite.net\/wp-admin\/admin-ajax.php"};
/* ]]> */

Butonul care declanșează totul folosește onclick="my_js_function(); pe tag-ul HTML button.

Simplu cum este, metoda get_my_option nu este declanșată de apelul AJAX. Ce fac greșit?

4
Comentarii

Ehm... trebuie să închizi PHP cu ?> înainte de a adăuga cod JavaScript și să-l deschizi din nou după aceea: <?php.

kaiser kaiser
22 apr. 2014 13:51:51

Tot JavaScript-ul este într-un fișier separat și adăugat cu wp_enqueue_script() deci nu cred că asta e o problemă.

JennisDev JennisDev
22 apr. 2014 15:05:21

"Fișierul adăugat synchandler.js:" este partea la care mă refer. Dacă acesta este conținutul fișierului JavaScript, atunci te rog arată-ne unde apelezi acea funcție. Nu o văd declanșată nicăieri.

kaiser kaiser
22 apr. 2014 15:20:49

Este în interiorul unui tag html input unde folosesc un eveniment onclick. O să încerc să-l pun în întrebare (acum este scris sub ultimul fragment de cod).

JennisDev JennisDev
22 apr. 2014 15:29:51
Toate răspunsurile la întrebare 2
4

Unde apelezi add_action()? Dacă o faci într-un loc unde deja afișezi HTML, este prea târziu și probabil acel loc nici măcar nu va fi analizat în timpul unei cereri AJAX.

Ar trebui să incluzi acel cod în fișierul functions.php al temei tale sau cât mai devreme într-un plugin.

22 apr. 2014 17:07:48
Comentarii

După cum tocmai am văzut că OP pare să adauge codul în mijlocul paginii, trebuie să confirm și eu asta. +1

kaiser kaiser
22 apr. 2014 18:52:05

Într-adevăr, așa este. Adăugarea acțiunilor în functions.php a făcut să funcționeze. Problema pe care o am cu adăugarea lui în functions.php din directorul temei mele este că nu pot accesa clasele de care am nevoie din directorul pluginului. O soluție ar fi mutarea întregului cod în temă, dar asta cam face pluginul inutil.

JennisDev JennisDev
22 apr. 2014 19:47:50

Atunci pur și simplu pune-l la începutul pluginului tău, în afara oricăror alte funcții sau clase și înainte de a începe să afișezi orice.

Dave Ross Dave Ross
23 apr. 2014 05:26:48

Adăugarea la începutul plugin-ului a rezolvat problema. Mulțumesc!

JennisDev JennisDev
23 apr. 2014 10:41:02
0

Va trebui să includeți codul funcțional în plugin, ca o funcție (Aceasta depinde de modul în care dezvoltați pluginul).

Eu prefer să adaug apelurile add_action în admin_init - Este apelat și cu admin-ajax.php.

wp_enqueue_script( 'function', plugins_url( '/js/synchandler.js',__FILE__),         array('jquery'));
wp_localize_script( 'function', 'my_ajax_script', array( 'ajaxurl' => admin_url(  'admin-ajax.php' ) );


function get_my_option()
{
    //fă ceva
    die();
}
function add_ajax_actions() {
    add_action("wp_ajax_nopriv_get_my_option", "get_my_option");
    add_action("wp_ajax_get_my_option", "get_my_option");
}
add_action( 'admin_init', 'add_ajax_actions' );

Nu știu dacă aceasta este cea mai bună practică - Este pur și simplu o preferință personală, pentru a evita adăugarea de hook-uri pe fiecare pagină încărcată - Doar pe paginile de administrare.

22 apr. 2014 19:30:19