RSS配信の定番コードのバグに注意!!

WordPressをベースにホームページを作成していると、カスタム投稿タイプをよく使うのですが、これが初期状態ではRSSに反映されません。そこで、カスタム投稿タイプをRSSに反映するために、PHPのコードをテーマのfunctions.phpに書き足すのが定番の手法なのですが、これは場合によってはバグというか動作的に問題がある場合がありますので、ご注意下さい。

以下、参考にしたサイトよりソースコードを引用します。

ネット上で定番のコード

以下の例は、通常の投稿(post)、カスタム投稿タイプ(news,videos)をRSS配信する場合のコードです。

function custom_post_rss_set($query) {
    if(is_feed()) {
		$query->set('post_type',
			Array(
				'post',
				'news',
				'videos'
			)
		);
        return $query;
    }
}
add_filter('pre_get_posts', 'custom_post_rss_set');

不具合が対応されたコード

public function custom_post_rss_set( $query ) {
    if ( is_feed() ) {
        $post_type = $query->get( 'post_type' );
        if ( empty( $post_type ) ) {
            $query->set( 'post_type', array( 'post', 'news', 'videos' ) );
        }
        return $query;
    }
}
add_filter( 'pre_get_posts', 'custom_post_rss_set' );

英語圏では以下の様なコードがメジャーのようです。

function mysite_feed_request($vars) {
    if ( isset( $vars['feed'] ) && !isset( $vars['post_type'] ) ) {
        $vars['post_type'] = array( 'post', 'news', 'videos' );
    }
    return $vars;
}
add_filter( 'request', 'mysite_feed_request' );

詳しい現象や何処を対応しているのかなどは、解説されているブログが有りましたので詳しくはそちらを参考にして下さい。

ランドマークスでのお勧めコード

ちなみに、私の場合は「Intuitive Custom Post Order」というプラグインでカスタム投稿タイプの並び順をGUIで変更したりするようにしている事が多いのですが、並び順が投稿日付順や更新日付順にならない場合があったので、以下のように条件にソート順を追加しています。

※「Intuitive Custom Post Order」は投稿、固定ページ、カスタム投稿タイプをそれぞれの一覧画面でマウスで並び順を変更できる便利なプラグインです。

public function custom_post_rss_set( $query ) {
    if ( is_feed() ) {
        $post_type = $query->get( 'post_type' );
        if ( empty( $post_type ) ) {
            $query->set( 'post_type', array( 'post', 'news', 'videos' ) );
            $query->set( 'orderby'    , 'date'); //更新順の場合は modified にする
            $query->set( 'order'      , 'DESC');  
        }
        return $query;
    }
}
add_filter( 'pre_get_posts', 'custom_post_rss_set' );

参考記事