WordPress フィードで pre_get_posts の posts_per_page は使えない

タイトルで言い切ってますが
WordPress のフィードで表示件数をダッシュボードで入力された値では無く、他の値に変更しようとしてハマったのでシェア。

通常 WordPress で表示件数を変更する場合は、pre_get_posts アクションフックを使って以下のように posts_per_page オプションを指定してやります。
codex にも書いてあるので、これで安心のはずです。

<?php
function my_pre_get_posts( $query ) {
    if ( is_admin() || ! $query->is_main_query() )
        return;

    if ( is_home() ) {
        // Display only 1 post for the original blog archive
        $query->set( 'posts_per_page', 1 );
    }
}
add_action( 'pre_get_posts', 'my_pre_get_posts', 1 );

これをフィードの時にのみ変更しようとして、以下のようなコードを書いたけど、期待通りに表示件数が変更されませんでした。

<?php
function my_pre_get_posts_for_feed( $query ) {
    if ( is_admin() || ! $query->is_main_query() )
        return;

    if ( is_feed() ) {
        // Display 50 posts for the feed
        $query->set( 'posts_per_page', 50 );
    }
}
add_action( 'pre_get_posts', 'my_pre_get_posts_for_feed', 1 );

そこでコアソースを確認してみたところ query.php の 2004行目付近で、is_feed() だった場合、$query->set() でセットした posts_per_page の値を get_option('posts_per_rss') の値で上書きしちゃってるじゃ無いですか!
やだなぁ、もう。

ってわけで、option_{option_name} フィルターフックを使って get_option('posts_per_rss') が返す値を変更しちゃうことにしました。


[2014-09-01:追記]
この記事書いた時に core にパッチも提供してたんだけど、長らく放置されてたので忘れてました。
https://core.trac.wordpress.org/ticket/25380

最近、みたら今年の1月に nacin さんにピックアップされて、3月に WordPress 3.9 リリース前にマージされていたようです。
WordPress 3.9 のリリース記事にも貢献者として僕の名前が乗ってた。
いやー、知らんかったなぁ。

てわけで、3.9以降であれば WordPress フィードで pre_get_posts の posts_per_page は使えるようになってるようですよ。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください