Guía: Cómo consultar publicaciones en WordPress
¿Qué métodos están disponibles para hacer una consulta de publicación personalizada y cuándo es mejor usarlos? Esta publicación tiene como objetivo establecer una comprensión sólida de dos métodos de consulta de publicaciones, cómo acceder a los resultados, cómo construir argumentos y, finalmente, cómo limpiar después de eso. Los dos métodos que veremos son get_posts()
y WP_Query
.
Cuando se trata de hacer una nueva consulta de publicación, en realidad hay dos opciones (en el momento de escribir este artículo). La elección realmente solo depende de su preferencia (y algún efecto de rendimiento menor). Una opción tiene el potencial de estropear el bucle/consulta global en el que se encuentra actualmente, a menos que lo maneje correctamente. Con una opción maneja objetos y en la otra opción maneja una matriz. Sin embargo, los argumentos para personalizar la consulta posterior son idénticos.
¿Consulta global?
Si no está seguro de lo que quiero decir con "estropear la consulta global", es esto. WordPress siempre realiza una consulta global, dependiendo de la página en la que se encuentre. Si un visitante visita un archivo de categoría, WordPress ha realizado una consulta de publicación para esto. El tema normalmente accedería a las publicaciones en la consulta usando "el bucle". Cuando hacemos una nueva consulta con su propio bucle dentro de este bucle, debemos asegurarnos de que la consulta global de WordPress y nuestra consulta se manejen por separado.
Sin embargo, si desea modificar la consulta de publicación de WordPress, esa es otra historia. Tengo otra publicación que profundiza sobre cómo hacer eso.
Veamos las dos opciones que tenemos y cómo las manejamos. Después de eso, veremos los argumentos para personalizar la consulta. Tenga en cuenta que los argumentos son idénticos para ambos.
Los dos métodos de consulta de publicaciones.
Puede consultar publicaciones con la función get_posts()
o creando una nueva instancia de WP_Query.
La primera opción devuelve una matriz de publicaciones y en la segunda maneja un objeto. Debido a que get_posts()
devuelve una matriz de solo las publicaciones, generalmente es más simple usar esto en cualquier lugar que desee. Sin embargo, si desea paginar su consulta, definitivamente debe crear una WP_Query
instancia.
La función get_posts
es una función contenedora, WP_Query
lo que significa que acepta los mismos argumentos, pero get_posts
tiene algunos argumentos de "alias" adicionales. La página de documentación de WordPress para get_posts no enumera los posibles argumentos (excepto los argumentos de alias), pero se refiere a la página de documentación de WP_Query para los argumentos. Veremos más de cerca los argumentos más adelante.
Si el rendimiento es un problema (es decir, el sitio tiene muchas publicaciones), get_posts
es más rápido que usar WP_Query
porque omite el cálculo de la paginación.
El método de recorrer su consulta de publicación personalizada difiere según el método que elija. Debe estar familiarizado con el bucle común de WordPress que se usa en casi todas las plantillas de temas:
if (have_posts()) {
while (have_posts()): the_post();
// Access to each post; you can use template tags here
endwhile;
}
Bucle usando WP_Query
Repetir los resultados de using WP_Query
es exactamente lo mismo, excepto que nos referimos específicamente al objeto de instancia en el bucle. También debemos recordar "restablecer el estado" después de que terminemos de hacer un bucle para que el objeto de publicación global vuelva a ser como era antes. Para hacer eso usamos wp_reset_postdata()
.
Si descarga el objeto instanciado por WP_Query
( $custom_query
en el ejemplo anterior), encontrará la consulta completa y los argumentos utilizados. Las partes interesantes aquí son las propiedades ‘ found_posts
‘ y ‘ posts
‘. La posts
propiedad ‘ ‘ contiene el resultado de los objetos de publicación por los que se ejecutará el ciclo. El número de publicaciones que coincidieron con su consulta se devuelve en ‘ found_posts
‘ y es útil si desea realizar una paginación personalizada. Divida este valor con la configuración de WordPress para el número de publicaciones por página para averiguar cuántas páginas necesita para su consulta, o simplemente consulte la propiedad ‘ max_num_pages
‘.
Nota: cuando usa get_posts
WordPress, solo devuelve la posts
propiedad ‘ ‘ (que es una matriz) del WP_Query
objeto.
Bucle usando get_posts
Al usar get_posts
no usamos el "bucle de WordPress" habitual, sino que usamos un bucle de matriz de PHP normal. Cada elemento de la matriz son objetos de publicación, y no es necesario restablecerlos una vez que haya terminado de realizar el bucle. Tenga en cuenta que las etiquetas de plantilla (como the_title()
, the_permalink()
etc.) no están disponibles dentro de este bucle. Deberá consultar las propiedades del objeto de la publicación (p. ej $custom_post->ID
., ).
Recomiendo que nombre sus objetos de publicación algo diferente a $post
. Es posible que encuentre problemas al intentar acceder a las propiedades de la publicación (es posible que se refiera al objeto de la publicación global y no a la publicación en el bucle).
Si desea utilizar etiquetas de plantilla para acceder más fácilmente a la información de la publicación (como the_title()
y the_permalink()
), puede hacerlo. Haga esto diciéndole a WordPress que configure el objeto de publicación global dentro del ciclo con setup_postdata()
. Si hace esto, deberá restablecer el estado wp_reset_postdata()
después del bucle.
$custom_query = get_posts([/ Arguments here /]);
foreach ($custom_query as $post) {
setup_postdata($post);
// Template tags are available here, for example:
the_title();
}
wp_reset_postdata();
¡ Tenga en cuenta que setup_postdata
requiere que se nombren los objetos que está recorriendo (la as
parte ” " en el ciclo foreach) $post
! En el primer ejemplo, nombré los objetos de publicación $custom_post
y esto no funcionaría con setup_postdata()
.
Sin embargo, si solo necesita acceder a la información básica de la publicación, también puede omitir la configuración del objeto de publicación global y, en su lugar, usar las get_
etiquetas de plantilla " " correspondientes y la identificación de la publicación. Por ejemplo, la etiqueta the_permalink()
solo funciona correctamente si el objeto de publicación global está configurado, pero puede solicitar el enlace permanente de la publicación sin el objeto de publicación global simplemente usando echo get_the_permalink($custom_post->ID)
.
Argumentos de consulta
Puede encontrar la lista completa de todos los argumentos posibles en la página de documentación de WP_Query. Ejemplos de parámetros son publicaciones con términos específicos de una taxonomía, metavalores de publicaciones, tipos de publicaciones, inclusión o exclusión de publicaciones específicas y toda una gama de opciones para ordenar los resultados. Hay demasiados para analizar cada uno en detalle, pero aquí hay algunos ejemplos comunes de argumentos para consultar publicaciones.
Ejemplo 1: publicaciones relacionadas de la misma categoría
Supongamos que desea mostrar "publicaciones relacionadas" al final de una sola publicación. Debería mostrar una selección aleatoria de 3 publicaciones que estén en la misma categoría que la publicación actual, y debería excluir la publicación actual del resultado.
Los argumentos son bastante autoexplicativos. Pido solo ‘ post
‘ en ‘ post_type
y un máximo de 3 publicaciones en ‘ posts_per_page'
.
Para consultar publicaciones en categorías, puede crear un tax_query o usar el ‘ category__in
‘ más simple (NB: solo funciona para la categoría de publicación). En el ejemplo anterior, utilizo wp_get_post_categories()
para obtener una serie de ID de términos asignados a la publicación proporcionada, y uso esto para el argumento ‘ category__in
‘.
Puede excluir ID de publicación con ‘ post__not_in
‘ mientras que proporcioné la ID de publicación actual. Finalmente, pedí un orden aleatorio de publicaciones configurando ‘ rand
‘ en ‘ orderby
‘. Puede proporcionar, por ejemplo, ‘ title
‘ o ‘ date
‘ para ordenarlos de manera diferente. Eche un vistazo a la documentación para realizar pedidos para ver qué es posible.
Ejemplo 2: todas las publicaciones de un tipo de publicación personalizado con múltiples argumentos de orden
En este ejemplo, asumimos que tiene un tipo de publicación personalizada ‘ book
‘ y en una plantilla de página personalizada desea mostrar todos los libros publicados. Desea ordenar las publicaciones principalmente por menu_order (el atributo de la página, es un número que puede establecer por publicación) y, en segundo lugar, el título de la publicación.
Una vez más, los argumentos se explican por sí mismos. Solicito el tipo de publicación ‘ book
‘ como ‘ post_type
‘. Cuando establece ‘ posts_per_page
‘ a -1, obtendrá todas las publicaciones (publicadas, a menos que especifique algo diferente en post_status
el argumento ”). Finalmente, proporciono una matriz a ‘ orderby
‘ para decirle a WordPress que ordene las publicaciones principalmente por orden de menú en orden ascendente y, en segundo lugar, el título de la publicación en orden descendente.
Ejemplo 3: Publicaciones con metadatos personalizados
Supongamos que tiene un tipo de publicación personalizada ‘ book
‘ y desea consultar todos los libros que no están publicados o un libro publicado entre el año 1990 y 2019.
Es mejor crear una consulta mediante el uso de post meta meta_query
(para argumentos meta muy simples que puede usar meta_key
y meta_value
directamente). El meta_query
argumento ‘ ‘ requiere una matriz, donde cada argumento es una matriz. Puede controlar la relación entre cada argumento con ‘ relation
‘, que configuré en ‘ OR
‘ en el ejemplo anterior.
Proporciono dos argumentos de metadatos para ‘ meta_query
‘. El primero simplemente compara la clave meta ‘ book_status
‘ con el texto ‘ unpublished
‘, y si es igual, se incluirá. En el segundo argumento, le digo a WordPress que obtenga cualquier valor en la clave meta ‘ year_published
‘ que esté entre los números 1990 y 2019.
Conclusión
Ahora debería tener una comprensión básica de los dos métodos para consultar publicaciones. No hay una gran diferencia ya que puede crear la misma consulta usando ambos, pero la forma de manejar los dos es diferente. Los tres ejemplos proporcionados de argumentos de consulta solo tocan la superficie de las consultas que puede crear. Consulte la documentación de WP_Query para obtener una descripción general completa con muchos ejemplos.
Si tiene curiosidad acerca de cómo modificar la consulta global que realiza WordPress, tengo una publicación separada que profundiza al respecto.