Come posso passare una variabile all'azione wp_ajax?
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?
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);
});
});
});

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.

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")
