少し悩んだので、記述しとくぜ。
WordPress 特定カテゴリのパーマリンクを変更する
特定のカテゴリーだけパーマリンクを変更したい時、管理画面のパーマリンクだけではできないので、function.phpに記述。結論から書くと、工程は2工程。
悪いがサクっとコピペはできねぇ。
なぜならパーマリンクは理解しないと、とくに表示がおかしくなるから。
だが理解できればアホでも可能。
覚えて実装する手順は2つ。
- そのアドレスで目的のページが出るようにする。
- 内部のリンクも書き換える。
こんだけだ。
1.そのアドレスで目的のページが出るようにする。
//例えばcategory/文字列 function custom_rewrite_category() { add_rewrite_rule('category/([^/]+)/?', 'index.php?category_name=$matches[1]', 'top'); } add_action('init', 'custom_rewrite_category');
先に結論からかくとこんな感じだ。
解説すると、
‘category/文字列/ ってアドレスなら、index.php?category_name=文字列と同じ表示してくれ ことだ。
WorddPresssのパーマリンクってのは、内部では本来ではあれば、他の1から書いたコードのように、
index.php?p=xxxxx&tag=xxxx
上記のようにpっていうようなパラメーター値があり、それを読んで変更してる。
http://kato.space/あうあう/ほげほげ/ っていうアドレスがあれば、
内部ではhttp://kato.space/index.php?p=”ほげほげ”&tag=”ほげほげ” って具合に読み取ってるわけだ。
このルールはリライトルールな訳でね、/xxx/xxx/のときはこうだって書き換えてる。
フレームワークだとパーサとかいうが、まあ、そんな感じだ。
つまりだ、/xxxxx/yyyyy/ の時にこういう動きしたいっていう要望があれば、
それに合わせたrewrite_ruleを追加してやればいいってこと。
…でだ、そうなると、WordPressのindex.php?p= のこのpに相当する部分がわからなきゃ困る。
先に結論から書くと、pは投稿のIDの文字列。
つまりだ、カテゴリで検索するのか投稿スラッグだが
このpの部分に相当する部分がわからきゃだめなわけだ。
これはwp-includes/class-wp.php にかいてあるぞ。ざっくりはこうだ。
パラメーター名 | 役割 | 指定例 |
---|---|---|
m | 日時 | 201304 |
p | 投稿のID | 1234 |
posts | 不明 | |
w | 週 | 12 |
cat | カテゴリーのterm_id | 1 |
withcomments | コメントフィード関連 | 1 |
withoutcomments | コメントフィード関連 | 0 |
s | サイト内検索の検索文字列 | WordPress |
search | 不明 | |
exact | 検索時完全一致にするかどうか | 1 |
sentence | 検索文字列の分解を行うか | 1 |
calendar | 不明 | |
page | ページ分割時のページ送り数 | 3 |
paged | アーカイブページのページ送り数 | 5 |
more | moreの表示 | 1 |
tb | トラックバック | 1 |
pb | 不明 | |
author | 作成者のユーザーID | 2 |
order | アーカイブの昇順・降順 | asc |
orderby | アーカイブの順列 | date |
year | 年 | 2013 |
monthnum | 月 | 4 |
day | 日 | 16 |
hour | 時 | 20 |
minute | 分 | 21 |
second | 秒 | 23 |
name | 投稿スラッグ | hello-world |
category_name | カテゴリースラッグ | uncategorized |
tag | タグのterm_id | 4 |
feed | フィードの種類 | rss2 |
author_name | 作成者名 | omagari |
static | 不明 | |
pagename | 固定ページのスラッグ | sample-page |
page_id | 固定ページのID | 2 |
error | レスポンスコード? | 404 |
comments_popup | コメントポップアップ | |
attachment | メディアのスラッグ | koara |
attachment_id | メディアのID | 11094 |
subpost | attachmentのエイリアス | |
subpost_id | attachment_idのエイリアス | |
preview | プレビューかどうか | 1 |
robots | ロボットテキストかどうか | 1 |
taxonomy | 分類 | category |
term | 分類のスラッグ | uncategorized |
cpage | コメント分割時のページ送り数 | 4 |
post_type | 投稿タイプスラッグ | custom_post |
embed | embed要素 |
この表を見て、
//例えばcategory/文字列 function custom_rewrite_category() { add_rewrite_rule('category/([^/]+)/?', 'index.php?category_name=$matches[1]', 'top'); } add_action('init', 'custom_rewrite_category');
上に書いた例は、
‘category/([^/]+)/?’, 正規表現で書いたマッチした部分、がindex.php?xxxxxx= xxxxxxとして行くわけだ。
あ、パーマリンク設定ページで再設定押さないと反映しないからな。
内部のリンクも書き換える。
でだ、上記で直接アドレスを叩けば、そのページが見える。
だがサイト内部はアドレスがそのままだ、
なので、これは内部リンクを書き換える。
add_filter( 'post_link', 'custom_permalink', 10, 3 ); function custom_permalink( $permalink, $post, $leavename ) { $category = get_the_category($post->ID); if ( !empty($category) && $category[0]->cat_name == "News" ) { $permalink = trailingslashit( home_url('/news/' . mysql2date('Ymd', $post->post_date) .'/'. $post->post_name ) ); } return $permalink; }
内部のパーマリンクを変更してる。
特にいいのはmysql2date
つまりだ、
この例は、
if ( !empty($category) && $category[0]->cat_name == “News” ) { カテゴリが Newsなら、
$permalink = trailingslashit( パーマリンクを
home_url(‘/news/’ . ベースはnewsって付けて
mysql2date(‘Ymd’, $post->post_date) .’/’. $post->post_name ) ); }年月日/投稿名
/news/年月日/投稿名 にしてくれって書いてある。
……と忘備録