未维护PRE_GET_POSTS中的查询变量更改

时间:2015-06-17 作者:Nicole

我正在创建一个插件,添加一个自定义提要。我正在使用pre_get_posts 过滤器以更改posts_per_page 将var查询到-1(以获取自定义帖子类型的所有项目)。但是,如果我将$wp_query 在渲染函数中,posts_per_page 保持默认值。我也测试了改变posts_per_rss 到-1,我确实看到了在查询中所做的更改(当然,它对生成的帖子没有任何影响)。我还尝试将主题更改为默认主题并进行测试,但结果相同。谁能解释一下为什么我不能改变posts_per_page 查询变量?

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 one:意识到我在使用add_filter 而不是add_action 对于pre_get_posts. 我已经更新了,尽管我仍然看到同样的问题。

add_action( \'pre_get_posts\', array($this, \'mcf_pre_get_posts\'));
<小时>Update two (and final):根据@ialocin的回答,我意识到posts_per_page 查询变量无效,因为它被posts_per_rss feed查询中的选项(我的场景)。因此,答案是使用过滤器来更改该选项。-1不是有效的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\') );

3 个回复
最合适的回答,由SO网友:Nicole 整理而成

根据本帖中的讨论/帮助,以下是最终为我的目的工作的基本代码。设置posts_per_page 查询变量是徒劳的,因为它被posts_per_rss feed查询中的选项(我的场景)。posts_per_rss 不是查询变量,必须以不同的方式设置,因此pre_option_posts_per_rss 已添加筛选器。-1不是有效的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();
}

SO网友:s_ha_dum

The init hook runs well before pre_get_posts 因此,在该点上转储查询init-- 不会反映出以后要做的任何事情。我认为您的代码没有任何问题,您误解了操作的顺序。你期望发生的事情并不是实际发生的事情。

SO网友:Nicolai Grossherr

posts_per_rssnot A.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\' );

结束

相关推荐

Image on rss feed on post

我希望我的网站能显示来自虚拟世界《第二人生》的时尚博客帖子。我已经开始使用blogger,他们有一个简单的小部件“bloglist”,只需输入blogger的url,它还可以显示每个url上最近发布的文章的图片。有人告诉我转到wordpress,因为它的布局更好。我现在正在使用Wordpress,但我完全迷路了。我需要什么类型的插件、代码或小部件才能在Wordpress中获得相同的结果?我知道rss提要,但它不显示带有后期提要的图像。我需要什么来实现这一点?以下是我试图实现的目标的示例behappyins