毎回忘れるので、備忘録として書いとこうと…
やりたいこと
- WordPress標準の投稿(post)のアーカイブページを作って、
https://www.example.com/スラッグ/
みたいな任意のパーマリンクにしたい。 - 標準の投稿のシングルページのパーマリンクを、
https://www.example.com/スラッグ/ページスラッグorID
みたいな感じにしたい。
早い話が
「カテゴリとかもないただのお知らせ的なの実装するだけでわざわざカスタム投稿タイプ作るのめんどいし抵抗がある、かといって標準の投稿だとアーカイブがカテゴリーベースのhttps://www.example.com/category/hoge/
みたいな感じでシングルページがhttps://www.example.com/123/
みたいな感じになってなんか気持ち悪い」
という人向け。
やり方
方法① カスタム投稿タイプをつくる。
上に書いた早い話の鉤括弧内を見て**『いやカスタム投稿でよくね?』**と思う方はカスタム投稿タイプ作るほうが圧倒的に早いし、パーマリンク的にはすごい素直な感じの挙動します。標準の投稿が完全に無用の長物と化すけど。
やり方はregister_post_type
するときに
'rewrite' => array( 'slug' => '任意のスラッグ', 'with_front' => true),
'has_archive' => true
とするだけ。ググればたくさん情報出てきますのでググってください。標準の投稿? 隠せばいいのだ。
方法② アーカイブページ用の固定ページを作る
標準の投稿を活かすならこっちの方法。解説は後ほど。
方法③ 'has_archive' => true
にしてうまいことする →できない
この「うまいことする」をやろうとして調べて結局キレイな形でできないから②のやり方に移行する、というのを毎回やってます。
アーカイブページなのに固定ページってなんか気持ち悪いし、無駄な固定ページがあるのも気になるし、ていうかアーカイブページがarchive.phpじゃなくてpage-{slug}.phpで動いてるのがなんか気持ち悪いんでこのやり方でやりたいんですが、アーカイブページのパーマリンクをどう頑張っても取得できません。
カテゴリでも日付でもない通常のアーカイブページを有効にするのは以下で可能。ググれば出てくる。
// 通常アーカイブを有効にする
function post_has_archive( $args, $post_type ) {
if ( 'post' == $post_type ) {
$args['rewrite'] = true
$args['has_archive'] = '任意のスラッグ';
}
return $args;
}
add_filter( 'register_post_type_args', 'post_has_archive', 10, 2 );
で、例えばスラッグをnews
とかにした場合、https://www.example.com/news/
とURLを叩くとarchive.phpのテンプレで投稿一覧が表示される。
のだがこのhttps://www.example.com/news/
はWordPressの関数ではどう頑張っても引っ張ってこれない。
get_post_type_archive_link('post')
で引っ張ってこようとしても、引数が'post'
だと無常にもfalse
が返ってくる。
URL直接叩かせるなり、アーカイブのリンク返す関数やショートコードを適当に自作するなり、post_type_archive_link
にフィルターフックしてうまいことするなりでなんとかしようと思えばできるけど、
アーカイブをarchive.phpで表示するという**『当たり前にできそうなこと』をしたいから頑張ってるのにそんな力技で解決するのはなんか気持ち悪い。**
というのと、WordPressのシステム上ではアーカイブページが無いものとして扱われるので(厳密には違うが)、例えばサイトマップ生成プラグインとか使ってるとアーカイブページが含まれなかったり、
それを解決しようとするとリライトルールをゴリゴリ書くハメになったりと、
とにかく不具合や複雑化の温床になりやすい。
ので、最終的に固定ページが1ページ増えるだけで特に他には影響が出ない【方法②】に落ち着くわけである。一応WordPress推奨の方法だしな…
今更説明するまでもないと思うけど、一応手順は以下の通り。
方法②-手順1. アーカイブ用の固定ページを作る
タイトルは任意のタイトル、本文は空でよい。このページのパーマリンクがアーカイブページのパーマリンクになる。
当然ながら、テンプレートとなるPHPファイルは用意しておくこと。
手順2. 表示設定・パーマリンク設定を変更
↑表示設定の【投稿ページ】で今しがた作った固定ページを選択する。
↑パーマリンク設定。【カスタム構造】のラジオボタンをチェックして、/任意のスラッグ/(任意のパーマリンク構造)
とする。画像では%post_id%
にしているが%post_name%
でも構わない。
手順3. アーカイブのパーマリンクの取得方法
echo get_permalink( get_page_by_path( '固定ページのスラッグ' )->ID );
**これで引っ張ることになる。**うーん、やっぱりなんか…
ほんとお知らせ機能とか標準の投稿タイプそのまま使えたらそれで良いんだけど、パーマリンクが何か気持ち悪い感じになるのが如何ともし難い。
管理画面の見え方からカスタマイズするようなレベルならカスタム投稿タイプ使うことに抵抗はないんだけど、固定ページいくつか+αくらいのサイトを作るときはこの辺の仕様で毎回もにゃる。自分だけかもしれないけど。