WordPress パーマリンク リライトルール
パーマリンクやリライトルールの基本的なことやリライトルールを追加する関数 add_rewrite_rule() やリライトルール関連のフィルターなどの使い方についての覚え書きです。
更新日:2023年03月11日
作成日:2019年07月22日
パーマリンク
パーマリンクは WordPress のページ毎に設定される個別の URL のことです。
パーマリンクの基本的な URL は以下のような構成の文字列で、? に続くクエリ文字列にパラメータを指定した形式になっています(パーマリンク設定で「基本」を選択している場合)。
パーマリンク(基本) | 意味(表示されるページ) |
---|---|
http://example.com/?p=123 | ID が 123 の投稿ページ |
http://example.com/?p=1234&page=2 | IDが1234の投稿のページ分割の2ページ目 |
http://example.com/?page_id=321 | ID が 321 の固定ページ |
http://example.com/?m=201907 | 2019年7月の月別アーカイブページ |
http://example.com/?cat=77&paged=3 | カテゴリーIDが77のカテゴリーページの3ページ目 |
http://example.com/?author=1 | 投稿者IDが1のアーカイブページ |
デフォルト(基本のパーマリンク)では上記のようにパラメータから成るクエリ文字(クエリ変数)を使った構成になっていて「Ugly パーマリンク」 とも呼ばれています。
WordPress(のシステム)は URL に含まれるこれらのパラメータ(クエリ変数)を基にどのページを表示するかを特定することができます。
http://example.com/?p=123 の場合、p は投稿の ID を意味するので WordPress は投稿の ID が 123 の投稿を表示します。
パブリッククエリ変数
標準で利用可能なパラメーター(パブリッククエリ変数)は WP クラスのプロパティ $public_query_vars として wp-includes/class-wp.php に定義されています(以下は version 5.2.2 の例です)。
カスタム投稿タイプやカスタム分類を設定している場合は、それらの値が追加されます。
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' );
パラメータ | 意味 |
---|---|
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 | 投稿タイプスラッグ |
プライベートクエリ変数
上記パブリッククエリ変数は直接 URL クエリとして使うことができます。
プライベートクエリ変数は URL には使えませんが、WordPress はプライベートクエリ変数を使ったクエリストリングを受け取ることができます。
プライベートクエリ変数はパブリッククエリ変数と同様 WP クラスのプロパティ $private_query_vars として wp-includes/class-wp.php に定義されています(以下は version 5.2.2 の例です)。
/** * 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' );
関連項目:get_query_var
Pretty パーマリンク
サーバーの拡張機能 mod_rewrite が使える Web サーバー(Apache など)では、パーマリンクを静的な Web サイトの URL のような(ユーザーにわかり易い構造の)URL として設定することができます。
管理画面ナビゲーションメニューの「設定」→「パーマリンク設定」で設定します。
例えばパーマリンク設定で /%category%/%postname%/(カスタム構造)とすると、以下のような URL でアクセス(表示)することができます。
- http://example.com/news/サンプルページ/
- http://example.com/%category%/%postname%/
このような「基本」以外のパーマリンク(の URL)を「Pretty パーマリンク」と呼びます。
Pretty パーマリンクが有効になるとパーマリンクの URL にはクエリ変数が含まれません。この URL の変換は Rewrite API によって行われます。以下は Codex からの引用です。
When pretty permalinks are enabled, URLs don't include query variables. Instead, WordPress transforms the URL into query vars via the Rewrite API, which are used to populate the query.
パーマリンクがデフォルトの「基本」以外に設定されている場合、WordPress の内部では URL を解析して(URL 文字列をクエリ変数へ変換して)リクエストされているページを特定します。
静的な Web サイトでは一般的に http://example.com/news/サンプルページ/ と言う URL は、「news」と言うディレクトリの中に「サンプルページ」と言うファイルが配置されていると言う構造になります。
WordPress は静的な Web サイトとは異なり、/news/サンプルページ/ と言う URL は /news/サンプルページ/ と言うディレクトリの構造を表しているわけではありません。
- Pretty パーマリンクの設定の場合に表示(アクセス)される URL
http://example.com/news/サンプルページ/ - 内部ではクエリ変数を使った以下のような形式に変換してページを特定
http://example.com/?p=xxx
このような内部での URL の変換は「リライトルール(Rewrite Rule)」に基づいて行われます。
日本語 Codex 関連ページ
リライトルール
パーマリンク(URL)がデフォルトの「基本」以外に設定されている Pretty パーマリンクの場合、WordPress は内部で URL 文字列のドメイン以降の部分をクエリ変数を使ったパラメータに変換してそれらに基づいて表示するページを決定しています。
例えば、ブラウザのアドレスバーに以下の URL が入力された場合、
http://example.com/contact
WordPress の内部ではリライト処理が行われ、例えば以下のような URL として認識されます。
http://example.com/index.php?pagename=contact
言い換えると、
http://example.com/contact でアクセスされたら
http://example.com/index.php?pagename=contact を表示するようになっています。
リライトルールとは上記のようにリクエストされたページの URL を必要に応じてパラメータに変換するための規則です。
WordPress は内部ではリライトルールに基いて URL をパラメータに変換してページを表示しています。
また、リライトルールを管理するためのクラスは WP_Rewrite になります。
Codex 日本語版:WP_Rewrite クラス
リライトルールは、WP_Rewrite で定義され、そのインスタンス $wp_rewrite に登録されているので、header.php などのテーマのファイルに以下を記述して参照することができます。
<pre><?php var_dump( $wp_rewrite ); ?></pre>
以下は出力例の一部抜粋です(リライトルール以外は改行を削除しています)。
object(WP_Rewrite)#526 (25) { ["permalink_structure"]=>string(23) "/%category%/%postname%/" //パーマリンク設定 ["use_trailing_slashes"]=>bool(true) ["author_base"]=>string(6) "author" ["page_structure"]=>string(10) "%pagename%" ["search_base"]=>string(6) "search" ["comments_base"]=>string(8) "comments" ["pagination_base"]=>string(4) "page" ["comments_pagination_base"]=>string(12) "comment-page" ["feed_base"]=>string(4) "feed" ["front"]=>string(1) "/" ["root"]=>string(0) "" ["index"]=>string(9) "index.php" ["matches"]=>string(0) "" ["rules"]=> //★リライトルールの配列 array(170) { ["^wp-json/?$"]=> //キー(正規表現) string(22) "index.php?rest_route=/" //値(変換後のパラメータの形式) ["^wp-json/(.*)?"]=> string(33) "index.php?rest_route=/$matches[1]" ["^index.php/wp-json/?$"]=> string(22) "index.php?rest_route=/" ["^index.php/wp-json/(.*)?"]=> string(33) "index.php?rest_route=/$matches[1]" ["rental/?$"]=> string(26) "index.php?post_type=rental" ["category/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$"]=> string(52) "index.php?category_name=$matches[1]&feed=$matches[2]" ["category/(.+?)/(feed|rdf|rss|rss2|atom)/?$"]=> string(52) "index.php?category_name=$matches[1]&feed=$matches[2]" ["category/(.+?)/embed/?$"]=> string(46) "index.php?category_name=$matches[1]&embed=true" ["category/(.+?)/page/?([0-9]{1,})/?$"]=> string(53) "index.php?category_name=$matches[1]&paged=$matches[2]" ["category/(.+?)/?$"]=> string(35) "index.php?category_name=$matches[1]" ["tag/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$"]=> string(42) "index.php?tag=$matches[1]&feed=$matches[2]" ["tag/([^/]+)/(feed|rdf|rss|rss2|atom)/?$"]=> string(42) "index.php?tag=$matches[1]&feed=$matches[2]" ・・・中略・・・ ["extra_permastructs"]=> //パーマリンク構造 array(9) { ["category"]=> array(8) { ["with_front"]=>bool(true) ["ep_mask"]=>int(512) ["paged"]=>bool(true) ["feed"]=>bool(true) ["forcomments"]=>bool(false) ["walk_dirs"]=>bool(true) ["endpoints"]=>bool(true) ["struct"]=>string(20) "/category/%category%" } ["post_tag"]=> array(8) { ["with_front"]=>bool(true) ["ep_mask"]=>int(1024) ["paged"]=>bool(true) ["feed"]=>bool(true) ["forcomments"]=>bool(false) ["walk_dirs"]=>bool(true) ["endpoints"]=>bool(true) ["struct"]=>string(15) "/tag/%post_tag%" } ["post_format"]=> array(8) { ["with_front"]=>bool(true) ["ep_mask"]=>int(0) ["paged"]=>bool(true) ["feed"]=>bool(true) ["forcomments"]=>bool(false) ["walk_dirs"]=>bool(true) ["endpoints"]=>bool(true) ["struct"]=>string(19) "/type/%post_format%" } ・・・中略・・・ ["rewritecode"]=> //リライトタグ(構造タグ) array(21) { [0]=>string(6) "%year%" [1]=>string(10) "%monthnum%" [2]=>string(5) "%day%" [3]=>string(6) "%hour%" [4]=>string(8) "%minute%" [5]=>string(8) "%second%" [6]=>string(10) "%postname%" [7]=>string(9) "%post_id%" [8]=>string(8) "%author%" [9]=>string(10) "%pagename%" [10]=>string(8) "%search%" [11]=>string(10) "%category%" [12]=>string(10) "%post_tag%" [13]=>string(13) "%post_format%" ・・・中略・・・ } ["rewritereplace"]=> //リライトタグ(構造タグ)を置き換える正規表現 array(21) { [0]=>string(10) "([0-9]{4})" [1]=>string(12) "([0-9]{1,2})" [2]=>string(12) "([0-9]{1,2})" [3]=>string(12) "([0-9]{1,2})" [4]=>string(12) "([0-9]{1,2})" [5]=>string(12) "([0-9]{1,2})" [6]=>string(7) "([^/]+)" [7]=>string(8) "([0-9]+)" [8]=>string(7) "([^/]+)" [9]=>string(8) "([^/]+?)" [10]=>string(4) "(.+)" [11]=>string(5) "(.+?)" [12]=>string(7) "([^/]+)" [13]=>string(7) "([^/]+)" ・・・中略・・・ } ["queryreplace"]=> //置換後に追加するクエリパラメータ array(21) { [0]=>string(5) "year=" [1]=>string(9) "monthnum=" [2]=>string(4) "day=" [3]=>string(5) "hour=" [4]=>string(7) "minute=" [5]=>string(7) "second=" [6]=>string(5) "name=" [7]=>string(2) "p=" [8]=>string(12) "author_name=" [9]=>string(9) "pagename=" [10]=>string(2) "s=" [11]=>string(14) "category_name=" [12]=>string(4) "tag=" [13]=>string(12) "post_format=" ・・・中略・・・ } ・・・以下省略・・・
リライトルールは上記のように正規表現をキー、変換するパラメータの形式を値とした連想配列で構成されています。
- リライトルール(連想配列 rules)の構成要素
-
- キー: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>
以下は出力例の一部抜粋です。Version 5.2.2 のデフォルトの場合、以下のように92個のルールがあります。カスタム投稿やカスタム分類を設定している場合は、それらのルールも追加されるのでルールはその分増えます。
array(92) { //92個の配列(リライトルール) ["^wp-json/?$"]=> //キーは正規表現 string(22) "index.php?rest_route=/" //値は変換後のパラメータの形式 ["^wp-json/(.*)?"]=> string(33) "index.php?rest_route=/$matches[1]" ["^index.php/wp-json/?$"]=> string(22) "index.php?rest_route=/" ["^index.php/wp-json/(.*)?"]=> string(33) "index.php?rest_route=/$matches[1]" ["category/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$"]=> string(52) "index.php?category_name=$matches[1]&feed=$matches[2]" ["category/(.+?)/(feed|rdf|rss|rss2|atom)/?$"]=> string(52) "index.php?category_name=$matches[1]&feed=$matches[2]" ["category/(.+?)/embed/?$"]=> string(46) "index.php?category_name=$matches[1]&embed=true" ["category/(.+?)/page/?([0-9]{1,})/?$"]=> string(53) "index.php?category_name=$matches[1]&paged=$matches[2]" ["category/(.+?)/?$"]=> string(35) "index.php?category_name=$matches[1]" ["tag/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$"]=> string(42) "index.php?tag=$matches[1]&feed=$matches[2]" ["tag/([^/]+)/(feed|rdf|rss|rss2|atom)/?$"]=> string(42) "index.php?tag=$matches[1]&feed=$matches[2]" ["tag/([^/]+)/embed/?$"]=> string(36) "index.php?tag=$matches[1]&embed=true" ["tag/([^/]+)/page/?([0-9]{1,})/?$"]=> string(43) "index.php?tag=$matches[1]&paged=$matches[2]" ["tag/([^/]+)/?$"]=> string(25) "index.php?tag=$matches[1]" ["type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$"]=> string(50) "index.php?post_format=$matches[1]&feed=$matches[2]" ["type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$"]=> string(50) "index.php?post_format=$matches[1]&feed=$matches[2]" ・・・中略・・・ //例:4桁の数字/page/1桁以上のページ送りの数(例 /2019/06/page/2/) ["([0-9]{4})/page/?([0-9]{1,})/?$"]=> //index.php?year=マッチした4桁の数字&paged=ページ送り数(例 index.php?year=2019&paged=2) string(44) "index.php?year=$matches[1]&paged=$matches[2]" ["([0-9]{4})/?$"]=> string(26) "index.php?year=$matches[1]" [".?.+?/attachment/([^/]+)/?$"]=> string(32) "index.php?attachment=$matches[1]" ・・・中略・・・ ["(.?.+?)/page/?([0-9]{1,})/?$"]=> string(48) "index.php?pagename=$matches[1]&paged=$matches[2]" ["(.?.+?)/comment-page-([0-9]{1,})/?$"]=> string(48) "index.php?pagename=$matches[1]&cpage=$matches[2]" ["(.?.+?)(?:/([0-9]+))?/?$"]=> string(47) "index.php?pagename=$matches[1]&page=$matches[2]" [".+?/[^/]+/attachment/([^/]+)/?$"]=> string(32) "index.php?attachment=$matches[1]" ・・・中略・・・ ["(.+?)/([^/]+)/page/?([0-9]{1,})/?$"]=> string(70) "index.php?category_name=$matches[1]&name=$matches[2]&paged=$matches[3]" ["(.+?)/([^/]+)/comment-page-([0-9]{1,})/?$"]=> string(70) "index.php?category_name=$matches[1]&name=$matches[2]&cpage=$matches[3]" ["(.+?)/([^/]+)(?:/([0-9]+))?/?$"]=> string(69) "index.php?category_name=$matches[1]&name=$matches[2]&page=$matches[3]" ・・・中略・・・ ["(.+?)/embed/?$"]=> string(46) "index.php?category_name=$matches[1]&embed=true" ["(.+?)/page/?([0-9]{1,})/?$"]=> string(53) "index.php?category_name=$matches[1]&paged=$matches[2]" ["(.+?)/comment-page-([0-9]{1,})/?$"]=> string(53) "index.php?category_name=$matches[1]&cpage=$matches[2]" ["(.+?)/?$"]=> string(35) "index.php?category_name=$matches[1]" }
「パーマリンク設定」が「基本」の場合
「パーマリンク設定」でデフォルトの「基本」が選択されている場合は、リライトルールは作成されないので以下のようになります。
<pre><?php var_dump( $wp_rewrite->rules ); ?></pre> <!--「パーマリンク設定」が「基本」の場合 --> string(0) ""
Debug Bar
Debug Bar と言うプラグインを使うと、リライトルールによる変換を簡単に確認することができます。(Debug Bar は2019年7月の時点で検証済み最新バージョン:4.9.10 ですが、リライトルールの変換は確認することができます)
以下は投稿の個別ページ(ページのスラッグ: query-test)にアクセスした際のスクリーンショットです。
リクエストされた URL が news/query-test で、
リライトルールのパターン (.+?)/([^/]+)(?:/([0-9]+))?/?$ がマッチしたため、以下のパラメータに変換されたことが確認できます。
category_name=news&name=query-test&page=(一致したリライト・クエリー)
この例でマッチしたパターン (.+?)/([^/]+)(?:/([0-9]+))?/?$ は前述の出力例57行目にあります。
このため以下の出力例58行目の変換後のパラメータの形式が適用されています。
index.php?category_name=$matches[1]&name=$matches[2]&page=$matches[3]
- $matches[1]:news → (.+?)にマッチ。改行を除く文字列
- $matches[2]:query-test → ([^/]+)にマッチ。/ 以外の文字列
- $matches[3]:該当なし → ([0-9]+) 4番目の括弧。3番目の括弧は ?: があるので参照対象外
パーマリンクのカスタマイズ
デフォルトのパーマリンク(URL)以外の形式の URL でアクセスできるようにするには、add_rewrite_rule() や rewrite_rules_array フィルターを使ってリライトルールを追加する必要があります。
add_rewrite_endpoint() を使えば、URL の末尾に文字列(エンドポイント名)を追加し、その後のスラッシュ以降の文字列を値として受け取ることができます。
また、デフォルトのパーマリンク(URL)以外の形式の URL を出力するには、pre_post_link や post_link、post_type_link などのリンク関連のフィルターを使ってカスタマイズすることができます。
リライトルールの追加
以下は http://example.com/test/xxxx/ と言う URL にアクセスしたらスラッグが test の固定ページで xxxx の部分に記述されている値を出力すると言う全く実用的ではない例です。
まず、リライトルールを追加して http://example.com/test/xxxx/ と言う URL にアクセスできるようにする必要があります。
そして、URL に入力された xxxx の文字列(パラメータ)を取得できるようにし、取得した値を出力ます。
リライトルールを追加して独自の URL にアクセス
スラッグが test と言う固定ページを作成し、以下のアドレスでアクセスできることを確認します。
http://example.com/test/
この時、404 ページを作成してある場合、以下のアドレスにアクセスすると /test/foo/ は(リライトルールに)存在しないので 404 エラーページが表示されます。
http://example.com/test/foo/
以下を functions.php に記述して add_rewrite_rule() を使ってリライトルールを追加します。
function add_my_test_rewrite_rule() { add_rewrite_rule( '^test/([^/]+)/?$', //正規表現パターン 'index.php?pagename=test&myvalue=$matches[1]', //変換するパラメータ(クエリ変数)の形式 'top' //リライトルールの先頭に追加 ); } add_action( 'init', 'add_my_test_rewrite_rule' );
続いて、「パーマリンク設定」で、何も変更せずに「変更を保存」をクリックします(リライトルールを再生成してデータベースを更新)。
http://example.com/test/foo/ にアクセスするとスラッグが test と言う固定ページが表示されます。
3行目の ^test/([^/]+)/?$ は以下のような正規表現パターンです。
- test/ で始まり
- ([^/]+) → スラッシュ以外の1文字以上の文字列。括弧で囲んだ部分は第2パラメータの $matches[1] で参照可能
- /?$ → スラッシュが1つあるかないかで終わる
4行目のパラメータ部分は以下のような内容です。
- pagename=test → 固定ページのスラッグが test
- myvalue=$matches[1] →パラメータ myvalue に第1パラメータの括弧で囲んだ部分にマッチした値
つまり URL に test/ で始まりその後に1文字以上の文字列があり最後がスラッシュで終わるようなパターンがあると、test と言う固定ページが選択され(pagename=test)、パラメータ myvalue(の値)にマッチした文字列が入ります(myvalue=$matches[1])。
上記の記述によりリライトルールが追加され、http://example.com/test/foo/ にアクセスすると 404 エラーにならず test 固定ページが表示されるようになります。
add_rewrite_rule() の代わりに rewrite_rules_array フィルターを使って以下のように記述しても同じ結果を得られます。
function add_my_test_rewrite ( $rules ) { //追加するリライトルールの配列を初期化 $new_rules = array(); //追加するリライトルールの配列を作成 $new_rules['^test/([^/]+)/?$'] = 'index.php?pagename=test&myvalue=$matches[1]'; //既存のリライトルールに作成した配列を追加 return $new_rules + $rules; } add_filter('rewrite_rules_array', 'add_my_test_rewrite');
パラメータの値を取得
パラメータ myvalue は独自のパラメータ(カスタムパラメータ)なので、get_query_var() を使って値を取得することができません。
get_query_var() を使ってカスタムパラメータ myvalue の値を取得できるようにするには、以下の何れかの方法を使うことができます。
- カスタムクエリ変数を追加
query_vars フィルタを使ってカスタムクエリ変数をパブリッククエリ変数に追加 - リライトタグを追加
add_rewrite_tag() を使ってリライトタグ(構造タグ)を追加
1.カスタムクエリ変数を追加する方法(query_vars フィルター)
以下を functions.php に記述して query_vars フィルターを使い myvalue をパブリッククエリ変数に追加します。
function add_myvalue_to_query_vars( $vars ) { $vars[] = 'myvalue'; return $vars; } add_filter( 'query_vars', 'add_myvalue_to_query_vars' );
2.リライトタグを追加する方法(add_rewrite_tag)
以下を functions.php に記述して myvalue と言う名前のリライトタグ(構造タグ)を追加することで、 myvalue をパブリッククエリ変数に追加します。
add_rewrite_tag() の第2パラメータはリライトタグ(第1パラメータ)を置き換える正規表現で、&以外の1文字以上の文字列を表します。
function custom_rewrite_tag() { add_rewrite_tag('%myvalue%', '([^&]+)'); } add_action('init', 'custom_rewrite_tag', 10, 0);
取得したパラメータの値を出力
以下を functions.php に記述して、スラッグが test の固定ページで且つ myvalue と言うクエリ変数が取得できた場合には <p>myvalue の値は'.$myvalue.'</p> をコンテンツの前に出力するようにします。
ページの判定とクエリ変数の確認は template_redirect アクションフックで行っています。
値をコンテンツの前に出力するには the_content フィルターを使っています。
15行目で myvalue の値をエスケープしていますが、取得される値は URL エンコードされているのとスペースを含むことができないのでおそらく不要だと思います。
function echo_myvalue() { //スラッグが test の固定ページで且つ myvalue と言うクエリ変数が空でない場合 if ( is_page( 'test' ) && !empty( get_query_var( 'myvalue' ) ) ) { //the_content フィルターに add_myvalue_to_content をフック add_filter( 'the_content', 'add_myvalue_to_content' ); } } add_filter( 'template_redirect', 'echo_myvalue' ); function add_myvalue_to_content($content){ //クエリ変数 myvalue の値を取得 $myvalue = get_query_var('myvalue'); if($myvalue) { //取得できていればコンテンツの前にその値を出力。 return '<p>myvalue の値は'.esc_html($myvalue).'</p>'. $content; }else{ //取得できない場合は、そのままコンテンツを出力 return $content; } }
http://example.com/test/xxxx/ にアクセスするとスラッグが test の固定ページが表示され xxxx の部分の文字列がコンテンツの前に p 要素で出力されます。
add_rewrite_endpoint() を使う例
上記と同じようなこと(似たようなこと)は、add_rewrite_endpoint() を使っても実現できます。以下は add_rewrite_endpoint() を使った例です。
前述の例は URL に入力された文字列を test と言う固定ページで表示しましたが、以下は任意の固定ページまたは投稿の個別ページで http://example.com/ページ名/test/xxxx/ にアクセスすると xxxx の部分の文字列がコンテンツの前に p 要素で出力されます。
以下を functions.php に記述します。
エンドポイントを追加するとエンドポイントマスク(第2パラメータ)で指定されたページに対応するリライトルールが作成され、デフォルトでは追加されたエンドポイントと同じ名前のクエリ変数が登録されます。
//投稿の個別ページと固定ページに test と言うエンドポイントを追加 add_rewrite_endpoint( 'test', EP_PERMALINK | EP_PAGES ); function add_testvalue_to_content($content){ //クエリ変数 test の値を取得 $test = get_query_var('test'); if($test) { //取得できていればコンテンツの前にその値を出力。 return '<p>test の値は'.esc_html($test).'</p>'. $content; }else{ //取得できない場合は、そのままコンテンツを出力 return $content; } } function echo_mytest() { //test と言うクエリ変数が空でない場合(必要であれば条件分岐タグでページ種類を限定) if (!empty( get_query_var( 'test' ) ) ) { //the_content フィルターに add_testvalue_to_content をフック add_filter( 'the_content', 'add_testvalue_to_content' ); } } add_filter( 'template_redirect', 'echo_mytest' );
カスタム投稿タイプの URL をスラッグから ID に
カスタム投稿タイプのパーマリンク(URL)を投稿のスラッグから投稿 ID に変更する例です。
カスタム投稿タイプの URL は「http://example.com/投稿タイプ名/投稿スラッグ」という形式で出力されますが、「http://example.com/投稿タイプ名/投稿 ID」に変更します。
以下はカスタム投稿タイプの投稿タイプ名が rental の場合の例です。
投稿タイプ名は register_post_type() の第1パラメータの値($post_type)です。
以下を functions.php に記述して個別ページに投稿スラッグの代わりに ID でアクセスできるようにします。
function my_custom_rewrite_rental() { add_rewrite_rule( '^rental/([0-9]+)/?$', //正規表現パターン 'index.php?post_type=rental&p=$matches[1]', //変換するパラメータ(クエリ変数)の形式 'top' //リライトルールの先頭に追加 ); } add_action('init', 'my_custom_rewrite_rental');
add_rewrite_rule() を使ってリライトルールを追加しています。
第1パラメータはリクエストされた URL にマッチする正規表現パターンです。
この場合は「rental/」から始まり、「([0-9]+)」で任意の桁数の数値を意味するので ID の値が続いて、「/?$」で末尾にスラッシュがあるかないか、と言うようなパターンになります。
第2パラメータは正規表現にマッチした場合に変換するパラメータの形式で以下のような意味になります。
- post_type=rental → 投稿タイプ(post_type)が renal
- p=$matches[1] → 投稿の ID(p)が第1パラメータの括弧内「([0-9]+)」にマッチした値
上記を記述後、「パーマリンク設定」で何も変更せずに「変更を保存」をクリックしてリライトルールデータベースの更新をすると、http://example.com/rental/123/ のような URL でアクセスできるようになります。
add_rewrite_tag() と add_permastruct() を使ってもほぼ同じことができます(add_permastruct の例)
続いて URL の生成でもスラッグではなく ID で出力されるようにするために post_type_link フィルターフックを使います。
以下を functions.php に記述します。
投稿タイプが rental の場合は、URL の投稿名のスラッグ($post->post_name)を投稿 ID($post->ID)に変換した URL を返しています。
function my_rental_link_name_to_id( $url, $post ) { if ( 'rental' == get_post_type( $post ) ) { $url = str_replace($post->post_name, $post->ID, $url); } return $url; } add_filter( 'post_type_link', 'my_rental_link_name_to_id', 10, 2 );
これでアーカイブページのリンクやナビゲーションメニューに出力される rental の個別ページの URL が http://example.com/rental/123 のような形式に変換されます。
カスタムタクソノミーの URL を変更
register_taxonomy() を使ってカスタムタクソノミーを登録する際に、rewrite パラメータを使ってデフォルトの URL(パーマリンク)を変更することができます。
例えば以下のように rewrite パラメータ(16行目)を使ってカスタムタクソノミーを登録すると、カスタムタクソノミーのアーカイブページの URL はデフォルトでは http://example.com/rental_cat/スラッグ/ ですが、http://example.com/rental-category/スラッグ/ に変更することができます。
変更後は「パーマリンク設定」で何も変更せずに「変更を保存」をクリックしてリライトルールデータベースを更新する必要があります。
register_taxonomy( 'rental_cat', //カスタムタクソノミー名 'rental', //このタクソノミーが使われるカスタム投稿タイプ array( 'label' => 'レンタルカテゴリー', //カスタムタクソノミーのラベル 'labels' => array( 'popular_items' => 'よく使うレンタルカテゴリー', 'edit_item' =>'レンタルカテゴリーを編集', 'add_new_item' => '新規レンタルカテゴリーを追加', 'search_items' => 'レンタルカテゴリーを検索' ), 'public' => true, // 管理画面及びサイト上に公開 'description' => 'レンタルカテゴリーの説明文です。', 'hierarchical' => true, //カテゴリー形式 'show_in_rest' => true, //Gutenberg で表示 'rewrite' => array('slug' => 'rental-category'), //URL を rental-category に ) );
但し、もし rewrite パラメータの slug の値にスラッシュを含む rental/category のような値を指定して、アーカイブページのリンクをクリックすると404エラーになってしまいます。
例えば以下のように rewrite パラメータを指定した場合、リンクをクリックすると出力される URL は http://example.com/rental/category/スラッグ/ となります。
この URL では rental/ 以下の(rental と言う)カスタム投稿タイプの投稿が検索されてしまい該当するページが見つからない(404エラー)と言うことになってしまいます。
そのためこの URL でアーカイブページが見つかるようにリライトルールを設定する必要があります。
register_taxonomy( 'rental_cat', //カスタムタクソノミー名 'rental', //このタクソノミーが使われるカスタム投稿タイプ array( 'label' => 'レンタルカテゴリー', //カスタムタクソノミーのラベル ・・・中略・・・ 'rewrite' => array('slug' => 'rental/category'), //スラッシュを含む slug を指定 ) );
functions.php に add_rewrite_rule() を使って以下のようなリライトルールを追加します。
([^/]+) はスラッシュ以外の文字列を表す正規表現で、rental/category/(スラッシュ以外の文字列)/ にアクセスがあったら「index.php?rental_cat=スラッシュ以外の文字列」に変換すると言うような内容です。
add_rewrite_rule('^rental/category/([^/]+)/?$', 'index.php?rental_cat=$matches[1]', 'top');
上記を記述後は「パーマリンク設定」で何も変更せずに「変更を保存」をクリックしてリライトルールデータベースを更新する必要があります。