WordPress の標準の投稿アーカイブを下層ページに該当するURLとして表示させたい、と考えたので方法を調査してみました。
コード (α版)
一応プラグインとして作ってみたものの、挙動的に不安定だったり不完全だったりするのでα版です。
条件としては以下の通り。
- ただし、個別記事のURLはスラッグになります。
- 投稿一覧のスラッグは
get_post_type_object( 'post' )->has_archive
で取得可。
フィルターフック
中身をかいつまんで説明。
<?php
/**
* add_post_add_archive
*
* desc: 投稿アーカイブをスラッグとして作成する
*/
function add_post_add_archive( $args, $post_type ) {
if ($post_type === 'post') {
$slug = 'news';
$label = '新着情報';
$args['labels'] = [
'name' => $label
];
$args['has_archive'] = $slug;
$args['rewrite'] = [
'slug' => $slug,
'with_front' => false,
];
}
return $args;
}
add_filter( 'register_post_type_args', 'add_post_add_archive', 10, 2 );
処理としては以下の通り。
- フィルターフックとしては
register_post_type_args
に自作の関数add_post_add_archive()
を引っ掛けます - 引っ掛けた関数の中では
- 投稿タイプが
post
ならば、上述の例だと「スラッグをnews
に、表示されるラベルを新着情報
に変更」としています
- 投稿タイプが
has_archive
に上述のスラッグを渡し、true
扱いにwith_front
はfalse
にセット
実際はスラッグやラベルをある程度自由にセットしたかったので設定画面を追加する処理を記述したり、変数や関数の名前空間の重複を回避するためにクラスにしまっていたり、と色々余計なことをしていますが、一番の着物部分は割とシンプル目です。
ただし、このコードではシングルページのURLがスラッグに固定されてしまったり、条件は不明ながら特定環境下の WordPress サイトでは上手く動作しなかったり……と挙動的に不安定・不完全なので、実用には向きません。
あくまでコンセプトを形にして方向性をある程度具体化したものだと思っていただければ、と想定しております。
また、調査していく中でどうも標準の投稿は経緯的に特殊にならざるを得ない部分がありそうなので、その辺りをフォローしてごにょごにょいじるくらいならば「いっそ最初からカスタム投稿タイプで作ってしまった方が楽なのでは……」と思い始めてしまったのでそこで筆を置いた、というのもあります。
というわけで尻切れトンボではありますが、その辺りは致し方ないのかな、と。
参考
- WordPressの投稿(投稿タイプpost)の一覧を任意のURLに変更し、投稿パーマリンクを下層ページに位置付ける方法 – SATOSHI MURATA
- WP(ワードプレス)の投稿アーカイブを任意のURLで出力する – Creator Note
- register_post_type_args | Hook | WordPress Developer Resources
- register_post_type() | Function | WordPress Developer Resources
オマケ
未検証
- カスタム投稿タイプのパーマリンクを書き換えるフィルターフックを定義する | | リーテラトバリタブログ
- 関数リファレンス\/get post type object – WordPress Codex 日本語版