1. Code
  2. Coding Fundamentals
  3. Rest API

Dominando WP_Query: Funciones Relacionadas

Saludos y bienvenido a la segunda parte de esta serie de tutoriales llamada "Dominando WP_Query". En la primera parte comenzamos con la serie de tutoriales simplemente introduciendo qué es la clase WP_Query. Y en esta segunda parte, vamos a aprender sobre las funciones relacionadas a WP_Query.
Scroll to top
This post is part of a series called Mastering WP_Query.
Mastering WP_Query: Using the Loop
Mastering WP_Query: Actions and Filters

Spanish (Español) translation by Oscar Abad Folgueira (you can also view the original English article)

Saludos y bienvenido a la segunda parte de esta serie de tutoriales llamada "Dominando WP_Query". En la primera parte comenzamos con la serie de tutoriales simplemente introduciendo qué es la clase WP_Query. Y en esta segunda parte, vamos a aprender sobre las funciones relacionadas a WP_Query.

¡Comencemos!

Aprovechando el Poder de WP_Query con Funciones, Actions y Filters

No soy un experto en programación, pero puedo ver que la clase WP_Query es uno de los mejores ejemplos del patrón MVC. Es extremadamente poderosa, completamente extensible y muy fácil de usar una vez que conoces la base.

Además de estas propiedades, métodos y parámetros (que veremos más adelante), WordPress ofrece funciones extra y hooks (actions y filters) para trabajar con la clase WP_Query. En este tutorial, vamos a conocer las funciones y en la siguiente parte veremos los actions y filters relacionados con WP_Query. Si ves que olvido algo, puedes dejar un comentario para recordármelo.

Funciones Relacionadas de WP_Query

Hay 13 funciones de WordPress que funcionan con la clase WP_Query que pueden ayudarte a aprovechar el poder de WP_Query. No es necesaria ninguna introducción así que vamos al tema:

Obtener las Variables de Consulta Púbicas: get_query_var()

El nombre de nuestra primer función habla por si misma: coge el objeto global $wp_query y devuelve una variable de consulta púbica de el. Tiene dos parámetros: El primero es la variable para retornar su valor y el segundo es un valor por defecto para devolver si la variable no está configurada:

1
<?php
2
3
$paged = get_query_var( 'paged', 1 );
4
5
?>

Afectar al Bucle Principal: query_posts()

Para ser honesto, esta es una mala función. No necesitas usarla pero para decirte cual es el "buen camino", vamos a ver y te voy a decir cual es "el mal camino".

query_posts() es una función que altera la consulta principal poniendo la consulta principal aparte y ejecutar una nueva consulta - y necesitarás usar wp_reset_query() para limpiarla después.

1
<?php
2
3
query_posts( 'category_name=news' );
4
5
?>

Esta función es una de las funciones más mal usadas el el core de WordPress. No deberías usarla para crear consultas secundarias - puedes usar la clase WP_Query o la función get_posts() (de la que hablaremos más adelante en este tutorial). No deberías utilizarla para modificar la consulta principal - deberías usa el action pre_get_posts (del que también hablaremos más tarde). Incluso el Codex nos disuade de utilizarla y nos muestra alternativas.

Conclusión: No la uses.

Obtener un Post Individual: get_post()

Otra función auto-explicada es get_post(), que usaremos para obtener un post individual. Tiene tres parámetros opcionales:

  • El primero es el post ID (o el ID del post actual por defecto).
  • El segundo es el tipo del resultado que obtienes: OBJECT, ARRAY_A (un array asociado) o ARRAY_N (un array numérico).
  • El tercero es si la opción de filtrado del resultado. Por defecto es 'raw' por lo que no puede ser filtrado a menos que lo configures a 'edit', 'display', 'attribute' o 'js'.
1
<?php
2
3
$first_post = get_post( 1, ARRAY_A );
4
$post_title = $first_post[ 'post_title' ];
5
6
?>

Guardar Consultas en Arrays: get_posts()

La función get_posts() nos permite ejecutar consultas y guardarlas como arrays para usarlas en varios sitios. Requiere los mismos argumentos que WP_Query por lo que puedes configurar la consulta a tu gusto. (Revisaremos los parámetros de WP_Query más adelante, por lo que estate atento) Es la mejor y más efectiva forma de crear listas de posts - pero sin bucles.

1
<?php
2
3
$args = array(
4
    'category_name' => 'news',
5
    'order' => 'ASC',
6
    'orderby' => 'post_title',
7
    'posts_per_page' => -1
8
);
9
10
// Return an array of all posts in the "news" category.

11
$all_posts_list = get_posts( $args );
12
13
?>

Aunque esta función puede usarse para ejecutar "consultas secundarias" sin problema, el Codex recomienda utilizar WP_Query cuando creamos múltiples bucles y usando get_posts() cuando extraemos una lista de post. Peter R. Knight explica las diferencias entre get_posts() y WP_Query in términos sencillos: La mayor diferencia es que WP_Query hace más consultas a la base de datos(datos del post, meta datos, datos de autor y datos de comentarios) mientras que get_posts() hace sólo una (los datos del post).

Obteniendo Páginas: get_pages()

Esta singular función tiene el propósito de recoger la lista de páginas, aunque haya un parámetro post_type que puede dejarte seleccionar otro tipo de post (siempre que el tipo de post es jerárquico, sino devuelve false).

1
<?php
2
3
$args = array(
4
    'sort_order' => 'ASC',
5
    'sort_column' => 'post_title',
6
    'hierarchical' => 1,
7
    'exclude' => '',
8
    'include' => '',
9
    'meta_key' => '',
10
    'meta_value' => '',
11
    'authors' => '',
12
    'child_of' => 0,
13
    'parent' => -1,
14
    'exclude_tree' => '',
15
    'number' => '',
16
    'offset' => 0,
17
    'post_type' => 'page',
18
    'post_status' => 'publish'
19
);
20
21
$pages = get_pages( $args );
22
23
?>

Acepta argumentos que son muy parecidos a los argumentos de WP_Query, pero son ligeramente diferentes:

  • sort_order: Para ordenar las páginas en orden ascendente (asc) o en orden descendente (desc).
  • sort_column: Como ordenar las páginas. Acepta post_title, menu_order, post_date, post_modified, ID, post_author y post_name.
  • hierarchical: para listar las páginas jerárquicamente (1) o no (0).
  • exclude: Una lista separada por comas o un array de IDs de página para excluirlos del listado.
  • include: Una lista separada por comas o un array de IDs de página para incluir del listado y excluir cualquier otra cosa.
  • meta_key: Cuando se usa con el argumento meta_value, solo incluye páginas que tienen definido el meta key y el valor.
  • meta_value: Cuando se usa con el argumento meta_key, solo incluye páginas que tienen definido el meta key y el valor.
  • authors: una lista de IDs de autor separados por comas.
  • child_of: Un ID de una página para extraer sólo su hijo y nieto en el listado.
  • parent: Lista las páginas que tienen el ID indicado como padre. Para que este argumento funcione, el argumento hierarchical tiene que ser 0.
  • exclude_tree: Una lista o un array de IDs de página separados por comas para excluir con su hijo.
  • number: Número de páginas a extraer.
  • offset: Número de páginas a omitir desde la parte superior.
  • post_type: El tipo de post a consultar. Naturalmente, por defecto está a page.
  • post_status: Una lista de tipos de estado de post separados por comas a incluir.

Comprobar si la Consulta Devuelve Posts: have_posts()

Sin ningún parámetro, esta función devuelve TRUE si la consulta retorno cualquier registro y FALSE en caso contrario.

1
<?php
2
3
if ( have_posts() ) {
4
    
5
    // Success.

6
    
7
} else {
8
    
9
    // Failure.

10
    
11
}
12
13
?>

Trabajando con el Bucle: the_post()

El Codex dice que "itera el índice del post en el Bucle". Hace muchas cosas:

  1. Recupera el siguiente registro de la consulta.
  2. Prepara el dato del $post.
  3. Establece el parámetro in_the_loop a TRUE.
1
<?php
2
3
if ( have_posts() ) {
4
5
    while ( have_posts() ) {
6
7
        the_post();
8
9
        the_title();
10
11
        the_content();
12
13
    }
14
    
15
}
16
17
?>

Establecer $post: setup_postdata()

Esta función también habla por si misma: Establece los datos del post global. Veamos qué dice el Codex sobre esto:

setup_postdata() rellenga las variables globales $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages, que ayudan a muchas etiquetas de plantilla en el contexto del post actual. No asigna la variable global $post, pero parece que espera que su argumento es una referencia a el.

1
<?php
2
3
global $post;
4
5
setup_postdata( $post );
6
7
?>

Borrando el Bucle Actual: rewind_posts()

Todavía otra función que nombra su funcionalidad: Esta función simplemente "rebobina" el Bucle de modo que puedes volver a ejecutarlo más tarde.

1
<?php
2
3
// After the loop.

4
rewind_posts();
5
6
?>

Reseteando $post: wp_reset_postdata()

Esta función resetea la variable global $post al primer post en la consulta principal. Es mejor utilizar ésta después de una consulta secundaria.

1
<?php
2
3
// After a secondary query.

4
wp_reset_postdata();
5
6
?>

Resetear la Consulta: wp_reset_query()

Ésta debería usarse si ha cambiado la consulta principal (con la función query_posts() o con el action pre_get_posts que veremos en la siguiente parte) así que la consulta principal puede ser reseteada.

1
<?php
2
3
// After the main query is altered.

4
wp_reset_query();
5
6
?>

Comprobar si la Consulta Actual es la Consulta Principal: is_main_query()

Ésta es una etiqueta condicional que devuelve TRUE si la consulta actual es la consulta principal y FALSE si no es así. Sencillo, ¿verdad?

1
<?php
2
3
if ( is_main_query() ) {
4
    
5
    // Success.

6
    
7
} else {
8
    
9
    // Failure.

10
    
11
}
12
13
?>

Comprobar si Estamos en el Bucle: in_the_loop()

Otra etiqueta condicional es in_the_loop() que simplemente devuelve TRUE o FALSE si tu código se está ejecutando dentro del Bucle o no.

1
<?php
2
3
if ( in_the_loop() ) {
4
    
5
    // Success.

6
    
7
} else {
8
    
9
    // Failure.

10
    
11
}
12
13
?>

Fin de la Segunda Parte

Ahora ya conoces (probablemente) todas las funciones relacionadas a WP_Query. Mantente al tanto de la siguiente parte donde aprenderemos sobre los actions y los filters relacionados con WP_Query.

¿Tienes algún comentario para añadir a esta parte? Comparte tus pensamientos comentando abajo. Y si te ha gustado el artículo, no olvides compartirlo con tus amigos y amigas!

¡Sé el primero en conocer las nuevas traducciones–sigue @tutsplus_es en Twitter!