Modificar el query principal con pre_get_posts
pre_get_posts es el hook correcto para modificar el query principal de WordPress antes de que ejecute la consulta SQL. Es más eficiente que crear un WP_Query secundario porque evita una consulta adicional a la base de datos. La clave es aplicar los cambios solo cuando procede, usando las condiciones correctas.
Casos de uso: cambiar el número de posts en el blog, incluir CPTs en la búsqueda, ordenar archivos de taxonomías por nombre en lugar de fecha, excluir categorías del listado principal.
<?php
add_action( 'pre_get_posts', 'mi_modificar_query' );
function mi_modificar_query( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( $query->is_home() ) {
$query->set( 'posts_per_page', 12 );
}
if ( $query->is_search() ) {
$query->set( 'post_type', array( 'post', 'proyecto', 'snippet' ) );
}
}
¿Qué hace cada parte?
- pre_get_posts: se dispara justo antes de ejecutar cualquier query. El parámetro
$queryse pasa por referencia, así que modificarlo directamente altera la consulta real. - is_admin(): evita modificar las queries del panel de administración, que también usan WP_Query internamente.
- $query->is_main_query(): distingue el query principal (el de la página) de los queries secundarios como widgets o WP_Query propios. Sin esta comprobación modificarías todos los queries.
- $query->is_home(): verdadero en la página del listado de posts del blog (no en la portada estática).
- $query->set(): modifica cualquier parámetro del query, equivalente a pasarlo en el array de args de WP_Query.
- is_search(): verdadero en las páginas de resultados de búsqueda. Aquí añadimos los CPTs para que también aparezcan al buscar.
