Autonomía digital y tecnológica

Código e ideas para una internet distribuida

Personalizando el loop de WordPress con WP_Query->set() para casos y plantillas determinados

Imago voragine.net
[actualizado el ]

Configurar una query para conseguir el loop que necesitamos en una plantilla determinada de WordPress es fácil: basta crear una query personalizada mediante WP_Query. Hay veces que solo queremos modificar una variable de la query, y para un caso concreto, no para toda la template. Por ejemplo en la template archive.php y solo para las queries que afecten a una taxonomía determinada. En estos casos, quizás prefiramos no ensuciar el archivo de la template, archive.php en nuestro ejemplo. Lo que podemos hacer es hacerlo usando el método set() de WP_Query en una función que incluiremos en el archivo functions.php de nuestor theme.

Como explica Michael Fields, si queremos que para una taxonomía determinada llamada taxname aparezcan todos los posts y no el número configurado por omisión, podemos hacerlo mediante una función como esta:

add_filter( 'pre_get_posts', 'prefix_all_posts_in_taxname_archive' );
function prefix_all_posts_in_taxname_archive( $query ) {
    if ( is_tax( 'taxname' ) )
        $query->set( 'posts_per_page', -1 );
    return $query;
}

Basta sustituir taxname por el slug real de la taxonomía, y conviene también sustituir prefix por un prefijo que asegure que el nombre de la función es único, y no se produzcan conflictos.

Para más información sobre el método set() de WP_Query se puede consultar el post de Justin Tadlock Showing custom post types on your home/blog page.

Actualización 12/09/2014.
A la hora de hacer la sentencia condicional para definir qué loops se filtrarán es útil contar con dos condiciones:

  • $query->is_main_query(). Solo afecta al loop principal de la página, quedando fuera todos los demás, por ejemplo el loop que construye los menús.
  • false == $query->query_vars['suppress_filters']. No afecta a lo loops construidos con get_posts, como explica Michael Fields.

1 comentario

Dejar un comentario

*
*

 

Un trackback