ワードプレスのパーマリンク設定で、投稿記事を
にしたところ、
カテゴリーページも
という感じになってしまいまいました。
index.php (サイトホーム)は newsカテゴリーだけを表示し、lesson, member紹介はmediaとは異なる見え方をしようかなと思っていたので、urlとしても media配下に置きたくない思いがあります。。
ゴール
newsカテゴリーの投稿は、メディアページとして
https://sosmepage.jp/media/%postname%/ に
レッスン紹介ページは、レッスン一覧のページとしては
https://somepage.jp/lesson
各レッスン詳細のページは
https://somepage.jp/lesson/voice
同じように講師紹介ページは、講師一覧ページとしては
https://somepage.jp/member
講師詳細ページとしては
https://somepage.jp/member/fumika
というURLで表示する
実現方法
新規関数(function)の中から add_rewrite_rule を呼び出し、その関数を、initイベントでフックされるようにする
function custom_rewrite()
{
add_rewrite_rule('lesson/?$', 'index.php?category_name=lesson', 'top');
add_rewrite_rule('lesson/([^/]+)/?', 'index.php?name=$matches[1]', 'top');
add_rewrite_rule('member/?$', 'index.php?category_name=member', 'top');
add_rewrite_rule('member/([^/]+)/?', 'index.php?name=$matches[1]', 'top');
}
add_action('init', 'custom_rewrite');
はまったこと
その1
add_rewrite_ruleを追記した場合は、設定>パーマリンクの設定 より 「変更の保存」ボタンを押して設定をリフレッシュする必要があります
その2
最初は、https://somepage.jp/lesson を https://somepage.jp/media/category/lesson に飛ばせば良いのかなと思い
add_rewrite_rule('lesson/?', 'media/category/lesson', 'top');
とすればいいかなと思ったのですが、これがうまく動かない。。
wordpressの裏側では何が起きているのか?
- index.phpへのrewriteの場合は、.htaccessの RewriteRule についてはいじらず、index.php以降のロジックで何とかする
- index.phpへのrewriteの場合は、.htaccessに RewriteRuleが追記される
2が曲者なのです。。
add_rewrite_rule('lesson/?', 'media/category/lesson', 'bottom');
と記載しても
add_rewrite_rule('lesson/?', 'media/category/lesson', 'top');
と記載しても
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteRule ^lesson/? /media/category/lesson [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
となります。Lオプションがついちゃうので、 index.phpにたどり着かないのよね。。
htaccessの書き換えは、add_actionをしただけでは実施されないので、
設定 > パーマリンク設定 で何もせずに 「変更を保存」 を実行することが必要になります
逆に、外部サイトとか、別のサブディレクトリとかに飛ばしたい場合にはよさそう。。
パーマリンクの設定
なので、add_rewrite_rule には、パーマリンクの設定で記載したURLを書いても意味がないです。。
そのため、wordpress内のカテゴリーページや記事ページを呼び出したい場合は、第二引数に index.php?を指定する必要がありました。
なので、
- 投稿idを指定する場合: index.php?page_id=1 と
- スラグを指定する場合: index.php?name=$matches[1] とか
- カテゴリ一覧を指定する場合: index.php?category_name=lesson
とかを指定することになります