WordPressでURLからcategoryを取除く方法の問題点:メモ

悩み
悩み

結局目的は達成していないのであまり意味もないのですが、一応調査過程をメモとして。

なお、キャッシュの問題か、どうも動作が安定しないので私の単なる勘違いかもしれません。

キャッシュを削除しても更新が反映されなかったりが多々ありましたので。

もちろん上手くいったほうがよいのですが、現にうまくいっていないので「うまくいく」という情報が多いと不安になります…。

[WordPress4.4(執筆時)]

実現したかったこと

結局できませんでしたが、実現したかったことは以下の通りです。

  • パーマリンクをカテゴリーベースに設定(e.g. /%category%/%post_id%/)
  • URLから「category」を消す
  • プラグインを使わない

なお、WordPressでcategory除去を行う方法を探すと、概ね以下の4つの方法が見つかるかと思います。

  • プラグインで除去(除去専用やSEO系の設定など)
  • 管理画面>パマリンク設定内の「カテゴリーベース」を利用して除去
  • .htaccessで除去(RewriteRuleを追加)
  • functions.phpにコードを記述して除去

今回はこのうちの下の3つが検討の範囲となりますが、4つめの「functions.phpにコードを記述して除去」に関してはプラグインを使う方法とあまり大差がないので今回は除きます。
一応このコードだけをとりあげた記事もみつかりますが、カテゴリーアーカイブは良くとも年月日アーカイブではページングが壊れているものもあり注意が必要です。

.htaccessを使う方法の問題点

.htaccessを使う方法としては、色々なサイトで以下のコードが散見されます。


//e.g.1
RewriteRule ^category/(.+)$ http://www.yourblog.com/$1 [R=301,L]
//e.g.2
RewriteRule category/(.*)$ $1 [R=301,L]

上記コードは確かに一見動作しますが、日付やカテゴリーなどのアーカイブページでページネーションが動かなくなります。

具体的には、2ページ目(e.g. http://www.yourblog.com/categry1/page/2/)にアクセスすると404エラーとなります。

RewriteRuleの記述位置

WordPressはパーマリンクの更新の度にRewriteRuleを書き換えます。

そのため、.htaccessにRewriteRuleを手書きで追加しても消えてしまいます。

この場合の対処法は以下のコーデックスに書かれていました。

上記ページの「“Pretty” パーマリンクの使い方 」の「.htaccess ファイルはどこ?」という小見出しの直前に以下の記述があります。

他に mod_rewrite 規則がある場合は、WordPress の規則よりも前に記述してください。

英語サイトの情報

日本語のサイトではどうもわからないので英語圏のサイトを調べてみましたが、同種のコードを提案しているサイトはあれどページングについては触れられているページがなかなか見つからず。

そんな中で以下の記事を発見。

投稿は2009年と古いため、WPのバージョンなどを考えると内容的に不安ではありますが、コメントはそれ以降も続いていました。コメントの中には以下のような内容があります。

This solution break the pagination. Doesn’t work.

「ページネーションが動かない」とのこと。

なお、この記事のコメントの流れとしては「プラグインを使用すべし」となっている模様です。

プラグインに頼り過ぎるのは嫌だという感じのものもありましたが、代替案の提示はなさそうでした。

管理画面のパーマリンク設定での対応

2014年の上記記事などで示されている「管理画面のパーマリンクで対応する方法」もありますが、こちらもページングができず。

調べたところ、「.」ではなく「/.」でしたが以下のような9年前のスレッドを見つけました(なお、実際にカテゴリーベースに「/.」を入れると「.」だけで保存されます)。

該当箇所は以下の部分です。

なお、上記の次のコメントで以下のように書かれています。

I’ve seen this solution on several threads here (e.g. link – closed but might prove useful), but the response to this is: does it work with paged archives, i.e., /%category%/page/2/? I’ve tried it (not in 2.1) and it doesn’t work. Just a heads-up. 🙂

試したところアーカイブでは動作しなかったそうです。

結び

色々調べて結局プラグイン対応という結論に達しています。

または、仕組みを自作するかでしょうか。

URL自体が変わるため、プラグインの更新不足や不具合による動作不良はリスクになりえます。

そういう意味ではプラグインに頼らずに、コードを自作できるのが一番かもしれません。

WordPress4.4で動くプラグイン内のcategory_rewrite_rulesフィルターフック

WP3.1以降category_rewrite_rulesがなくなったということですが、試しにいれたcategory除去用のプラグインの中ではcategory_rewrite_rulesがフックとして使われていました。

これは「WP Remove Category Base」というプラグインで、3.5+であり、更新が止ったままのプラグインということではありません。

なぜこのフックが使えるのか調べた所、おそらくこれかなというのが以下の情報です。

This filter hook does not technically exist, but is merely a usage of {$permastructname}_rewrite_rules

The dynamic portion of the hook name, $permastructname, refers to the name of the registered permastruct, e.g. ‘post_tag’ (tags), ‘category’ (categories), etc.

Source file: wp-includes/class-wp-rewrite.php

つまり、{$permastructname}_rewrite_rulesがあり、そこでcategoryが使えるから、記述としてはcategory_rewrite_rulesと書けばフックされるということかなと考えています。

0人がこの記事を評価

役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。

連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。

コメント欄