ラムネグから一言:寝る前に読むとくだらなすぎて逆に寝れると好評なすごい適当なブログをこっちではじめてます.
ワードプレスを使っていて、カスタム投稿タイプを新しく追加、そんでもってこのカスタム投稿タイプは「投稿(post)」みたいな記事詳細ページを作らないようにしたい!というケースってそれなりにあると思います。
例えばQ&Aをカスタム投稿タイプで作ったり、スタッフ一覧を本当に一覧ページだけにして、スタッフ一人一人の詳細な記事は要らないケースとか。
ネットで調べると「’public’ => false」「’publicly_queryable’ => true」を併用すれば記事一覧(つまりアーカイブページ)は作成して記事詳細ページは作らない、っていう設定にできる!と書いてあるんですが、できない。
というコトでここでは、ワードプレスのカスタム投稿タイプで記事一覧ページは作りつつ記事詳細ページは作らない方法を紹介します。
解決方法
後からなんでこういう結論になったかはくわしく書きますのでまずは解決方法から。
「’public’ => false」「’publicly_queryable’ => true」の併用では記事詳細ページが作られてしまうのは避けられないので、functions.phpで記事詳細ページは404を返すように設定しちゃいます。力技っぽいですがこれ以外にやり方がない。
fnctions.php
function my_redirect_404() {
if( is_singular('○○') ){
global $wp_query;
$wp_query->set_404();
status_header(404);
}
}
add_action( 'template_redirect', 'my_redirect_404' );
2行目の「○○」の所にカスタム投稿タイプ名(アルファベットの方のやつ)を入れてくださいね。これでカスタム投稿タイプの記事詳細ページにアクセスしようとしたら404ページに飛ぶようになるので、見た目上はこれでOK。あとはサイトマップ(sitemap.xml)の対応のみです。
sitemap.xmlの設定
「XML Sitemaps」というプラグインを使ってsitemap.xmlを作成しているのでこのプラグインでの設定方法を。
「XML Sitemaps」ではカスタム投稿タイプをサイトマップに含める、という選択肢があるんですが、これで追加されるのは記事詳細ページのURLのみ。アーカイブページは追加されません。今回は記事詳細は404になるんでチェックを外しておく。
別にsitemap.xmlに書いてなくてもインデックスされるからいいかなーという気もしないでもないですが、とりあえず追加しときたいのであれば、「XML Sitemaps」の「Additional Pages」にカスタム投稿タイプのアーカイブページURLを入力しておけばOK。
唯一難点は最終更新日が手入力になってしまう所ですが、とりあえず空白で設定しておけば大丈夫だと思います。なんたってsitemapに記載しなくても勝手にインデックスされるんだから大丈夫。
これにて作業は終了!お疲れさまでした。
やったこととしては、
- functions.phpに404リダイレクトの設定を加えた
- sitemap.xmlにカスタム投稿タイプの記事詳細は追加されないようにし、アーカイブページのURLのみsitemap.xmlに記述
結果としては、
- カスタム投稿タイプのアーカイブページは生成される
- カスタム投稿タイプの記事詳細は生成はされてしまうがアクセスしようとすると404ページが表示されるんで、人が見てもそれからグーグルのクローラーが見ても存在していない事になる
力技感がすごいですがとりあえず目標だった「カスタム投稿タイプで記事一覧ページは作る、記事詳細ページは作らない」をすべて達成できました。
さあ、説明と過程の時間
ここから下はなぜこんな力技になったのかという解説です。読みたい人だ読んでくださいね。
「’publicly_queryable’ => true」がダメだった
解説サイトとかでは「’publicly_queryable’ => true」にすると記事一覧ページ(アーカイブページ)のみ作成されて記事詳細ページは作成されない、と書かれてるんですがそれが違いました。
「’publicly_queryable’ => true」だとアーカイブページも記事詳細ページも作る、反対に「’publicly_queryable’ => false」ならどちらも作らない、という挙動をします。
publicly_queryableの説明を読むと、記事を検索可能にします、みたいなことが書いてあります。
その名の通りクエリ発行したときにその記事が対象になるかどうかってことだと思いますが、アーカイブページだろうが記事詳細ページだろうがhave_post()でwhileまわして表示している以上、どちらもクエリ対象に含まれてるはずなんですよね。
じゃないとqueryが空っぽになるわけだし。
だからtrueにしたらどっちのページも生成されて、falseにすると記事一覧も記事詳細も作らない、っていうのはよく考えたらまあそうだろうなーという感じです。
ならほかになんかそのものズバリな設定とかないのかな?と思って何時間も調べましたが結局ない事が分かりました。海外のフォーラムでも、
「’publicly_queryable’はその場合役に立たない、記事詳細を作りたくないなら404リダイレクトを行え」みたいなことが書かれてる始末。てことで数時間の格闘の末上記の力技へと至ったのでした。
まとめ
ワードプレスのカスタム投稿タイプで、記事一覧ページは作りたいけど記事詳細ページは作らない、という設定方法を紹介しました。
まとめると「’public’ => false」「’publicly_queryable’ => true」をしてしまうと記事詳細ページも作られてしまうので、スマートではないけれど404リダイレクトをfunctions.phpに書いて対応するしかない!という感じです。
参考にしてみてくださいね。それでは。
【おしらせ、というか完全なる宣伝】
文体がもうぜんぜん適当すぎてあれだけどものすごい自由に書いてるブログ「檸檬だくだく」もよろしく.寝る前に読める恐ろしくくだらないやつです.
こんなにも一ミリも目を引かれないタイトルを取り扱ってます: ココア20g / ハイチュウとかってさ / なぜ米と小麦を食べようと思ったのかの謎 /