Advertisement
  1. Code
  2. PHP

Usa dos bucles para generar tu primera entrada de blog de forma diferente

Scroll to top
Read Time: 10 min

() translation by (you can also view the original English article)

Creo que puedo decir con seguridad que si eres un blogger, querrás destacar el contenido más reciente de tu blog para que la gente lo vea y lo lea. Existen algunas formas mediante las que podrías conseguirlo, incluyendo el uso de diferentes estilos para la primera entrada en tu página de blog para resaltarla o mostrarla de forma prominentemente en tu barra lateral.

En este tutorial te mostraré cómo ir un poco más allá de lo que podrías lograr usando CSS: en lugar de aplicar simplemente estilo diferente a tu primera entrada de blog, generarás contenido distinto para ese fin. Concretamente, la primera entrada tendrá un título, una imagen destacada y contenido, mientras que el resto de entradas solo tendrán el título, la imagen destacada y el extracto.

Puedes adaptar esta técnica: si no quieres tanto detalle, puedes modificar el bucle en cada una de las consultas con las que trabajaremos para que (por ejemplo) la primera entrada tenga un título, una imagen y un extracto, mientras que otras solo tengan el título y la imagen. O podrías eliminar la imagen destacada en la entradas posteriores. Depende de ti.

La técnica que usaremos para hacer esto implica usar la clase WP_Query para escribir una consulta adicional antes de la consulta principal en el archivo de plantilla home.php, que controla la página principal del blog. A continuación, usaremos pre_get_posts() para modificar la consulta principal de modo que la publicación más reciente no se genere dos veces. Crearé un tema hijo del tema predeterminado Twenty Fifteen y crearé un archivo home.php para el mismo, además de una hoja de estilo para configurar el tema secundario.

Lo que necesitarás

Para seguir este tutorial, necesitarás lo siguiente:

  • una instalación de desarrollo de WordPress
  • una copia del tema Twenty Fifteen instalado (o puedes trabajar con tu propio tema si lo prefieres)
  • entradas añadidas a tu sitio, yo he añadido la mayor parte de las mías importando los datos de prueba unitaria del tema
  • un editor de código

Configurar del tema del hijo

Si estás trabajando con el tema Twenty Fifteen, el primer paso consiste en configurar tu tema hijo. Crea una nueva carpeta en tu directorio wp-content/themes y asígnale un nombre: estoy llamando a la mía tutsplus-blog-page-two-loops. Ahora cree un archivo style.css vacío en esa carpeta y añade en él lo siguiente:

1
/*

2
Theme Name:     Tuts+ Use Two Loops on Your Main Blog Page

3
Theme URI:      http://rachelmccollin.co.uk/wptutsplus-taxonomy-archive-list-by-second-taxonomy/

4
Description:    Theme to support WPTutsPlus tutorial on creating a custom taxonomy archive. Child theme for the Twenty Fifteen theme.

5
Author:         Rachel McCollin

6
Author URI:     http://rachelmccollin.co.uk/

7
Template:       twentyfifteen

8
Version:        1.0

9
*/
10
11
@import url("../twentyfifteen/style.css");

Esto le dice a WordPress que tu tema es un tema hijo del tema Twenty Fifteen e importa la hoja de estilo de ese tema. Es probable que desees editar algunos de los detalles para reflejar el hecho de que se trata de un tema tuyo.

Crear un archivo de plantilla para la página del blog

Como es la página principal del blog lo que deseas modificar, tendrás que crear un archivo de plantilla para ello en tu tema hijo. El archivo de plantilla que necesitas crear es home.php, que alimenta la página principal del blog, independientemente de que sea o no la primera página de tu sitio.

Crea un archivo llamado home.php en la carpeta del tema.

Ahora abre el archivo index.php en Twenty Fifteen y copia el código al principio y al final de ese archivo (es decir, no copies el bucle). Tu archivo tendrá un aspecto similar al siguiente:

1
<?php
2
3
get_header(); ?>
4
5
    <div id="primary" class="content-area">
6
		<main id="main" class="site-main" role="main">
7
		
8
			<header>
9
				<h1 class="page-title screen-reader-text"><?php single_post_title(); ?></h1>
10
			</header>
11
			
12
			
13
            <?php // Previous/next page navigation.

14
    		the_posts_pagination( array(
15
			    'prev_text'          => __( 'Previous page', 'twentyfifteen' ),
16
			    'next_text'          => __( 'Next page', 'twentyfifteen' ),
17
			    'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Page', 'twentyfifteen' ) . ' </span>',
18
			) ); ?>
19
            
20
		</main><!-- .site-main -->
21
	</div><!-- .content-area -->
22
23
<?php get_footer(); ?>

Si usas tu propio tema, copia el código equivalente del archivo index.php de tu tema en su lugar, para que tengas los elementos que lo contienen para tu página pero ningún bucle.

Añadir el primer bucle

El siguiente paso es crear el primer bucle, que mostrará la entrada más reciente en su totalidad.

Debajo de la etiqueta de cierre </header> en tu archivo home.php, añade los argumentos para la consulta:

1
$args = array(
2
'posts_per_page' => '1',
3
);

Esto sólo consultará la entrada más reciente. Ten en cuenta que no tienes que incluir el tipo de entrada y el valor predeterminado es 'post'.

Ahora agrega el bucle debajo de tus argumentos:

1
$query = new WP_query ( $args );
2
if ( $query->have_posts() ) { ?>
3
4
<?php while ( $query->have_posts() ) : $query->the_post(); /* start the loop */ ?>
5
6
<article id="post-<?php the_ID(); ?>" <?php post_class( 'first-post' ); ?>>
7
    <?php the_title( sprintf( '<h2 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>
8
9
	<?php if ( has_post_thumbnail() ) { ?>
10
		<a href="<?php the_permalink(); ?>">
11
			<?php the_post_thumbnail( 'medium', array(
12
				'class' => 'left',
13
				'alt'	=> trim(strip_tags( $wp_postmeta->_wp_attachment_image_alt ))
14
			) ); ?>
15
		</a>
16
	<?php } ?>
17
	
18
	<section class="entry-content">
19
		<?php the_content(); ?>
20
	</section><!-- .entry-content -->	
21
				
22
	<footer class="entry-footer">
23
		<?php twentyfifteen_entry_meta(); ?>
24
		<?php edit_post_link( __( 'Edit', 'twentyfifteen' ), '<span class="edit-link">', '</span>' ); ?>
25
	</footer><!-- .entry-footer -->
26
	
27
</article><!-- #post-## -->
28
29
<?php // End the loop.

30
endwhile;
31
32
rewind_posts();
33
34
} ?>

Este bucle genera el título de la entrada, la miniatura (si la hay) y el contenido.

Ten en cuenta que he añadido una clase adicional, .first-post, en la etiqueta de plantilla post_class(). Si quieres resaltar tu primera entrada usando CSS, esta clase adicional te ofrece una manera fácil de hacerlo.

Es muy importante que añadas rewind_posts() después del bucle, ya que de lo contrario el siguiente bucle no funcionará.

Añadir el segundo bucle

El segundo bucle es muy similar, pero en lugar de usar WP_Query, solo tiene acceso a la consulta principal.

Debajo del bucle que acabas de agregar, añade el segundo bucle:

1
<?php while ( have_posts() ) : the_post(); ?>
2
3
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
4
    <?php the_title( sprintf( '<h2 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>
5
6
	<?php if ( has_post_thumbnail() ) { ?>
7
		<a href="<?php the_permalink(); ?>">
8
			<?php the_post_thumbnail( 'medium', array(
9
				'class' => 'left',
10
				'alt'	=> trim(strip_tags( $wp_postmeta->_wp_attachment_image_alt ))
11
			) ); ?>
12
		</a>
13
	<?php } ?>
14
	
15
	<section class="entry-summary">
16
		<?php the_excerpt(); ?><a href="<?php the_permalink(); ?>">Further information</a>.
17
	</section><!-- .entry-summary -->
18
				
19
	<footer class="entry-footer">
20
		<?php twentyfifteen_entry_meta(); ?>
21
		<?php edit_post_link( __( 'Edit', 'twentyfifteen' ), '<span class="edit-link">', '</span>' ); ?>
22
	</footer><!-- .entry-footer -->
23
	
24
</article><!-- #post-## -->
25
26
<?php // End the loop.

27
endwhile; ?>

Este bucle es muy similar al primero, pero con dos diferencias:

  • Produce el extracto en lugar del contenido.
  • No incluye la clase .first-post .

Ahora guarda tu archivo.

Desplazar la consulta principal mediante pre_get_posts

Por el momento, si revisas la página principal de tu blog verás que tu entrada más reciente se muestra dos veces. Lo solucionaremos desplazando la consulta principal mediante el enlace de pre_get_posts.

Crea un nuevo archivo en el tema llamado functions.php. Alternativamente, si estás trabajando con tu propio tema y ya tiene un archivo de funciones, ábrelo.

Añade este código al archivo de funciones:

1
<?php
2
// offset the main query on the home page 

3
function tutsplus_offset_main_query ( $query ) {
4
     if ( $query->is_home() && $query->is_main_query() ) {
5
		 $query->set( 'offset', '1' );
6
	}
7
 }
8
add_action( 'pre_get_posts', 'tutsplus_offset_main_query' );

Esto filtra la consulta principal, pero solo en la página principal, añadiendo un desplazamiento de 1.

Ahora guarda tu archivo y echa un vistazo a la página principal de tu blog:

Main blog page showing both sticky post and most recent postMain blog page showing both sticky post and most recent postMain blog page showing both sticky post and most recent post

Hay un problema. Debido a que mi blog tiene una entrada pegajosa, esta se muestra por encima de la entrada más reciente, que no es lo que quiero. También muestra el contenido completo tanto de la entrada más reciente y como de la entrada fija.

Fijar las entradas "pegajosas"

Esto se corrige fácilmente. Abre tu archivo home.php de nuevo y añade otro argumento a los argumentos de la primera consulta:

1
'ignore_sticky_posts' => true

Esto asegurará que WordPress ignore las entradas pegajosas o fijas cuando se ejecute el primer bucle. El primer conjunto de argumentos de consulta ahora tendrá este aspecto:

1
$args = array(
2
    'posts_per_page' => '1',
3
    'ignore_sticky_posts' => true
4
);

Ahora guarde el archivo de nuevo y revisa la página de tu blog:

Blog page with most recent post at the topBlog page with most recent post at the topBlog page with most recent post at the top

¡Eso está mejor! La entrada más reciente está en la parte superior en su totalidad y la entrada pegajosa está por debajo de ella, mostrando solo su extracto. Si te desplazas hacia abajo verás que las otras entradas también muestran solo un extracto:

Blog page with posts showing excerpts onlyBlog page with posts showing excerpts onlyBlog page with posts showing excerpts only

Si deseas omitir las entradas pegajosas en el segundo bucle, puedes hacerlo agregando el argumento ignore_sticky_posts a la segunda consulta. Yo quiero que mis entradas pegajosas funcionen de la forma estándar para cualquier entrada a excepción, sin embargo, de mi entrada más reciente, así que no lo haré.

Reparar la paginación

Notarás que si navegas a la segunda y posteriores páginas de entradas (es decir, las páginas paginadas) de tu blog, se muestran las mismas entradas que en la primera página, ¡lo cual significa que solo se muestran tus diez entradas más recientes! Esto se debe a que el desplazamiento de la consulta principal ha roto la paginación.

Por suerte, esto se soluciona fácilmente modificando la función que añadiste al gancho pre_get_posts.

Abre tu archivo funciones.php de nuevo y edita la función para que se lea como la siguiente:

1
function tutsplus_offset_main_query ( $query ) {
2
     if ( $query->is_home() && $query->is_main_query() && !$query->is_paged() ) {
3
		 $query->set( 'offset', '1' );
4
	}
5
 }

Lo que hemos hecho aquí es añadir la etiqueta condicional is_paged(). Esto comprueba si existen páginas paginadas que no sean la primera, por lo que devuelve true si el visitante está mirando la segunda o posteriores páginas de entradas. Mediante el uso de !$query->is_paged(), nos aseguramos de que la consulta solo se desplazará si la página no está paginada.

Ahora guarda tu archivo y vuelve a comprobarlo. La paginación ahora estará funcionando bien.

Notarás que la misma entrada reciente sigue mostrándose en la parte superior de la página. Esto se debe a que la página está utilizando la misma plantilla y los mismos dos bucles.

En mi sitio estoy feliz de dejar esto tal cual porque quiero que la entrada más reciente sea muy prominente. Sin embargo, si deseas cambiar esto, añadiría un argumento adicional a la primera consulta, a saber, 'paged' => false.

Resumen

Modificar la forma en que la página principal de tu blog genera entradas es fácil de conseguir usando la clase WP_Query con el gancho pre_get_posts. En este tutorial has aprendido a:

  • Añadir un bucle adicional a la página de tu blog utilizando WP_Query para generar la primera entrada en su totalidad
  • modificar la consulta principal para que la primera entrada no se genere dos veces
  • corregir errores con las entradas pegajosos y la paginación

Podrías adaptar esta técnica para mostrar la última entrada de una categoría determinada, para usar contenido diferente en el bucle y mucho más.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.