[WordPress General] URL から category を取り除く方法

memo.

category base とは

パーマリンクの設定に %category% を含めていると、下記のように category とが含まれて表示されます。

http://example.com/category/your_ category

この部分は、category base と呼ばれ、パーマリンクの前に置かれるようです。

カテゴリーベースとタグベース
カテゴリーベースとカテゴリーベースは、カテゴリー/タグアーカイブのパーマリンクの前に置かれます。

カテゴリーベースのデフォルト値は、categoryです。タグベースのデフォルト値は、tagです。値を変更することはできますが、取り除くことはできません。
これらのパーマリンクはほとんどのシステムで問題なく動作しますが、問題が生じる環境もあります。

取り除く方法がいくつかあるよう。

プラグインを利用する

プラグインで削除する方法が一般的なよう。

以下の3つあたりが多い。

ただし日本語の扱いや、プラグインをやめたらページが表示されないといった不具合報告を見かけました。

パーマリンク設定で取り除く

管理画面の「設定 ≫ パーマリンク設定」で取り除く方法。
カテゴリーベースに . を設定する。

2014-06-19_wp_01

初期値の「category」をカレントディレクトリで置き換えるのか?
WordPress Codex あたりに記載さていても良さそうだが、なぜか載っていない。

カスタム構造の値を「/%category%/%post_id%」にすると、サブカテゴリーページが404エラーとなり、表示されなくなるため、必ず「.html」を付けてください。

これが原因?

追記(2017/03/21)

archive ページのページネーションに影響がある。
下記を設定するとうまく動くよう。

カスタム構造 /%category%/%post_id%.html
カテゴリーベース .

このブログは下記で動いている(WP-PageNavi を利用)。

カスタム構造 /blog/%year%/%monthnum%/%day%_%post_id%.html
カテゴリーベース

function.php で置換する

ディフォルトの「category」を function.php を使って削除する。

上記で紹介されていたコード。

function.php
add_filter('user_trailingslashit', 'remcat_function');
function remcat_function($link) {
    return str_replace("/category/", "/", $link);
}
add_action('init', 'remcat_flush_rules');
function remcat_flush_rules() {
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}
add_filter('generate_rewrite_rules', 'remcat_rewrite');
function remcat_rewrite($wp_rewrite) {
    $new_rules = array('(.+)/page/(.+)/?' => 'index.php?category_name='.$wp_rewrite->preg_index(1).'&paged='.$wp_rewrite->preg_index(2));
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}

WordPress の内部についても分かってないといけないですね。

Apache の mod_rewrite で書き換える

.htaccess あたりに追記する。

おなじく上記で紹介されていたコード。

RewriteRule ^category/(.+)$ http://yourwordpresssite.com/$1 [R=301,L]