Modificando a consulta atual usando pre_get_posts

02/01/2015

O pre_get_posts é um gancho que permite que você modifique a consulta principal, é muito comum você precisar alterar o conteúdo que é exibido em uma página, então vamos usar esse gancho que facilita muito o trabalho.

Para poder funcionar você precisa adicionar a função no arquivo functions.php.

Não use query_posts() para alterar a consulta principal, como o próprio Codex do WordPress diz essa função não é para ser usada em temas e plugins, existe outros métodos mais confiáveis que é o pre_get_posts que vamos ver agora.

Alterando a quantidade de posts na página

function change_posts_per_page( $query ) {
    if( $query->is_main_query() && $query->is_home() ) {
        $query->set( 'posts_per_page', '20' );
    }
}

add_action( 'pre_get_posts', 'change_posts_per_page' );
  • $query->is_main_query(): isso verifica se estamos acessando a consulta principal
  • $query->is_home(): essa outra verificamos se estamos na homepage
  • $query->set( 'posts_per_page', '20' ): aqui modificamos para exibir 20 posts por página

Excluir páginas do resultado da busca

function search_filter($query) {
    if ( !is_admin() && $query->is_main_query() ) {
        if ($query->is_search) {
            $query->set('post_type', 'post');
        }
    }
}

add_action('pre_get_posts','search_filter');
  • !is_admin(): verificamos se não for a página de adminstração
  • $query->is_main_query(): e se estamos acessando a consulta principal
  • $query->is_search: por fim verificamos se é a página de busca
  • $query->set('post_type', 'post'): aqui definimos para o resultado da busca só exibir posts

Incluir Custom Post Types no resultado da busca

function search_filter($query) {
    if ( !is_admin() && $query->is_main_query() ) {
        if ($query->is_search) {
            $query->set('post_type', array( 'post', 'eventos' ) );
        }
    }
}

add_action('pre_get_posts','search_filter');
  • $query->set('post_type', array( 'post', 'eventos' ) ): aqui setamos para o resultado da busca exibir posts e o custom post type eventos

Ordenar Custom Post Type por título em ordem decrescente

function modify_query_eventos( $query ) {
    if( $query->query_vars['post_type'] === 'eventos' && !is_admin() ) {
        $query->set('orderby', 'title');
        $query->set('order', 'desc');
    }
}

add_action( 'pre_get_posts', 'modify_query_eventos' );
  • $query->query_vars['post_type']: verifica se o custom post type é o de eventos
  • !is_admin(): e se não for a página de administração
  • $query->set('orderby', 'title'): ordena por título
  • $query->set('order', 'desc'): em ordem decrescente

Algumas observações

  • As modificações devem ser feitas usando o método $query->set('key','value'), são diversas possibilidades para você personalizar seus posts, consulte todos os parametros possíveis aqui WP_Query Parameters.

  • Essa alteração na consulta também pode afetar a página de administração, certifique-se de verificar se sua consulta esta afetando a página de adminsitração dos posts.

  • Se você precisar criar um segundo bloco de posts na página use o WP_Query().

Referências