WordPressで投稿や固定ページとは違う投稿の集まりが作れる機能であるカスタム投稿タイプ、ご存じですか??
ちょっとカスタム投稿タイプって何?に触れておくと、インストール直後に何かを書いて表示させることができるものに【投稿】と【固定ページ】というのがあるのはご存じですよね?これも実は【投稿タイプ】なんです。それぞれ「post」「page」という名前がついています。カスタム投稿タイプはこの2種類の投稿タイプのほかに任意のもの、例えば「diary」などという記事の集まりを追加できる機能なんです。
カスタム投稿タイプを使うと、管理画面のメニュー上で「投稿」「固定ページ」とは別のメニュー項目が追加され、投稿や固定ページと同じようにその中にある記事を追加したり一覧表示したりできるようになります。カテゴリーで分けるのとは違って完全に別の記事の集まりにできるので、サイトの中で分けて管理できるので大変便利です。
・・・と今回の日記の主旨から外れていってしまうので、カスタム投稿タイプとは?についてはこの辺にしておきます。詳しい内容を知りたい方はこちらなどを参考にしていただければと思います。
そのカスタム投稿タイプで問題が発生!!なんと特定のカスタム投稿タイプだけページを表示すると404ページが表示されるのです。しかもその投稿タイプで作成した記事だけではありません。「Post Type Switcher」というプラグインを使って他の投稿タイプの記事を移動させてもやはり404ページが表示されます。しかもその記事を元の投稿タイプに戻すと正常に表示される・・・まさにカオスな状態です。
カスタム投稿タイプの記事が404になるという現象あるあるにパーマリンク構造の設定が反映されていないというのがあるんですけど(これも難しい話なのでさらっと流します)、そんなことは当然知ってて、パーマリンクのフラッシュをしても改善されない。まあそもそも特定の投稿タイプだけなんだから解決するはずもないとはうすうす思ってましたけど、やっぱりの結果でした。
今まで何年もWordPressでサイト作りしてきて、カスタム投稿タイプも何の気なしに追加したりして構築してきた経験上でも初めてのことでしたのでさすがに焦りました・・・え?サイト壊れてる?って・・。
でも実は単純なミスによって引き起こされたことだったんです。わかってみたらな~~んだってことでしたけど、こういうことが今後あるかもしれないと思い、備忘録として残しておきます。同じことが起こった方(ない?)の参考になれば幸いです。
カスタム投稿タイプの投稿表示が404になった原因と対処
カスタム投稿タイプで作成した投稿(ややこしいですね)は、Custom Post Type UIプラグインを使おうが、自身でfunctions.phpへ設定情報を書こうが、何も指示しなければ通常の【投稿】と混ぜて表示させたりすることはできないんです。例えば投稿タイプを追加しただけでは
- カスタム投稿タイプ内の投稿を公開・編集してもpingが飛ばない
- カスタム投稿タイプ内の投稿は通常のRSSフィードには含まれない
- カスタム投稿タイプ内の投稿はダッシュボード上のどこにも数などが表示されない
- カスタム投稿タイプ内の投稿は何かの一覧(ブログ一覧など)には含まれない
など、いろいろと不都合があるんです。これを解消するためにこちらで紹介しているような設定を追加するのですが、実はこれの1つの設定漏れ&コードの誤記があったんです(ちなみに上記紹介コードは修正してありますのでご安心を)。
設定漏れと一部コードの間違いがあったのは
function chample_latest_posts( $wp_query ) {
if ( is_home() && ! isset( $wp_query->query_vars['suppress_filters'] ) ) {
$wp_query->query_vars['post_type'] = array('カスタム投稿タイプ名1', 'カスタム投稿タイプ名2');
}
}
add_action( 'parse_query', 'chample_latest_posts' );
という、閲覧画面のブログ一覧へカスタム投稿タイプも含めて一覧表示させるためのコード。これに投稿タイプ名を追加しないと一覧には含まれないのですが、まずはこの設定が漏れていたことが1つめの原因でした。
ただこの設定は、投稿タイプを追加していないものは一覧に含まれないというだけで、設定が漏れていても404になることはないんです。
ここで発見したのがさらにこのコードの誤り。以下のコードを上のコードと見比べてください。
function chample_latest_posts( $wp_query ) {
if ( is_home() || is_single() && ! isset( $wp_query->query_vars['suppress_filters'] ) ) {
$wp_query->query_vars['post_type'] = array('カスタム投稿タイプ名1', 'カスタム投稿タイプ名2');
}
}
add_action( 'parse_query', 'chample_latest_posts' );
なぜか || is_single() というのが条件に入ってます。このコードはis_home()(トップページを投稿一覧にしている際)で、次のカスタム投稿タイプを投稿抽出条件に加えなさいというものなのに、なぜかis_single()(投稿を表示するページで)というのも加わってるんですね。
それで投稿を表示するページで投稿タイプの設定がないから「ページがないよ」と404になってしまっていたんです。そもそも上のコードを使ってたはずなのに、いつ、何のために条件加えたのか??自身で追加した覚えがないので気持ち悪いところではありますが、無事解決できて何よりでした。
ちなみに上記コードは関数名(chample_latest_posts)でググるとわかる通り、いつぞやにどこかの誰かが作成・公開されたコードで、私も使用しつつ、たくさんの方が使用しつつ、たくさんの方がコピーコードを紹介しています。私も紹介記事として公開する当時は、きちんと引用にするか、参照元リンクを入れるというマナーというかネットエチケットを知らなかったので、恥ずかしながらコードのみ紹介する形になってしまってます(どの方が大本なのかが不明なため今更引用元を知る術がありません)。余談になってしまいますが、私のようにならないよう、誰かのページのコードや文章を自身の紹介記事等に含めるときは、きちんと引用元を示すようにしてくださいね。もちろん私は今はきちんとしてます。
![特定のカスタム投稿タイプにある投稿を表示するときだけ404エラーになってしまう現象の原因と解決方法についての備忘録です。 WordPressで特定のカスタム投稿タイプだけ表示すると404になる件【解決済】|Knowledge Base](https://www.momosiri.info/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png)
![特定のカスタム投稿タイプにある投稿を表示するときだけ404エラーになってしまう現象の原因と解決方法についての備忘録です。 WordPressで特定のカスタム投稿タイプだけ表示すると404になる件【解決済】|Knowledge Base](https://www.momosiri.info/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png)