WordPress
カスタマイズ事例

WORDPRESS CUSTOMIZATION

『親カテゴリ > 子カテゴリ > 年 > 月』というパーマリンク構造のパンくずリストをつくる

投稿のパーマリンク構造をこのようにしたいとします。

https://domain.com/親カテゴリ/子カテゴリ/年/月/詳細ページID/

たまにあるかもしれませんね。
カテゴリで分けつつ、さらに投稿月で分けるような構造。
 
パーマリンク構造自体は、管理画面の「設定 – パーマリンク」から「カスタム構造」を選んで次のように登録すれば、簡単に設定できます。

/%category%/%year%/%monthnum%/%post_id%/
 
ただ、パンくずがうまくいかなかった。

100ウェブでは普段からパンくずリストプラグインはBreadcrumb NavXTを使っていますが、今回のパンくずをBreadcrumb NavXTで吐き出すようにするのに、少々調べる必要がありました。
そもそも年月アーカイブは、カテゴリ関係なく投稿すべてを取得して年月に振り分ける仕様がWordPressの標準のためだからか、パーマリンク構造を管理画面から変更登録しても、Breadcrumb NavXTではそれを意識してくれませんでした。
パンくずの理想的には

ホーム > 親カテゴリ > 子カテゴリ > 2022年 > 11月

となってほしいところですが、Breadcrumb NavXTの標準機能のままでやると実際はこうなります。

ホーム > 2022年 > 11月

そうですか。。標準仕様のまんま、変わらないんですね。
 
なら直しましょう。

具体的にはBreadcrumb NavXTが用意してくれているbcn_after_fillにアクションフックをひっかけます。
テーマの functions.php に次の記述を加えます。

functions.php

function bcn_category_year_month_insert( $bcnObj ) {
	if ( is_date() ) {
		if ( get_post_type() == 'post' && is_archive() ) {
			$year          = get_query_var( 'year' );
			$cat_id        = (int) get_query_var( 'cat' );
			$the_cat       = get_category( $cat_id );
			$cat_url       = get_category_link( $cat_id );
			$year_url      = $cat_url . $year . '/';
			$cat_name      = $the_cat->name;
			$cat_slug      = $the_cat->slug;
			$parent_cat_id = '';
			while ( $the_cat->parent ) {
				$the_cat       = get_category( $the_cat->parent );
				$parent_cat_id = $the_cat->term_id;
			}
			$parent_cat_slug = ( $the_cat->slug != $cat_slug ) ? $the_cat->slug : '';
			$parent_cat_name = ( $the_cat->name != $cat_name ) ? $the_cat->name : '';
			$parent_cat_url  = '';
			if ( $parent_cat_id ) {
				$parent_cat_url = get_category_link( $parent_cat_id );
			}
			$end = count( $bcnObj->trail );
			for ( $i = 0; $i < $end; $i ++ ) {
				if ( $i == $end - 1 ) {
					$trail[] = $bcnObj->add( new bcn_breadcrumb( $cat_name, null, array( 'archive' ), $cat_url, null, true ) );
					if ( $parent_cat_slug ) {
						$trail[] = $bcnObj->add( new bcn_breadcrumb( $parent_cat_name, null, array( 'archive' ), $parent_cat_url, null, true ) );
					}
					$trail[] = $bcnObj->trail[ $i ];
				} else {
					$trail[] = $bcnObj->trail[ $i ];
					$trail[ $i ]->set_url( $year_url );
				}
			}

			$bcnObj->trail = $trail;
		}
	}

	return $bcnObj;
}

add_action( 'bcn_after_fill', 'bcn_category_year_month_insert' );

※ ただし、今回の記述はカテゴリが親子の2層までを想定しています。3層以上になる場合はもう少し処理を加える必要があります。ご留意ください。
 
コードの解説を少々しますと、
現在のページの年と、カテゴリと、その親カテゴリがあれば親カテゴリについて、それらのスラッグやらURLを取得しておいてから、「ホーム」をパンくず出力するところで、「ホーム」の前にカテゴリパンくずを挿し込む処理を加えています。
もしかしたらもっと簡単な方法があるのかもしれませんが、プラグインのコードはほとんど見ずに直そうとするとこういうコードになりました。
 
ひと月に1件程度しか投稿しないサイトでは必要ないですが、コツコツ月5件とかコラムを投稿する会社社長のコラムページなどは、こんなパーマリンク構造にするとメリットもありますね。

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

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