Ajax permette di modificare i contenuti di una pagina anche una volta che la pagina stessa è stata caricata. Questo perchè PHP si occupa della generazione del codice HTML ma poi non permette più di modificarlo. Si ricorre quindi ad AJAX, o meglio a JS che chiama (quando decidiamo noi) una pagina PHP che rielabora del codice e lo ritorna al file JS nel formato JSON per poter appunto modificare i contenuti della pagina. Vediamo come funziona in WP.
Avremo quindi bisogno di due file, uno php e uno js.
Per la documentazione ufficiale: https://codex.wordpress.org/AJAX_in_Plugins
Nel nostro file js scriveremo
jQuery(document).ready(function($){
$('#form_informazioni').submit(function(e){
e.preventDefault();
$.post(
PT_Ajax.ajaxurl,
{
action : 'invia_mail',
nextNonce : PT_Ajax.nextNonce
},
function( response ) {
alert(response);
}
);
return false;
});
});In pratica, diciamo che
- al submit di un form (#form_informazioni)
- si blocca il normale funzionamento (e.preventDefault(); // da verificare se serve per il form. Se avessimo cliccato un link non sarebbe cambiata pagina d esempio)
- viene chiamata un'azione (action : 'invia_mail')
- viene fatto un alert dei dati che ritornano da PHP (alert(response);)
- essendo un form ritorno falso per bloccare l'invio (return false;)
Ci serve poi il codice php. Nel nostro file functions.php scriveremo
<?
add_action( 'wp_enqueue_scripts', 'prepara_inserimento_scripts' );
function prepara_inserimento_scripts() {
wp_enqueue_script( 'invia_mail', get_template_directory_uri() . '/frontend/js/script_ajax.js', array( 'jquery' ));
wp_localize_script( 'invia_mail', 'PT_Ajax', array(
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'nextNonce' => wp_create_nonce( 'myajax-next-nonce' ))
);
}
add_action( 'wp_ajax_invia_mail', 'invia_mail' );
add_action( 'wp_ajax_nopriv_invia_mail', 'invia_mail' );
function invia_mail() {
// check nonce
$nonce = $_POST['nextNonce'];
if ( ! wp_verify_nonce( $nonce, 'myajax-next-nonce' ) )
die ( 'Busted!');
// generate the response
$response = "messaggio di mail inviata";
// response output
echo $response;
wp_die();
}
?>In pratica gli diciamo
- dove si trova il file con li script, aggiungendo il js tra i file da caricare (il nome non deve per forza essere inerente all'azione invia_mail)
- aggiungiamo il nome dell'azione sia per gli utenti loggati che per quelli non loggati (e qui si il nome deve essere quello giusto!)
add_action( 'wp_ajax_XXXXXXX', 'XXXXXXXX' ); add_action( 'wp_ajax_nopriv_XXXXXXX', 'XXXXXXX' );
- la funzione che poi verrà chiamata (che corrisponde al nome della action nel file JS e al nome definito nelle due righe sopra)
In questo caso la funzione torna semplicemente una stringa, ma avrebbe potuto cercare dei post e tornare l'elenco dei dati come JSON (vediamo dopo un esempio). Alla fine fa un echo del risultato (stringa o JSON che sia) e muore (wp_die();)
Vediamo quindi un esempio che ritorna un file JSON
function genera_marker() {
// check nonce
$nonce = $_POST['nextNonce'];
if ( ! wp_verify_nonce( $nonce, 'myajax-next-nonce' ) )
die ( 'Busted!');
$return_arr = array();
// imposto la query
$wpquery = new WP_Query(array(
"post_type" => "marker",
"post_status" => "publish",
"posts_per_page" => -1
));
while ($wpquery->have_posts()): $wpquery->the_post();
$post_id = get_the_ID();
$row_array['descrizione'] = get_post_meta( $post_id, 'descrizione_marker');
$row_array['latitudine'] = get_post_meta( $post_id, 'latitudine_marker');
$row_array['longitudine'] = get_post_meta( $post_id, 'longitudine_marker');
if ( ($row_array['latitudine'] >0) && ($row_array['longitudine'] >0) ){
array_push($return_arr,$row_array);
}
endwhile;
echo json_encode($return_arr);
wp_die();
}e il file js che utilizza questo JSON
jQuery(document).ready(function($){
var data = new Array();
costruisci_mappa = false;
$.post(
PT_Ajax.ajaxurl,
{
action : 'genera_marker',
nextNonce : PT_Ajax.nextNonce
},
function( response ) {
data = response;
if (costruisci_mappa == false){
costruisci_mappa = true;
crea_mappa();
}
}
);
function crea_mappa() {
json = JSON.parse(data);
for(var i = 0; i < json.length; i++) {
singolo_marker = json[i];
latitudine = singolo_marker.latitudine;
longitudine = singolo_marker.longitudine;
descrizione = String(json[i]["descrizione"]);
}
}
});In questo esempio, del cui codice è stata tenuta solo una piccola parte per mostrare l'estrazione dei dati dal JSON, i dati poi venivano utilizzati per generare dei pin su una mappa di google. Sarebbero però potuti essere utilizzati per aggiungere/modificare codice nella pagina generata, tramite jQuery.add o jQuery.append o jQuery.html
ESERCIZI
- Creare un bottone in una pagina e un div vuoto (specidifarne l'id)
- Creare una funzione php che estrae il custom post più recente
- Creare quanto serve per far si che al clic sul bottone, venga fatta una chiamata AJAX che chiami quella funzione e che che popoli il div con le informazioni del post (anche solo titolo e testo)
