En una entrada anterior ya estudiamos cómo funciona el Loop de WordPress y te expliqué con detalle los conceptos básicos para entender la porción de código fundamental que utilizan los temas de WordPress para visualizar los contenidos de tu base de datos.
Hoy iremos un paso más allá y veremos cuatro formas diferentes de personalizar el Loop de WordPress para que se comporte de la manera en que tú quieras que lo haga. Para ello te enseñaré a usar el objeto WP_Query
para crear un Loop personalizado. Además, vas a conocer las funciones query_posts()
y get_posts()
, que también te permitirán manipular el Loop. Y por último, aprovecharás el hook pre_get_posts
para modificar la consulta a la base de datos del Loop de WordPress antes de que esta se ejecute, y así cambiar el contenido que se obtiene como resultado.
Todo esto parece muy complicado (y en parte lo es), pero si sigues leyendo atentamente estoy seguro de que comprenderás los conceptos y obtendrás la experiencia suficiente como para subir de nivel en la escala de desarrolladores novatos de WordPress. ¡Atento que esto empieza ya!
Usando el objeto WP_Query
Como ya deberías saber, cuando WordPress recibe una URL del servidor web para procesar, la descompone en una serie de parámetros que utiliza cuando hace la consulta a la base de datos. Si entras en la URL de una entrada, WordPress será capaz de obtener el identificador de la entrada a partir de la URL y utilizará este identificador para hacer la consulta en la base de datos. Del mismo modo, si entras en la URL de una categoría, WordPress extraerá el nombre de la categoría de la URL para obtener de la base de datos todas las entradas que pertenezcan a tal categoría.
La consulta a la base de datos se realiza mediante el objeto WP_Query
. Concretamente, existe la variable global $wp_query
que es usada para recuperar el contenido del Loop principal de una página. Si queremos crear un nuevo Loop personalizado, tendremos que usar una nueva instancia de WP_Query
. Ten en cuenta que los Loops personalizados pueden usarse en cualquier archivo de tu tema para mostrar diferentes tipos de contenidos.
Cuando creas un nuevo objeto WP_Query
, este contiene funciones por defecto para construir consultas y ejecutarlas para obtener entradas. Nos aprovecharemos de esto para construir nuestras propias consultas personalizadas con los parámetros que queramos para modificar el Loop y así extraer el contenido que queramos de la base de datos.
A continuación, tienes un Loop personalizado usando el objeto WP_Query
para obtener y renderizar las entradas cuyo autor sea avillegasn.
Fíjate que en vez de usar los métodos have_posts()
y the_post()
directamente, tal y como vimos en la explicación del funcionamiento del Loop de WordPress, en este Loop personalizado se llaman los métodos a través de la nueva instancia del objeto WP_Query
que hemos creado. Y es en la creación de la nueva instancia (línea 2) cuando especificamos las condiciones para la consulta que incluye nuestro Loop. En este caso, la única condición es author_name=avillegasn
, para indicar que sólo devuelva entradas de este autor. Ten en cuenta que si quisieras poner más de una condición deberías separarlas con el símbolo &
.
Parámetros para modificar el Loop
Seguramente te preguntarás qué parámetros puedes usar para crear condiciones nuevas cuando creas un Loop personalizado como el que hemos visto antes. La verdad es que hay una infinidad de posibilidades aquí. Las tienes todas en el Codex de WordPress (cómo siempre) bien documentadas y con ejemplos.
Aún así, creo que es oportuno que veas algunos de los parámetros más usados. ¡A por ello!
Usuarios, Categorías y Etiquetas
Puedes decidir devolver sólo aquellos contenidos que pertenezcan a un usuario, categoría o etiqueta concretos usando los siguientes parámetros:
cat=3,4,5
– Obtiene las entradas de las categorías indicadas mediante el identificador (o identificadores, si hay mas de uno, separados por comas).category_name=comunidad
– Obtiene las entradas de la categoría indicada mediante el nombre de categoría.tag=wprofesional
– Obtiene las entradas de la etiqueta indicada mediante el nombre de etiqueta.tag_id=34
– Obtiene las entradas de las etiquetas indicadas mediante el identificador (o identificadores, si hay mas de uno, separados por comas).author=1
– Obtiene las entradas que tengan como autor a los usuarios indicados mediante el identificador (o identificadores, si hay mas de uno, separados por comas).author_name=avillegasn
– Obtiene las entradas que tengan como autor al usuario cuyo Nombre de usuario sea el indicado.
Entradas y Páginas
Del mismo modo, también podemos hacer uso de parámetros específicos para seleccionar sólo ciertas entradas y páginas concretas:
p=135
– Obtiene la entrada que tenga el identificador indicado.name=mi-entrada
– Obtiene la entrada cuyo slug o enlace permanente sea el indicado.page_id=8
– Obtiene la página que tenga el identificador indicado.pagename=mi-pagina
– Obtiene la página cuyo slug o enlace permanente sea el indicado.post_type=page
– Obtiene sólo páginas.post_type=post
– Obtiene sólo entradas.
Ejemplos más complejos
Como podréis ver en el Codex, se pueden hacer consultas mucho más complicadas. En el siguiente ejemplo, seleccionamos las entradas personalizadas del tipo amigo
ordenadas por el campo personalizado edad
, quedándonos con aquellas cuya edad esté entre 18 y 35.
Usando query_posts()
A pesar de que el método más habitual para modificar el Loop de WordPress es mediante el uso del objeto WP_Query
, existen otros mecanismos que también puedes usar.
La función query_posts()
se utiliza para modificar los contenidos devueltos por el Loop principal de WordPress. Concretamente, puedes modificar el contenido devuelto en $wp_query
después de que la consulta por defecto se haya ejecutado, cambiar los parámetros de consulta, y repetir la consulta usando query_posts()
. El mayor problema de usar query_posts()
es que sobrescribe el resultado original del Loop principal, con lo cual hay que ser muy cuidadoso con ella.
La función query_posts()
la usarás justo antes del inicio del Loop, tal y como vemos a continuación:
En este ejemplo hemos cambiado el Loop indicando a WordPress que sólo muestre aquellas entradas que pertenecen a la categoría que tiene como identificador el número 1 y que además están etiquetadas con las etiquetas temas
y plugins
.
Como ya hemos dicho, usar la función query_posts()
tal cual sobreescribe el contenido extraído por el Loop. Esto significa que los contenidos anteriores ya no se devolverán, lo cual es lógico puesto que estamos cambiando la consulta a la base de datos desde query_posts()
. Para evitar perder el contenido del Loop original (el que venía antes de que pusieras la función query_posts()
) puedes guardar los parámetros de consulta usando la variable global $query_string
:
En este ejemplo concatenamos los parámetros adicionales a los parámetros de consulta que ya están incluidos en $query_string
. De esta forma lo que estamos haciendo es filtrar la consulta inicial haciéndola más estricta de lo que esta era (indicando que sólo devuelva las entradas del autor avillegasn).

Nelio A/B Testing
Me sorprendió mucho la calidad del plugin, lo fácil que fue configurarlo y el increíble soporte que me dio Nelio. Recomiendo encarecidamente usar Nelio A/B Testing.

Josette Millar
Usando get_posts()
Una alternativa más sencilla al uso de query_posts()
es la función get_posts()
. Esta simplemente retorna información de entradas. El principal problema es que no tiene en cuenta la configuración de los metadatos necesarios para el uso de Template Tags. Para arreglar esto, hay que usar la función setup_postdata()
. En el siguiente ejemplo vemos cómo se haría esto:
Otra diferencia es que los contenidos que devuelve get_posts()
están en forma de array. Por eso usamos la sentencia foreach
para recorrerlo (nos hace de Loop).
Aunque encontrarás código antiguo que usa get_posts()
o query_posts()
, el método preferido para trabajar con Loops es mediante WP_Query()
.
Usando el hook pre_get_posts
Por último, disponemos de una opción adicional para modificar cualquier Loop en tu WordPress mediante el hook pre_get_posts
. Habitualmente, este es el hook preferido para modificar el Loop principal de WordPress.
El hook pre_get_posts
tiene como parámetro la consulta global de WordPress, lo que te permite modificarla antes de que se ejecute y devuelva valores. Por tanto, podemos modificar la consulta a la base de datos de WordPress y hacer que incluya nuevas condiciones que modifiquen el contenido que se devolverá una vez se ejecute.
Para usar el hook pre_get_posts
, habitualmente añadiremos código en el archivo functions.php
de nuestro tema. Veamos un ejemplo:
Fíjate que estamos usando funciones condicionales (is_admin()
, is_main_query()
, is_search()
) para modificar el Loop únicamente en areas específicas de WordPress. Concretamente, sólo se mostraran entradas (ver $query->set( 'post_type', 'post' )
en la linea 4) en los resultados de una búsqueda en tu web (ver $query->is_search()
en la linea 3). Por tanto, hemos modificado el Loop para que sólo muestre entradas (y no páginas, ni productos, ni ninguna otra cosa más) únicamente en los resultados de búsquedas. En cualquier otro lugar, el Loop principal se comportará tal y como ya lo hacía, dado que las funciones condicionales evitarán la ejecución de la función set()
de la línea 4.
El hook pre_get_posts
filtra el objeto WP_Query
, por lo que cualquier cosa que puedas hacer con WP_Query
(como vimos anteriormente) lo puedes hacer en pre_get_posts
usando la función set()
. Esto incluye el uso de los parámetros que te expliqué antes para modificar el Loop.
Para más información sobre el hook pre_get_posts
, visita la página del Codex http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts.
Repaso final
Recuerda que el Loop es el corazón de los temas WordPress. Cualquier tema que se precie usa Loops para recuperar el contenido y mostrarlo con los estilos oportunos. Pero no sólo los temas usan Loops, también los plugins. Mostrar entradas relacionadas o desarrollar un widget para la barra lateral que muestre las entradas más visitadas son funciones que un plugin puede añadir haciendo uso de Loops personalizados.
Hemos visto cuatro maneras diferentes de modificar el Loop principal de WordPress o crear Loops personalizados. Has aprendido a usar el objeto WP_Query
para crear un Loop nuevo y filtrar los resultados a partir de una serie de parámetros. Además, has conocido las funciones alternativas query_posts()
y get_posts()
y los inconvenientes que tienen. Por último, también has visto el hook pre_get_posts
que permite modificar todos los Loops de WordPress desde un único punto en el código. Tendrás que ir con cuidado al usarlo, ya que es un arma tan potente que en manos inexpertas puede causar el caos.
Si has llegado hasta aquí, te felicito. Has superado una nueva etapa en tu formación como desarrollador WordPress. Y recuerda que no hemos acabado. En una futura entrada veremos ejemplos concretos sobre cómo crear y trabajar con múltiples Loops a la vez. Y si tienes alguna duda, no dudes en comentarla para que podamos mejorar.
Imagen destacada de Beyond Neon
Deja una respuesta