Änderung der Abfrage var in pre_get_posts nicht gepflegt

Ich erstelle ein Plugin, das einen benutzerdefinierten Feed hinzufügt. Ich benutze einen pre_get_posts Filter, um die posts_per_page Abfrage var auf -1 zu ändern (um alle Elemente eines benutzerdefinierten Beitragstyps zu erhalten). Wenn ich jedoch die $wp_query in der posts_per_page bleibt posts_per_page der Standardwert. Ich habe auch getestet, posts_per_rss auf -1 zu ändern, und ich sehe das als in der Abfrage geändert (obwohl es natürlich keinen Effekt auf die resultierenden Posts hat). Ich habe auch versucht, mein Thema zu einem Standard zu ändern und zu testen, aber ich hatte die gleichen Ergebnisse. Kann mir jemand erklären warum ich die posts_per_page Abfrage var nicht ändern kann?

 defined( 'ABSPATH' ) OR exit; if(!class_exists('My_Custom_Feeds')) { class My_Custom_Feeds { protected $feed_slug = 'theslug'; function __construct() { add_action( 'init', array($this, 'mcf_add_feed')); add_filter( 'pre_get_posts', array($this, 'mcf_pre_get_posts')); } function mcf_add_feed() { add_feed($this->feed_slug, array($this, 'mcf_render')); } function mcf_render(){ //just output query to ensure it is as expected - but it's not global $wp_query; var_dump($wp_query); exit(); } function mcf_pre_get_posts( $query ) { if ( $query->is_main_query() && $query->is_feed( $this->feed_slug ) ) { // modify query here to show all posts $query->set( 'posts_per_page', -1); $query->set( 'posts_per_rss', -1); } } } } if ( class_exists('My_Custom_Feeds') ){ $my_custom_feeds = new My_Custom_Feeds(); } 

Update 1: Realisiert Ich habe add_filter anstelle von add_action für pre_get_posts . Ich habe das aktualisiert, sehe aber immer noch das gleiche Problem.

 add_action( 'pre_get_posts', array($this, 'mcf_pre_get_posts')); 

Update zwei (und final): Per @ ialocin’s Antwort, realisierte ich das Ändern der posts_per_page Abfrage var ist sinnlos, da es von der Option posts_per_rss in einer Feed-Abfrage überschrieben wird (mein Szenario). Die Antwort besteht also darin, einen Filter zu verwenden, um diese Option zu ändern. (-1 ist kein gültiger posts_per_rss Wert, daher der unten verwendete.)

 function mcf_posts_per_rss( $option_name ) { global $wp_query; if ( $wp_query->is_main_query() && $wp_query->is_feed( $this->feed_slug ) ) { return 100; //arbitrarily large value that, while not ideal, works for me } return $option_name; } 

Dann habe ich in meinem Plugin-classnkonstruktor Folgendes hinzugefügt (und die pre_get_posts Aktion entfernt):

 add_filter( 'pre_option_posts_per_rss', array( $this, 'mcf_posts_per_rss') ); 

Solutions Collecting From Web of "Änderung der Abfrage var in pre_get_posts nicht gepflegt"

Der init Hook läuft gut vor pre_get_posts so dass die Abfrage an diesem Punkt – bei init – nicht reflektiert wird, was viel später gemacht wird. Ich glaube nicht, dass mit Ihrem Code etwas nicht stimmt, Sie missverstehen die Reihenfolge der Aktionen. Was Sie erwarten, ist nicht das, was tatsächlich passiert.

posts_per_rss ist kein WP_Query Parameter. Dies ist der Name der option , die in der database gespeichert wird. Es können Adressen über die pre_option_{$option_name} :

 function wpse191824_posts_per_rss( $option_name ) { return 999; } add_filter( 'pre_option_posts_per_rss', 'wpse191824_posts_per_rss' ); 

Nach der Diskussion / Hilfe in diesem Thread, unten ist der grundlegende Code, der am Ende für meine Zwecke funktioniert. Die Abfrage posts_per_page var war eine sinnlose Übung, da sie in einer Feed-Abfrage (mein Szenario) durch die Option posts_per_rss überschrieben wird. posts_per_rss ist keine posts_per_rss und muss auf andere Weise festgelegt werden, daher wird der Filter pre_option_posts_per_rss hinzugefügt. (-1 ist kein gültiger posts_per_rss Wert, daher der unten verwendete.)

 defined( 'ABSPATH' ) OR exit; if(!class_exists('My_Custom_Feeds')) { class My_Custom_Feeds { protected $feed_slug = 'theslug'; function __construct() { add_filter( 'pre_option_posts_per_rss', array( $this, 'mcf_posts_per_rss') ); add_action( 'init', array($this, 'mcf_add_feed')); } function mcf_add_feed() { add_feed($this->feed_slug, array($this, 'mcf_render')); } function mcf_render(){ //put rendering stuff here exit(); } function mcf_posts_per_rss( $option_name ) { global $wp_query; if ( $wp_query->is_main_query() && $wp_query->is_feed( $this->feed_slug ) ) { return 100; //arbitrarily large value that, while not ideal, worked for my purposes } return $option_name; } } } if ( class_exists('My_Custom_Feeds') ) { //instantiate class $my_custom_feeds = new My_Custom_Feeds(); }