名古屋市のフロントエンドエンジニアがWEB制作に関する技術メモを書いています

メニュー

ホーム > WordPress > WordPressの一歩踏み込んだパーマリンクカスタマイズ

WordPressの一歩踏み込んだパーマリンクカスタマイズ

最終更新日:

公開日:2014年01月25日

WordPress

皆さんWordPressライフ楽しんでますか?くーへいです。

今日は、WordPressのパーマリンク、いわゆるURLについて、書いていこうと思います。

デフォルトのパーマリンク

WordPressはPHPで作られていることはご存知ですよね。

WordPressで使用されているPHPに限らずCGIでも同様ですが、PHPのファイルにアクセスする際、PHPは様々なパラメーターを受信し、それに応じた中身を表示します。
様々なパラメーターとは、閲覧者が入力したデータであったり、一時保存したデータ(Cookie)であったり、URLもその1つです。
例えば、「http://example.com/index.php?p=123」といったURLの場合、「p」というパラメーターに「123」という数字を格納したうえで「index.php」を開く、という指示を送っているわけです。
「?」はこれ以降はパラメーターだよ、ということを示しています。

この前提の上で、WordPress管理画面の「設定」→「パーマリンク設定」を見てみましょう。
以下はこのサイトの「設定」→「パーマリンク設定」です。

パーマリンク設定

なお、このサイトでは、ファイル名を指定しなかった場合は「index.php」にアクセスするように設定されています。

「デフォルト」では、先ほど説明したように、パラメータを指定していますね。
しかし、それ以外ではフォルダを指定しているようなURLです。
もちろん、そのようなフォルダが存在するわけではありませんが、WordPressはきちんとアクセスできます。
その仕組みは後ほど解説します。

「設定」→「パーマリンク設定」からできること

上の画像をご覧いただければわかる通り、このサイトでは「カスタム構造」を使用して、URLをアレンジしています。
ちなみに、「設定」→「パーマリンク設定」→「共通設定」での設定が反映されるのは「投稿」と「カテゴリー」のみですので、その点はご注意を。

画像にて「カスタム構造」に設定してある「%category%」などは、「パーマリンク設定」における変数のようなものだと思っていただいて構いません。
例えば、「/%category%」は「/category/カテゴリーのスラッグ」を指定したと認識されます。
なお、「Top Level Categories」というプラグインを導入することで、「/category」の部分を自動で削除するようにできます。

「%post_id%」は記事のIDを数字でそのまま指定したことになります。(この記事でいうと、「57」ですね。)

その他にも、以下のようなものが指定できます。

「%year%」・・・投稿された年を4桁で取得します。例)2004
「%monthnum%」・・・投稿された月を取得します。例)05
「%day%」・・・投稿された日を取得します。例)28
「%hour%」・・・投稿された時(時間)を取得します。例)15
「%minute%」・・・投稿された分を取得します。例)43
「%second%」・・・投稿された秒を取得します。例)33
「%post_id%」・・・投稿の固有IDを取得します。例)423
「%postname%」・・・投稿の投稿名を取得します。(いわゆる、指定されたスラッグのこと)
「%category%」・・・投稿のカテゴリーを取得します。サブカテゴリーは入れ子にされたディレクトリとして取得されます。
「%author%」・・・投稿の作成者を取得します。

※日本語版Codexから抜粋し、書き方を若干修正

上記のようなものを、「リライトタグ」と呼びます。
「リライトタグ」は他にも種類がある可能性があります。
例えば、プラグインを追加したときは独自の「リライトタグ」が追加されるケースもあります。
詳しくは、プラグインの説明書を参照してみてください。

※「オプション」の「カテゴリーベース」や「タグベース」については、設定ページに説明が書かれていますので、それを見ていただければわかると思います。

「カスタム投稿タイプ」と「カスタムタクソノミー」のパーマリンク

先ほども書きましたが、「設定」→「パーマリンク設定」での設定が反映されるのは「投稿」と「カテゴリー」のみです。
では、「カスタム投稿タイプ」や「カスタムタクソノミー」のパーマリンクはどうするのか・・・?

「functions.php」で設定することもできる(後述します)のですが、ここは「Custom Post Type Permalinks」という大変便利なプラグインがありますので、これを利用させていただきましょう。
(蛇足ですが、5万件以上もダウンロードされているのに、評価が☆5というのはすごいですね・・・)

custom_post_type_permalink_2

上の図は「Custom Post Type Permalinks」導入後に現れる、「設定」→「パーマリンク設定」の画面です。

大変わかりやすく、カスタム投稿タイプのパーマリンクが設定できます。
このプラグインを導入したことで、「カスタムタクソノミー」の「リライトタグ」も生成されますので、使用できます。
また、「カスタムタクソノミー」のアーカイブページのパーマリンクも簡易設定できます。

詳細は、プラグインの説明をご覧ください・・・。

「add_rewrite_tag」と「add_permastruct」について

さて、今までも散々「functions.php」でも設定できますと書いてきましたが、それが「add_rewrite_tag」と「add_permastruct」になります。

先ほども説明した通り、パーマリンクは「リライトタグ」を使って設定することで思い通りに設定できます。

「add_rewrite_tag」の使い方

関数の使い方の前に、現在のリライトタグの設定を見てみましょう。
テーマファイルのどこかに下記を打ち込んでみてください。
間違えても、本番環境で使わないでくださいね。すごくたくさんの文字が表示されますので。

echo '<p><strong>$wp_rewrite->rewritecode</strong><br />';
foreach ( $wp_rewrite->rewritecode as $key => $val ) {
	echo $key . ' => ' . $val . '<br />';
}
echo '</p><p><strong>$wp_rewrite->rewritereplace</strong><br />';
foreach ( $wp_rewrite->rewritereplace as $key => $val ) {
	echo $key . ' => ' . $val . '<br />';
}
echo '</p><p><strong>$wp_rewrite->queryreplace</strong><br />';
foreach ( $wp_rewrite->queryreplace as $key => $val ) {
	echo $key . ' => ' . $val . '<br />';
}
echo '</p>';

それぞれの段落ごとに、「リライトタグ名」、「リライトタグを置き換える正規表現」、「置き換えた正規表現に付け加えるパラメータ」となります。

「0 => %year%」、「0 => ([0-9]{4})」、「0 => year=」であれば、「%year%」がパーマリンクに設定されていれば、「数字4桁」を「year=」に置き換える、というわけです。
・・・わかりませんよね。
例示すると、「http://www.example.com/2014/」というURLがあったら、「http://www.example.com/?year=2014」という風に見るよ、ということです。

置き換えられた後のURLならば、どういう記事を表示すればよいか、一目瞭然ですね。
これが、実際に「/2014/」というディレクトリが無くてもアクセス可能な原理です。
ただし、リライトタグが設定されているだけでは、アクセス可能になりません。
その点については、「add_permastruct」の使い方で説明します。

「add_rewrite_tag」関数については、かなり直感的に使用できると思います。
Codexに記載されている構文は以下のとおりです。

add_rewrite_tag($tagname,$regex,$query);

実際に使用する際は、以下のようになるかと思います。

function ku_add_rewrite_tag() {
global $wp_rewrite;
$wp_rewrite->add_rewrite_tag( '%blog%', '(blog)', 'post_type=' );
}
add_action( 'init', 'ku_add_rewrite_tag', 0 );

引数の1つ目は「リライトタグ名」、2つ目は「リライトタグを置き換える正規表現」、3つ目は「置き換えた正規表現に付け加えるパラメータ」となります。
「リライトタグ名」は、指定した値がすでに存在していた場合、上書きされてしまうそうです。
事前に値をチェックしてから「リライトタグ名」を決めた方が良さそうですね。

「add_permastruct」の使い方

Codexの構文は以下の通り。

add_permastruct( $name, $struct, $args = array() );

「functions.php」には以下のように記載します。

function mytheme_add_permastruct() {
global $wp_rewrite;
$wp_rewrite->add_permastruct( 'blog_single', '/%blog%/%post_id%/', false );
}
add_action( 'init', 'mytheme_add_permastruct', 0 );

「add_permastruct」の使い方もかなり直観的で、「Custom Post Type Permalinks」の設定に酷似していることがわかると思います。
引数の1つ目は「ストラクチャー名」、2つ目は「パーマリンクの設定」、3つ目は「設定値」となります。

「ストラクチャー名」は、重複して記載することはできません。

3つ目の引数については、以下のような設定を行えます。

with_front
「true」もしくは「false」を指定。初期値は「true」。
WP_Rewriteの$frontの設定値を、ストラクチャーの前に付加するかどうかを設定します。
例えば、「設定」→「パーマリンク設定」にてカスタム構造を選択し、「/blog/%post_id%/」と設定した場合、全ての記事に「/blog」というURLがつくことになるわけですが、その値を格納しているのがWP_Rewriteの$frontです。
つまり、これが「true」になっていて、カスタム構造を選択し、「/blog/%post_id%/」と設定すると、「add_permastruct」にて「/%blog%/%post_id%/」と設定していても、「/blog/%blog%/%post_id%/」と解釈されてしまいます。
混乱が起きるのを防ぐためにも、「false」に設定することをお勧めします。
ちなみに、3つ目の引数に単に「false」とすると、「with_front」を「false」に設定したと解釈されるため、上記の例では単に「false」としています。

ep_mask
整数を指定。初期値は「EP_NONE」。
Endpoint mask defining what endpoints are added to the structure.

paged
「true」もしくは「false」を指定。初期値は「true」。
Should archive pagination rules be added for the structure?

feed
「true」もしくは「false」を指定。初期値は「true」。
Should feed rewrite rules be added for the structure?

forcomments
「true」もしくは「false」を指定。初期値は「false」。
Should the feed rules be a query for a comments feed?

walk_dirs
「true」もしくは「false」を指定。初期値は「true」。
Should the 'directories' making up the structure be walked over and rewrite rules built for each in turn?

endpoints
「true」もしくは「false」を指定。初期値は「true」。
Should endpoints be applied to the generated rewrite rules?

仕上げ

仕上げに、「設定」→「パーマリンク設定」の「変更を保存」ボタンを押してください。
これを押さないと、ブログ全体に設定が反映されません。
もしくは、「flush_rules()」を実行することでも反映が可能です。
プラグインなどを作成する際は後者になるかと思います。

まとめ

この記事でやっていることを応用すれば、結構自由にパーマリンクをカスタマイズできると思います。
パーマリンクはサイトにとってはとても大切な要素ですので、是非マスターしてください。

え?途中で英語が出てきたって?
頑張って訳してください・・・。

  • このエントリーをはてなブックマークに追加

関連記事

Twitterにて更新情報などを配信しています

スポンサードリンク