ট্যাগগুলির তালিকাতে কমপক্ষে 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) পিএইচপি-তে, পুনরাবৃত্তি ছাড়াই, 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

পদ্ধতির sprclldr আমি ব্যবহার করা হয়। লুপ লুপ হিসাবে, আমি এখানে পরিবর্তে ব্যবহার করেছি:

$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 পিএইচপি 5,5 এর অ্যারে_ কলামের চেয়ে একটি অনুরূপ ফাংশন:

  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 টি সাধারণ ট্যাগের সাথে সম্পর্কিত কোনও পোস্ট না থাকে, তবে এই সবগুলি কিছু পোস্ট দেবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.