WordPressの投稿(投稿タイプpost)の一覧を任意のURLに変更し、投稿パーマリンクを下層ページに位置付ける方法

WordPressの標準的な投稿(投稿タイプ post)の記事一覧ページ(アーカイブページ)をトップページとは別に用意したいことはありませんか? この記事ではその設定方法を解説していきます。カスタム投稿タイプの一覧ページを作るときとはすこし違う設定が必要です。

ゴール

この記事では次のようなURLで各ページを表示したい想定で書いていきます。blog 以外の名前にしたいときは都度読み替えてください。

  • 記事一覧ページ: /blog/
  • 記事パーマリンク: /blog/nice-postname

手順1. 記事パーマリンクURLの変更

まずは素朴に管理画面の「設定」→「パーマリンク設定」から、パーマリンクURLを変更します。

この例では記事パーマリンクを次のようにしました。

/blog/%postname%/

wordpress-archive-another-url-permalink

/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);

ここから先は解説になるので、公式のリファレンスをみながら読み進めてください。

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_args2 にします。

add_filter('register_post_type_args', callback, 10, 2);

2-2. アーカイブを有効化する

has_archive でアーカイブページを有効にします。

$args['has_archive'] = $slug;

2-3. リライトの指定

has_archive を有効にしただけではリライトが足りず、期待したURL /blog/ で記事一覧ページを表示できないので、リライトの設定を追加します。単に rewritetrue にするだけだとパーマリンク構造が重複してしまう(記事一覧ページが /blog/blog/になってしまう)ので with_frontfalse にします。

$args['rewrite'] = array(
  'slug' => $slug,
  'with_front' => false,
);

オプション:ページ名や管理画面のサイドバーの名前を変更する

アーカイブページの名前が「投稿」のままでよければこの設定は不要ですが、アーカイブページをトップページから変えたいということは、名前もほとんどの場合で変えたくなるでしょう。labels を追加して名前を変更します。

$args['labels'] = array(
  'name' => 'ブログ'
);

記事一覧ページ作成のアンチパターン

記事一覧ページ作成のアンチパターンがいくつかあります。

  • 固定ページでサブクエリを引いて記事一覧ページにする
  • 手仕事でリライトを入れる

固定ページでサブクエリを引いて記事一覧ページにする

固定ページを作って、その中でWP_Queryを引いて、独自の一覧ページを作るパターンです。単純な記事一覧ページではない場合はこの限りではありません。フィードやページネーションなどで苦労することになるので、register_post_type_args フィルターフックを使いましょう。

手仕事でリライトを入れる

register_post_type_args フィルターフックを使うけど、$argsrewrite を入れずに、手動でフィードやページネーションのリライトなどを add_rewrite_rule で入れるパターンです。抜け漏れが発生したりするので、 rewrite を活用しましょう。

付録:リライトルールを確認する方法

$wp_rewritevar_dump() すると一覧が見れます。<pre></pre> 推奨です。

<pre><?php var_dump( $wp_rewrite ); ?></pre>