Incluso si cree que nunca antes ha usado WP_Query, lo ha hecho cada vez que carga una página en WordPress. En los términos más simples, la forma en que funciona WordPress es cuando carga una página, crea un objeto WP_Query que puede acceder a la publicación o publicaciones que solicita la URL actual, es decir, las primeras diez publicaciones, o 1 publicación específica, o las primeras 10 publicaciones en una categoría, etc. Esto permite funciones en los archivos de plantilla de su tema, como the_post() y the_content() para generar la publicación correcta o el contenido de publicación correcto.
Cómo funciona eso no es importante en este momento. Es importante que sepas que eso es lo que está pasando. Eso es importante porque lleva a hacer la pregunta «Oye, Josh, ¿y si quisiera hacer mi propia colección de publicaciones, tal vez todas las publicaciones con dos etiquetas específicas? ¿O cómo puedo mostrar todas las publicaciones en un tipo de publicación personalizada, ordenadas por un campo personalizado? Esa es una pregunta perfectamente natural para un desarrollador de WordPress en crecimiento. La respuesta es que necesita aprender a construir y usar sus propios objetos WP_Query.
Tenga en cuenta que si bien lo que estoy a punto de cubrir no es particularmente avanzado, no es el tema más amigable para principiantes. Asumo en este artículo que está familiarizado con el bucle estándar de WordPress y se siente cómodo abriendo un tema o un tema secundario y haciendo algunos cambios en el código PHP que contiene.
Como habrás notado en los dos párrafos anteriores, sigo refiriéndome al objeto WP_Query. Eso es porque cuando usa WP_Query está usando lo que se llama PHP orientado a objetos. La mayoría de las personas, incluido yo mismo, ni siquiera se dan cuenta de esto cuando comienzan a usar WP_Query.
Piense en el objeto WP_Query como un contenedor especialmente diseñado para las publicaciones que necesita y algunos métodos útiles (funciones dentro de ese contenedor) para trabajar con ellos. Por ejemplo, en un bucle normal de WordPress , comenzamos el bucle así:
01
|
<pre><?php while ( have_posts() ) : the_post(); ?> |
Cuando usamos WP_Query, comenzamos nuestro ciclo así:
01
|
<?php while ( $query ->have_posts() ) : $query ->the_post(); ?> |
¿Por qué? Porque queremos las publicaciones de un objeto WP_Query específico, que en este caso se almacena en la variable $query.
Construyendo un objeto WP_Query
Como ya expliqué, un objeto WP_Query es un contenedor de publicaciones muy específicas. Cuando construimos el objeto, especificamos una lista de argumentos para que WordPress los use en la construcción de nuestra consulta. Y luego almacenamos el objeto en una variable para que podamos usarlo tantas veces como sea necesario.
WP_Query tiene una larga lista de argumentos aceptados en su página de códice. No puedo enseñárselos todos en este artículo, sino que mi objetivo es que se sienta cómodo trabajando con lo que ve en la documentación.
Aquí hay un ejemplo básico, donde solicitamos todas las publicaciones con la etiqueta «skywalker» y la categoría «jedi»:
01
02
03
04
05
|
$args = array ( 'tag' => 'skywalker' , 'category' => 'jedi' , ); $query = new WP_Query( $args ); |
Para desglosar un poco lo que les acabo de mostrar, lo que hemos hecho, está en la variedad de argumentos, se le dice a WordPress: “Quiero publicaciones que tengan la etiqueta ‘skywalker’ y la categoría ‘jedi’. Luego tomamos esa matriz de argumentos, almacenados en la variable $args y creamos un nuevo objeto WP_Query con él y almacenamos ese objeto en la variable $query.
Podríamos esperar que esta consulta arroje publicaciones con títulos como Luke Skywalker y Anakin Skywalker.
Bucle con WP_Query
El simple hecho de tener un objeto WP_Query no es particularmente útil en sí mismo. El hecho de que podamos recorrer la publicación que contiene es lo que lo convierte en algo útil. Recorrer el objeto WP_Query es muy similar a trabajar con un bucle regular de WordPress. La diferencia es que debemos hacerlo en el contexto de nuestro objeto WP_Query. Aquí hay un ejemplo, basado en la última sección:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
<?php $args = array ( 'tag' => 'skywalker' , 'category' => 'jedi' , ); $query = new WP_Query( $args ); ?> <?php if ( $query ->have_posts() ) : ?> <?php while ( $query ->have_posts() ) : $query ->the_post(); ?> <h2><?php the_title(); ?></h2> <?php echo the_content(); ?> <?php endwhile ; ?> <?php endif ; ?> <?php wp_reset_postdata(); ?> |
Repasemos lo que acabamos de hacer. El primer paso fue construir el objeto WP_Query y almacenarlo en $query. Ya hemos discutido cómo funciona eso y por qué. El siguiente paso es verificar si la consulta devolvió alguna publicación. Hacemos esto con $query->have_posts() para que WordPress esté revisando nuestro objeto WP_Query en busca de publicaciones, no el objeto WP_Query principal que WordPress creó automáticamente cuando cargó la publicación.
Luego, usamos el mismo sistema de bucle que está acostumbrado a ver en los temas para entrar en publicaciones individuales, excepto que debemos hacerlo en el contexto del objeto actual, por lo que nuevamente usamos el objeto actual, seguido del operador de flecha ( ->) y el nombre del método –función en la clase– que queremos utilizar. Dentro del ciclo, todo funciona como de costumbre. No necesitamos hacer nada especial con funciones como the_title() o the_content().
Terminamos el ciclo de la misma manera que siempre lo hacemos, pero después hay un paso adicional. Eso es usar wp_reset_postdata() para decirle a WordPress que se reinicie. Este paso no afecta el bucle que sigue, pero si lo omitimos, podría causar que otros objetos WP_Query, como los de sus widgets, se comporten de manera extraña. Por esta razón, es importante finalizar su bucle WP_Query con un reinicio.
Cuándo y dónde usar WP_Query
Es importante saber cuándo es el momento adecuado para usar WP_Query y asegurarse de que no está recreando algo que WordPress ya hace por usted. Por ejemplo, si desea una página que enumere todas las publicaciones de un autor específico, no querrá usar WP_Query. WordPress ya tiene páginas de archivo de autor.
Por otro lado, ¿qué pasaría si quisiera que su plantilla de página principal (front-page.php) tuviera dos bucles personalizados? Ese sería un gran uso para WP_Query. Supongamos que desea mostrar en su página principal las tres publicaciones más recientes en el tipo de publicación personalizada de cartera y luego las tres publicaciones con la mayor cantidad de comentarios, publicadas en el último mes. Esos son excelentes usos para WP_Query. Terminaré el artículo mostrándote cómo hacer exactamente eso, ya que son excelentes ejemplos prácticos de cómo usar WP_Query.
Mostrar publicaciones de un tipo de publicación personalizado
Hace unas semanas escribí un artículo aquí sobre el uso del nuevo tipo de publicación personalizada de cartera proporcionada por JetPack. Déjame mostrarte cómo generar un enlace a las tres publicaciones más recientes en ese tipo de publicación, que se llama cartera jetpack. Primero necesitamos construir un objeto WP_Query, limitado a las tres publicaciones más recientes, en un tipo de publicación específico. Así es como se verían los argumentos:
01
02
03
04
05
06
|
$args = array ( 'post_type' => 'jetpack-portfolio' , 'posts_per_page' => '3' , 'paged' => '1' , ); $query = new WP_Query( $args ); |
Lo que hemos hecho aquí es decirle a WordPress, quiero publicaciones de un tipo de publicación específico, las quiero organizadas en grupos de 3, ese es el argumento ‘publicaciones_por_página’, y solo quiero la primera «página» o grupo de publicaciones: ese es el argumento ‘paginado’.
Ahora podemos construir un ciclo para crear los enlaces, usando nuestro objeto que está almacenado en $query, así:
01
02
03
04
05
06
07
|
<?php if ( $query ->have_posts() ) : ?> <h1>Recent Portfolio Items</h1> <?php while ( $query ->have_posts() ) : $query ->the_post(); ?> <h2><a href= "<?php the_permalink(); ?>" ><?php the_title(); ?></a></h2> <?php endwhile ; ?> <?php endif ; ?> <?php wp_reset_postdata(); ?> |
Tenga en cuenta que puse el encabezado de las publicaciones de la cartera dentro del cheque para ver si tenemos publicaciones. De esa manera, si no hay publicaciones de cartera, el encabezado no se muestra, seguido de nada, lo que se vería divertido. bucle regular de WordPress. Diviértete con el marcado dentro del bucle y hazlo tuyo.
Mostrando las publicaciones más comentadas
Ahora, para nuestro ejemplo final, mostremos la publicación más comentada del último mes. La segunda mitad de los argumentos de consulta para este son muy similares a los argumentos del último ejemplo, excepto que agregamos argumentos para ordenar las publicaciones por la cantidad de comentarios que tiene una publicación.
Lo que hace que esta matriz de argumentos sea un poco más complicada es que agregamos una consulta de fecha. De esa manera limitamos las publicaciones al último mes. Puede omitir la consulta de fecha para mostrar las publicaciones más comentadas de todos los tiempos. Las consultas de fecha son realmente simples, ya que los argumentos son muy legibles. Como puede ver a continuación, solicitamos publicaciones creadas después de 1 mes y antes de hoy. Al establecer el argumento ‘inclusivo’ en verdadero, se devuelven publicaciones cuyas fechas son de hoy o hace exactamente un mes. Si establecemos eso en falso, perderíamos las publicaciones de hoy, lo cual no tiene ningún sentido:
01
02
03
04
05
06
07
08
09
10
11
12
|
$args = array ( 'date_query' => array ( 'after' => '1 month ago' , 'before' => 'today' , 'inclusive' => true, ), 'orderby' => 'comment_count' , 'order' => 'DESC' , 'posts_per_page' => '3' , 'paged' => '1' , ); $query = new WP_Query( $args ); |
Te dejaré el resultado de este, ya que debería ser obvio para ti saber cómo trabajar con el objeto WP_Query.
Una cosa que quería mencionar es que, si usara ambas consultas una después de la otra, almacenar la segunda en una variable con el mismo nombre que la primera destruirá el objeto de consulta original y lo reemplazará con el nuevo. uno. Si ha terminado con el primer objeto, es bueno hacerlo, ya que lo borra de la memoria de su servidor. Si necesita conservar el primer objeto para usarlo más tarde, puede almacenar el segundo objeto en una variable con un nombre diferente.
consulta en
Espero que este artículo le haya ayudado a descubrir el maravilloso mundo de WP_Query y le haya facilitado la lectura de la página del códice de WP_Query o la lectura de otros artículos o tutoriales que usan WP_Query para lograr un objetivo específico. Comprender cómo funciona WP_Query es importante si desea personalizar el comportamiento de WordPress para lograr un objetivo específico que exige el diseño de un sitio.