Acțiunea wp_ajax nu rulează - rezolvare WordPress
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?
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.

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

Î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.

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.

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.
