- Modificando el Loop de WordPress: query_posts()
- Modificando el Loop de WordPress: WP_Query()
- Modificando el Loop de WordPress: get_posts()
En uno de mis posts anteriores hablé del loop de WordPress y cómo funciona. El Loop es algo primordial si quieres ser un desarrollador de temas o si tienes que cambiar el aspecto de un tema que no te gusta. Hay 3 métodos que permiten modificar el Loop de WordPress para que haga lo que querámos.
- query_posts
- WP_Query
- get_posts
En este post me centraré en query_posts(). Si trabajas con un solo Loop y quieres modificar el tipo de posts que son devueltos, deberás emplear este método. Es perfecto para limitar el número de posts, excluír posts de una categoría o etiqueta (tag) etc. Comencemos con un ejemplo de un Loop.
1 2 3 4 5 6 7 8 9 10 11 |
<?php if (have_posts()) : while (have_posts()) : the_post(); //Código que se ejecuta si hay posts endwhile; else: //Código que se ejecuta si NO hay posts endif; ?> |
La información que se muestra en el bucle depende de varios factores. Por ejemplo, si alguien visita tu página de inicio, el bucle por defecto muestra los posts de cualquier categoría hasta el número de post de posts especificados en la página de administración.
En vez de mostrar posts de cualquier categoría, quieres excluír los posts que tengan la categoría “Ejemplos” que tiene como ID 7 (tag_ID = 7) harías lo siguiente.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php query_posts('cat=-7'); // Para excluír se usa el símbolo menos if (have_posts()) : while (have_posts()) : the_post(); //Código que se ejecuta si hay posts endwhile; else: //Código que se ejecuta si NO hay posts endif; ?> |
Una vez que se han excluído los posts que queremos, hay que usar la función wp_reset_query() para que la query original vuelva a estar disponible para el Loop.
1 2 3 4 5 6 7 8 |
endwhile; else: //Código que se ejecuta si NO hay posts endif; wp_reset_query(); ?> |
Esta función lo que hace es restablecer por defecto $wp_query a su valor original. Siempre hay que llamarla cuando se use query_posts().
Con query_posts() es fácil modificar cualquier consulta añadiendo parámetros adicionales a la consulta. Por ejemplo, si quisiéramos excluír 2 categorías más, limitar los posts por página y que se muestren por orden ascendente podríamos usar el siguiente código.
1 |
query_posts($query_string.'&cat=-7,-8,-9&posts_per_page=5&order=ASC'); |
Hay que tener en cuenta que el uso de query_post() no es recomendable y es preferible usar el hook (gancho) pre_get_posts().
El hook pre_get_posts()
Este gancho no se debería utilizar para la alterar la consulta de páginas simples (Single pages). Este gancho debe ser llamado desde el functions.php. Mostraré un ejemplo usando el caso anterior.
1 2 3 4 5 6 7 8 |
function excluir_categorias( $query ) { if ( $query->is_home() && $query->is_main_query() ) { $query->set( 'cat', '-7,-8,-9' ); $query->set( 'posts_per_page', 5 ); $query->set( 'order', 'ASC' ); } } add_action( 'pre_get_posts', 'excluir_categorias' ); |
Y hasta aquí el post de hoy, espero que os haya gustado. A seguir picando 🙂