L'azione wp_ajax non viene eseguita
Sto sviluppando un plugin. Voglio eseguire il metodo get_my_option quando qualcuno clicca un pulsante nella pagina delle impostazioni del mio plugin WordPress. La chiamata AJAX viene effettuata ma il metodo non viene mai eseguito.
Nella pagina ho il seguente codice:
<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()
{
//fai qualcosa
die();
}
add_action("wp_ajax_nopriv_get_my_option", "get_my_option");
add_action("wp_ajax_get_my_option", "get_my_option");
?>
Il file synchandler.js aggiunto:
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("Ricevuto: " + response);
}
});
}
C'è una risposta ma è 0, quindi lo javascript viene aggiunto correttamente ma è tutto qui. Non ottengo errori nel log eseguendo questo codice. AjaxURL è aggiunto nella pagina (sembra essere un errore comune).
/* <![CDATA[ */
var my_ajax_script = {"ajaxurl":"http:\/\/mywebsite.net\/wp-admin\/admin-ajax.php"};
/* ]]> */
Il pulsante per attivare tutto usa onclick="my_js_function();
nel tag HTML button
.
Per quanto semplice, il metodo get_my_option
non viene attivato dalla chiamata ajax. Cosa sto sbagliando?
Dove stai chiamando add_action()? Se è in un punto in cui stai già generando HTML, è troppo tardi, e probabilmente è un posto che non verrà nemmeno considerato durante una richiesta AJAX.
Dovresti includere quel codice nel file functions.php del tuo tema, o il prima possibile in un plugin.

Dato che ho appena visto che l'OP sembra aggiungere il codice a metà pagina, devo raddoppiarlo. +1

Infatti lo è. Aggiungere le azioni nel functions.php ha fatto funzionare il tutto. Il problema che ho con l'aggiungerlo nel functions.php della cartella del mio tema è che non posso accedere alle classi di cui ho bisogno nella cartella del plugin. Una soluzione è spostare tutto il codice nel tema, ma in qualche modo rende inutile il plugin.

Allora mettilo semplicemente all'inizio del tuo plugin, al di fuori di qualsiasi altra funzione o classe e prima di iniziare a produrre qualsiasi output.

Dovrai inserire il tuo codice funzionale nel plugin, come una funzione (questo dipende dal tuo modo di sviluppare il plugin).
Preferisco aggiungere le chiamate add_action
a admin_init - Viene chiamato anche con 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()
{
//fai qualcosa
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' );
Non so se questa sia la migliore pratica - È puramente una preferenza personale, per evitare di aggiungere hook a ogni pagina caricata - Solo alle pagine di amministrazione.
