Come posso passare una variabile all'azione wp_ajax?

14 apr 2015, 21:54:46
Visualizzazioni: 15.7K
Voti: 3

Sto scrivendo un plugin che recupera dati da un'API esterna e li inserisce in un topic di bbPress. Ecco un esempio di codice:

function bbp_ajax() {
    $topic_id = bbp_get_topic_id();
    $the_issue_key = get_post_meta( $topic_id, 'bbp_jira_issue_field', true);
    $nonce = wp_create_nonce( 'theNonce' );

    // Codice jQuery AJAX, azioni bbpAjax...
}
add_action ( 'bbp_template_before_replies_loop', 'bbp_ajax');

function get_ajax_content() {
    check_ajax_referer( "theNonce" );
    $api_url = get_option( 'jifbs_url' );
    $fullurl = $api_url.$the_issue_key;

    $username = get_option( 'jifbs_username' );

    // Poi recupero i dati con cURL e li stampo. Ma mi serve $the_issue_key per completare l'autenticazione API
}

add_action( 'wp_ajax_bbpAjax', 'get_ajax_content' );
add_action( 'wp_ajax_nopriv_bbpAjax', 'get_ajax_content' );

Non riesco a capire come passare $the_issue_key nella funzione get_ajax_content. Ho provato a impostarla come globale (brividi) ma restituisce sempre null.

$the_issue_key = get_post_meta( $topic_id, 'bbp_jira_issue_field', true); eseguito nella funzione get_ajax_content restituisce null.

C'è qualcosa di specifico riguardo all'azione wp_ajax che dovrei sapere - oppure mi sto perdendo qualcosa di ovvio?

0
Tutte le risposte alla domanda 1
2

Dovresti inserire il valore della variabile nella pagina in modo che JavaScript possa passarlo nuovamente a PHP utilizzando ajax. Le funzioni Ajax sono un "caricamento di pagina" completamente separato, quindi anche se la rendessi globale non funzionerebbe. Il modo migliore per farlo è utilizzare "wp_localize_script" (https://codex.wordpress.org/Function_Reference/wp_localize_script)

Ecco un esempio completo di come potresti farlo:

//Prima carica il tuo JavaScript in WordPress
    function your_prefix_enqueue_scripts(){

        //Carica il tuo JavaScript (questo presuppone che il tuo file JavaScript si trovi nel tuo plugin in una directory "includes/js")
        wp_enqueue_script( 'your_unique_js_name', plugins_url('js/yourjavascriptfile.js', dirname(__FILE__) ), array( 'jquery' ) );

        //OPPURE (più semplice ma non raccomandato)  
        wp_enqueue_script( 'your_unique_js_name', 'http://domain.com/myjavascriptfile.js', array( 'jquery' ) );

        //Qui creiamo una variabile oggetto JavaScript chiamata "youruniquejs_vars". Possiamo accedere a qualsiasi variabile nell'array usando youruniquejs_vars.nome_della_sotto_variabile
        wp_localize_script( 'your_unique_js_name', 'youruniquejs_vars', 
            array(
                //Per usare questa variabile in JavaScript usa "youruniquejs_vars.ajaxurl"
                'ajaxurl' => admin_url( 'admin-ajax.php' ),
                //Per usare questa variabile in JavaScript usa "youruniquejs_vars.the_issue_key"
                'the_issue_key' => $the_issue_key,

            ) 
        );  

    }
    add_action( 'wp_enqueue_scripts', 'your_prefix_enqueue_scripts' );

    //Questa è la tua funzione di callback Ajax
    function your_ajax_callback_function_name(){

        //Ottieni i dati del post 
        $the_issue_key = $_POST["the_issue_key"];

        //Fai qui le tue operazioni

        //Crea l'array che invieremo indietro a JavaScript qui
        $array_we_send_back = array( 'test' => "Test" );

        //Assicurati di codificare l'output in json perché è quello che si aspetta
        echo json_encode( $array_we_send_back );

        //Assicurati di terminare dopo aver completato l'output ajax.
        die(); 

    }
    add_action( 'wp_ajax_' . 'your_ajax_callback_function_name', 'your_ajax_callback_function_name' );
    add_action( 'wp_ajax_nopriv_' . 'your_ajax_callback_function_name', 'your_ajax_callback_function_name' );

E poi nel tuo file JavaScript fai qualcosa come questo:

jQuery(document).ready(function($){

    /**
     * Quando viene cliccato il tuo trigger ajax
     *
     */
    $( document ).on( 'click', '.my-button', function(event){

        event.preventDefault();

        // Usa ajax per fare qualcosa...
        var postData = {
            action: 'your_ajax_callback_function_name',
            the_issue_key: youruniquejs_vars.the_issue_ke,
        }

        //Ajax carica altri post
        $.ajax({
            type: "POST",
            data: postData,
            dataType:"json",
            url: youruniquejs_vars.ajaxurl,
            //Questo viene eseguito quando l'ajax 'ritorna' ed è un json valido
            success: function (response) {

                alert( response.test );

            }
            //Questo viene eseguito quando l'ajax 'ritorna' e non è un json valido
        }).fail(function (data) {
            console.log(data);
        }); 

    });

});
14 apr 2015 22:23:16
Commenti

Ci siamo quasi, grazie mille :) Potresti chiarirmi una cosa però? Nella funzione di callback, diciamo che $the_issue_key = "12345" - ho difficoltà a capire come passare questo valore all'array youruniquejs_vars e mi restituisce sempre null.

Finne Finne
15 apr 2015 17:50:28

Devi assegnare il valore "12345" quando eseguiamo il "wp_localize_script"

    `wp_localize_script( 'your_unique_js_name', 'youruniquejs_vars', array('ajaxurl' => admin_url( 'admin-ajax.php' ),'the_issue_key' => "12345",) );`

(Scusa per la formattazione qui... non riesco a farla apparire "carina")

Phil Johnston Phil Johnston
15 apr 2015 17:56:07