Wie kann ich Argumente nur für die Hauptabfrage ändern und andere Abfragen nicht beeinflussen?
add_filter('pre_get_posts', 'custom_post_count');
function custom_post_count($query){
$query->set('posts_per_page', 5);
return $query;
};
Da diese Aktion in der Methode get_posts von WP_Query aufgerufen wird, ändert dieser Code das Argument posts_per_page für alle Schleifen, nicht nur für die Hauptschleife. Das Übergeben dieses Arguments an WP_Query ist daher sinnlos.
Grundsätzlich suchen Sie die Variableglobal $wp_the_query
, die auf den Wert der Hauptabfrage gesetzt ist. Es ist möglicherweise nicht für 100% der Fälle geeignet, funktioniert jedoch wahrscheinlich in 99% der Fälle:
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;
};
Erstens ist 'pre_get_posts' eine Aktion und kein Filter. Das ist das Hauptproblem. Zweitens müssen Sie Bedingungen für den Kontext festlegen.
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;
};
Das vorherige Beispiel ist, wenn Sie dies einmal in Ihrer functions.php verwenden möchten, ohne Ihre Vorlagendateien zu berühren. Wenn Sie keine neue Abfrage erstellen, wird für jede Schleife mit pre_get_posts $ die Abfrage übernommen. Aus diesem Grund benutze ich query_posts (), um im folgenden Beispiel eine neue Abfrage zu erstellen.
Benutzerdefinierte Loops
So mache ich benutzerdefinierte Loops:
$args = array(
'posts_per_page' => 5
);
query_posts($args);
if(have_posts()): while(have_posts()): the_post();
endwhile; else:
endif;
wp_reset_query();
Platzieren Sie einfach query_posts () über der Schleife und wp_reset_query () am Ende der Schleife.
Hoffe das hilft dir weiter. :)