Intereting Posts
получать только одобренных пользователей (плагин для конечных пользователей) Очистка: лучший способ удалить комментарии WooCommerce из таблицы wp_comments Архивы и категории в пользовательском меню Примечание: wp_get_http <strong> устарел </ strong> с версии 4.4.0! Пользовательский просмотр в реальном времени JS – Функция для освещения / темного цвета Hex Как проверить вход в виджетов Как добавить пользовательские цветовые образцы для всех редакторов WYSIWYG? Nonce Сгенерирован 0-12 часов назад Как разместить функцию из другого класса в аргументе add_action 2nde? Почему я не могу получить правильную постоянную ссылку? WordPress Reply comment_form в Модале / Лайтбокс (Ajax) Альтернативы DISALLOW_FILE_EDIT wp-config Constant? Это нарушает некоторые плагины Недопустимое имя пользователя, если оно содержит символ @ Реплицировать функциональные возможности изображения Возможно ли добавить меню пользовательского типа сообщений в качестве другого настраиваемого подтипа типа публикации

Изменение запроса var в pre_get_posts не поддерживается

Я создаю плагин, который добавляет настраиваемый канал. Я использую фильтр pre_get_posts для изменения запроса posts_per_page var до -1 (чтобы получить все элементы настраиваемого типа сообщений). Однако, если я $wp_query в функции рендеринга, posts_per_page останется значением по умолчанию. Я также тестировал изменение posts_per_rss на -1, и я вижу, что это изменено в запросе (хотя оно, конечно, не влияет на итоговые сообщения). Я также попытался изменить мою тему на стандартную и тестирование, но у меня были те же результаты. Может кто-нибудь объяснить, почему я не могу изменить posts_per_page запрос var?

 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(); } 

Обновление: реализовано Я использовал add_filter вместо add_action для pre_get_posts . Я обновил это, хотя я все еще вижу ту же проблему.

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

Обновите два (и окончательный): ответ Пер @ ialocin, я понял, что изменение запроса posts_per_page var бесполезно, поскольку оно перезаписывается опцией posts_per_rss в запросе фида (мой сценарий). Таким образом, ответ заключается в использовании фильтра для изменения этой опции. (-1 не является допустимым значением posts_per_rss , таким образом, posts_per_rss из них используется ниже).

 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; } 

Затем в моем конструкторе класса плагина я добавил следующее (и удалил действие pre_get_posts ):

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

Solutions Collecting From Web of "Изменение запроса var в pre_get_posts не поддерживается"

Крюк init работает задолго до pre_get_posts поэтому сбрасывая запрос в этот момент – в init – не будет отражать ничего, что будет сделано намного позже. Я не думаю, что что-то не так с вашим кодом, вы неправильно понимаете последовательность действий. То, что вы ожидаете, не то, что на самом деле происходит.

posts_per_rss не является параметром WP_Query . Это имя option которая сохраняется в базе данных. Это могут быть адреса через pre_option_{$option_name} :

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

В обсуждении / помощи в этом разделе ниже приведен базовый код, который в конечном итоге работает для моих целей. Установка запроса posts_per_page var была бесполезным упражнением, так как оно перезаписано опцией posts_per_rss в запросе фида (мой сценарий). posts_per_rss не является запросом var и должен быть установлен другим способом, поэтому pre_option_posts_per_rss фильтр pre_option_posts_per_rss . (-1 не является допустимым значением posts_per_rss , таким образом, posts_per_rss из них используется ниже).

 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(); }