Evitare i post duplicati

Da AldoWiki.

Quando in WordPress si creano blog con una pagina iniziale diversa dalla solita, cioè che non presenta i post in ordine cronologico uno dietro all'altro, generalmente si presenta il problema di evitare di pubblicare lo stesso post in aree diverse della prima pagina.

Infatti, in un blog dove la prima pagina è impostata a mo' di magazine, con diverse query di post da più categorie, è quasi inevitabile che si finisca per pubblicare lo stesso post in due (o più) punti diversi della pagina.

Per evitare ciò, bisogna far sì che WordPress raccolga le ID dei vari post mentre li stampa a video in modo da confrontarli con quanto sta ricevendo dal database: se l'ID del post che riceve coincide con quella di uno già pubblicato, allora lo scarta e salta al successivo.

Esempio di una pagina in stile magazine

Per capire meglio come intervenire, vediamo un possibile schema di impostazione della prima pagina, con diverse aree e altrettante categorie:

Schema sito.png

In questo template ciò che s vuole fare è la seguente cosa:

  • ci sono 4 categorie diverse da cui richiamare gli articoli;
  • nella sezione "homepage-top" va pubblicato l'ultimo articolo e, se eventualmente c'è un articolo (o più articoli) in evidenza, questo (o questi) deve (o devono) sovrastare l'ultimo articolo;
  • nelle sezioni "homepage-left", "homepage-right" e "homepage-bottom" ci vanno 3 categorie diverse di articoli con tre articoli in ciascuna;
  • nella sidebar, oltre ai restanti widgets, va pubblicato l'ultimo video inserito come post nella categoria apposita "Video"; questa categoria non deve mai apparire nelle sezioni suddette e nemmeno nell'"homepage-top", ma solo nella sidebar;
  • è fondamentale che se un articolo appartiene a più categorie, questo non deve risultare duplicato in più punti della pagina;
  • infine, se l'articolo appartiene a una delle categorie scelte per l'homepage ed è contemporaneamente l'ultimo articolo, questo non deve apparire sia nella sezione in cima (riservata all'ultimo articolo) sia nella sezione della sua categoria in homepage.

Il codice

Il pezzo di codice che ci interessa da vicino è il seguente; con esso WordPress colleziona le varie ID dei post che stampa a video:

<?php if (have_posts()) : ?>
 
	<?php $published = array(); // Definiamo la variabile $published come array ?>
 
	<?php while(have_posts()) : the_post(); ?>
 
		<?php $published[] = get_the_ID(); // Raccogliamo le ID per evitare duplicati ?>
 
		Qui mettiamo il resto del materiale...
 
	<?php endwhile; ?>
 
<?php endif; ?>

Definendo la variabile $published come array, la creeremo come un contenitore dove WordPress andrà a raccogliere le varie ID dei post che vengono stampati a video. Quando WordPress estrarrà un post dal database, ne confronterà la ID con quelle già raccolte e lo scarterà se la sua ID coinciderà con una di quelle dell'array. In questo modo potremo eseguire varie query senza il problema dei post duplicati.

Il codice con cui WordPress confronta le ID è il seguente:

<?php query_posts(array(
	'post__not_in' => $published,
	... altre opzioni...
)); ?>

Ed ecco tutto un template possibile con il codice che genera la pagina. Il codice è stato ridotto al minimo per esigenze dimostrative.

<?php
/*
Template Name: La mia pagina
 */
?>
 
<?php get_header(); ?>
 
	<div id="content">
 
		<?php
			// Definiamo alcune variabili, come da disegno soprastante:
			$cat_left	= 1;	// la ID della categoria 1 (left)
			$cat_right	= 2;	// la ID della categoria 2 (right)
			$cat_bottom	= 3;	// la ID della categoria 3 (bottom)
			$cat_video	= 4;	// la ID della categoria video
			$posts_number	= 3;	// il numero dei post da vedere nelle sezioni
		?>
 
		<!-- /// INIZIA HOMEPAGE-TOP \\\ -->
 
        <div id="homepage-top">
 
			<?php query_posts(array(
				'post__in' => get_option('sticky_posts'),
				'cat' => -$cat_video,
			)); ?>
 
			<?php if (have_posts()) : ?>
 
				<?php $published = array(); // Definiamo la variabile $published come array ?>
 
				<?php while(have_posts()) : the_post(); ?>
 
					<?php $published[] = get_the_ID(); // Raccogliamo le ID per evitare duplicati ?>
 
					<div <?php post_class(''); ?> id="post-<?php the_ID(); ?>">
 
						<!-- Visualizza un simbolo per i post in evidenza -->
						<div class="sticky-post"></div>
 
						<h2>
							<a href="<?php the_permalink() ?>" rel="bookmark" title="Link a <?php the_title_attribute(); ?>">
								<?php the_title(); ?>
							</a>
						</h2>
 
						<div class="entry">
							<?php the_excerpt(); ?>
						</div>
 
					</div>
					<!-- close post -->
 
				<?php endwhile; ?>
 
			<?php endif; ?>
 
			<?php
				// Inizia pubblicazione ultimissimo articolo non in evidenza
				// Notare la presenza della variabile $published: se non ci fosse,
				// l'ultimo articolo verrebbe duplicato se venisse anche messo in evidenza,
				// cioè comparirebbe come post in evidenza e come ultimo articolo.
				// Per questo snippet vedi http://wordpress.org/support/topic/196135#post-827418
				query_posts(array(
					'showposts' => 1,
					'caller_get_posts'=> 1,
					'cat' => -$cat_video,
					'post__not_in' => $published,
				));
			?>
 
			<?php if (have_posts()) : ?>
 
				<?php while(have_posts()) : the_post(); ?>
 
					<?php $published[] = get_the_ID(); // Raccogliamo quest'altra ID ?>
 
					<div <?php post_class(''); ?> id="post-<?php the_ID(); ?>">
 
						<h2>
							<a href="<?php the_permalink() ?>" rel="bookmark" title="Link a <?php the_title_attribute(); ?>">
								<?php the_title(); ?>
							</a>
						</h2>
 
						<div class="entry">
							<?php the_excerpt(); ?>
						</div>
 
					</div>
					<!-- close post -->
 
				<?php endwhile; ?>
 
			<?php endif; ?>
 
		</div>
		<!-- close homepage-top -->
 
		<!-- /// INIZIA HOMEPAGE-LEFT \\\ -->
 
        <div id="homepage-left">
 
			<?php
				query_posts(array(
				'showposts' => $posts_number,
				'cat' => $cat_left,
				'post__not_in' => $published,
				));
			?>
 
			<?php if (have_posts()) : while(have_posts()) : the_post(); ?>
 
				<?php $published[] = get_the_ID(); // Raccogliamo queste altre ID ?>
 
				<div <?php post_class('sticky-home post-home'); ?> id="post-<?php the_ID(); ?>">
 
					<div class="home-center-img">
						<?php if (function_exists('get_the_image')) {
							get_the_image(array('image_class' => 'homepage-center-image', 'image_scan' => 'true', 'default_size' => 'thumbnail', 'width' => '70', 'height' => '70'));
						} ?>
					</div>
 
					<strong>
						<a href="<?php the_permalink() ?>" rel="bookmark" title="Link a <?php the_title_attribute(); ?>"><?php the_title(); ?></a>
					</strong>
 
					<div class="entry">
						<?php the_excerpt(); ?>
					</div>
 
				</div>
 
				<hr />
 
			<?php endwhile; endif; ?>
 
			<strong><a href="<?php echo get_category_link($cat_left); ?>" rel="bookmark">
				Altri articoli nella categoria <?php echo get_cat_name($cat_left); ?>
			</a></strong>
 
		</div>
		<!-- close homepage-left -->
 
		<!-- /// INIZIA HOMEPAGE-RIGHT \\\ -->
 
        <div id="homepage-right">
 
			<?php query_posts(array(
				'showposts' => $posts_number,
				'cat' => $cat_right,
				'post__not_in' => $published,
				));
			?>
 
			<?php if (have_posts()) : while(have_posts()) : the_post(); ?>
 
				<?php $published[] = get_the_ID(); // Raccogliamo queste altre ID ?>
 
				<div <?php post_class(''); ?> id="post-<?php the_ID(); ?>">
 
					<strong>
						<a href="<?php the_permalink() ?>" rel="bookmark" title="Link a <?php the_title_attribute(); ?>">
							<?php the_title(); ?>
						</a>
					</strong>
 
					<div class="entry">
						<?php the_excerpt(); ?>
					</div>
 
				</div>
 
			<?php endwhile; endif; ?>
 
			<strong><a href="<?php echo get_category_link($cat_right); ?>" rel="bookmark">
				Altri articoli nella categoria <?php echo get_cat_name($cat_right); ?>
			</a></strong>
 
		</div>
		<!-- close homepage-right -->
 
		<!-- /// INIZIA HOMEPAGE-BOTTOM \\\ -->
 
        <div id="homepage-bottom">
 
			<?php query_posts(array(
				'showposts' => $cpo_number_posts_bottom,
				'cat' => $cpo_cat_bottom,
				'post__not_in' => $published,
				));
			?>
 
			<div class="section-home"><?php echo get_cat_name($cpo_cat_bottom); ?></div>
 
			<?php if (have_posts()) : while(have_posts()) : the_post(); ?>
 
				<div <?php post_class(''); ?> id="post-<?php the_ID(); ?>">
 
					<strong>
						<a href="<?php the_permalink() ?>" rel="bookmark" title="Link a <?php the_title_attribute(); ?>">
							<?php the_title(); ?>
						</a>
					</strong>
 
					<div class="entry">
						<?php the_excerpt(); ?>
					</div>
 
				</div>
 
			<?php endwhile; endif; ?>
 
			<strong><a href="<?php echo get_category_link($cat_bottom); ?>" rel="bookmark">
				Altri articoli nella categoria <?php echo get_cat_name($cat_bottom); ?>
			</a></strong>
 
		</div>
		<!-- close homepage-bottom -->
 
	</div>
	<!-- close content -->
 
	<?php get_sidebar(); ?>
 
<?php get_footer(); ?>

Ulteriori risorse

  • Il codice presentato in questa pagina trae spunto dallo snippet presente in questa discussione del forum di WordPress.
  • Un'altra soluzione è presente in Weblogtoolscollection, che utilizza lo stesso concetto (raccolta delle ID e confronto) ma con uno snippet diverso.
Strumenti personali
Namespace
Varianti
Azioni
Navigazione
Argomenti
ExtraWiki
Strumenti