WordPressのリライトルールとは?URLをカスタマイズ方法を徹底解説!

投稿日:2024年04月24日(水) 更新日:2024年05月20日(月)
WordPressのリライトルールとは?URLをカスタマイズ方法を徹底解説!|UMENOKI|すぐに仕事で使えるIT技術情報メディア

みなさんこんにちは!エンジニアの高澤です!

今回はWordPressのリライトルールについて、カスタマイズ方法をわかりやすく解説していきたいと思います。

リライトルールという仕組みは、テーマ開発にしてもプラグイン開発にしても非常に重要な仕組みといっても過言ではありません。

リライトルールを扱えることでパーマリンク(URL)の構造を自由にカスタマイズすることができ、また、WordPressで何かアプリケーションを実装したりする際や、SEO対策においても大変活きてくる知識となるかと思います。

よろしければぜひ当記事をお仕事でご活用いただけましたら幸いです。

リライトルールとは

WordPressのリライトルールとは、WordPressサイトでパーマリンク(Permalink)構造をカスタマイズするための仕組みです。

WordPressはデフォルトでは、「?p=123」といった形式のURLが使われますが、リライトルールを使用することで、「https://sample.com/news/business/」のように、より意味のあるわかりやすいURLを生成することができます。

今この時点ではここまでの理解で大丈夫です。次からリライトルールを理解するためにパーマリンクやパブリック変数などについて解説し、あらためて再度リライトルールの仕組みについて解説していきたいと思います。

パーマリンクとは

パーマリンクは、WordPressサイトのページや投稿ページごとのURLの形式のことをいいます。

WordPressのパーマリンクは、デフォルトでは以下のURLの形式となっております。

「?」の後に、パラメータである「p」などを指定したクエリ文字(クエリ変数)を使った構成になっており、これを「Ugly パーマリンク(アグリーパーマリンク)」 と呼びます。

デフォルト(基本)のパーマリンク説明
https://sample.com/?p=999ID が「999」の投稿ページ
https://sample.com/?p=999&page=2IDが「999」の投稿のページ分割の2ページ目
https://sample.com/?page_id=999ID が「999」の固定ページ
https://sample.com/?m=2024042024年4月の月別アーカイブページ
https://sample.com/?cat=99&paged=5カテゴリーIDが「99」のカテゴリーページの5ページ目
https://sample.com/?author=99投稿者IDが「99」のアーカイブページ

クエリ文字(クエリ変数)とは、ウェブページのURLに付加される、検索やフィルタリングなどの目的で使用されるパラメーターのセット「?m=202404」のことをいいます。

クエリ文字(クエリ変数)は、「?cat=99」のようにURLの末尾に「?」で始まり、キーと値のペアが「キー=値」という形式で表されます。

キーと値のペアが複数になる場合、キーと値は「&」で区切られ連結されます。(例:https://sample.com/?cat=99&paged=5)

「https://sample.com/?p=99」の場合、「p」は「投稿」投稿タイプの記事のIDを意味しており、このURLパラメータを解析したWordPressは「投稿」投稿タイプの記事のID「99」の記事ページを表示します。

パブリッククエリ変数とは

パブリッククエリ変数とは、WordPressがリクエストされたページや投稿に関する情報を取得するのに使用される変数です。

一般的に使用されるパブリッククエリ変数は以下の内容になります。

パラメータ名内容
m年月
p投稿の ID
w
catカテゴリID(term_id)
s検索キーワード
exact完全一致にするかどうか
pageページ分割時のページ送り数
pagedアーカイブページのページ送り数
author投稿者ID
order昇順・降順
year
monthnum
day
hour
minute
second
name投稿スラッグ
category_nameカテゴリースラッグ
tagタグの ID(term_id)
author_name投稿者名
pagename固定ページのスラッグ
page_id固定ページのID
attachment添付ファイルのスラッグ
attachment_id添付ファイルのID
taxonomyカスタム分類
termタームのスラッグ
cpageコメント分割時のページ送り数
post_type投稿タイプスラッグ

このパブリッククエリ変数は、WordPressがリクエストされたコンテンツを特定し、それに基づいて適切な情報を表示するために使用されます。

パブリッククエリ変数として利用可能なパラメーターは、WPクラスのプロパティである$public_query_varsとして、 WordPressコアファイルの一つであるwp-includesファイルの中のclass-wp.phpに定義されております。

wp-includes/class-wp.php

上記class-wp.phpのパブリッククエリ変数に該当するコードは以下になります。

<?php
class WP {
  /**
   * Public query variables.
   * Long list of public query variables.
   * @since 2.0.0
   * @var string[]
   */
  public $public_query_vars = array( 'm', 'p', 'posts', 'w', 'cat', 'withcomments', 'withoutcomments', 's', 'search', 'exact', 'sentence', 'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order', 'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'tag', 'feed', 'author_name', 'static', 'pagename', 'page_id', 'error', 'attachment', 'attachment_id', 'subpost', 'subpost_id', 'preview', 'robots', 'taxonomy', 'term', 'cpage', 'post_type', 'embed' );

パブリッククエリ変数の定義の内容は、ご自身でカスタム投稿タイプやカスタムタクソノミーなどを独自に追加されていたりした場合はその分対応したパブリッククエリ変数が追加されるようになっております。

そのため、もし現状のご自身のWordPressで定義されているパブリッククエリ変数をすべて確認したい場合は、上記class-wp.phpファイルをご確認いただけることで可能です。

プライベートクエリ変数とは

プライベートクエリ変数とは、一般的にはユーザーが直接操作する必要がない、WordPressの内部で使用される特別な変数です。

例えば、特定の条件下でのみ表示されるカスタム投稿や、カスタム検索機能などがこれに該当します。これらのカスタム機能を実装する際に、プライベートクエリ変数が使われることがあります。

プライベートクエリ変数は、一般的には直接ユーザーには公開されません。プライベートクエリ変数は、WordPressの動作を制御するために使用され、通常はテーマやプラグインの開発者によって利用されます。

代わりに、開発者がプログラム内部でこれらの変数を使用して、WordPressの挙動をカスタマイズすることができます。

ユーザーは、WordPressのインターフェースやコンテンツを通じてこれらの機能にアクセスしますが、プライベートクエリ変数を直接見ることはありません。

プライベートクエリ変数はURLには使えませんが、プライベートクエリ変数を使ったクエリ文字列を取得することが可能です。

プライベートクエリ変数は、パブリッククエリ変数と同じような感じでWPクラスのプロパティである $private_query_varsとして、 WordPressコアファイルの一つであるwp-includesファイルの中のclass-wp.phpに定義されております。

wp-includes/class-wp.php

上記class-wp.phpのパブリッククエリ変数に該当するコードは以下になります。

<?php
/**
   * Private query variables.
   * Long list of private query variables.
   * @since 2.0.0
   * @var string[]
   */
  public $private_query_vars = array( 'offset', 'posts_per_page', 'posts_per_archive_page', 'showposts', 'nopaging', 'post_type', 'post_status', 'category__in', 'category__not_in', 'category__and', 'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and', 'tag_id', 'post_mime_type', 'perm', 'comments_per_page', 'post__in', 'post__not_in', 'post_parent', 'post_parent__in', 'post_parent__not_in', 'title', 'fields' );

プライベートクエリ変数の確認が必要になりましたら上記をご確認いただけましたら幸いです。

Prettyパーマリンクとは

Prettyパーマリンク(プリティパーマリンク)とは、WordPressで使用されるパーマリンク構造の一種でで、読みやすく覚えやすい形式のURLのことをいいます。

このPrettyパーマリンクは、ApacheなどのWebサーバーの拡張機能であるmod_rewriteが使える場合、パーマリンクを静的なURLであるPrettyパーマリンクとして設定することが可能となります。

WordPressのデフォルトでは「http://sample.com/?p=123」というようなURL(Uglyパーマリンク)が使用されますが、プリティパーマリンクを有効にすることで、これを「http://example.com/sample-post/」のような、意味のある単語やフレーズで構成されたURLに変更することができます。

Prettyパーマリンクhttp://sample.com/sample-post/
Uglyパーマリンクhttp://sample.com/?p=123

プリティパーマリンクを有効にすることにより、URLがわかりやすくなることで検索エンジンがコンテンツをより正確にインデックスできるようにするといったSEO対策でのメリットなどがあります。

WordPressでプリティパーマリンクを有効にするには、WordPress管理画面左メニュー「設定」→「パーマリンク設定」をクリックし、「パーマリンク設定」ページを開きます。

開いたら「投稿名」を選択していただき保存していただくと、Prettyパーマリンクへの設定が完了して投稿ページや固定ページなどのURLが変更されます。

上図設定ページの「基本」以外のパーマリンクをPrettyパーマリンクと呼びます。

これで設定は完了です。

Prettyパーマリンクが有効になると、パーマリンクのURL には「?p=99」のようなクエリ変数が含まれません。
このURL変換はWordPressで提供されているRewrite APIによって変換処理が行われます。

Prettyパーマリンクの処理の仕組み

パーマリンク設定がデフォルトの「基本」以外に設定されている場合、例えば「http://sample.com/sample-post/」でアクセスした際にWordPressでは内部処理で「/sample-post/」のURL文字列をクエリ変数へ変換してURLを解析し、リクエストされているページを特定して表示します。

HTMLファイルで構築された静的なウェブサイトなどでは、一般的に「http://sample.com/sample-category/sample-post/」のURLは「sample-category」というディレクトリの中に「sample-post」というファイルが配置される構造になっているかと思います。

ですが、WordPressではこの静的なサイトとは異なり、「/sample-category/sample-post/」という構成のURLは「/sample-category/sample-post/」という構造を表しているわけではありません。

WordPressでは以下のようにURLが処理されます。

  • Prettyパーマリンクの設定の場合に「http://sample.com/sample-category/sample-post/」にアクセスする場合、内部ではクエリ変数を使って以下の形式に変換してページを特定します↓
    「http://sample.com/?p=sample-post」

このように内部でおこなわれるのURLの変換はWordPressの「リライトルール(Rewrite Rule)」によっておこなわれます。

次はこのリライトルールについて解説したいと思います。

リライトルールの仕組み

それでは、ここでWordPressのリライトルールの仕組みについて解説したいと思います。

パーマリンクの設定が「基本」以外のPrettyパーマリンクに設定している場合、例えば「http://sample.com/sample-post/」でアクセスしたときはWordPress内部の処理で「/sample-post/」のURL文字列をクエリ変数を使ったパラメータに変換し、それに基づいてリクエストされたページを特定して表示します。

具体的には以下のイメージになります。

例えば、ブラウザから以下のURLでアクセスした場合、
http://sample.com/sample-post/

WordPress内部の処理で「/sample-post/」のURL文字列をクエリ変数を使ったパラメータに変換してリライト処理が行われ、以下のようなURLとして処理されます。
http://sample.com/index.php?pagename=sample-post

表現を変えると…

以下のURLでアクセスしたら
http://sample.com/sample-post/

以下のページを表示するようになっています。
http://sample.com/index.php?pagename=sample-post

リライトルールとは、上記のようにリクエストされたページのURLを必要に応じてパラメータに変換するための仕組みのことをいいます。

このWordPressの内部のリライトルールに基づいてURLを「index.php?pagename=sample-post」のようにパラメータに変換してページを表示しています。

また、このリライトルールはクラスのWP_Rewriteで管理されています。

WP_Rewriteとは

WP_Rewriteは、WordPressのリライトルール(URLリライティング)を管理するためのクラスです。WordPressでは、パーマリンクを使ってウェブページにアクセスできますが、このパーマリンクの形式やルールを管理するのがWP_Rewriteクラスの役割です。

WP_Rewriteクラスは、WordPressがURLを解析し、リクエストされたコンテンツを特定するために使われます。また、URLの構造をカスタマイズしたり、リクエストされたURLを特定のクエリパラメーターにマッピングしたりするためにも使用されます。

例えば、WP_Rewriteクラスを使ってカスタム投稿タイプやカスタムタクソノミーのパーマリンクを定義したり、URLの構造を変更したりすることができます。これにより、WordPressのURLがより意味のある形になったり、SEO対策が行われたりすることが可能になります。

WP_Rewriteクラスは、WordPressの内部で広く使用されており、URLの解析や生成、リダイレクトの処理など、パーマリンクに関連するさまざまな機能を提供しています。

リライトルールはこのWP_Rewriteによって定義され、WP_Rewriteのインスタンスである$wp_rewriteにリライトルールが登録されているため、テーマファイル内の任意のPHPテンプレートファイルに以下のコードを記述することによて、リライトルールを参照することができます。

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

上記コードは、$wp_rewrite変数に含まれる情報を出力するコードです。

出力すると以下のコードがブラウザに表示されます。

つまりこれがリライトルールです。

リライトルールは上記のように正規表現をキーにしており、変換するパラメーターの形式を値とした連想配列となっております。

キーURL の正規表現パターン(例:([0-9]{4})/?$)
変換後のパラメータの形式(例:index.php?year=$matches[1])

例:rules[“([0-9]{4})/?$”]=>”index.php?year=$matches[1]”

リライト処理をおこなうときは、URLとリライトルールの連想配列を先頭から照合していき、マッチしたルールを適用します。

リライトルールの中にマッチするルールが複数あった場合、より適切なルールが適用されます。

ちなみにリライトルールだけを出力するには以下のように記述することができます。

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

もしくはデータベースの options テーブルにrewrite_rulesというデータ名で保存されているので、get_option()関数を使って以下のように記述するとリライトルールだけを出力することができます。

<pre>
<?php
var_dump( get_option('rewrite_rules') );
?>
</pre>

「パーマリンク設定」が「基本」に設定した場合はリライトルールは作成されないため、上記のコードで出力されるデータはありません。

パーマリンクのカスタマイズ方法

それでは早速、独自のリライトルールを定義してパーマリンクのカスタマイズ方法について解説したいと思います。

カスタマイズで使用する関数の内容は以下になります。

add_rewrite_rule()WordPressのリライトルールを追加するための関数です。リライトルールは、URLの構造を変更し、WordPressが特定のURLを解析して適切なコンテンツを提供するために使用されます。
add_rewrite_tag()WordPressのリライトシステムにカスタムのクエリ変数を追加するための関数です。WordPressでは、パーマリンクにクエリ変数を含めることができますが、これにより、リクエストされたURLに基づいて特定のコンテンツを表示することができます。
add_permastruct()WordPressのパーマリンク構造(permastruct)を定義するための関数です。パーマリンク構造は、WordPressがURLを解析し、特定のリクエストを処理する方法を制御します。
add_rewrite_endpoint()WordPressのリライトエンドポイント(rewrite endpoint)を追加するための関数です。リライトエンドポイントは、WordPressのパーマリンク構造に特定のエンドポイントを追加し、それに基づいて特定のアクションやコンテンツを表示することができるようにします。

カスタマイズで使用するフックの内容は以下になります。

それぞれ解説していきます。

add_rewrite_rule()関数

add_rewrite_rule()関数は、WordPressのリライトルールを追加するための関数です。

リライトルールは、URLの構造を変更し、WordPressが特定のURLを解析して適切なコンテンツを提供するために使用されます。

add_rewrite_rule()関数を使用すると、新しいリライトルールを追加し、WordPressのリライトシステムに新しいパターンを認識させることができます。

これにより、カスタム投稿タイプやページ、カスタムタクソノミーなどのコンテンツを、独自のURL構造にマッピングすることが可能になります。

<?php
add_rewrite_rule( string $regex, string $redirect, string $after = 'bottom' )
$regexリライトルールのパターンを指定します。これは正規表現パターンで、リクエストされたURLと照合されます。
$redirectリライトされたURLが実際にどのWordPressのページにマッピングされるかを指定します。通常は、index.phpを始めとするWordPressのコアファイルへのパスが含まれます。
$afterリライトルールの優先度を指定します。'top'または'bottom'を指定します。デフォルトは'bottom'ですが、'top'を指定すると、他のルールよりも優先されます。

add_rewrite_rule()関数は、通常はinitアクションフック内で呼び出されます。これにより、WordPressが初期化された後、リライトルールが適用されます。

add_rewrite_rule()関数の使用例

WordPressのadd_rewrite_rule()関数を使用して、独自のリライトルールを追加する例です。

この例では、カスタム投稿タイプbookのシングルページを/book/{book-slug}/の形式のURLでアクセスできるようにします。

<?php
function custom_rewrite_rules() {
    add_rewrite_rule(
        '^book/([^/]+)/?$',
        'index.php?post_type=book&name=$matches[1]',
        'top'
    );
}
add_action('init', 'custom_rewrite_rules');

このコードでは、add_rewrite_rule()関数を使用して新しいリライトルールを追加しています。

^book/([^/]+)/?$はリライトルールのパターンを表します。
このパターンは、URLが/book/{book-slug}/の形式であることを指定しています。^は行の先頭を表し、book/はURLの先頭にbook/が来ることを示します。

([^/]+)は、任意の文字列をキャプチャする正規表現パターンです。/?$は、URLの末尾にオプションのスラッシュがあることを表します。

index.php?post_type=book&name=$matches[1]」は、リライトされたURLがどのWordPressのページにマッピングされるかを指定します。
index.phpはWordPressのインデックスファイルを示し、post_type=bookはカスタム投稿タイプがbookであることを示します。
name=$matches[1]は、正規表現パターンでキャプチャされた文字列を含む投稿のスラッグを示します。

top」は、リライトルールの優先度を指定します。'top'を指定すると、このルールが最上位に配置されます。

add_rewrite_tag()関数

add_rewrite_tag()関数は、独自のリライトタグ(構造タグ)を追加するための機能です。

これにより、WordPressのリライトルールに独自のタグを追加し、特定のパラメータを識別できるようになります。

通常、この関数はinitアクションフック内で使用されます。追加された独自のリライトタグは、WP_Rewriteクラスのrewritecode、rewritereplace、queryreplaceプロパティに追加されます。

そして、指定したリライトタグ名はパブリッククエリ変数として登録されます。

簡単に言えば、add_rewrite_tag()関数を使うとWordPressのリライト機能に独自のタグを追加でき、それを使って特定のパラメータを操作できるようになります。

<?php
add_rewrite_tag( string $tag, string $regex, string $query_param = '' )
$tag%で囲まれたリライトタグの名前を指定します。たとえば、%author_id%のように指定します。このリライトタグは後でリライトルールで使用されます。
$regexリライトルールでリライトタグ($tag)を置き換える正規表現を指定します。この正規表現は、URLから抽出した値に基づいてリライトタグを置換します。
$query_param置換した正規表現に指定するパラメータ文字列を指定します。最後は “=” で終わる必要があります。たとえば、’post_type=’のように指定します。このパラメータを指定しない場合、デフォルトで”$tag=”(’リライトタグ名=’)になります。

$tagパラメータにすでに存在するリライトタグ名を指定すると、そのリライトタグの$rewritereplace$queryreplaceの値が上書きされます。これにより、既存のリライトタグの動作を変更することができます。

以下はすでに登録されているリライトタグを確認することができるコードになります。

<pre>
  <p>リライトタグ(構造タグ)/rewritecode</p>
  <?php
    // $wp_rewrite グローバルオブジェクトから rewritecode プロパティを取得し、出力します
    var_dump( $wp_rewrite->rewritecode );
  ?>
  <p>リライトタグを置き換える正規表現/rewritereplace</p>
  <?php
    // $wp_rewrite グローバルオブジェクトから rewritereplace プロパティを取得し、出力します
    var_dump( $wp_rewrite->rewritereplace );
  ?>
  <p>置換後に追加するクエリパラメータ/queryreplace</p>
  <?php
    // $wp_rewrite グローバルオブジェクトから queryreplace プロパティを取得し、出力します
    var_dump( $wp_rewrite->queryreplace );
  ?>
</pre>

上記コードは、WordPressのリライトシステムに関する情報を出力します。

WordPressの$wp_rewriteグローバルオブジェクトのプロパティである rewritecoderewritereplacequeryreplaceを出力し、それぞれのリライトタグ(構造タグ)の情報や置換パラメータについて確認できます。

もし現状のリライトリライトタグ(構造タグ)の設定内容を確認したい場合は、こちらのコードが便利ですのでご活用ください。

add_ rewrite_tag()関数は基本的に、 add_rewrite_rule()関数やadd_permastruct()関数と組み合わせて実装するパターンが多いです。

例えば、以下のコードをご覧ください。

<?php
/**
 * カスタムのリライトタグを追加する関数
 */
function custom_rewrite_tag() {
  // '%film_title%' というリライトタグを追加し、それに対応する正規表現を指定します
  // この例では、'([^&]+)' という正規表現を使用しています。これは '&' 以外の文字列にマッチします
  add_rewrite_tag('%film_title%', '([^&]+)');
}
// init アクションフックで custom_rewrite_tag() 関数を呼び出します
add_action('init', 'custom_rewrite_tag', 10, 0);  

上記コードの例は、シンプルに ‘%film_title%’ というリライトタグを追加(登録)するものです。

この例では、「%film_title%」は正規表現として([^&]+)にマッチします。この正規表現は、「&」以外の文字列にマッチするものです。

また、第3パラメータを省略しているため、リライトルールで置き換える際のデフォルトのパラメータが 「film_title=」になります。これは、リライトタグが見つかった場合に、そのタグを置き換える際に使用されるパラメータです。

このように、「%film_title%」を使用すると、リライトルールでパラメータfilm_title=を操作できるようになります。

リライトタグを追加すると、それに対応するパブリッククエリ変数が自動的に登録されます。

add_rewrite_tag()関数の使用例

リライトタグ(構造タグ)を追加すると、それに対応するパブリッククエリ変数が自動的に登録されます。

そのため、リクエストにそのパラメータが含まれていれば、$wp_query->query_varsからその値を取得することができます。

<?php
global $wp_query;
$film_title = $wp_query->query_vars['film_title'];
echo $film_title;
?>

また、get_query_var()関数でも値を取得できます。コードは以下になります。

<?php
// クエリ変数から値を取得するための処理
$film_title = get_query_var('film_title');

// 取得した値を出力する
echo $film_title;

上記コードでは、get_query_var()関数を使用してクエリ変数「film_title」の値を取得し、その値を出力しています。例えば、URLが「http://sample.com/?film_title=WordprssMagazine」の場合、「WordprssMagazine」 が出力されます。

このように、リライトタグを追加すると、そのタグに対応するパブリッククエリ変数が利用可能になり、URLからその値を取得して利用することができます。

add_permastruct()関数

add_permastruct()関数は、WordPressのパーマリンク構造(permastruct)を新規に追加するための関数です。

この関数で追加したパーマリンク構造は、WP_ Rewrite::$extra_permastructsプロパティ(配列)に追加されます。

<?php
add_permastruct( string $name, string $struct, array $args = array() )
$nameパーマリンク構造の名前。第2パラメータで指定するパーマリンク構造を識別する任意の文字列。
$structパーマリンク構造。構造タグ(リライトタグ)や静的な値(文字列)を並べて作る URL 構造を指定。
$argsパーマリンク構造から、リライトルールを生成するときのオプションの連想配列(表)。

上記表の$argsに設定するオプションの内容は以下になります。

設定可能な値(キー)内容初期値(型)
with_frontWP_Rewrite クラスの $front(WP_Rewrite::$front パーマリンク構造の静的な部分)を前に付加するかどうかtrue
ep_mask追加するエンドポイントマスク(どのページにエンドポイントを追加するか)を整数値(EP_* 定数  )で指定EP_NONE
pagedアーカイブページでページ番号をサポートする構造(/page/2 など)をルールに追加するかどうか。true
feedフィードのリライトルールを構造に追加するかどうか(/feed/rss など)。false
forcommentsコメントフィードのフィードのルールをクエリとするかかどうか。
walk_dirsURL 構造で指定した全てのディレクトリに対するリライトルールを生成するかどうか。true
endpoints生成されたリライトルールにエンドポイントを適用するかどうかtrue

add_permastruct()関数は基本的に、 add_rewrite_rule()関数やadd_rewrite_tag()関数と組み合わせて実装するパターンが多いです。

add_permastruct()関数の使用例

例えば、カスタム投稿タイプ「custom_post_type」の記事ページのURLは通常「https://sample.com/custom_post_type/sample-post-1/」のように投稿のスラッグ「sample-post-1」がURLになりますが、これを「投稿ID」に変更してアクセスできるように実装する方法を解説したいと思います。

コードの内容としては以下になります。

<?php
function my_custom_post_type_rewrite() {
  add_rewrite_tag('%custom_post_type_id%', '([0-9]+)','post_type=custom_post_type&p=');
  add_permastruct('customposttypeid', '/custom_post_type/%custom_post_type_id%', array( 'with_front'=>false ));
}
add_action('init', 'my_custom_post_type_rewrite');

上記コードは、まずadd_rewrite_tag()関数でリライトタグ「%custom_post_type_id%」を登録し、「%custom_post_type_id%」は ([0-9]+) という正規表現にマッチしたら「post_type=custom_post_type&p=」に置き換えられるようにしています。

そして add_permastruct()関数で「/custom_post_type/%custom_post_type_id%」というURLの構造を登録しています。

このように実装することで、カスタム投稿タイプ「custom_post_type」の記事ページのURLにアクセスしたときに「/custom_post_type/([0-9]+)」という正規表現にマッチすれば、「index.php?post_type=custom_post_type&p=$matches[1]」に置き換えることができます。

また、add_rewrite_rule()関数を利用することでも同じ実装が可能です。

<?php
function my_rewrite_custom_post_type() {
  add_rewrite_rule(
    '^rental/([0-9]+)/?',  //正規表現パターン
    'index.php?post_type=custom_post_type&p=$matches[1]',   //変換するパラメータ(クエリ変数)の形式
    'top'  //リライトルールの先頭に追加
  );
}
add_action('init', 'my_rewrite_custom_post_type');

それぞれの実装コードをfunctions.phpにコピー&ペーストしてご自身のサイトに適した形でカスタマイズしていただけましたら、保存してWordPress管理画面左メニュー「設定」→「パーマリンク」→「変更を保存」をクリックしていただきリライトルールのデータベースを更新してリセットしてください。

これで実装内容が反映されます。

また、$extra_permastructsプロパティの内容は以下で確認することができます。

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

add_rewrite_endpoint()関数

add_rewrite_endpoint()関数は、WordPressのエンドポイント(rewrite endpoint)を追加するための関数です。

エンドポイントとは、ページURLの末尾にエンドポイント名(文字列)を追加でき、そのエンドポイント名のスラッシュ以降の文字列を値として取得できる仕組みのことをいいます。

エンドポイントを追加することで、エンドポイントマスク(EP_ROOTなど)で指定されたページに対応するリライトルールが生成されます。

またデフォルトで、追加されたエンドポイントと同じ名前のクエリ変数が登録され、add_rewrite_endpoint()関数の第3パラメータでfalseを指定するとこで、エンドポイントをquery_varに登録しないといった制御が可能です。

例えば、以下のように「/sample-endpoint/sample_element/」は「?sample-endpoint=sample_element」になります。

以下のURLは
https://sample.com/sample-endpoint/sample_element/

以下のように「sample_endpoint」がエンドポイント名として機能します。
https://sample.com/?sample-endpoint=sample_element

add_rewrite_endpoint()関数の内容は以下になります。

<?php
add_rewrite_endpoint( string $name, int $places, string|bool $query_var = true )
$nameエンドポイントの名前
$placesエンドポイントマスク。どのページにエンドポイントを追加するのかを整数値(EP_* 定数)で指定
$query_var対応するクエリ変数の名前。false を指定するとこのエンドポイントを query_var に登録しません。何も指定しない場合(デフォルト)は $name の値。

エンドポイントマスク / EP_* 定数の内容は以下になります。

定数内容整数
EP_NONEなし(デフォルト)0
EP_PERMALINK投稿のパーマリンク1
EP_ATTACHMENT添付ファイルページ2
EP_DATEdate アーカイブ4
EP_YEARyear(年別)アーカイブ8
EP_MONTHmonth(月別)アーカイブ16
EP_DAYday(日別)アーカイブ32
EP_ROOTルート(トップ)ページ64
EP_COMMENTSコメントページ128
EP_SEARCH検索結果ページ256
EP_CATEGORIESカテゴリーアーカイブページ512
EP_TAGSタグアーカイブページ1024
EP_AUTHORS投稿者アーカイブページ2048
EP_PAGES固定ページ4096
EP_ALL_ARCHIVES全てのアーカイブページ(EP_DATE | EP_YEAR | EP_MONTH | EP_DAY | EP_CATEGORIES | EP_TAGS | EP_AUTHORS と同じ意味)
EP_ALL全て(EP_PERMALINK | EP_ATTACHMENT | EP_ROOT | EP_COMMENTS | EP_SEARCH | EP_PAGES | EP_ALL_ARCHIVES と同じ意味)

add_rewrite_endpoint()関数の使用例

add_rewrite_endpoint()関数を使うと、独自のURLを簡単に追加することができます。

例えば以下のコードをfunctions.phpにコピー&ペーストして保存していただき、管理画面左メニュー「設定」→「パーマリンク」→「変更を保存」ボタンをクリックしていただければリライトルールのデータベースの更新されて実装内容が反映されます。

<?php
add_rewrite_endpoint( 'sample-endpoint', EP_ROOT );

第2引数にあるEP_ROOTはトップページににエンドポイントを追加するエンドポイントマスクになります。

上記実装前では、「https://sample.com/sample-endpoint/」にアクセスしたときに404エラーページになりますが、実装後は404エラーページにならずにステータスコード200(OK)が返却されてトップページが表示されます。

また、次に以下のコードをご確認ください。

<?php
add_rewrite_endpoint( 'sample-endpoint', EP_PERMALINK | EP_PAGES );

上記のコードを実装することにより、「sample-endpoint(/(.*))?/?$」という新しいリライトルールをEP_PERMALINK(投稿のパーマリンク)とEP_PAGES(固定ページ)に追加することができます。

これによりエンドポイント名「sample-endpoint」はクエリ変数に登録されて、以下のように「/sample-endpoint/sample_element/」でアクセスすると「?sample-endpoint=sample_element」となります。

以下のURLは
https://sample.com/page1/sample-endpoint/sample_element/

以下のように「sample_endpoint」がエンドポイント名として機能します。
https://sample.com/page1/?sample-endpoint=sample_element

上記の内容は、固定ページのスラッグ名「page1」で「sample-endpoint」というエンドポイントを追加してアクセスした例になります。

また、エンドポイント名「sample-endpoint」のスラッシュ以降の文字列の値は取得してページに表示することが可能です。

add_rewrite_endpoint()関数で追加したエンドポイントの値を取得して表示する例

以下のコードのように、template_redirectフックを使って取得した値を出力することができます。functions.phpにコピー&ペーストしてください。

<?php
function my_sample_endpoint_template_redirect() {
  $sample_endpoint = get_query_var('sample-endpoint');
  if(!empty($sample_endpoint)) {
    echo 'パラメータの値: ' .$sample_endpoint;
    exit;  // WordPress の処理を中止
  }
}
add_action('template_redirect', 'my_sample_endpoint_template_redirect');

実装コードをfunctions.phpにコピー&ペーストしてご自身のサイトに適した形でカスタマイズしていただけましたら、保存してWordPress管理画面左メニュー「設定」→「パーマリンク」→「変更を保存」をクリックしていただきリライトルールのデータベースを更新してリセットしてください。

これで実装内容が反映されます。

投稿ページや固定ページのURLの末尾に「/sample-endpoint/sample_element/」を追加してアクセスすると、「パラメータの値: sample_element」といった表示が可能となります。

リライトルールをカスタマイズするためのフック

リライトルールのカスタマイズと、それに合わせてパーマリンクのカスタマイズをするためのフックについて解説していきたいと思います。

以下はWordPressのリライトルールをカスタマイズするためのフックは以下になります。

rewrite_rules_arrayリライトルールの配列全体が生成された後に適用されるフックです。
author_rewrite_rules投稿者(ユーザー)に関連するURLのリライトルールが生成された後に適用されるフックです。
category_rewrite_rulesカテゴリーに関連するURLのリライトルールが生成された後に適用されるフックです。
comments_rewrite_rulesコメントに関連するURLのリライトルールが生成された後に適用されるフックです。
date_rewrite_rules日付に関連するURLのリライトルールが生成された後に適用されるフックです。
page_rewrite_rules固定ページに関連するURLのリライトルールが生成された後に適用されるフックです。
post_rewrite_rules投稿に関連するURLのリライトルールが生成された後に適用されるフックです。
root_rewrite_rulesルートレベルのURLのリライトルールが生成された後に適用されるフックです。
search_rewrite_rules検索に関連するURLのリライトルールが生成された後に適用されるフックです。
{$permastructname}_rewrite_rules特定のパーマリンク構造(カテゴリーやタグなど)に関連するURLのリライトルールが生成された後に適用されるフックです。$permastructは、categoryやtag、またはカスタム投稿タイプ名やカスタムタクソノミー名など、特定のパーマリンク構造を指定します。

以下は作成したページのパーマリンクをカスタマイズするためのフックは以下になります。

pre_post_link投稿のパーマリンク(URL)の出力をカスタマイズできるフックです。
post_link投稿のパーマリンク(URL)の出力をカスタマイズできるフックです。
post_type_linkカスタム投稿タイプのパーマリンク(URL)の出力をカスタマイズできるフックです。
category_linkカテゴリーのパーマリンク(URL)の出力をカスタマイズできるフックです。
tag_linkタグのパーマリンク(URL)の出力をカスタマイズできるフックです。
term_linkカスタムタクソノミーのパーマリンク(URL)の出力をカスタマイズできるフックです。

上記がリライトルールとパーマリンクをカスタマイズするためのフックになります。

これらフックを使ってカスタマイズすることで、例えば投稿者ページや固定ページなどのいずれか特定のページの時のみリライトルールをカスタマイズするといったことが可能となります。

次からはこれらフックを使ったカスタマイズ例を解説いたします。

投稿者アーカイブページを生成させない実装方法

まず最初の実装例は、投稿者アーカイブページである「https://sample.com/?author=1」のページへアクセスできないようにする実装を解説いたしますた。
(ここではパーマリンク設定をデフォルトの「基本」以外に設定している(Pretty パーマリンクを使用している)場合を前提とします)

WordPressでは、管理画面にログインできる管理者権限や購入者権限をもつユーザー情報のアーカイブページ(該当のテーマのテンプレートファイルはauthor.php)として「/?author=1」のパラメータをつけたURLでアクセスすることができます。

このとき問題となるのが、「https://sample.com/author/【ユーザー名】/」といった具合に、簡単にユーザー名がバレてしまい見方によればセキュリティ上望ましくないといえるでしょう。

これを解説する手段として、ユーザーのリライトルールをカスタマイズするauthor_rewrite_rulesフックの出番です。

以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
add_filter( 'author_rewrite_rules', '__return_empty_array' );

__return_empty_array()関数をauthor_rewrite_rulesフックに設定することによって、空の配列を返してリライトルールを削除しています。

削除することで404ページを返してくれるようになります。

上記コードをペーストして保存したら、「パーマリンク設定」で変更を加えず「変更を保存」をクリックしてください。これでリライトルールがリセットされて設定した内容が反映されて正常に機能します。

これで、投稿者アーカイブページが生成されず、投稿者アーカイブURLにアクセスしたときに404エラーページが表示するようになりました。

実際に投稿者アーカイブのURLにアクセスして確認してみてください。

これで終わり!…といいたいところですが、まだすべき実装があります。

それはtemplate_redirectフックを使ってのリダイレクトの実装です。
次にご説明いたします。

投稿者アーカイブページをリダイレクトする実装

author_rewrite_rulesフックでの実装によって投稿者アーカイブを生成させなくしたら、次はトップページへリダイレクトさせるように実装します。

この処理がなぜ必要なのかというと、author_rewrite_rulesフックでの実装のみだと「https://sample.com/?author=1」にアクセスしたときに「https://sample.com/author/【ユーザー名】/」のようにURLが変換してしまい、その状態で404ページが表示されてしまうからです。

これだと、最初に話したユーザー名がわかってしまうためによるセキュリティ的によろしくない状態のままとなってしまいます。

なので、リダイレクトする実装をしていきましょう。

以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
// テンプレートリダイレクトアクションに関数をフック
add_action( 'template_redirect', 'custom_archives_redirect', 1);

// アーカイブページをリダイレクトするための関数
function custom_archives_redirect() {
    // もし現在のページが投稿者アーカイブであれば
    if ( is_author()) {
        // ホームページへ安全にリダイレクト
        wp_safe_redirect( home_url() );
        // リダイレクト後、スクリプトの実行を終了
        exit;
    }
}

上記コードは、template_redirectフックに独自に定義したcustom_archives_redirect()関数を設定して、投稿者アーカイブページにアクセスした場合にwp_safe_redirect()関数でトップページへリダイレクトする実装コードになります。

これにより、404ページ表示時にユーザー名が見ることができてしまっていた「https://sample.com/author/【ユーザー名】/」に変換されることなくトップページにアクセスが切り替わってセキュリティ的に強くなります。

ちなみに現時点ではwp_safe_redirect()関数でのリダイレクトは302リダイレクトとなっており、意味合い的には一時的なリダイレクトとなっております。

これを301リダイレクトに修正したい場合は以下のように変更してください。

<?php
wp_safe_redirect( home_url(), 301 );

wp_safe_redirect()関数の第2引数に「301」のステータスコードを設定すると301ダイレクトとして処理してくれます。

カスタム投稿タイプの記事ページのみパーマリンクを変更する方法

次はカスタム投稿タイプの記事ページのみパーマリンクを変更する方法を解説したいと思います。
(ここではパーマリンク設定をデフォルトの「基本」以外に設定している(Pretty パーマリンクを使用している)場合を前提とします)

ここでは、カスタム投稿タイプ「custom_blog」の記事ページのURL「https://sample.com/custom_blog/投稿名/」を「https://sample.com/custom_blog/custom_post/投稿名/」といった具合にURLに「/custom_post/」を追加した形で投稿ページのURLをカスタマイズしたいと思います。

以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
function custom_blog_custom_post_rewrite_rule( $rules ) {
    $new_rules = array();
    $permastructname = 'custom_blog'; // カスタム投稿タイプの名前

    // カスタム投稿タイプが custom_blog の場合、パーマリンク構造を変更する
    if ( isset( $rules[ $permastructname . '_rewrite_rules' ] ) ) {
        foreach ( $rules[ $permastructname . '_rewrite_rules' ] as $regex => $rewrite ) {
            // パーマリンクに /custom_post/ を追加する
            $new_rules[ $regex ] = str_replace( "/$permastructname/", "/$permastructname/custom_post/", $rewrite );
        }
    }

    return $new_rules;
}
add_filter( 'custom_blog_rewrite_rules', 'custom_blog_custom_post_rewrite_rule' );

上記コードは、{$permastructname}_rewrite_rulesフックを使用して、カスタム投稿タイプ「custom_blog」のパーマリンク構造を変更するコードの例を示します。

この実装により、カスタム投稿タイプ「custom_blog」の記事ページのみURLに「/custom_post/」を追加してパーマリンクを変更することができます。

通常URLが「https://sample.com/custom_blog/投稿名/」になるところを、「https://sample.com/custom_blog/custom_post/投稿名/」でアクセスできるようにした実装コードになります。

上記コードをペーストして保存したら、「パーマリンク設定」で変更を加えず「変更を保存」をクリックしてください。これでリライトルールがリセットされて設定した内容が反映されて正常に機能します。

これで実装完了…と思いきや、まだやるべき実装があります。
それはパーマリンクのカスタマイズです。

カスタム投稿タイプの出力されるパーマリンクをカスタマイズする実装方法

パーマリンクの形式をカスタマイズできたら、次はカスタム投稿タイプの出力されるパーマリンクをカスタマイズする実装方法について解説していきたいと思います。

なぜここでの実装が必要なのかというと、今のままだとアーカイブページやサイドバーなどで表示される記事一覧やメニューで出力されるリンクがカスタマイズの内容が反映されておらず、「https://sample.com/custom_blog/投稿名/」でリンクが出力されてしまうからです。

そのため、出力されるパーマリンクについてもURLをカスタマイズしていきましょう。

以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
function custom_blog_permalink_structure( $post_link, $post ) {
    if ( 'custom_blog' === $post->post_type ) {
        // カスタム投稿タイプが custom_blog の場合、パーマリンクに /custom_post/ を追加する
        $post_link = str_replace( '/custom_blog/', '/custom_blog/custom_post/', $post_link );
    }
    return $post_link;
}
add_filter( 'post_type_link', 'custom_blog_permalink_structure', 10, 2 );

上記コードは、post_type_linkフィルターを使用して、カスタム投稿タイプがcustom_blogの場合に投稿ページのパーマリンクを変更します。

独自に定義したcustom_blog_permalink_structure()関数では、投稿ページのURLを構築する際に、既存の「/custom_blog//custom_blog/custom_post/」に置換しています。

このコードをテーマのfunctions.phpファイルに追加すると、カスタム投稿タイプcustom_blogの投稿ページのURLに/custom_post/が追加されます。

上記コードをペーストして保存したら、「パーマリンク設定」で変更を加えず「変更を保存」をクリックしてください。これでリライトルールがリセットされて設定した内容が反映されて正常に機能します。

rewrite_rules_arrayフック

rewrite_rules_array フィルターは、生成されたすべてのリライトルールの配列をフィルタリングします。これにより、リライトルールを追加、削除、またはカスタマイズすることができます。

このフィルターは、WP_Rewrite::rewrite_rules() の最後に適用されます。

他のリライトルールを操作する場合と同様に(リライトルールはデータベースに保存されているため)、変更を保存するためには、管理画面左メニュー「設定」→「パーマリンク設定」で変更せずに「変更を保存」をクリックする必要があります。

<?php
// リライトルールの配列をカスタマイズするフィルター関数
function custom_rewrite_rules_filter( $rules ) {
  // $rules をカスタマイズする処理を追加

  // カスタマイズ後の $rules を返す
  return $rules;
}
// rewrite_rules_array フィルターにフックして、カスタムフィルター関数を適用
add_filter('rewrite_rules_array', 'custom_rewrite_rules_filter');
$rules既存のリライトルールの配列

上記コードは、独自のcustom_rewrite_rules_filter()関数を作成してrewrite_rules_arrayフックに追加しています。

独自のcustom_rewrite_rules_filter()関数の中で、引数にある$rulesを加工したりするカスタマイズ処理を行い、最終的にカスタマイズされた $rules を返します。これにより、リライトルールの配列が変更されます。

rewrite_rules_arrayフックでリライトルールを追加する方法

次は、rewrite_rules_arrayフックを使って [‘^custom_rule/([0-9]+)/?’] = ‘index.php?p=$matches[1]’ と言うリライトルールを追加する実装を例に解説していきたいと思います。

以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
// カスタムルール用のリライトルールを追加する関数
function add_my_custom_rule_rewrite_rules( $rules ) {
  // 新しいリライトルールを格納する配列を初期化
  $new_rules = array();

  // 新しいリライトルールを作成して配列に追加
  $new_rules['^custom_rule/([0-9]+)/?'] = 'index.php?p=$matches[1]';

  // 既存のリライトルールと新しいルールをマージして返す
  return $new_rules + $rules;
  // または return array_merge( $new_rules, $rules );
}

// rewrite_rules_array フィルターにフックして、カスタムルール用のリライトルールを追加する関数を適用
add_filter( 'rewrite_rules_array', 'add_my_custom_rule_rewrite_rules' );

上記コードは、新しいリライトルールを追加する独自に定義した関数add_my_custom_rule_rewrite_rules()関数を定義し、それをrewrite_rules_arrayフィルターにフックしています。

関数内では、新しいリライトルールを作成し、それを既存のルールとマージして返しています。

PHP の配列演算子 + は、左側の配列に右側の配列を追加し、同じキーが存在する場合は上書きしません。新しいルールを既存のリライトルールの先頭に配置するには、追加したルールを左側に記述します。

一方、PHPのarray_merge()関数も、前の配列の後ろに配列を追加したものを返しますが、同じキーが存在する場合は上書きします。

また、以下のコードはカスタム投稿タイプ「custom_post_type」の全てのfeed用のURLをリライトルールから削除するコードになります。

<?php
// 'custom_post_type' から始まり 'feed' を含むリライトルールを削除する関数
function remove_custom_post_type_feed_rewrites($rules){
  // ルールの配列をループして、条件に一致するルールを削除
  foreach ($rules as $rule => $rewrite) {
    if ( preg_match('/^custom_post_type.*(feed)/', $rule) ) {
      unset($rules[$rule]); // 条件に一致するルールを削除
    }
  }
  return $rules; // 変更後のルールの配列を返す
}

// rewrite_rules_array フィルターにフックして、リライトルールを削除する関数を適用
add_filter('rewrite_rules_array', 'remove_custom_post_type_feed_rewrites');

このコードは、独自にremove_custom_post_type_feed_rewrites()関数を定義し、それを rewrite_rules_arrayフィルターにフックしています。

関数内では、foreachループを使用してルールの配列を順番に処理し、preg_match()関数を使用して条件に一致するルールを見つけ、unset()関数を使ってそのルールを削除しています。最後に、変更後のルールの配列を返しています。

pre_post_linkフック

pre_post_linkフックは、get_permalink() に設置されるパーマリンク設定をカスタマイズするためのフックです。

投稿タイプ「投稿」(post_type=post)に対して適用され、 post_linkフックよりも前の段階で適用され、より早いタイミングで処理されます。

<?php
// pre_post_link フィルターを使用して、投稿のパーマリンクをカスタマイズする関数
function custom_permalink_filter( $permalink, $post, $leavename ) {
    // $permalink をカスタマイズする処理を追加

    // カスタマイズ後の $permalink を返す
    return $permalink;
}

// pre_post_link フィルターにフックして、カスタムフィルター関数を適用
add_filter( 'pre_post_link', 'custom_permalink_filter', 10, 3 );

上記コードのpre_post_linkフックにフックしたcustom_permalink_filter()関数は以下の3つの引数を受け取ります。

$permalinkパーマリンク構造
$post現在の投稿オブジェクト(オブジェクト WP_Post)
$leavename構造的な投稿名(%postname%)を残すかどうかのフラグ

最後にreturn文でカスタマイズ後のパーマリンクを返します。このように実装することで、投稿タイプ「投稿」の記事ページのパーマリンクをカスタマイズした上で生成することができます。

もっと詳しく確認したい方は上記公式ドキュメントをご確認ください。

post_linkフック

post_linkフックは、get_permalink() に設置されるパーマリンク設定をカスタマイズするためのフックです。

投稿タイプ「投稿」(post_type=post)に対して適用され、 pre_post_linkフックより後のタイミングで処理されます。

<?php
// post_link フィルターを使用して、投稿のパーマリンクをカスタマイズする関数
function custom_permalink_filter( $permalink, $post, $leavename ) {
    // $permalink をカスタマイズする処理を追加

    // カスタマイズ後の $permalink を返す
    return $permalink;
}

// post_link フィルターにフックして、カスタムフィルター関数を適用
add_filter( 'post_link', 'custom_permalink_filter', 10, 3 );
$permalinkパーマリンクリンク(URL)
$post現在の投稿オブジェクト(オブジェクト WP_Post)
$leavename構造的な投稿名(%postname%)を残すかどうかのフラグ

最後にreturn文でカスタマイズ後のパーマリンクを返します。このように実装することで、投稿タイプ「投稿」の記事ページのパーマリンクをカスタマイズした上で生成することができます。

もっと詳しく確認したい方は上記公式ドキュメントをご確認ください。

post_type_linkフック

post_linkフックは、get_post_permalink() に設置されるパーマリンク設定をカスタマイズするためのフックです。

カスタム投稿タイプ(post_type=【カスタム投稿タイプ名】)に対して適用され、投稿(post_type=post)には適用されません。

<?php
// post_type_link フィルターを使用して、投稿タイプのパーマリンクをカスタマイズする関数
function custom_post_type_permalink_filter( $url, $post, $leavename, $sample ) {
    // $url をカスタマイズする処理を追加

    // カスタマイズ後の $url を返す
    return $url;
}

// post_type_link フィルターにフックして、カスタムフィルター関数を適用
add_filter( 'post_type_link', 'custom_post_type_permalink_filter', 10, 4 );
$url投稿のパーマリンク(URL)
$post現在の投稿オブジェクト(オブジェクト WP_Post)
$leavename構造的な投稿名(%postname%)を残すかどうかのフラグ
$sampleサンプルパーマリンクかどうかのフラグ

最後にreturn文でカスタマイズ後のパーマリンクを返します。このように実装することで、カスタム投稿タイプの記事ページのパーマリンクをカスタマイズした上で生成することができます。

もっと詳しく確認したい方は上記公式ドキュメントをご確認ください。

category_linkフック

category_linkフックは、get_category_link() に設置されるカテゴリーのパーマリンク設定をカスタマイズするためのフックです。

category_linkフックを使用することで、カテゴリーのパーマリンクが生成される前に、その挙動や出力をカスタマイズすることができます。

以下はカテゴリーのパーマリンクに「/blog/」を追加する実装例のコードです。

<?php
// カスタムカテゴリーページのパーマリンクを設定するフィルター関数
function custom_category_permalink($category_link, $category_id) {
    // カテゴリースラッグを取得し、'/blog/category/' を追加してパーマリンクをカスタマイズ
    $category_slug = get_category($category_id)->slug;
    $custom_permalink = home_url('/blog/category/' . $category_slug);
    
    // カスタマイズされたパーマリンクを返す
    return $custom_permalink;
}

// category_link フックにフィルター関数を追加
add_filter('category_link', 'custom_category_permalink', 10, 2);
$category_linkカテゴリのパーマリンク(URL)
$category_idカテゴリーID

最後にreturn文でカスタマイズ後のパーマリンクを返します。このように実装することで、カテゴリーのパーマリンクをカスタマイズした上で生成することができます。

もっと詳しく確認したい方は上記公式ドキュメントをご確認ください。

tag_linkフック

tag_linkフックは、get_tag_link() に設置されるタグのパーマリンク設定をカスタマイズするためのフックです。

tag_linkフックを使用することで、タグのパーマリンクが生成される前に、その挙動や出力をカスタマイズすることができます。

以下はタグのパーマリンクに「/blog/」を追加する実装例のコードです。

<?php
// カスタムタグページのパーマリンクを設定するフィルター関数
function custom_tag_permalink($tag_link, $tag_id) {
    // タグスラッグを取得し、'/blog/tag/' を追加してパーマリンクをカスタマイズ
    $tag_slug = get_tag($tag_id)->slug;
    $custom_permalink = home_url('/blog/tag/' . $tag_slug);
    
    // カスタマイズされたパーマリンクを返す
    return $custom_permalink;
}

// tag_link フックにフィルター関数を追加
add_filter('tag_link', 'custom_tag_permalink', 10, 2);
$tag_linkタグのパーマリンク(URL)
$tag_idタグID

最後にreturn文でカスタマイズ後のパーマリンクを返します。このように実装することで、タグのパーマリンクをカスタマイズした上で生成することができます。

もっと詳しく確認したい方は上記公式ドキュメントをご確認ください。

term_linkフック

term_linkフックは、get_term_link() に設置されるターム(タグ、カテゴリー、カスタムターム)のパーマリンク設定をカスタマイズするためのフックです。

tag_linkフックを使用することで、タームのパーマリンクが生成される前に、その挙動や出力をカスタマイズすることができます。

以下はカスタムタクソノミー「custom_taxonomy」のパーマリンクに「/blog/」を追加する実装例のコードです。

<?php
// term_link フックを使用して、カスタムタクソノミーのパーマリンクに '/blog/' を追加する関数
function custom_taxonomy_permalink($termlink, $term, $taxonomy) {
    // カスタムタクソノミーが "custom_taxonomy" の場合のみ処理を行う
    if ($taxonomy === 'custom_taxonomy') {
        // '/blog/' を追加してパーマリンクをカスタマイズ
        $custom_termlink = home_url('/blog/' . $term->slug);
        return $custom_termlink;
    }

    // カスタムタクソノミー以外の場合は元のパーマリンクを返す
    return $termlink;
}

// term_link フックにフィルター関数を追加
add_filter('term_link', 'custom_taxonomy_permalink', 10, 3);
$termlinkタームのパーマリンク(URL)
$term現在のタームオブジェクト
$taxonomyタームが属するタクソノミーのスラッグ

最後にreturn文でカスタマイズ後のパーマリンクを返します。このように実装することで、タームのパーマリンクをカスタマイズした上で生成することができます。

もっと詳しく確認したい方は上記公式ドキュメントをご確認ください。

実際に使えるカスタマイズ例

最後に、実際に筆者がお仕事で実装したかなり実用的なサンプルコードを解説したいと思います。

実際に仕事でおこなった実装内容なので、以下のコードをご参考にしていただき、ご自身のサイトに適したコードに修正していただけますと幸いです。

ここでのサンプルコードでは以下の実装をおこなっております。

  • カスタムタクソノミーの「media-tag」のURLに「/blog/」を付与したリライトルール追加
  • カスタムタクソノミーの「media-tag」のページネーションによる2ページ目以降のURLに「/blog/」を付与したリライトルール追加
  • WordPress標準機能であるカテゴリーとタグのURLに「/blog/」を付与したリライトルール追加
  • WordPress標準機能であるカテゴリーとタグのページネーションによる2ページ目以降のURLに「/blog/」を付与したリライトルール追加
  • WordPress標準機能であるカテゴリーとタグのパーマリンク(URL)に「/blog/」を追加
  • WordPress標準機能であるカテゴリーとタグのURLで「/blog/」なしのパーマリンク(URL)の場合は「/blog/」ありのパーマリンクに301リダイレクト

以下のコードをお使いいただく場合、functions.phpにてコピー&ペーストしてカスタマイズしてください。

/*
WordPress標準のカテゴリーとタグのURLに「/blog/」を追加する対応の全て
*/
// リライトルールをカスタマイズ
function custom_rewrite_rules() {
	// 「media-tag」カスタムタクソノミー
	add_rewrite_rule(
		'^blog/media-tag/([^/]+)/?$',
		'index.php?media-tag=$matches[1]',
		'top'
	);
	// 「media-tag」カスタムタクソノミー 2ページ目以降
	add_rewrite_rule(
		'^blog/media-tag/([^/]+)/page/?([0-9]{1,})/?$',
		'index.php?media-tag=$matches[1]&paged=$matches[2]',
		'top'
	);

	// カテゴリー
	add_rewrite_rule(
        '^blog/category/([^/]+)/?$',
        'index.php?category_name=$matches[1]',
        'top'
    );
	// カテゴリー 2ページ目以降
	add_rewrite_rule(
        '^blog/category/([^/]+)/page/?([0-9]{1,})/?$',
        'index.php?category_name=$matches[1]&paged=$matches[2]',
        'top'
    );

	// タグ
	add_rewrite_rule(
		'^blog/tag/([^/]+)/?$',
		'index.php?tag=$matches[1]',
		'top'
	);
	// タグ 2ページ目以降
	add_rewrite_rule(
		'^blog/tag/([^/]+)/page/?([0-9]{1,})/?$',
		'index.php?tag=$matches[1]&paged=$matches[2]',
		'top'
	);
}
add_action('init', 'custom_rewrite_rules');

function custom_category_link($category_link, $category_id) {
    // カテゴリーのパーマリンクに/blog/を追加
    return home_url('/blog/category/' . sanitize_term_field('slug', get_category($category_id)->slug, $category_id, 'category', 'display'));
}
add_filter('category_link', 'custom_category_link', 10, 2);

function custom_tag_link($tag_link, $tag_id) {
    // タグのパーマリンクに/blog/を追加
    return home_url('/blog/tag/' . sanitize_term_field('slug', get_tag($tag_id)->slug, $tag_id, 'post_tag', 'display'));
}
add_filter('tag_link', 'custom_tag_link', 10, 2);

function custom_category_tag_redirect() {
    // リクエストされたURLが/blog/なしでカテゴリーページであるか確認
    if (is_category() && strpos($_SERVER['REQUEST_URI'], '/blog/') === false) {
        // カテゴリーのスラッグを取得
        $category_slug = get_query_var('category_name');
        // /blog/を追加したURLを生成
        $redirect_url = home_url('/blog/category/' . $category_slug);
        // リダイレクト
        wp_redirect($redirect_url, 301);
        exit();
    }
	// リクエストされたURLが/blog/なしでタグページであるか確認
	if (is_tag() && strpos($_SERVER['REQUEST_URI'], '/blog/') === false) {
		// タグのスラッグを取得
		$tag_slug = get_query_var('tag');
		// /blog/を追加したURLを生成
		$redirect_url = home_url('/blog/tag/' . $tag_slug);
		// リダイレクト
		wp_redirect($redirect_url, 301);
		exit();
	}
}
add_action('template_redirect', 'custom_category_tag_redirect');

上記コードの内容をうまくカスタマイズしていただくことで、ご自身のサイトに適した形で自由にURLをカスタマイズすることが可能です。

よろしければ仕事などでご活用ください。

まとめ

WordPressのリライトルールについての解説はこれで以上になります。

リライトルールという仕組みは、テーマ開発やプラグイン開発で必要な場面で非常に重宝される仕組みといっても過言ではありません。

今回解説したリライトルールを扱えることで、パーマリンク(URL)の構造を自由にカスタマイズすることができ、何かアプリケーションを実装したりする際や、SEO対策においてもリライトルールの威力を発揮することができます。

よろしければぜひ、当記事をお仕事などでご活用いただけましたら幸いです。

執筆者

UMENOKI編集部 高澤 翔汰

歴5年目(2024年8月以降から5年目です)のエンジニアです!
CMSでのサイト構築とWebデザイン制作を兼任して5年目になります。
自作のiOSアプリ(iPhoneアプリ)やWordPressプラグインを開発することもあり、まだまだ現在進行形で勉強中です!

お気軽に皆さんのご要望をお聞かせください!

どんなに些細なことでも構いません!よろしければ記事や当サイトへの「こんな記事があったら仕事とかで役に立つな〜」や「こうだったらもっと役に立つのに!」といったようなご要望等をお気軽にお聞かせください!今後のサービス改善にお役立てさせていただきます!

例1)Reactの技術記事を書いてほしい!
例2)WordPressの使い方とかを初心者向けに解説してほしい!...など

送信と同時にプライバシーポリシーに同意したものとします。
サンタさん