WordPressのカスタム投稿タイプとタクソノミーのパーマリンクをカスタマイズする方法

実際に案件でカスタム投稿タイプとタクソノミーを追加した際にデフォルトのパーマリンクで使うことってほとんど無いと思います。
タクソノミーがなければプラグインのみで対応可能なのですが、タクソノミーを「投稿」のカテゴリまたはタグと同じように利用したいことがかなり多いかなと思います。

そこで今回はカスタム投稿タイプにタクソノミーがある場合にもパーマリンクを自由にカスタマイズする方法を解説していきます。

まずは結論

  • Custom Post Type Permalinksプラグインを利用する
  • functions.phpにタクソノミーのリライトルールを追記する

現状の検証結果だとこの対応が一番楽です。

前提

わかりやすいようにWordPressを下記のような構成にする前提で解説していきます。

  • ①投稿はブログとして扱い、タグは使わない。投稿のディレクトリは /blog/ とする。
     カテゴリ一覧は /blog/[カテゴリのスラッグ]/
     個別記事は /blog/[カテゴリのスラッグ]/[記事ID]/ とする。
  • ②newsというカスタム投稿タイプを追加。
     ディレクトリは /news/ とする。
     個別記事は /news/[タームのスラッグ]/[記事ID]/ とする。
  • ③newsに対してnews_categoryというタクソノミーを追加。
     ディレクトリは /news/[タームのスラッグ]/ とする。

投稿のディレクトリを設定

WordPressの管理画面「設定」>「パーマリンク設定」を開きましょう。

以下の設定に変更し保存する。

1 共通設定は、カスタム構造を選択し以下パーマリンクとする
/blog/%category%/%post_id%/

2 カテゴリーベースは以下を設定する
blog/.

これで前提①のディレクトリの設定は完了です。

※ちなみにブログ一覧を表示するには、固定ページでテンプレートを利用して作成するか、「設定」>「表示設定」のホームページの表示で投稿ページを選択し、home.phpというテンプレートを利用することで表示できます。

カスタム投稿タイプとタクソノミーを追加

functions.phpに以下を追記します。

function create_custom_post_type() {
  // カスタム投稿タイプを追加
  register_post_type(
    'news',
    array(
      'label' => 'ニュース',
      'public' => true,
      'has_archive' => true,
      'show_in_rest' => true,
      'supports' => array( 'title', 'editor', 'thumbnail', 'author' ),
      'menu_position' => 6,
      'rewrite' => array(
        'with_front' => false,
      ),
    )
  );

  // タクソノミーを追加
  register_taxonomy(
    'news_category',
    'news',
    array(
      'hierarchical' => true,
      'label' => 'ニュースカテゴリー',
      'show_ui' => true,
      'query_var' => true,
      'public' => true,
      'singular_label' => 'ニュースカテゴリー',
      'rewrite' => array(
        'with_front' => false,
      ),
    )
  );
}
add_action( 'init', 'create_post_type' );

特に大事なのが、

    'rewrite' => array(
      'with_front' => false,
    ),

この指定は必ず入れましょう!

指定しない状態(with_frontがtrueの場合)だと、最初に設定したパーマリンクをもとにディレクトリを生成してしまうので、 /blog/news/ となってしまいます。
rewriteのwith_frontをfalseにすることで、 /news/ と始めることができますので必ず設定しましょう。

これで、前提②のディレクトリもひとまずは指定できました。しかし、記事のURLを記事IDにしたい場合など融通を効かせるにはカスタマイズしないといけません。
そこで、管理画面上から設定できるようプラグインを入れます。

Custom Post Type Permalinksを追加

Custom Post Type Permalinksでダウンロードして、FTPや管理画面からアップロードするか、
WordPressの管理画面「プラグイン」>「新規追加」でプラグインを入れて有効化しましょう。

有効化すると、管理画面「設定」>「パーマリンク設定」の下の方に、「カスタム投稿タイプのパーマリンク設定」という項目が追加され、カスタム投稿タイプでもパーマリンクを指定出来るようになります。

news部分を /%news_category%/%post_id%/ と指定し、「カスタマイズされたカスタムタクソノミーのパーマリンクを使用する。」にチェックを入れると前提②の設定が完了です。

タクソノミーに対応したパーマリンクを追加

最後に以下をfunctions.phpに追加します。

<?php
// リライトルールを追加
function custom_rewrite_rule() {
  // ニュースのタクソノミー追加
  add_rewrite_rule('news/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?news_category=$matches[1]&feed=$matches[2]', 'top');
  add_rewrite_rule('news/(.+?)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?news_category=$matches[1]&feed=$matches[2]', 'top');
  // 年別
  add_rewrite_rule('news/(.+?)/date/([0-9]{4})/?$', 'index.php?news_category=$matches[1]&year=$matches[2]', 'top');
  // 年別(ページング)
  add_rewrite_rule('news/(.+?)/date/([0-9]{4})/page/?([0-9]{1,})/?$', 'index.php?news_category=$matches[1]&year=$matches[2]&paged=$matches[3]', 'top');
  // 月別
  add_rewrite_rule('news/(.+?)/date/([0-9]{4})/([0-9]{1,2})/?$', 'index.php?news_category=$matches[1]&year=$matches[2]&monthnum=$matches[3]', 'top');
  // 月別(ページング)
  add_rewrite_rule('news/(.+?)/date/([0-9]{4})/([0-9]{1,2})/page/?([0-9]{1,})/?$', 'index.php?news_category=$matches[1]&year=$matches[2]&monthnum=$matches[3]&paged=$matches[4]', 'top');
  // 日別
  add_rewrite_rule('news/(.+?)/date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$', 'index.php?news_category=$matches[1]&year=$matches[2]&monthnum=$matches[3]&day=$matches[4]', 'top');
  // 日別(ページング)
  add_rewrite_rule('news/(.+?)/date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$', 'index.php?news_category=$matches[1]&year=$matches[2]&monthnum=$matches[3]&day=$matches[4]&paged=$matches[5]', 'top');
  // 一覧
  add_rewrite_rule('news/([^/]+)/?$', 'index.php?news_category=$matches[1]', 'top');
  // 一覧(ページング)
  add_rewrite_rule('news/([^/]+)/page/([0-9]+)/?$', 'index.php?news_category=$matches[1]&paged=$matches[2]', 'top');
}
add_action('init', 'custom_rewrite_rule');

上記追加し、「設定」>「パーマリンク設定」を開き、何もいじらずに保存ボタンを押せば設定が反映されます。

これで前提③も網羅でき、無事すべて動くようになりました。

※注意点として、ニュースの記事でカテゴリーを追加せずに投稿してしまうとページにアクセスできないので、必ず記事にカテゴリを設定しましょう!

まとめ

前提③の部分もプラグインで出来ると素晴らしいのですが、そもそも「タグもカテゴリも利用する」「タクソノミーも複数ある」というケースが存在してしまうので設定できないのもしょうがないかなと思います。

とはいえ、個人的に仕事で結構利用することが多いので、同じケースで利用する参考になれば嬉しいです。

About Me

プロフィール画像

ユーキと申します。北海道恵庭市という札幌と新千歳空港の間でフリーランスのWebエンジニアとして活動してます。

当サイトのブログでは、主にWeb制作全般、フリーランス周りの情報など色々なノウハウや知識を載せています。
その他日々気になったこと、思ったことも書いてます。

お仕事の相談など何かありましたら、お問い合わせかツイッターのDMからお気軽にご連絡くださいませ。

お問い合わせはこちら

ツイッターはこちら

ポートフォリオはこちら

Latest Posts

Popular Posts

TOP