Wie kann WP_Query auf ein Ergebnis in der Schleife beschränkt werden?

Ich versuche nur einen Beitrag zu bekommen und das muss der neuste sein, also hier ist was ich mache:

$basic_args = $wp_query->query_vars; $basic_args['tax_query'] = $wp_query->tax_query; $aditional_args = array( 'post__in' => get_option('sticky_posts'), 'ignore_sticky_posts' => 1, 'order' => 'desc', 'post_status' => 'publish', 'posts_per_page' => 1 ); $normal_args = array_merge($basic_args, $aditional_args); $normal_query = new WP_Query($normal_args); $prev_post_ids = array(); if (!$normal_query->have_posts()) { $normal_args = array_merge($basic_args, array('posts_per_page' => 1)); $normal_query = new WP_Query($normal_args); } echo $normal_query->post_count; // returns 25 if ($normal_query->have_posts()) { while ($normal_query->have_posts()) { .... // here I got 25 results instead of just one } } 

Ich weiß, dass posts_per_page Limit posts_per_page sollte, wie viele Post ich bekommen werde, aber funktioniert nicht für mich und weiß nicht warum. Wie Sie lesen können, bekomme ich 25 Post auf der Schleife statt einer. Kann mir jemand zu diesem Thema einen Rat geben? Ich habe das und das gelesen, hilft aber überhaupt nicht.

Update1

Ich $normal_query->request die $normal_query->request wie von @ pieter-goosen vorgeschlagen, und ich bekomme diese falsche SQL-Abfrage:

 SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN wp_term_relationships AS tt1 ON (wp_posts.ID = tt1.object_id) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (6) AND tt1.term_taxonomy_id IN (6) ) AND wp_posts.post_type IN ('opinion', 'post', 'especiales') AND ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 25 

Wo wird das LIMIT geändert?

Update2

Ich habe debug auch die $basic_args , die $wp_query->query_vars und auch $normal_args und hier ist das Ergebnis:

 echo '
'; print_r($basic_args); echo '

'; Array ( [category_name] => internacionales [error] => [m] => [p] => 0 [post_parent] => [subpost] => [subpost_id] => [attachment] => [attachment_id] => 0 [name] => [static] => [pagename] => [page_id] => 0 [second] => [minute] => [hour] => [day] => 0 [monthnum] => 0 [year] => 0 [w] => 0 [tag] => [cat] => 409 [tag_id] => [author] => [author_name] => [feed] => [tb] => [paged] => 0 [comments_popup] => [meta_key] => [meta_value] => [preview] => [s] => [sentence] => [title] => [fields] => [menu_order] => [category__in] => Array ( ) [category__not_in] => Array ( ) [category__and] => Array ( ) [post__in] => Array ( ) [post__not_in] => Array ( ) [post_name__in] => Array ( ) [tag__in] => Array ( ) [tag__not_in] => Array ( ) [tag__and] => Array ( ) [tag_slug__in] => Array ( ) [tag_slug__and] => Array ( ) [post_parent__in] => Array ( ) [post_parent__not_in] => Array ( ) [author__in] => Array ( ) [author__not_in] => Array ( ) [ignore_sticky_posts] => [suppress_filters] => [cache_results] => 1 [update_post_term_cache] => 1 [update_post_meta_cache] => 1 [post_type] => [posts_per_page] => 10 [nopaging] => [comments_per_page] => 50 [no_found_rows] => [order] => DESC [tax_query] => WP_Tax_Query Object ( [queries] => Array ( [0] => Array ( [taxonomy] => category [terms] => Array ( [0] => internacionales ) [field] => slug [operator] => IN [include_children] => 1 ) ) [relation] => AND [table_aliases:protected] => Array ( [0] => wp_term_relationships ) [queried_terms] => Array ( [category] => Array ( [terms] => Array ( [0] => internacionales ) [field] => slug ) ) [primary_table] => wp_posts [primary_id_column] => ID ) ) echo '

'; print_r($normal_args); echo '

'; Array ( [category_name] => internacionales [error] => [m] => [p] => 0 [post_parent] => [subpost] => [subpost_id] => [attachment] => [attachment_id] => 0 [name] => [static] => [pagename] => [page_id] => 0 [second] => [minute] => [hour] => [day] => 0 [monthnum] => 0 [year] => 0 [w] => 0 [tag] => [cat] => 409 [tag_id] => [author] => [author_name] => [feed] => [tb] => [paged] => 0 [comments_popup] => [meta_key] => [meta_value] => [preview] => [s] => [sentence] => [title] => [fields] => [menu_order] => [category__in] => Array ( ) [category__not_in] => Array ( ) [category__and] => Array ( ) [post__in] => Array ( ) [post__not_in] => Array ( ) [post_name__in] => Array ( ) [tag__in] => Array ( ) [tag__not_in] => Array ( ) [tag__and] => Array ( ) [tag_slug__in] => Array ( ) [tag_slug__and] => Array ( ) [post_parent__in] => Array ( ) [post_parent__not_in] => Array ( ) [author__in] => Array ( ) [author__not_in] => Array ( ) [ignore_sticky_posts] => 1 [suppress_filters] => [cache_results] => 1 [update_post_term_cache] => 1 [update_post_meta_cache] => 1 [post_type] => [posts_per_page] => 1 [nopaging] => [comments_per_page] => 50 [no_found_rows] => [order] => desc [tax_query] => WP_Tax_Query Object ( [queries] => Array ( [0] => Array ( [taxonomy] => category [terms] => Array ( [0] => internacionales ) [field] => slug [operator] => IN [include_children] => 1 ) ) [relation] => AND [table_aliases:protected] => Array ( [0] => wp_term_relationships ) [queried_terms] => Array ( [category] => Array ( [terms] => Array ( [0] => internacionales ) [field] => slug ) ) [primary_table] => wp_posts [primary_id_column] => ID ) [post_status] => publish )

Wie Sie sehen post_per_page ist post_per_page hier auf 1 gesetzt, warum also diese 25?

Update 3

Anscheinend ist dies der problematische Code in functions.php :

 function change_wp_search_size($query) { if ($query->is_search) { $query->query_vars['posts_per_page'] = 25; } // Change 25 to the number of posts you would like to show return $query; // Return our modified query variables } add_filter('pre_get_posts', 'change_wp_search_size'); 

Sollte das nicht nur für die Suche funktionieren? Warum agiert die ganze Zeit über alle query_vars?

Solutions Collecting From Web of "Wie kann WP_Query auf ein Ergebnis in der Schleife beschränkt werden?"

pre_get_posts ändert alle Abfragen, Back End und Front End unabhängig.

Es gibt zwei sehr wichtige Prüfungen, die eine große Anzahl von Personen vermisst, nämlich die !is_admin() Prüfung, die nur auf das Frontend is_main_query() , und dann die wichtigste Prüfung, is_main_query() die nur die Hauptabfrage und nicht benutzerdefinierte Abfragen ändert .

Ihr Statement sollte ungefähr so ​​aussehen wie das Folgende

 if ( !is_admin() && $query->is_main_query() && $query->is_search() ) { // Your arguments to set } 

Ok, nach den Vorschlägen von @ pieter-goosen habe ich eine Lösung gefunden, indem remove_all_filters( 'pre_get_posts' ) diese remove_all_filters( 'pre_get_posts' ) bevor sie ausgeführt wird, dass WP_Query das Problem behebt, hoffe, dass es anderen hilft