パーマリンクを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 を表示する

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

まずは追加してみる

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

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

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 の処理の中に

// Authors
$author_rewrite = $this->generate_rewrite_rules($this->get_author_permastruct(), EP_AUTHORS);
$author_rewrite = apply_filters('author_rewrite_rules', $author_rewrite);

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

なので、多分

function authorUrlRewrite($author_rewrite){
  $author_rewrite = ★ここで何か書き換える★
  return $author_rewrite;
}
add_filter( 'author_rewrite_rules', 'authorUrlRewrite' );

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

$author_rewrite = $this->generate_rewrite_rules($this->get_author_permastruct(), EP_AUTHORS);

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

とりあえずまがりんさんのスライドによると、

print '<pre>';print_r(get_option( 'rewrite_rules' ));print '</pre>';

を適当にどこかに書く事によって、現在のリライトルールの一覧を確認する事が出来るので、それを表示。
で、リライトルールは配列で格納されており、表示したい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 に配列で値を入れれば良いかなと思い、

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

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

最終的には

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' );

です。

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

参考にした記事

Follow me!

投稿者プロフィール

kurudrive
普段はWordPressを使って企業サイトなどを制作しつつ、
WordPress関連のイベントにもよく顔を出しています。
■WordPressテーマ「BizVektor」コア開発者
■最近のWordPressコミュニティでの活動
2013 WordCrab Fukui セッションスピーカー
2012 WordCamp Tokyo セッションスピーカー
2012 WordBeach Nagoya 実行委員 & セッションスピーカー

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

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です