WordPressテーマSANGOの質問

記事一覧ショートコードで指定したカテゴリやタグのすべてに該当する記事のみを絞り込んで表示したい

アバター
Kura-kura.net

特定のカテゴリーやタグの記事を一覧表示するショートコード (category や onlytag) についてですが、複数のカテゴリやタグを指定すると、該当する記事が混ざって表示されると思います。
指定したカテゴリやタグのすべてに該当する記事のみを絞り込んで表示することはできないでしょうか。
以前のコメントでは、その機能は現在ないとのご回答でしたが、こちらを将来的に実装されるご予定はないでしょうか。
または、何らかの方法で個人的に実装することは可能でしょうか。

例えば、食べ物というカテゴリ内の、フルーツというタグが付いた記事のみを一覧表示したい場合どうすれば良いでしょうか。

よろしくお願い致します。

SANGO
質問板アーカイブ
コメントへの回答
サルワカくん
サルワカくん
2019/02/08

たとえば、「果物」と「りんご」という2つのカテゴリーを持つ記事のみ、という指定は難しいかもしれません。
一方で
「果物」というカテゴリーと「りんご」というタグを持つ記事のみ
というタグとカテゴリーのかけ合わせの絞り込みならいけるかもです。

イメージ的には後者で合っていますか?

アバター
Kura-kura.net
2019/02/08

お忙しい中早速ご返信いただきありがとうございます。

>「果物」というカテゴリーと「りんご」というタグを持つ記事のみというタグとカテゴリーのかけ合わせの絞り込みならいけるかもです。

ご返信いただいた内容の後者のイメージで考えていました。

ただ「果物(カテゴリ)」の記事の中から「りんご(タグ)」の付いた記事のみを抽出するというのが難しい場合、カテゴリは問わず「果物(タグ)」と「リンゴ(タグ)」の両方が付いた記事のみを抽出するというパターンでも大丈夫です。

お手数をお掛けしますが、こうした機能が実装できると大変助かります。
よろしくお願い致します。

サルワカくん
サルワカくん
2019/02/09

試してみたところ、以下のカスタマイズで可能だと思います。

1. 子テーマのfunctions.phpに以下のコードを貼り付けます。新しいショートコードを作っています。

// 特定のカテゴリーとタグに属する記事一覧のみ表示するショートコード
add_shortcode("posts_by_tag_cat", "output_cards_by_cat_and_tag");
function output_cards_by_cat_and_tag($atts) {
	$num = isset($atts['num']) ? esc_attr($atts['num']) : '4';
	$catid = isset($atts['catid']) ? explode(',', $atts['catid']) : null;	
	$tagid = isset($atts['tagid']) ? explode(',', $atts['tagid']) : null;
	$notin = isset($atts['notin']) ? explode(',', $atts['notin']) : null;
	$orderby = isset($atts['orderby']) ? $atts['orderby'] : 'date';
	$order = isset($atts['order']) ? ($atts['order']) : "DESC";
	
  $type = 'kanren';
  if (isset($atts['type'])) {
    if ($atts['type'] == 'card') {
      $type = 'card';
    } elseif ($atts['type'] == 'card2') {
      $type = 'card2';
    }
  }
	$output_posts = get_posts(array(
		'category__in' => $catid,
		'tax_query' => array(
			array(
				'taxonomy' => 'post_tag',
				'field' => 'term_id',
				'terms' => $tagid,
				'operator' => 'AND'
			)
		),
		'numberposts' => $num,
		'orderby' => $orderby,
		'order' => $order
	));
  $output = "";
  if ($output_posts && $type == "card") {
    foreach ($output_posts as $post) {
      $output .= sng_card_link(array('id' => $post->ID));
    }
    $output = '<div class="catpost-cards flex flex-wrap space-between">'.$output.'</div>';
  } elseif ($output_posts && $type == "card2") {
    foreach ($output_posts as $post) {
      $output .= sng_longcard_link(array('id' => $post->ID));
    }
  } elseif ($output_posts && $type == "kanren") {
    foreach ($output_posts as $post) {
      $output .= sng_entry_link(array('id' => $post->ID));
    }
  } //endif output_posts
  return $output;
}

2. ショートコードは、以下の形で挿入できます。

[posts_by_tag_cat catid="カテゴリーID" num="数" tagid="タグID"]

これにより「指定されたカテゴリーID」かつ「指定されたタグID」を持つ、という条件で記事一覧を取得できます。以下のような形でタグIDは複数条件で指定することができます。

[posts_by_tag_cat catid="カテゴリーID" num="数" tagid="1,15"]

ご確認よろしくお願いします。

アバター
Kura-kura.net
2019/02/09

週末にもかかわらずご対応いただきありがとうございます。

実際にサイトに実装してみましたところ、理想通りの完璧な動作でした。
また、複数タグ、さまざまなカードのスタイル、ランダム表示にも対応していただいていまして、本当に助かりました。

ありがとうございました。