Modificar el query principal con pre_get_posts

Php marzo 10, 2026

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 $query se 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.