L'azione wp_ajax non viene eseguita

22 apr 2014, 13:31:53
Visualizzazioni: 14K
Voti: 2

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?

4
Commenti

Ehm... devi chiudere PHP con ?> prima di aggiungere codice JavaScript e riaprirli successivamente: <?php.

kaiser kaiser
22 apr 2014 13:51:51

Tutto il JavaScript è in un file separato e viene aggiunto con wp_enqueue_script(), quindi non credo sia un problema.

JennisDev JennisDev
22 apr 2014 15:05:21

"Il file synchandler.js aggiunto:" è la parte a cui mi riferisco. Se questi sono i contenuti del file JavaScript, allora per favore mostraci dove chiami quella funzione. Non riesco a vedere dove viene triggerata.

kaiser kaiser
22 apr 2014 15:20:49

È all'interno di un tag HTML input dove sto usando un evento onclick. Proverò a inserirlo nella domanda (ora è scritto sotto l'ultimo snippet di codice).

JennisDev JennisDev
22 apr 2014 15:29:51
Tutte le risposte alla domanda 2
4

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.

22 apr 2014 17:07:48
Commenti

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

kaiser kaiser
22 apr 2014 18:52:05

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.

JennisDev JennisDev
22 apr 2014 19:47:50

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.

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

Aggiungerlo all'inizio del plugin ha risolto il problema. Grazie!

JennisDev JennisDev
23 apr 2014 10:41:02
0

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.

22 apr 2014 19:30:19