WP_QUERY – parte prima

Come detto poco sopra, se dobbiamo interrogare il database di wp, dobbiamo scrivere una query ma è veramente semplice farlo perché infatti non c’è quasi bisogno di sapere la sintassi Sql.
Vediamo quindi ad esempio come potrebbe essere il codice scritto nel template di pagina che caricherebbe tutte le news, custom post type che avevamo creato sopra.
Tralasciando codice html di contorno, il richiamo dell’header e alla fine del footer, quello che interessa non è altro che questo:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// serve per poter gestire la paginazione, in caso volessimo dividere l'estrazione su più pagine

$wpquery = new WP_Query(array(
	//opzioni
	'post_type'      => "news",
	'posts_limits' => -1, // estrae tutti post
	'posts_per_page' => 3, // ne mostra 3 per pagina. Va poi gestita la paginazione tramite apposita funzione
	'paged' =>$paged // siamo alla pagina x
	'orderby' => 'date',
	'order' => 'desc'
));

while ($wpquery->have_posts()): $wpquery->the_post();
	…… // codice estrazione dati come fatto nel template di pagina prima, le funzioni di wp sono le stesse sia per le pagine che per i post. In questo caso sarà anche utile la funzione get_the_permalink. Ad esempio usata in questo modo

	echo"<div><a href='".get_the_permalink()."'>".get_the_title()."</a></div>";
	//per far si che venga stampato il titolo della news e che faccia da link alla news completa, magari perché non stampiamo il testo o ne è mostrata solo una parte (tramite funzione o tramite overflow hidden da css)
endwhile; // qui finisce il ciclo al cui interno faremo ciò che vogliamo per ogni singola news estratta

wp_reset_postdata();
 // quest'ultima funzione è molto importante : resetta la query a quella eventualmente precaricata da wp per la pagina. Ad esempio se inserissimo la query in una template di pagina e andassimo a recuperare alcuni dati con una query custom, la query base sarebbe quella che wp ha per caricare i dati di quella pagina. Quindi, come regola, dopo ogni query custom, si lancia quella funzione.

Ovviamente questa è una query molto semplice, senza tante opzioni ma possiamo aggiungerne quante ne vogliamo come vedremo quasi alla fine della guida. Tutte le opzioni sono comunque elencate qui

https://codex.wordpress.org/it:Riferimento_classi/WP_Query

WP_QUERY – parte seconda

Ecco quindi alcune altre opzioni che si possono aggiungere a quelle viste prima. Vediamone una più complessa

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// serve per poter gestire la paginazione, in caso volessimo dividere l'estrazione su più pagine

$wpquery = new WP_Query(array(
	'post_type'      =>"news", // cerco nel custom post type news
	'p' => $post_id, // se valorizzato, caricherà solo il post con quell'id passato
	'posts_per_page' => 50, // 50 post per pagina, dove poi va ovviamente gestita la paginazione
	'meta_query' => array($array_scrittore, $array_scrittore2,……),
	//qui possiamo elencare n array con opzioni di selezione, ad esempio sui campi 
	//Per gli array, che vanno definiti ovviamente prima (vedere dopo)
	'tax_query' => array($array_tipo_news, $array_tipo_news_2, $array_tipo_news_3……),
	// qui possiamo elencare n array per fare delle selezioni sulle taxonomy
	//(un modo più complesso di quello fatto poche righe sopra dove cercavamo"tipologia_news"e //"tipologia_news_2". Per gli array, che vanno definiti ovviamente prima (vedere dopo)
	'paged' =>$paged, // per poter gestire il numero di pagina (vedere dopo la funzione per la paginazione)
	'orderby' => 'date', // risultati ordinate per data
	'order' => 'desc', // ordinate in modo descrescente
	'suppress_filters' => true // da mettere sempre se si usa WPML
));

while ($wpquery->have_posts()): $wpquery->the_post(); // solito ciclo while
	…… // qui eseguiremo il codice che vorremo in base alle selezioni della query
endwhile;
wp_reset_postdata();

Come detto, prima della query quindi, avremo definito eventuali opzioni come ad esempio:

$array_scrittore = array(
	"key" => "nome_scrittore",
	"value" =>"marco rossi",
	"compare" => "=" 
);

//Oppure, al di fuori dell'esempio delle news,

$array_meta_query = array(
	'key' => 'eta',
	'value' => array(3, 4),
	'compare' => 'IN',
);

// specifichiamo che vogliamo solo le news con taxonomy"tipologia_news"con slug"news_importanti"
$array_tipo_news = array(
	"taxonomy" => "tipologia_news",
	"field" => "term_id",
	"terms" =>"news_importanti",
	"compare" => "=" 
);

Ci sono tantissime combinazioni e tutto dipende da cosa dobbiamo cercare ed estrarre. Fare sempre riferimento comunque a questa pagina per le opzioni : https://codex.wordpress.org/it:Riferimento_classi/WP_Query
Esempio di funzione per la paginazione e sua chiamata, da lanciare dopo il ciclo while, che cicla il risultato della query custom, ma prima della funzione

wp_reset_postdata();

Esempio:

paginazione(__("View Other News","qrpinternational"), $wpquery->found_posts, $wpquery->query_vars['posts_per_page'],true);
wp_reset_postdata();
function paginazione($titolo,$post_totali,$post_per_pagina,$print) {

	$code = "";
	
	$total_pages = ceil((int)$post_totali/ (int)$post_per_pagina);

	if ($total_pages > 1){

	if (isset($_POST["pagenumber"])){
		$current_page = $_POST["pagenumber"];	
	}
	else{
		$current_page = 0;
	}
	
	if ( $current_page >= 1){}
	else{
		$current_page = max(1, get_query_var('paged'));
	}

	$code .= '<div class="page_nav">
			<div class="contenitore-mini">
				<div class="titolo-paginazione">'.$titolo.'</div>
				<div class="cont-paginazione">';

				$code_links = paginate_links(array(
					//'base' => get_pagenum_link(1) . '%_%',
					'base' => preg_replace('/\?.*/', '', get_pagenum_link(1)) . '%_%',
					'format' => 'page/%#%',
					//'format' => '?paged=%#%',
					'current' => $current_page,
					'total' => $total_pages,
					'prev_text' => "<div class='pagina-precedente'></div>",
					'next_text' => "<div class='pagina-successiva'></div>"
					));
				
				$code_links = str_replace('<a class="prev', '<a rel="prev" class="prev', $code_links);
				$code_links = str_replace('<a class="next', '<a rel="next" class="next', $code_links);
				
				$code .= $code_links;
			$code .=  '</div>';
		$code .=  '</div>';
	$code .=  '</div>';
	}
	
	if ($print == true){
		echo $code;
	}
	else{
		return $code;
	}
}


ALTRE TIPOLOGIE DI RICERCA SU DATABASE

 

//Estrazione di post
$args = array(
	'post_type'        =>"news",
	'post__in'         => (12,34,56……), // id dei post che mi interessano
	'numberposts'      => -1,
	'post_status'      => 'publish',
	'suppress_filters' => true 
);
$posts_array = get_posts( $args );
// per ogni post estratto cerco poi gli slug di una sua taxonomy
foreach( $posts_array as $k => $v ){
	$terms = wp_get_post_terms( $v->ID,"tipologia_news");
	foreach( $terms as $t => $c ){
		$nome_tipologia = $c->name;
		echo $nome_tipologia;
	}
}

//Estrazione di taxonomy, per avere ad esempio l'elenco dei suoi slug ("news_importanti",……)
$categories = get_categories( array(
	'orderby' => 'name',
	'taxonomy' =>"tipologia_news",
) );

$categories = get_categories( array(
	'orderby' => 'name',
	'taxonomy' => $cat,
	'parent' => 0
// senza che abbia delle altre taxonomy come padri, 
//oppure ne possiamo definire una in base sempre a quello che dobbiamo cercare
) );

ESERCIZI

  1. Aggiungere al custom type eventi una taxonomy (categoria) con nome “tipologia”. Creare 3 tipologie nel backend (es. serali, mattutini, pomeridiani)
  2. Creare 3 link nella pagina eventi che mandano alla pagina stessa un parametro (?tipo=1, ?tipo=2, ?tipo=3) ed in base al tipo, se passato, la pagina estrae solo gli eventi di quella categoria
  3. Creare una pagina “chi siamo” nel backend e lasciare il template standard
  4. Nel template di pagina aggiungere una sidebar, con una foto modificabile da backend (widget con elemento testuale e codice html img)