パーマリンクをfunctions.phpからカスタマイズする(投稿者アーカイブのURLを変更)

お城めぐりGPSスタンプラリー「戦国攻城記」はWordPressで構築されており、各ユーザーのお城の攻略情報は投稿者アーカイブを活用しています。

そうなると、ユーザーページのURLは

http://kojoki.jp/author/ユーザーログイン名/

となるわけですが、このURLを変更したかったので、その際の手順をメモしておきます。

WordPressのURLの処理

そもそも、WordPressが使われているページのURLは、WordPressのトップページのURLに様々なパラメーターをつけると表示されます。

http://kojoki.jp/?p=286

これだとサイトの構造がわかりにくいし、SEOにもよろしくないので、例えば

http://kojoki.jp/about/ でアクセスされたら
http://kojoki.jp/?p=286 を表示する

みたいに処理してくれます。
今回はこのルールを追加したり、変更したりします。

まずは追加してみる

[sourcecode language="php"]
function authorUrlRewrite(){
// 第一パラメーターは表示したいURLの形式の正規表現
// 第二パラメーターは表示したいページのURLをパラメーターで書いたもの
// 第三パラメーターはリライトルールの優先順位
add_rewrite_rule('author/([0-9])/?$' , 'index.php?author=$matches[1]','top');
}
// authorUrlRewrite というURLのリライトルールを追加する
add_action( 'init', 'authorUrlRewrite' );
[/sourcecode]

まずは新たにパーマリンクを追加してみました。

add_action( 'init'
で 'authorUrlRewrite' という処理を追加で実行。

authorUrlRewriteの内容は

http://サイトのURL/author/数字(ID)/ の条件にマッチした時に
http://サイトのURL/index.php?author=数字(ID) のページを表示する
というルールを最初(top)に追加する

という感じです。

ちなみにデフォルトのルールだと

http://サイトのURL/author/ログイン名/ の条件にマッチした時に
http://サイトのURL/index.php?author_name=ログイン名

という感じになっています。

※正規表現についてわからない方は「フリーザにもわかる正規表現入門」がわかりやすいかと思います。

ここまでは多分大曲さんのスライド「パーマリンクをマスターしよう」を読んでいただいた方が良くわかると思います。

URLを変更する

今回したかったのはURLの追加ではなく変更です。
とりあえず、そのそもURLをごにょごにょしているのはググってみたところ WP Rewrite ってヤツらしいです。

で、こいつが何をしているのかと見てみる。

プラグイン「Source View」が超ベンリ。

Source View を使って WP Rewrite のソースの内容を表示した状態で、ブライザ内で「author」のキーワードを検索。

すると、WP Rewrite の処理の中に

[sourcecode language="php"]
// Authors
$author_rewrite = $this->generate_rewrite_rules($this->get_author_permastruct(), EP_AUTHORS);
$author_rewrite = apply_filters('author_rewrite_rules', $author_rewrite);
[/sourcecode]

という箇所を発見。投稿者アーカイブのURLだけを書き換え出来るように『author_rewrite_rules』というフィルターが用意されてます。

なので、多分

[sourcecode language="php"]
function authorUrlRewrite($author_rewrite){
$author_rewrite = ★ここで何か書き換える★
return $author_rewrite;
}
add_filter( 'author_rewrite_rules', 'authorUrlRewrite' );
[/sourcecode]

こんな感じで書き換えたいルールを記述するのだろうという事は想像出来るのですが。。。

[sourcecode language="php"]
$author_rewrite = $this->generate_rewrite_rules($this->get_author_permastruct(), EP_AUTHORS);
[/sourcecode]

この右側の意味がさっぱり理解出来なかったのでかなり手こずりました。

とりあえずまがりんさんのスライドによると、
[sourcecode language="php"]
print '<pre>';print_r(get_option( 'rewrite_rules' ));print '</pre>';
[/sourcecode]

を適当にどこかに書く事によって、現在のリライトルールの一覧を確認する事が出来るので、それを表示。
で、リライトルールは配列で格納されており、表示したいURLがキーになってて、実際に表示するパラメータ付きのURLが値になっているようです。

Array
(
    [post/post_format/(.+?)/?$] => index.php?taxonomy=post_format&term=$matches[1]
    [post/areas/(.+?)/?$] => index.php?taxonomy=areas&term=$matches[1]
    [info/info-cat/(.+?)/?$] => index.php?taxonomy=info-cat&term=$matches[1]
    [info/archive//?$] => index.php?post_type=info
    [info/archive//feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?post_type=info&feed=$matches[1]
    [info/archive//(feed|rdf|rss|rss2|atom)/?$] => index.php?post_type=info&feed=$matches[1]
    [info/archive//page/([0-9]{1,})/?$] => index.php?post_type=info&paged=$matches[1]
    // 以下略
)

上記は get_option( 'rewrite_rules' ) で表示される内容の一部。
配列のキーである左側が「表示したいURL」。配列の値である右側が「実際に表示するパラメータ付きのURL」になっている。

と、いう事は、$author_rewrite に配列で値を入れれば良いかなと思い、

[sourcecode language="php"]
$author_rewrite = array(
'author/([0-9]{1,100})/?$' => 'index.php?author=$matches[1]'
);
[/sourcecode]

と書いてみたら上手く行きました。

最終的には

[sourcecode language="php"]
function authorUrlRewrite($author_rewrite){
$author_rewrite = array(
'author/([0-9]{1,100})/?$' => 'index.php?author=$matches[1]'
);
return $author_rewrite;
}
add_filter( 'author_rewrite_rules', 'authorUrlRewrite' );
[/sourcecode]

です。

いやはや、@jim0912さん、@gatespace_kさん & Source View作者の水野さん、毎度お世話になります
m(T-T)m

参考にした記事

Follow me!

投稿者プロフィール

kurudrive
名古屋のウェブ制作会社数社に10年程度務めた後、株式会社ベクトル設立。
企画・運営・コンサルティング〜WordPressを中心としたシステム開発まで幅広く携わる。
[ 著書 ]
・いちばんやさしいWordPressの教本(共著)
・現場でかならず使われているWordPressデザインのメソッド(共著)
[ 最近のWordPressコミュニティでの活動 ]
2018 WordCampOsaka セッションスピーカー
2017 WordCampKyoto セッションスピーカー
2016 WordCampTokyo LT
2016 WordCampKansai ハンズオン世話役
2015 WordCampTokyo セッションスピーカー
2015 WordCampKansai セッションスピーカー
2014 WordFesNagoya 実行委員 & セッションスピーカー
2013 WordCampTokyo セッションスピーカー(パネラー)
2013 WordFesNagoya 実行委員 & セッションスピーカー
2013 WordCrabFukui セッションスピーカー

シンプルでカスタマイズしやすいWordPressテーマ

Lightningは twitter Bootstrap ベースのシンプルでカスタマイズしやすいWordPressテーマです。
プラグイン VK All in One Expansion Unit とセットで使う事でビジネスサイトにもブログにも活用できます。