Aggiungere una lista di post correlati in WordPress

Aggiungere una lista di post correlati in WordPress

In questo tutorial vedremo come creare una lista personalizzata di post correlati da aggiungere in un articolo del blog (o sito).

Nell’esempio utilizzeremo il file content.php come template per la visualizzazione dei correlati. Poiché lo scopo è di focalizzare l’attenzione sull’aggiunta delle correlazioni tra i post, non andremo a considerare gli aspetti estetici relativi agli stili e, quindi, a come il post correlato apparirà graficamente.

Iniziamo con lo sviluppare il cuore di questa funzionalità, occupandoci della gestione delle relazioni nell’area di amministrazione.

Nota: Le seguenti funzioni dovranno essere aggiunte nel file functions.php del tema WordPress.

Il metabox per gestire i post correlati

// ************
// Add meta box
// ************

function my_related_add_meta_box() {
	add_meta_box(
		"correlati",
		esc_html__( "Articoli correlati", "mytextdomain" ),
		"my_related_render_meta_box_content",
		"post",
		"advanced",
		"high"
	);
}

add_action( "add_meta_boxes", "my_related_add_meta_box" );

Con questa funzione, nell’admin del nostro articolo abbiamo ottenuto un’area, per il momento vuota, da dedicare alla selezione dei post correlati.

Per colmare tale vuoto, proseguiamo con il creare la funzione di callback per add_meta_box(), che appunto si occuperà di inserire il contenuto nel nostro metabox.

I campi per selezionare i post correlati

function my_related_render_meta_box_content( $post ) {

// ***
// Il numero di post correlati desiderato
// ***

	$n = "3";

// ***
// Gli argomenti della query WP_Query
// ***

	$args = array (
		"post_type" => $post->post_type,
		"orderby" => "title",
		"order"	=> "ASC",
		"post_status" => "publish",
		"posts_per_page" => -1,
		"post__not_in" => array($post->ID)
	);

	remove_all_filters("posts_orderby");

// ***
// Esegui la query
// ***

	$query = new WP_Query($args);

// ***
// Recupera i valori degli eventuali post correlati già registrati
// ***

	$values = get_post_meta( $post->ID, "my-related" );

// ***
// Crea un campo select per ogni $n correlato
// ***

	for ($i = 1; $i <= $n; $i++) {

		if ( $query->have_posts() ) :

			echo "<div style='padding: 10px; border: 1px solid #f5f5f5; margin-bottom: 5px;'>";

			echo "<span style='padding: 5px 10px; background-color: #f5f5f5; margin-right: 20px;'>".$i."</span>";

			echo "<select name='my_field-".$i."' id='my_field-".$i."' class='posts_list'>";

			echo "<option value=''>".esc_html__( "Seleziona un post", "yourdomainname" )."</option>";

			while ($query->have_posts()) : 

				$query->the_post();

				if ( get_the_ID() == $values[0][$i] ) { $selected = "selected"; } else { $selected = ""; }

				echo "<option value=".get_the_ID()." ".$selected.">" . get_the_title() . "</option>";

			endwhile;

			echo "</select>";

			echo "</div>";

		endif;

	}

}

Con la funzione render_meta_box_content, nel metabox, vedremo apparire 3 campi select grazie ai quali potremo andare a selezionare i post che vogliamo associare allo specifico articolo in cui ci troviamo.

Seleziona post correlati

In effetti tutto ciò non è di grande utilità se non registriamo le nostre selezioni nel database, quindi…

Salva le correlazioni dei post

// ***
// Save post
// ***

function my_related_save_postdata( $post_id ) {

	$n = "3";

	for ($i = 1; $i <= $n; $i++) {

		if ( array_key_exists("my_field-".$i, $_POST ) ) {

			$my_related[$i] = intval( $_POST["my_field-".$i] );

			update_post_meta( 
				$post_id,
				"my-related",
				$my_related
			);

		}

	}

}

add_action( "save_post", "my_related_save_postdata" );

Fino ad ora abbiamo visto come:

  • creare il metabox nell’admin del nostro articolo;
  • come creare dei campi select contenenti la lista di tutti i post;
  • come salvare nel database i post selezionati.

Ciò che rimane da fare è far apparire la lista di post correlati nella pagina dell’articolo pubblica. Per fare questo andremo a creare uno shortcode.

Crea la lista dei post correlati

function my_related_shortcode() {

	global $post;

	$meta_value = get_post_meta( $post->ID, "my-related" );

	$post_in = my_related_flatten($meta_value);

	if ($post_in) :

		$args = array( 
			"post_type" => "post", 
			"posts_per_page" => -1, 
			"post__in" => $post_in,
			"orderby" => array("post__in"),
			
		);

		remove_all_filters("posts_orderby");
									
		$loop = new WP_Query( $args );

		if ($loop->found_posts > 0) :

			echo "<h2>".esc_html__("Articoli correlati")."</h2>";

			while ( $loop->have_posts() ) : $loop->the_post();

				get_template_part( "content", get_post_format() );

			endwhile;

		endif;

	endif;	

}

add_shortcode( "my_related", "my_related_shortcode" );

function my_related_flatten($array) { 
	if (!is_array($array)) {
		return FALSE; 
	} 
	$result = array(); 
	foreach ($array as $key => $value) { 
		if (is_array($value)) { 
		  $result = array_merge($result, my_related_flatten($value)); 
		} else { 
		  $result[$key] = $value; 
		} 
	} 
	return $result; 
}

Per finalizzare, non ci resta che inserire lo shortcode creato nel punto in cui vogliamo mostrare la lista di correlati, come ad esempio sotto la fine dell’articolo o nella sidebar.

Mostra la lista dei post correlati

echo do_shortcode('[my_related]');

Una comoda alternativa

Per saltare un po’ di passaggi installa il nostro plugin WordPress CPTRP che, oltre a farti risparmiare tempo, ti offre anche diverse opzioni, tra cui la possibilità di aggiungere articoli correlati utilizzando i custom post types.

Una volta installato e attivato il plugin, dovrai solo selezionare alcune opzioni nella pagina delle impostazioni e sarai già al punto 5 di questo articolo. Infatti, l’unica cosa che rimarrà da fare sarà inserire lo shortcode [cptrp] dove desideri far apparire i post correlati.

Scarica il Plugin CPTRP

Clicca sul pulsante in basso Download se vuoi invece scaricare il codice del tutorial.