WordPress
カスタマイズ事例

WORDPRESS CUSTOMIZATION

複数のターム(カテゴリ)に所属する投稿のスラッグ(URL)を、運営側が意図するスラッグにする

100ウェブでは、携わらせていただくあらゆるサイトで、SEOを考慮した最適な投稿パーマリンクとして、カテゴリー(ターム)の下層に投稿というツリー構成にしています。
要するにこんな感じです。

https://100webdesign.jp/category/postid/
(ドメイン/カテゴリー/投稿ID)

※ パーマリンクの設定方法については「おすすめの初期設定について」の「6.設定メニュー - パーマリンク設定」を参考にしてください。

このパーマリンク構造は、閲覧者におけるサイトの分かりやすさおよびSEO的観点の両面において最強だと思いますが、投稿を複数のカテゴリに所属させる場合、このパーマリンクはどうなるでしょう。
--答えは簡単で、サイト内で各ページはそれぞれ一意に定められていないといけないので、複数のカテゴリに所属させようが、URLは
https://100webdesign.jp/category/postid/
という一意のURLになります。
ではこのときの「category」部分は複数あるカテゴリの中のどれにしましょう?
まあ、メインとなるカテゴリー(ターム)にしましょう、というのがだいたいの運営者側の結論にはなると思いますが、ここでひとつ困ることがあります。

投稿を複数のカテゴリに所属させた場合、カテゴリスラッグは運用者側では自由に指定できず、自動でカテゴリIDの一番若いカテゴリスラッグになってしまう

ということです。

システム的な解決としては合理的で間違ってはいないんですが、かといってどうにかしたいなあ、というのが運営者側の本音でしょう。
 
そこで今回は、複数のカテゴリに所属させたい投稿のURLを運営者の意図したURLにする方法として、
複数のカテゴリー(ターム)に所属させずにメインカテゴリー1つにだけ所属させ、投稿の属性情報として、所属させたいすべてのカテゴリー(ターム)情報を紐づけるやり方
を紹介します。
そのためにはカスタムフィールドを使います。またまた、アドバンストカスタムフィールドの登壇です。
 
言葉で説明しても分かりづらいので、登録イメージも絡めながら例として以下のケースについて具体的に説明します。
例)
カスタム投稿: サービス紹介
カスタムタクソノミー: サービスカテゴリ(services_cat)

 
【アドバンストカスタムフィールドの登録画面】


フィールドタイプを「タクソノミー」に、
フィールドラベル名は何でも良いので、たとえば「紐づけるカテゴリ」とかに、
フィールド名を「services_attach_cats」に、
タクソノミーを「サービスカテゴリ」に、
返り値を「タームID」に、それぞれ設定し、
表示条件には「サービス紹介」を設定します。
以上でアドバンストカスタムフィールド側の設定は完了。
 
次にサービス紹介の投稿を作成します。
ここで、カテゴリーを複数設定したいところを、複数選択せずにメインカテゴリー1つだけ設定します。
こうすれば、当然ですがスラッグは運営者が狙った通りの /メインカテゴリー/投稿ID/ になります。
 
【サービス紹介の投稿画面】

そして、アドバンストカスタムフィールドが出力する「紐づけるカテゴリ」のところで、複数設定したいカテゴリーすべて(メインカテゴリーにも)にチェックを入れます。

これで管理画面からの登録はすべて完了。
 
あとは、このままだとメインカテゴリー以外のカテゴリ別投稿一覧ページで当該投稿が表示されないので、本来所属させたいカテゴリーページすべてで当該投稿が表示されるようにします。
taxonomy_services_cat.php
このファイルの投稿一覧取得処理のところで、カスタムフィールド「紐づけるカテゴリ」に現在のサービスカテゴリ名を設定しているすべての投稿を取得するようにします。

$post_type        = 'services';
$taxonomy         = 'services_cat';
$current_slug     = get_query_var('term'); //現在のサービスカテゴリスラッグを取得
$the_term = get_term_by('slug', $current_slug, $taxonomy);
$current_term_id = (int)$the_term->term_id;
$the_query = new WP_Query(array(
	'post_type'      => $post_type,
	'posts_per_page' => -1,
	'meta_query' => array(
		array(
			'key'     => 'services_attach_cats',  //「紐づけるカテゴリ」の配列がシリアライズされて入る
			'value'   => serialize(strval($current_term_id)),  //keyがシリアライズされているので値のほうもシリアライズする
			'compare' => 'LIKE' //部分一致
		),
	)
));
if ($the_query->have_posts()) {
	while ($the_query->have_posts()) {
		$the_query->the_post();
		the_content();
	}
}

以上です。
 
あまり使うシーンは無いかもしれませんが、サービスラインナップがたくさんあってそれらが複数の事業ドメインをまたがるような企業サイトなどでは、こういった仕様でサイトを制作することがありえます。

【100ウェブ新着情報メルマガ】

WordPressカスタマイズ事例やウェブ制作ノウハウの新着情報、お役立ち情報を
リアルタイムにメルマガ配信!