少し悩んだので、記述しとくぜ。
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/年月日/投稿名 にしてくれって書いてある。
……と忘備録

「function.phpに記述しろ」って言ってるページがエラーだらけなの怖すぎるんですが大丈夫でしょうか…