답변:
아래의 답변은 단순화되었으며 목록을 출력하기 전에 3 개의 일치하는 태그가 있는 게시물 을 확인하도록 확장 될 수 있습니다 . 하나의 쿼리를 사용하고 3 개의 일치하는 태그가있는 게시물이 하나 이상 있다고 가정합니다.
//List of tag slugs
$tags = array('foo', 'bar', 'chocolate', 'mango', 'hammock', 'leaf');
$args = array(
'tag_slug__in' => $tags
//Add other arguments here
);
// This query contains posts with at least one matching tag
$tagged_posts = new WP_Query($args);
echo '<ul>';
while ( $tagged_posts->have_posts() ) : $tagged_posts->the_post();
// Check each single post for up to 3 matching tags and output <li>
$tag_count = 0;
$tag_min_match = 3;
foreach ( $tags as $tag ) {
if ( has_tag( $tag ) && $tag_count < $tag_min_match ) {
$tag_count ++;
}
}
if ($tag_count == $tag_min_match) {
//Echo list style here
echo '<li><a href="'. get_permalink() .'" title="'. get_the_title() .'">'. get_the_title() .'</a></li>';
}
endwhile;
wp_reset_query();
echo '</ul>';
편집 : 변수 $tag_min_match
를 조정하면 일치 횟수가 설정됩니다.
이를 수행하는 한 가지 방법이 있습니다.
5 개의 태그 세트가 주어지면 {a, b, c, d, e}
:
1) PHP에서 반복하지 않고 3 개의 요소를 포함하는 가능한 모든 서브 세트를 생성하십시오.
{a, b, c}
{a, b, d}
{a, b, e}
{a, c, d}
{a, c, e}
{b, c, d}
{b, c, e}
{c, d, e}
2) 이러한 하위 집합을 대규모 분류법 쿼리로 변환하십시오.
$q = new WP_Query( array(
'tax_query' => array(
'relation' => 'OR',
array(
'terms' => array( 'a', 'b', 'c' ),
'field' => 'slug',
'operator' => 'AND'
),
array(
'terms' => array( 'a', 'b', 'd' ),
'field' => 'slug',
'operator' => 'AND'
),
...
)
) );
sprclldr 의 접근 방식은 내가 사용한 것입니다. while 루프는 다음과 같이 사용했습니다.
$relatedPosts = $tagged_posts->posts;
$indexForSort = array();
for ($i = count($relatedPosts) - 1; $i >= 0; $i--) {
$relatedPostTags = get_tags($relatedPosts[$i]->ID);
//get the ids of each related post
$relatedPostTags = $this->my_array_column($relatedPostTags, 'term_id');
$relatedPostTagsInPostTag = array_intersect($tags, $relatedPostTags);
$indexForSort[$i] = count($relatedPostTagsInPostTag);
}
//sort by popularity, using indexForSort
array_multisort($indexForSort, $relatedPosts, SORT_DESC);
그런 다음 최상위 게시물을 가져옵니다.
$a_relatedPosts = array_slice($relatedPosts, 0, $this->numberRelatedPosts);
my_array_column
PHP 5,5의 array_column과 비슷한 기능입니다.
protected function my_array_column($array, $column) {
if (is_array($array) && !empty($array)) {
foreach ($array as &$value) {
//it also get the object's attribute, not only array's values
$value = is_object($value) ? $value->$column : $value[$column];
}
return $array;
}
else
return array();
}
그것은 최초의 질문에 대답하지 않습니다 (하지만 내 근본 문제를 해결 ,)로 : 3 개 일반적인 태그,이 모든 동일주고 일부 게시물과 아무 관련 게시물이 존재하지 않는 경우.