WordPressの標準的な投稿(投稿タイプ post
)の記事一覧ページ(アーカイブページ)をトップページとは別に用意したいことはありませんか? この記事ではその設定方法を解説していきます。カスタム投稿タイプの一覧ページを作るときとはすこし違う設定が必要です。
WordPressの投稿(投稿タイプpost)の一覧を任意のURLに変更し、投稿パーマリンクを下層ページに位置付ける方法
ゴール
この記事では次のようなURLで各ページを表示したい想定で書いていきます。blog
以外の名前にしたいときは都度読み替えてください。
- 記事一覧ページ:
/blog/
- 記事パーマリンク:
/blog/nice-postname
手順1. 記事パーマリンクURLの変更
まずは素朴に管理画面の「設定」→「パーマリンク設定」から、パーマリンクURLを変更します。
この例では記事パーマリンクを次のようにしました。
/blog/%postname%/
/blog/
のうしろは投稿スラッグのみにしたいので %postname%
としました。ちなみに、この部分はどのような構造でも機能するので、お好みの構造を指定してください。
これで、記事パーマリンクページは期待するURLで表示できるようになりました。
この時点では /blog/
にアクセスしてもまだ404で「ページが見つかりませんでした」となっているはずです。
手順2. 記事一覧ページのURLを変更
次に記事一覧ページの設定をしていきます。まずは結論から。次のコードをfunctions.phpに追加します。
add_filter('register_post_type_args', function($args, $post_type) {
if ($post_type === 'post') {
$slug = 'blog';
$args['labels'] = array(
'name' => 'ブログ'
);
$args['has_archive'] = $slug;
$args['rewrite'] = array(
'slug' => $slug,
'with_front' => false,
);
}
return $args;
}, 10, 2);
ここから先は解説になるので、公式のリファレンスをみながら読み進めてください。
- 関数リファレンス/register post type - WordPress Codex 日本語版
- register_post_type() | Function | WordPress Developer Resources
2-1. register_post_type_args フィルターフック
既存の投稿タイプの設定を登録たいので、フィルターフック register_post_type_args
を使っています。
register_post_type_args | Hook | WordPress Developer Resources
register_post_tpe_args
は引数を2つ受け取るので、 $priority
は初期値のまま 10
とし、 $accepted_args
を 2
にします。
add_filter('register_post_type_args', callback, 10, 2);
2-2. アーカイブを有効化する
has_archive
でアーカイブページを有効にします。
$args['has_archive'] = $slug;
2-3. リライトの指定
has_archive
を有効にしただけではリライトが足りず、期待したURL /blog/
で記事一覧ページを表示できないので、リライトの設定を追加します。単に rewrite
を true
にするだけだとパーマリンク構造が重複してしまう(記事一覧ページが /blog/blog/
になってしまう)ので with_front
を false
にします。
$args['rewrite'] = array(
'slug' => $slug,
'with_front' => false,
);
オプション:ページ名や管理画面のサイドバーの名前を変更する
アーカイブページの名前が「投稿」のままでよければこの設定は不要ですが、アーカイブページをトップページから変えたいということは、名前もほとんどの場合で変えたくなるでしょう。labels
を追加して名前を変更します。
$args['labels'] = array(
'name' => 'ブログ'
);
記事一覧ページ作成のアンチパターン
記事一覧ページ作成のアンチパターンがいくつかあります。
- 固定ページでサブクエリを引いて記事一覧ページにする
- 手仕事でリライトを入れる
固定ページでサブクエリを引いて記事一覧ページにする
固定ページを作って、その中でWP_Queryを引いて、独自の一覧ページを作るパターンです。単純な記事一覧ページではない場合はこの限りではありません。フィードやページネーションなどで苦労することになるので、register_post_type_args
フィルターフックを使いましょう。
手仕事でリライトを入れる
register_post_type_args
フィルターフックを使うけど、$args
に rewrite
を入れずに、手動でフィードやページネーションのリライトなどを add_rewrite_rule
で入れるパターンです。抜け漏れが発生したりするので、 rewrite
を活用しましょう。
付録:リライトルールを確認する方法
$wp_rewrite
を var_dump()
すると一覧が見れます。<pre></pre>
推奨です。
<pre><?php var_dump( $wp_rewrite ); ?></pre>