回答編集履歴

3 コードのシンタックスエラー修正

退会済みユーザー

退会済みユーザー

2019/02/03 08:51  投稿

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

退会済みユーザー

退会済みユーザー

2019/02/01 17:31  投稿

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

退会済みユーザー

退会済みユーザー

2019/02/01 16:39  投稿

> サイドバーのアーカイブのリンク先を年月の後にカテゴリーIDを記述できれば解決できるかと思うのですが、
これだけでいいのであれば、ウィジェット「アーカイブ」の内部で使われている`get_archives_link`フックを利用できます。
```PHP
add_filter( 'get_archives_link', 'teratail168423_HisaoAndo_3', 10, 6 );
function teratail168423_HisaoAndo_3( $link_html, $url, $text, $format, $before, $after ) {
   $category_name = "item";
   //$category_name = "item"; // 20190201 修正
  $category_name = get_query_var('category_name'); // 20190201 修正
   $link_html = preg_replace('/href=["\'](.*?)["\']/','href="$1?category_name=' . $category_name .'"', $link_html);
   
   return $link_html;
}
```
ただし、該当するカテゴリーの月別アーカイブが存在しない場合に404エラーになってしまうので、もう少し丁寧にやるなら、`getarchives_join`と`getarchives_where`フックを使用する必要があります。
ただし、該当するカテゴリーの月別アーカイブが存在しない場合に404エラーになってしまうので、もう少し丁寧にやるなら、`getarchives_join`と`getarchives_where`フックを使用する必要があります。
---
20190201 追記
上記コードを修正。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る