Pubblico questa risorsa, per cercare di venire in contro a chi come me ha dovuto affrontare in WordPress, la questione “Caricamento dei post tramite chiamata Ajax” ed ha riscontrato difficolà nei vari link presenti in rete.

Nel codice che vedremo io ho strutturato la pagina in modo che un determinato Custom Post venisse aperto tramite finestra in style modal.

Gli step che vedremo sono molto semplici:

  • Creazione della funzione che gestirà il contenuto
  • Gestione differenti template in base al post type
  • Creazione link
  • Richiamo/associazione della chiamata Ajax tramite jQuery

Creazione della funzione che gestirà il contenuto

Creiamo ora la nostra funzione PHP che gestirà la query in base alla chiamata ajax per caricare il contenuto richiesto, inseriamo quindi il seguente codice sempre nel nostro functions.php

function load_post() {
if ( isset( $_POST['id'] ) && isset( $_POST['id'] ) && wp_verify_nonce($_POST['load_post_nonce'], 'load_post-nonce') ) {
   $id = absint($_POST["id"]);
$post_type= sanitize_text_field($_POST["post_type"]);
  $myquery = new WP_Query(array(   'p' => $id , 'post_type' => $post_type ));
  while ($myquery->have_posts()): $myquery->the_post();
        
    get_template_part( 'template_parts/ajax', $post_type );
    
  endwhile;
  die(); 
  }
}
add_action( 'wp_ajax_load_post', 'load_post' );
add_action( 'wp_ajax_nopriv_load_post', 'load_post' );

Vediamo nei dettagli questa funzione, non fa altro che creare una query custom tramite l’ID del post che si vuol richiamare e la tipologia del post, questo è stato fatto per far sì che la funzione possa essere il più universale possibile, in quanto si può usare oltre che per i normali post, anche per i Custom Post Type creati in base alle proprie esigenze.
Nel ciclo while, invece che l’output desiderato, ho inserito la funzione

get_template_part();

grazie alla quale vado a richiamare all’interno della cartella “template_parts” il file “ajax-post_type.php” dove tramite la variabile $_POST[‘post_type’] andrò a recuperare la tipologia del post e richiamare quindi il template che ho creato ad hoc (es. ajax-staff.php o ajax-promo.php).

vediamo inoltre che subito dopo la funzione vado ad aggiungere l’azione al mio tema tramite add_action utilizzando le funzioni

wp_ajax_NOME_FUNZIONE

e

wp_ajax_nopriv_NOME_FUNZIONE

importante per non sbagliare di utilizzare sempre il nome della funzione

add_action( 'wp_ajax_NOME_FUNZIONE', 'NOME_FUNZIONE' );

Gestione differenti template in base al post type

Come nell’esempio qui sopra riportato, vediamo ora come ho generato il mio file template:

ID, 'custom_field_impostato', true );

?>
X

foto <?php the_title(); ?>

Questa struttura la scegliete voi in base alle vostre esigenze e in base a ciò che dovete/volete mostrare e tramite CSS potrete mostrare il contenuto come fosse una modal oppure mostrare il contenuto creando un effetto slide.

Creazione link

Nel nostro loop in home page o ovunque voi vogliate usare la chiamata ajax, vediamo come strutturare il link

Maggiori Dettagli

analizziamo il link:
la classe: ne ho impostata una che mi servirà per la funzione jQuery che andremo a vedere a breve, nella quale definirò che al suo click venga trattata la chiamata ajax.
href: imposto l’ID di un div* dislocato nel nostro codice

, nel quale verrà destinato il contenuto della chiamata.
id e data-type: prelevo i dati che sfrutterò per creare la corretta query che mi estrarrà il contenuto richiesto

*= al div sopra segnalato, ho impostato una classe hide con la quale lo nascondo tramite CSS alla quale alternerò una classe open per mostrarlo (con le regole css che meglio si adattano alla situazione

Richiamo/associazione della chiamata Ajax tramite jQuery e localizzazione dello script

Ultima cosa ho creato un file js (es.richieste-ajax.js) che ho impostato per tutto il tema tramite la funzione custom_scripts() e sempre nella stessa ho provveduto a localizzare lo script ed impostare l’url di admin-ajax.php che serve per le chiamate Ajax.

function custom_scripts() {
    wp_enqueue_script('richieste_ajax', get_template_directory_uri().'/js/richieste-ajax.js',array('jquery'),'1.0',true);
wp_localize_script( 'richieste_ajax', 'richieste_ajax_vars', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ),'nonce' => wp_create_nonce('load_post-nonce'), ) );
}
add_action( 'wp_enqueue_scripts', 'scripts' );

ma andiamo a vedere il file in questione come è strutturato:

jQuery(function($){
		    $( 'a.ajaxPost' ).on( 'click', function( e ) {
		        e.preventDefault();
		        var post_id = $(this).attr( 'id' );
		        var post_type = $(this).attr( 'data-type' );
		        jQuery.ajax({
		        	url:richieste_ajax_vars.ajaxurl,  // questa è la variabile che abbiamo impostato con il primo script
		            type: "POST",
		            data: {
		                action: 'load_post', // questo è il richiamo alla funzione che deve gestire la chiamata
		                id: post_id, //questo è il passaggio da js a php dell'ID del post da richiamare
		                post_type: post_type   //questo è il passaggio da js a php della tipologia di post da richiamare
                                load_post_nonce:richieste_ajax_vars.nonce
		            },
		            success: function(response, satus, call) {
		                $("#ContenutoPost").html(response);   //tramite questa stringa comunico che il div con id ContenutoPost sia la destinazione della mia chiamata ajax
		                console.log("Success", arguments);    //mostron in console l'esito della chiamata - può essere commentata la riga
                  
                  	jQuery('#ContenutoPost').removeClass('hide').addClass('open'); //tramite questa stringa, alterno le classi open e hide per mostrare o nascondere il div
                    if (jQuery('#ContenutoPost').hasClass('open')) { //se il div ha la classe open, quindi è visualizzato farò in modo che al clic al di fuori del contenuto o sulla X, venga chiuso
                        jQuery("#ContenutoPost").mouseup(function(e)
                            {   
                            var subject = $('.modalPost');

                            if(e.target.id != subject.attr('id') && !subject.has(e.target).length)
                            {
                                jQuery('#ContenutoPost').removeClass('open').addClass('hide');
                            }

                            });
                        jQuery('.closeModal').click(function(event){
                            event.preventDefault();
                            jQuery('#ContenutoPost').removeClass('open').addClass('hide');
                        });
		              }
                    },
		            error: function(err) {
		                console.log("Error", arguments); //nel caso di errori stampa il contenuto dell'errore - può essere commentata la riga
		            }
		        });
                    });
	    });

Mi auguro di aver fatto cosa gradita e chiarito dubbi in merito all’utilizzo di Ajax, su WordPress.

Cosa ne pensate?

Pubblicato da Francesco

Sistemista con la passione per il Web Design e per la tecnologia, sempre al passo con i tempi, cerco le soluzioni a svariati problemi che riguardano i pc, server o web in generale. Cerco di essere sempre aggiornato, creo siti e cerco ispirazioni per migliorare sempre più le loro grafiche.

Lascia un commento