サイドバーのアーカイブのリンク先を年月の後にカテゴリーIDを記述できれば解決できるかと思うのですが、
これだけでいいのであれば、ウィジェット「アーカイブ」の内部で使われているget_archives_link
フックを利用できます。
PHP
1
2add_filter( 'get_archives_link', 'teratail168423_HisaoAndo_3', 10, 6 );
3
4function teratail168423_HisaoAndo_3( $link_html, $url, $text, $format, $before, $after ) {
5 //$category_name = "item"; // 20190201 修正
6 $category_name = get_query_var('category_name'); // 20190201 修正
7
8 $link_html = preg_replace('/href=["\'](.*?)["\']/','href="$1?category_name=' . $category_name .'"', $link_html);
9
10 return $link_html;
11}
ただし、該当するカテゴリーの月別アーカイブが存在しない場合に404エラーになってしまうので、もう少し丁寧にやるなら、getarchives_join
とgetarchives_where
フックを使用する必要があります。
2019/02/01 追記
上記コードを修正。
2019/02/01 追記2
getarchives_join
とgetarchives_where
フックの処理を追加し、該当のカテゴリーに所属する投稿がある場合のみ月別アーカイブのリンクが表示されるようにしました。
また、カテゴリースラッグではなく、カテゴリーIDでの処理に変更にしました。
PHP
1add_filter( 'getarchives_join', 'teratail168423_HisaoAndo_1', 10, 2 );
2add_filter( 'getarchives_where', 'teratail168423_HisaoAndo_2', 10, 2 );
3add_filter( 'get_archives_link', 'teratail168423_HisaoAndo_3', 10, 6 );
4
5function teratail168423_HisaoAndo_1( $join, $r ) {
6 global $wpdb;
7
8 $join .= <<< EOF
9LEFT JOIN $wpdb->term_relationships AS tr ON ( $wpdb->posts.ID = tr.object_id )
10EOF;
11
12 return $join;
13}
14
15function teratail168423_HisaoAndo_2( $where, $r ) {
16 $cat = get_query_var('cat');
17
18 $where .= " AND tr.term_taxonomy_id =" . $cat;
19
20 return $where;
21}
22
23function teratail168423_HisaoAndo_3( $link_html, $url, $text, $format, $before, $after ) {
24 $cat = get_query_var('cat');
25
26 $link_html = preg_replace('/href=["\'](.*?)["\']/','href="$1?cat=' . $cat .'"', $link_html);
27
28 return $link_html;
29}