WordPress 特定カテゴリのパーマリンクを変更する

  • 2017年10月19日
  • 2017年10月19日
  • CMS, WordPress
  • 2259view

少し悩んだので、記述しとくぜ。

WordPress 特定カテゴリのパーマリンクを変更する

特定のカテゴリーだけパーマリンクを変更したい時、管理画面のパーマリンクだけではできないので、function.phpに記述。結論から書くと、工程は2工程。

悪いがサクっとコピペはできねぇ。
なぜならパーマリンクは理解しないと、とくに表示がおかしくなるから。
だが理解できればアホでも可能。

覚えて実装する手順は2つ。

  1. そのアドレスで目的のページが出るようにする。
  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/年月日/投稿名 にしてくれって書いてある。

……と忘備録

 

最新情報をチェックしよう!
>最強のWordPressテーマ「THE THOR」

最強のWordPressテーマ「THE THOR」

システムの構築・保守運用「   」 社内システム担当が欲しいが、専属で雇うほどの仕事量はない。 必要な時に必要なだけ頼りたいというお悩みを持つ企業様へ専門知識を持って対応を行っております。 サーバから各種システムまで自社・他社で構築されたシステムに対してサポートを行っております。

CTR IMG