Modificando a consulta atual usando pre_get_posts
Jan 2, 2015Tempo de leitura 2 min
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
- Palestra Leo Baiano WordCamp São Paulo 2014 - Dicas e Truques para desenvolver Projetos Web Utilizando WordPress.
- wpmidia - Customizando a query do WordPress
- Codex Wordpress pre_get_posts