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)