Site icon Tosolini.info

WordPress: Creiamo dei post in serie

L’articolo che vediamo quest’oggi sarà un po’ più complicato (per me da spiegare) del solito. Ne parlo perché farò uso proprio in questo sito per una serie di post, o meglio delle guide a puntate, che andrò a realizzare nell’immediato futuro. Lo scopo quindi è quello di creare “un legame” per gli articoli che andranno a ricadere all’interno di una specifica guida mostrando un elenco degli post passati e quelli in previsione. Ovviamente tale elenco deve essere automatico, ovvero nel momento che aggiungo un articolo anche quelli vecchi andranno ad aggiornarsi. Inoltre voglio prevedere che le guide possano essere più di una, quindi deve essere un metodo riutilizzabile.

Cosa serve?

Per procedere avremo bisogno di creare un plugin, per molti potrà essere il primo plugin che andremo a creare. Nulla di complicato.
Il plugin in questione farà utilizzo della creazione di una interfaccia per le nuove tassonomie e uno shortcode che permetterà di inserire dove vogliamo l’elenco e manipolarlo dal punto di vista esecutivo e grafico come meglio ci aggrada.

Le nuove tassonomie di fatto andranno a creare un nuovo “Slug”, ovvero una url amichevole che sarà del tipo miosito.com/serie/lamiaguida.
In questo modo oltre a creare non solo un elenco richiamabile all’interno del post, avremo anche una pagina di riepilogo dedicata in modo del tutto automatico.

Mettiamoci all’opera, creiamo il plugin.

Per prima cosa consiglio di effettuare le prossime operazioni in un sito WordPress di test poiché se qualcosa va storto andremo ad “impallare” tutto. Nel qual caso succedesse e non sapete come uscire vi darò più sotto le istruzioni.

Andiamo nella cartella wp-content/plugins/ e qui creiamo una nuova cartella che si chiamerà post-seriali. All’interno di essa creiamo un file che si chiamerà post-seriali.php. Nel caso ci troviamo in difficoltà e il sito non si vede nemmeno lato amministrazione, cancellate questa cartella con il contenuto. All’interno possiamo inizializzare con il semplice commento tipico delle linee guida di WordPress

<?php
/*
Plugin Name: Post in Serie
Plugin URI: https://www.tosolini.info/2015/01/wordpress-crei…-post-in-serie/
Description: Permette di aggiungere dei post in una serie e mostrare i titoli.
Version: 1.0
Author: Walter Tosolini
Author URI: https://www.tosolini.info
License: GPL2
*/

Ora procediamo con la creazione della funzione che andrà a creare la tassonomia padre, ovvero “serie”.

// creiamo una tassonomia chiamata "serie" per i post.
function post_seriali() {
	$labels = array(
		'name' => _x('Post in Serie', 'Nome generale della Tassonomia'),
		'singular_name' => _x('Post in Serie', 'Nome singolo della Tassonomia'),
		'all_items' => __('Tutti i Post in Serie'),
		'edit_item' => __('Modifica Post in Serie'),
		'update_item' => __('Aggiorna Post in Serie'),
		'add_new_item' => __('Aggiungi un nuovo Post in Serie'),
		'new_item_name' => __('Nuova Serie di Post'),
		'menu_name' => __('Post Seriali'),
	);

	register_taxonomy(
		'serie',
		array('post'), /* Utilizzato per i post, se vuoi aggiungere altro devi usare un array tipo ('post','page','custom-post-type') */
		array(
			'hierarchical' => true, /* true viene utilizzato come categoria, false come tag */
			'labels' => $labels,
			'show_ui' => true, /* mostra interfaccia in backend */
			'show_admin_column' => true,
			'query_var' => true,
			'rewrite' => array('slug' => 'serie'), /* utilizziamo i permalinks per i SEO in modo da trovare i nostri post in serie */
		)
	);
} add_action('init', 'post_seriali', 0);

Analizziamo il codice. La prima funzione post_seriali non è altro che un array con delle Etichette che saranno mostrate in fase di creazione dell’articolo e della loro successiva gestione.

La funzione register_taxonomy invece va a creare la SLUG “serie“, ovvero a creare una URL personalizzata del proprio sito dove includere poi successivamente le SLUG relative alle varie guide. In questa sede andremo anche a fornire alcuni parametri base, ad esempio oltre le etichette citate in precedenza, la facoltà di apparire nel menu di creazione di un articolo. A tal proposito il primo array(‘post’) andremo a scegliere dove far apparire questa funzione, ovvero solo nei post o anche nelle pagine oppure in altri custom-post del nostro tema se ne abbiamo. Consiglio di scegliere con oculatezza e non sparare la nuova tassonomia in ogni dove. Infine citazione per hierarchical. Con il valore booleanno in true i nuovi slug saranno trattati come categorie, ovvero saranno richiamati facilmente dalla lista precompilata e potranno essere sottomessi a slug genitori. Davvero un pacchia! viceversa con false saranno trattati alla stregua dei tag. Per cui vi consiglio caldamente la prima opzione.

Passiamo alla creazione del nostro ShortCode.

Abbiamo terminato con la parte della tassonomia, ora abbiamo bisogno di un codice per attuarla in modo operativo nei nostri post. Infatti creando e scegliendo i vari SLUG non avremo nulla di visibile sull’articolo che andremo a creare, potremo solo giocare con le URL. Quindi procediamo a creare un nuovo ShortCode, il codice lo vedremo a pezzi per cercare di capirlo meglio.

// Costruiamo la Funzione Shortcode
function guida_sc($atts) {
	extract(
		shortcode_atts(
			array(
				"slug" => '',
				"id" => '',
				"titolo" => '',
				"titolo_element" => 'h3',
				"titolo_link" => true,
				"element" => 'ul',
				"limite" => -1,
				"future" => true
			), $atts
		)
	);
} add_shortcode('guida','guida_sc');

Questa prima parte è molto importante, perché andiamo a creare uno ShortCode che si chiamerà [guida] con delle particolari opzioni. Ovvero sono quelle che vedete include nell’array. Ognuna di esse sarà nella notazione [guida opzione=”valore”].
Vediamoli nel dettaglio:

  1. slug e id sono funzionali solo se avete hierarchical in false. Questo perché ho avuto qualche rogna nella modalità tags. Con queste due piccole opzioni, che dovranno essere richiamate alla lettera, ovvero se la slug è prova la shortcode sarà [guida slug=”prova”] e il numero nel caso dell’ID, si potrà evitare di avere fraintendimenti nel caso di più guide. Nel caso di utilizzo del sistema a categorie si possono ignorare.
  2. Titolo. Permette di scegliere un titolo che potrà essere differente ad ogni articolo. Sotto di esso saranno elencati i post in serie.
  3. titolo_element, è relativo alla parte CSS del titolo, ovvero potremo scegliere un titolo più grosso o trasformare la classe in un elemento DIV.
  4. titolo_link. Permette di scegliere se il titolo possa avere il link allo SLUG relativo o meno.
  5. element. Relativo alla classe CSS, in particolare si sceglierà come mostrare gli articoli, se in elementi a notazione o altre scelte.
  6. limite. Può mostrare un limite di articoli, con -1 non vi sono limiti.
  7. future. Nel caso di post programmati, verrà mostrato il titolo ma ovviamente non in link.

Sta poi a voi se avete da aggiungere o meno altre funzioni che vi vengono in mente. Ovviamente poi ognuna dovrà avere il relativo codice. Vediamo le parti esecutive delle varie opzioni. Queste andranno aggiunte prima di } add_shortcode.

if($id) {
	$tax_query = array(array('taxonomy' => 'serie', 'field' => 'id', 'terms' => $id));
} else if ($slug) {
	$tax_query = array(array('taxonomy' => 'serie', 'field' => 'slug', 'terms' => $slug));
} else {
	// Abbiamo cercato "Serie" in id e slug, se non li troviamo utilizziamo la nostra tassonomia
	$terms = get_the_terms($post->ID,'serie');
	if ($terms && !is_wp_error($terms)) {
		foreach ($terms as $term) {
			$tax_query = array(array('taxonomy' => 'serie', 'field' => 'slug', 'terms' => $term->slug));
		}
	} else {$error = true;}
}

Questa prima parte verifica le opzioni ID e SLUG, se non le trova cerca la tassonomia associata all’ID dell’articolo. Se non trova nulla genera la variabile $error con valore vero. Più sotto tale variabile sarà richiamata per sapere se ci sono stati errori o meno e continuare a mostrare il codice.

if($titolo) {
	if($titolo_link == true){
		$terms = get_terms( 'serie' );
		foreach ( $terms as $term ) {
		$term_link = get_term_link( $term );
		// If there was an error, continue to the next term.
		if ( is_wp_error( $term_link ) ) {
			continue;
		}
	}
		$titolo_output = '<'.$titolo_element.' class="post-serie-titolo"><a href="'.esc_url( $term_link ).'">'.$titolo.'</a></'.$titolo_element.'>';
	} else {
		$titolo_output = '<'.$titolo_element.' class="post-serie-titolo">'.$titolo.'</'.$titolo_element.'>';
	}
}

Per il titolo in hyper link si è dovuto cercare la tassonomia correlata. Si tratta in pratica di pescare il primo link valido (poiché un articolo potrebbe avere più SLUG sotto la tassonomia “serie”). La funzione core utilizzata è get_term_link. E’ una ridondanza rispetto alla sezione precedente e probabilmente con vari test è migliorabile.

if($future == true) {
	// Includere i post programmati se l'attributo è true
	$post_status = array('publish','future');
	} else {
	// altrimenti mostra solo i post pubblicati
	$post_status = 'publish';
}

In questo caso si scelgono i post da mostrare in base al fatto che siano stati pubblicati o siano programmati. Infatti la variabile $post_status viene poi inserita successivamente in un array che viene a sua volta dato in pasto alla funzione core get_posts, da cui appunto si può scegliere la tipologia di post in base allo stato di lavoro.

	if($error == false) {
	$args = array(
		'tax_query' => $tax_query,
		'posts_per_page' => $limite,
		'orderby' => 'date',
		'order' => 'ASC',
		'post_status' => $post_status
	);
	$the_posts = get_posts($args);
	/* se esiste un solo post invece di una serie non mostrare la lista */
	if(count($the_posts) > 1) {
		// mostro il titolo precedentemente trattato
		$output = $titolo_output;
		// creo la lista di tag
		$output .= '<'.$element.' class="post-serie-lista">';
		// creo il loop per mostrare la lista di post
		foreach($the_posts as $post) {
			setup_postdata($post);
			if($post->post_status == 'publish') {
				$output .= '<li><a href="'.get_permalink($post->ID).'">'.get_the_title($post->ID).'</a></li>';
			} else {
				/* I post programmati non hanno un link, quindi li mostro come elenco */
				$output .= '<li>Articoli in programmazione: '.get_the_title($post->ID).'</li>';
			}
		}
	wp_reset_query();
	// make-up chiudiamo la lista
	$output .= '</'.$element.'>';
	// mostriamo l'intero costrutto
	return $output;
	}
}

La parte finale si occupa di formattare la lista dei post in serie. Come si può vedere le opzioni dello ShortCode hanno la possibilità di modificare il CSS. Ad esempio $element per default è l’elemento a lista <ul> ma può diventare un <div> da gestire con la classe “post_serie_lista” che possiamo mandare in parse direttamente nel stylesheet.css del nostro tema grafico.

Conclusioni.

Abbiamo fatto la conoscenza di tassonomie personalizzate con cui si possono implementare URL personalizzate. In questo caso oltre ad aver legato fra loro degli articoli, inserendo nel corpo del post uno ShortCode che genera un elenco delle puntate precedenti e future, abbiamo anche una pagina di riferimento ottima per l’ottimizzazione SEO.

p.s. potete trovare l’intero codice su PasteBin.

Exit mobile version