Dominando WP_Query: Funciones Relacionadas
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) oARRAY_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. Aceptapost_title,menu_order,post_date,post_modified,ID,post_authorypost_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 argumentometa_value, solo incluye páginas que tienen definido el meta key y el valor. -
meta_value: Cuando se usa con el argumentometa_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 argumentohierarchicaltiene que ser0. -
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á apage. -
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:
- Recupera el siguiente registro de la consulta.
- Prepara el dato del
$post. - Establece el parámetro
in_the_loopaTRUE.
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!



