ども、dice(@dice_dDtea)です。
近頃、ノマドワーカーにシフトするためパソコン選びに傾倒していましたが、
久しぶりに技術的な記事を書きます!
今回はWordpressのカスタム投稿タイプの話です。
カスタム投稿って扱いが独特ですよね?普通に今までの普通の記事のようにやると表示されないorz
実際diceがカスタム投稿タイプのサイト制作でつまずいたRSSについてです。
普通にWordpressでRSSを配信する時
RSSを配信する時って、<head>タグに以下のようなタグを仕込みますよね?
<link rel="alternate" type="application/rss+xml"
title="<?php bloginfo('name'); ?>"
href="<?php bloginfo('rss2_url'); ?>">
ちなみに、RSSのURLは
bloginfo('rss2_url');
で取得できます。
普通に投稿しているんであれば以下のような感じでRSSが吐き出されると思います。
しかし、カスタム投稿タイプで記事更新していると
記事がRSSに反映されません。
WordPressのRSSのURL
通常の場合
通常 bloginfo(‘rss2_url’) で吐き出されるURLってのは
http://【ブログトップのURL】/feed/
です。
カスタム投稿タイプのRSSのURLって?
手動で
http://【ブログトップのURL】/【カスタム投稿タイプのスラッグ】/feed/
http://【ブログトップのURL】/feed/?post_type=【カスタム投稿タイプのスラッグ】
上記のどっちかを打ち込めば、
問題なく、その指定したカスタム投稿タイプのRSSを取得できます。
なので、rssのhrefに上記のURLをぶち込めばいいわけです。
例えば、
カスタム投稿タイプのスラッグが「music」ならば、
http://【ブログトップのURL】/music/feed/
http://【ブログトップのURL】/feed/?post_type=music
でOK!
実は post_type=post でも通常のRSSは取得できる
ちなみに、
通常の投稿のスラッグは「post」なので、
http://【ブログトップのURL】/feed/?post_type=post
とすれば通常投稿だけのRSSが選択的に取得できます。
ただし、
http://【ブログトップのURL】/post/feed/
は作動しません!!!!
これだけは、
「/feed/?post_type=post」のみです。
複数にまたがる投稿タイプを一つのRSSでまとめて吐き出したい!
例えば、
メインコンテンツは「カスタム投稿タイプ」
更新情報は「投稿」もしくは別の「カスタム投稿タイプ」など・・・。
「bloginfo(‘rss2_url’)」で吐き出されるRSSのURL、
つまり「http://【ブログトップのURL】/feed/」に、
「投稿」や複数の「カスタム投稿タイプ」をまとめて表示させるには?
やり方は、現在3パターン確認されています。
function.php に、下記のコードのうちいずれか一つ、好きなのを仕込めばOKです。
まずは最も一般的なコードから
function custom_post_rss_set($query) {
if( is_feed() ) {
$query->set('post_type',
array(
'post',
'【カスタム投稿タイプAのスラッグ】',
'【カスタム投稿タイプBのスラッグ】'
)
);
return $query;
}
}
add_filter( 'pre_get_posts', 'custom_post_rss_set' );
但し、この方法だと以下のような不具合が出るそうです
カスタム投稿タイプのフィードを表示させようと思ったのですが、下記のような不具合が発生。
・特定のカスタム投稿タイプのRSSが取得できない(全てメインフィードと同じフィードになる)
・WP_DEBUGがtrueのときに特定のカスタム投稿タイプのRSSフィードを表示するとNoticeエラーがでる
出典: 巷でよく見かけるカスタム投稿タイプをRSSに反映させるコードはバグがあるので使ってはいけない | モンキーレンチ
ちなみに、
diceが最近運営を始めたカスタム投稿タイプによるサイトでは問題なく動きました。
次に前述の対策が施されたというコード
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',
'【カスタム投稿タイプAのスラッグ】',
'【カスタム投稿タイプBのスラッグ】'
)
);
}
return $query;
}
}
add_filter( 'pre_get_posts', 'custom_post_rss_set' );
逆にコッチは、
diceが最近運営を始めたカスタム投稿タイプによるサイトでは動かなかったので不採用しました(--;)
最後に別に以下のようなコード
function mysite_feed_request($vars) {
if ( isset($vars['feed']) && !isset($vars['post_type']) ){
$vars['post_type'] = array(
'post',
'【カスタム投稿タイプAのスラッグ】',
'【カスタム投稿タイプBのスラッグ】'
);
}
return $vars;
}
add_filter( 'request', 'mysite_feed_request' );
1番目のコードの不具合は克服しつつ、
diceが最近運営を始めたカスタム投稿タイプによるサイトでは元気に動いているのでこれを採用しています。
で、どれがいいの?
上記の3パターンのうち好きなのをお選びください。
試して問題なく動けば無問題です。
Facebookコメント
※コメントしたけど表示されてない方へ
パーマリンクを変えてしまったおかげで表示されなくなってしまいました。
折角コメントいただいたのにスイマセンm(__)m
パーマリンク変更しても何とか表示できる方法を現在模索中です。