टैग की एक सूची के कम से कम 3 टैग के साथ पोस्ट


13

उदाहरण के लिए, टैग कर रहे हैं { foo, bar, chocolate, mango, hammock, leaf}

मैं इनमें से कम से कम 3 टैग के साथ सभी पोस्ट ढूंढना चाहूंगा ।

टैग के साथ एक पोस्ट { foo, mango, vannilla, nuts, leaf} इसकी वजह यह है की भरपाई कर देंगे { foo, mango, leaf} - तो टैग की आवश्यक सेट से कम से कम 3 टैग।

इसलिए यह मिलान किए गए पदों की सूची में होगा।

क्या सभी पोस्ट के माध्यम से कई लूप्स किए बिना ऐसा करने का एक सरल तरीका है?

जवाबों:


8

नीचे दिए गए उत्तर को सरल किया गया है, और यह जांचने के लिए बढ़ाया जा सकता है कि क्या सूची पोस्ट करने से पहले किसी भी पोस्ट में 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को समायोजित करने से मैचों की संख्या निर्धारित होगी।


2

यहाँ यह करने का एक तरीका है:

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'
    ),
    ...
  )
) );

1

स्प्रक्लड्र का दृष्टिकोण वह है जिसका मैंने उपयोग किया था। जबकि पाश के लिए, यहाँ है कि मैं क्या बजाय इस्तेमाल किया है:

$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 सामान्य टैग के साथ कोई संबंधित पोस्ट नहीं है, तो यह सभी कुछ पोस्ट देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.