こんにちは。澤井です! 私はカルテット入社前にWordPressを使ったサイト制作をしていました。 入社後の現在でも保守や構築を作業する事があり、WordPressは私にとってなじみの深いCMSです。
今回は、そんな私にとってなじみの深いWordPressの基本機能である、パーマリンクについてすこし詳しく書こうと思います。
パーマリンク
WordPressの公式ドキュメントでは、パーマリンクを以下のように解説しています。
パーマリンクとは、ブログの個々の投稿、カテゴリーなどの投稿一覧ページへの恒久的 (半永久的) な URL です。
主に使われるパーマリンクは2種類あります。
- Uglyパーマリンク(デフォルト)
- Prettyパーマリンク
パーマリンクは、WordPress管理画面 > 設定 > パーマリンク設定
で設定します。
本記事では、Uglyパーマリンク
の表示の流れを確認して、その後にPrettyパーマリンク
をUglyパーマリンク
に変換するルール(リライトルール)についてみていきたいと思います。
Uglyパーマリンク
WordPressをインストールした直後のURL構造は、https://example.com/?p=123
のように、クエリ文字列を使用します。
この形式は、Uglyパーマリンク
と呼びます。
WordPressは、クエリ文字列にマッチする投稿を表示します。
例えば、スラッグがcategory-sample
のカテゴリーの中で、投稿IDが1の投稿を表示するURLは以下のようになります。
https://example.com?p=1&category-name=category-sample&page=
※ 実際には、https://example.com?p=1
で同じ投稿を表示できますが、
説明を分かりやすくするために、category-name=category-sample&page=
も加えています。
上記のp
、category-name
、page
などを、パブリッククエリとよびます。
パブリッククエリは、WordPressがデータベースに問い合わせする際の条件として使われます。
WordPressで使用可能なパブリッククエリは、WP
クラス(wp-includes/class-wp.php
)で定義されています。
WordPressは、パブリッククエリをもとに問い合わせ条件を作成し、SQLを実行してデータベースから表示すべき投稿を取得します。
https://example.com?p=1&category-name=category-sample&page=
の投稿取得条件は、以下のようになります(投稿取得条件は、WP_Query::query_vars
プロパティで確認できます)。
Array
(
[p] => 1
[page] =>
[category_name] => category-sample
)
page
クエリは、今回の記事では重要でないので、説明しませんが、詳しく知りたい方は以下を参考にしてください。
注: ‘page’ クエリ変数には、コンテンツに クイックタグが含まれページ送りが設定されている個別投稿または固定ページのページ数が含まれます。
関数リファレンス/get query var - WordPress Codex 日本語版
Prettyパーマリンク
Prettyパーマリンク
は、ユーザーフレンドリーで見た目の良いリンク構造を提供します。
実際の運用では、Uglyパーマリンク
を使うことは少なく、Prettyパーマリンク
を使用することが多いと思います。
以下、本記事の主題であるPrettyパーマリンク
からUglyパーマリンク
へ変換するリライトルールについて記載します。
今回は、Prettyパーマリンク
を以下のように設定してみます。
カスタム構造 https://example.com/%category%/%post_id%
上記のようにパーマリンクを設定をした場合、https://example.com?p=1&category-name=category-sample&page=
で表示される投稿は、以下URLで取得できるようになります。
https://example.com/category-sample/1
WP_Query::query_vars
を確認すると、投稿取得条件は、 Uglyパーマリンク
と同じになっています。
Array
(
[p] => 1
[page] =>
[category_name] => category-sample
)
https://example.com/category-sample/1
をhttps://example.com?p=1&category-name=category-sample&page=
へ変換するルールをリライトルールとよびます。
リライトルールは、wp_options.option_name
のrewrite_rules
レコードに格納されています。
WordPressは初期化時に、WP_Rewrite::rules
プロパティにリライトルールを保持します。
(WP_Rewriteオブジェクトはグローバル変数$wp_rewriteとしてアクセスできます)。
パーマリンク構造を、https://example.com/%category%/%post_id%
に設定したときのWP_Rewrite::rules
プロパティを確認してみます。
WP_Rewrite::rules
は、正規表現とマッチ後の置き換え方法を表します。
正規表現でキャプチャされた部分を$match配列に順番に適用していきます。 上から順にマッチを試み、最初にマッチしたものを変換ルールとして採用します。
WP_Rewrite Object
(
[permalink_structure] => /%category%/%post_id%
// ...
[rules] => Array
(
[^wp-json/?$] => index.php?rest_route=/
// ...
[(.+?)/([0-9]+)(?:/([0-9]+))?/?$]
=> index.php?category_name=$matches[1]&p=$matches[2]&page=$matches[3] --- (1)
// ...
[(.+?)/?$] => index.php?category_name=$matches[1]
)
// ...
)
https://example.com/category-sample/1
は、上記(1)にマッチします。
- 1番目にキャプチャされた
category-sample
は、$matches[1]
で使用されて、category_name=category-sample
になる - 2番目にキャプチャされた
1
は、$matches[2]
で使用されて、p=1
になる - 3番目のキャプチャはないので、
$matches[3]
は空になり、page=
になる
リライトルールが適用された結果、Uglyパーマリンクhttps://example.com?p=1&category-name=category-sample&page=
と同じクエリ文字になります。
結果、WP_Query::query_vars
もUglyパーマリンク
と同じものになります。
Array
(
[p] => 1
[page] =>
[category_name] => category-sample
)
以上、Prettyパーマリンク
からUglyパーマリンク
へのリライトルールを見てきました。
注:WordPressはフロントコントローラーindex.php
ですべてのリクエストを処理するので、他のページにアクセスした時にindex.php
に処理を移すようWebサーバーを設定しておく必要があります。Webサーバーの設定もリライトと呼ばれますが、WordPressのリライト(Ugly/Pretty)とは全く別の設定箇所になりますのでご注意ください。例えばApache
ではmod_rewrite
を有効にし.htaccess
に設定を記述します。
WordPressは、パーマリンクの設定次第でURL構造が大きく変わります。 思ったとおりのURLで投稿が表示されないといった問題が発生した場合は、一度リライトルールを確認すると良いかもしれません。