Consultas personalizadas de WordPress: bucles múltiples

Publicado: 2021-01-29

En la mayoría de los casos, al crear un sitio web con WordPress, el tema que active mostrará de manera predeterminada una página principal que enumera sus publicaciones recientes, a menos que elija mostrar una página estática desde las opciones de administración en Configuración> Lectura. Pero, ¿qué sucede si desea mostrar una gama diferente de contenido que no sea una página estática ni sus últimas publicaciones? Afortunadamente esto es posible usando WordPress Multiple Loops.

¡Veamos cómo se puede lograr esto!

Use bucles múltiples en su página de inicio de WordPress

Antes de comenzar, vale la pena señalar que debe realizar estas modificaciones en su propio sitio web utilizando un tema secundario, ya que editaremos los archivos de plantilla de su tema. Si no hace esto, descubrirá que perderá las modificaciones que realice la próxima vez que actualice su tema. Puede obtener más información sobre los temas secundarios aquí.

Independientemente del tema que esté utilizando, el archivo PHP correspondiente para la página de inicio incluirá un bucle estándar que muestra algunas publicaciones (en la mayoría de los casos, serán publicaciones publicadas recientemente). En el tema Twenty Twenty, por ejemplo, encontrarás el código que controla esto dentro del archivo index.php alrededor de la línea 79.

 if ( have_posts() ) { $i = 0; while ( have_posts() ) { $i++; if ( $i > 1 ) { echo '<hr class="post-separator styled-separator is-style-wide section-inner" aria-hidden="true" />'; } the_post(); get_template_part( 'template-parts/content', get_post_type() ); } }

En un bucle estándar como este, se utilizan dos variables globales importantes:

  • El $wp_query que es un objeto de clase WP_Query y contiene un resultado de consulta de base de datos WP
  • El $post que es el objeto de clase WP_Post actual.

En el fragmento de código anterior, primero verificamos si hay publicaciones para mostrar con la función global have_posts() y, si es así, iteramos a través de estas publicaciones dentro de un ciclo while. La función global the_post() es la que itera a través de las publicaciones que le indican a WordPress que vaya a la siguiente publicación.

Si desea ver estas funciones y clases en detalle, puede encontrarlas en el archivo wp-includes/class-wp-query.php .

Para los fines de nuestro ejemplo, activamos el tema Twenty Twenty y luego creamos 6 Publicaciones en una categoría denominada "Categoría 1" y 5 Publicaciones de servicio en una categoría denominada "Servicios".

Para simplificar las cosas, mantendremos el código de bucle lo más simple posible al mostrar solo una lista de los títulos de las publicaciones.

 if ( have_posts() ) { while ( have_posts() ) { the_post(); the_title( '<h3 class="entry-title">', '</h3>' ); } }

Esto significa que en nuestra página de inicio veremos algo como esto:

Primeros pasos Personalización de la salida de nuestra página de inicio

Como vimos en la captura de pantalla anterior, si visitamos nuestra 'página principal', veremos las 10 publicaciones más recientes, independientemente de las categorías que se les hayan asignado.

Ahora procederemos a crear nuestra propia plantilla de página de inicio personalizada donde incluiremos una salida personalizada.

Para hacer esto, cree un archivo llamado custom-homepage.php y guárdelo en la carpeta de su tema. Agregue el siguiente código a esta página:

 <?php /* * Template Name: My custom homepage template */ get_header(); if ( have_posts() ) { while ( have_posts() ) { the_post(); the_title( '<h4 class="example"></h4>' ); } } get_footer();

Luego, diríjase a su administrador de WordPress y cree una página llamada 'Mi página de inicio' y seleccione 'Mi plantilla de página de inicio personalizada' en el menú desplegable Plantilla como plantilla.

Luego, para que esta sea la página de inicio predeterminada, deberá seleccionarla en el menú Configuración (Configuración> Lectura> Una página estática).

En este punto, si echa un vistazo a su página de inicio, debería ver solo el título de la página cuando se ve desde la parte frontal de su sitio web.

Ahora que tenemos esta configuración, agreguemos algunas consultas a nuestra plantilla 'Mi plantilla de página de inicio personalizada'.

Adición de consultas personalizadas

Nuestro objetivo en este ejemplo será mostrar algunas de nuestras últimas publicaciones de todas las categorías. Debajo de esto, mostraremos publicaciones de un tipo de publicación personalizado llamado 'libros'. Si no sabe cómo configurar tipos de publicaciones personalizadas, consulte el artículo 'Crear tipos de publicaciones personalizadas de WordPress manualmente'. Incluir un tipo de publicación personalizado es, por supuesto, completamente opcional. Si no desea hacer esto, simplemente omita los pasos en los que nos referimos a este tipo de publicación.

Comencemos reemplazando el ciclo actual (que se encuentra en index.php alrededor de la línea 79) con este:

 $args = array( 'posts_per_page' => 8, 'orderby', 'date', 'order', 'DESC' ); $query = new WP_Query( $args ); while ( $query->have_posts() ) : $query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

Este ciclo significará que su página de inicio ahora mostrará sus 8 publicaciones más recientes (como se muestra a continuación):

Luego, si desea incluir el tipo de publicación personalizada 'libros' (o cualquier otro tipo de publicación personalizada), agregaremos un segundo ciclo para las publicaciones de libros justo debajo del primer ciclo como este:

 echo '<h4>Books</h4>'; $args = array( 'post_type' => 'book', 'posts_per_page' => 8 ); $query = new WP_Query( $args ); while ($query->have_posts()) : $query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

Dirígete al front-end de tu sitio web y actualiza la página para confirmar que todo funciona como se esperaba.

Dividir una consulta personalizada en partes

Puede ser útil dividir una consulta personalizada en partes. Una razón para hacer esto sería si quisiera 'interrumpir' la primera consulta mostrando publicaciones de otra categoría o tipo de publicación antes de reanudar el ciclo inicial. Esto es útil si, por ejemplo, desea mostrar las últimas publicaciones de una categoría y luego mostrar otro contenido antes de finalmente concluir con más "últimas publicaciones" para terminar la página.

Saltemos a esto. Para comenzar, elimine el contenido del archivo custom-homepage.php que usamos antes y agregue el código a continuación.

 <?php /* * Template Name: My custom homepage template */ get_header(); //////////// // Services Posts loop echo '<h4>Services</h4>'; $args = array( 'posts_per_page' => 3, 'category_name'=> 'services' ); $services = new WP_Query( $args ); while ( $services->have_posts() ) : $services->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; // Books Posts in between echo '<h4>Books</h4>'; $args = array( 'post_type' => 'book', ); $books = new WP_Query( $args ); while ( $books->have_posts() ) : $books->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; // Resume Services Posts loop echo '<h4>More Services</h4>'; $args = array( 'offset' => '3', 'posts_per_page' => 3, 'category_name'=> 'services' ); $services = new WP_Query( $args ); while ( $services->have_posts() ) : $services->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; //////////// get_footer();

En el primer bucle recuperamos 3 publicaciones de la categoría Servicios. Para reanudar las publicaciones de la categoría Servicios en el tercer bucle y evitar duplicados, definimos un desplazamiento => 3 . Esto significaría que veríamos lo siguiente:

Por supuesto, puede modificar el valor de compensación a cualquier número que desee.

Agregar publicaciones personalizadas a la consulta de publicaciones más recientes

¿Qué pasa si queremos incluir las publicaciones de libros en las últimas publicaciones de la página de inicio? El bucle predeterminado no incluye publicaciones personalizadas de forma predeterminada. Así es como podemos arreglar esto.

Para esta sección, estableceremos la configuración de lectura de la página de inicio en 'Tus últimas publicaciones'.

La ruta a seguir aquí es el uso del gancho pre_get_posts . Este enlace se introduce en el archivo wp-includes/class-wp-query.php y se usa para personalizar el objeto $query y el bucle principal de WordPress como mejor le parezca. Se ejecuta después de que se crea el objeto de la variable de consulta, pero antes de que se ejecute la consulta real.

Abra el archivo functions.php de su tema activo e inserte el siguiente código al final:

 function homepage_add_cpt( $query ) { if ( $query->is_main_query() && is_home() ) { $query->set( 'post_type', array( 'post', 'book' ) ); } } add_action( 'pre_get_posts', 'homepage_add_cpt' );

Lo que hace este código en la condición if es asegurarse de que las modificaciones se apliquen en la página de inicio solo mientras se ejecuta la consulta principal.

Si ahora visita su página de inicio, notará que en las últimas publicaciones, también se incluyen las publicaciones personalizadas de 'libro'.

Conclusión

Casi sin excepción, cualquier cosa que necesite lograr en términos de contenido para su página de inicio de WordPress es posible. Como mostramos aquí, usar WordPress Multiple Loops es una forma poderosa de personalizar la salida que aparece en su página de inicio. Nuestro enfoque aquí es solo uno de muchos. WordPress ofrece increíbles niveles de control sobre la salida que aparece en su sitio. ¡Experimenta con las herramientas que te brindan para lograr lo que quieres!