“pre_get_posts” disparando em todas as consultas

3

Como posso alterar argumentos apenas para a consulta principal e não afetar outras consultas?

add_filter('pre_get_posts', 'custom_post_count');
function custom_post_count($query){
  $query->set('posts_per_page', 5);
  return $query;
};

Como esta ação é chamada dentro do método get_posts de WP_Query, este código irá alterar o argumento posts_per_page para todos os loops, não apenas o principal, então passar este argumento para WP_Query é inútil ...

    
por onetrickpony 16.09.2011 / 05:17

2 respostas

7

Basicamente, o que você está procurando é a variável global $wp_the_query , que é definida como o valor da consulta principal. Pode não ser um ajuste perfeito para 100% dos casos, mas provavelmente funcionará bem em 99% dos casos:

add_action( 'pre_get_posts', 'custom_post_count' );
function custom_post_count( $query ){
  global $wp_the_query;
  if ( $wp_the_query === $query ) {
    $query->set( 'posts_per_page', 5 );
  }
  return $query;
};
    
por MikeSchinkel 16.09.2011 / 07:22
5

Em primeiro lugar, "pre_get_posts" é uma ação e não um filtro. Esse é o principal problema para começar. Em segundo lugar, você precisa definir condicionais para o contexto.

add_action('wp', 'custom_post_count');
function custom_post_count($query){
    if($query->is_home || $query->is_front_page){
        $query->set('posts_per_page', 5);
    }
    return $query;
};

O exemplo anterior é se você quiser usar isso uma vez no seu functions.php sem tocar nos seus arquivos de modelo. Quanto a afetar todas as consultas, se você não criar uma nova consulta, cada loop herdará a consulta pre_get_posts $. É por isso que uso query_posts () para criar uma nova consulta no exemplo a seguir.

Loops personalizados

É assim que faço loops personalizados:

$args = array(
    'posts_per_page' => 5
);
query_posts($args);

if(have_posts()): while(have_posts()): the_post();


endwhile; else:

endif;

wp_reset_query();

Coloque apenas query_posts () acima do loop e wp_reset_query () no final do loop.

Espero que isso ajude você. :)

    
por Brian Fegter 16.09.2011 / 05:40