3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

wordpress add_rewrite_ruleでいろいろと試した件

Posted at

ワードプレスのパーマリンク設定で、投稿記事を

にしたところ、
カテゴリーページも

という感じになってしまいまいました。

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/lessonhttps://somepage.jp/media/category/lesson に飛ばせば良いのかなと思い

add_rewrite_rule('lesson/?', 'media/category/lesson', 'top');
とすればいいかなと思ったのですが、これがうまく動かない。。

wordpressの裏側では何が起きているのか?

  1. index.phpへのrewriteの場合は、.htaccessの RewriteRule についてはいじらず、index.php以降のロジックで何とかする
  2. 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

とかを指定することになります

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?