পোস্টের ধরণে বিভিন্ন যুক্তি দিয়ে কোয়েরি একত্রিত করা


11

আমি একটি সাইটে একটি বিভাগ তৈরি করছি যেখানে আমি দুটি লুপের মধ্যে দুটি পৃথক পোস্টের সংশ্লেষ করছি এবং তারপরে এলোমেলোভাবে প্রদর্শন করছি। সমস্যাটি হ'ল, প্রতি প্রকারের পোস্টের পরিমাণ সীমাবদ্ধ করার উপায় খুঁজে পেতে আমার খুব কষ্ট হচ্ছে ।

এখানে আমি চেষ্টা করেছি:

  • একাধিক পোস্ট প্রকারের সাথে একটি ক্যোয়ারী অ্যারে দিয়ে অর্জন করা যেতে পারে:

    $args = array( 'post_type' => array( 'photos', 'quotes' ), ...

    ... তবে প্রতি প্রকারের নির্দিষ্ট সংখ্যক পোস্টের মধ্যে সীমাবদ্ধ থাকতে পারে না।

  • এটিতে WP_Query চালানোর আগে দুটি ক্যোয়ারী আর্গুমেন্ট অ্যারে মার্জ করা:

    $photos = array( 'post_type' => 'photos', 'posts_per_page' => 15, 'orderby' => 'rand' );
    $quotes = array( 'post_type' => 'quotes', 'posts_per_page' => 5, 'orderby' => 'rand' );
    
    $args = $photos + $quotes;
    // Also tried array_merge( $photos, $quotes );

    এই জন্য কোন ভাগ্য। যা ঘটে তা হ'ল পরের পরিবর্তনশীল $quotesওভাররাইটগুলি $photosএবং কেবলমাত্র উদ্ধৃতিগুলি প্রদর্শিত হয়।

  • টাইপকাস্টিংয়ের মাধ্যমে দুটি WP_Query অবজেক্ট একত্রিত করা:

    $photos_query = new WP_Query( $photos );
    $quotes_query = new WP_Query( $quotes );
    $result = (object)array_merge( (array)$photos_query, (array)$quotes_query );

... ইত্যাদি।

আমি সম্ভবত সরাসরি ডাটাবেসে একটি এসকিউএল কোয়েরি ব্যবহার করতে পারি, তবে আমার এ দুটি পৃথক পোস্ট ধরণের এক লুপের জন্য, এলোমেলোভাবে সাজানো এবং টাইপ প্রতি পোস্টের একটি নির্দিষ্ট পরিমাণে সীমাবদ্ধ করতে সক্ষম হওয়া দরকার

আপনার সাহায্যের জন্য ধন্যবাদ!

উত্তর:


16

একটি উপায় হ'ল এসকিউএল ক্যোয়ারী posts_clausesবা অন্যান্য অন্যান্য ফিল্টার ব্যবহার করে কার্যকর করা হয়েছে custom তাদের জন্য posts_clauses"ডাব্লুপি-অন্তর্ভুক্ত / ক্যোয়ারী.এফপি" অনুসন্ধান করুন এবং এই লাইনের ঠিক আগে ফিল্টারগুলির সিরিজ দেখুন। এগুলি একসাথে ক্যোয়ারির যে কোনও অংশ কাস্টমাইজ করতে সক্ষম

আর একটি জিনিস যা আপনি করতে পারেন তা হ'ল বস্তুগুলিতে কোয়েরি পোস্টগুলিকে ম্যানুয়ালি মেশানো

$photos_query = new WP_Query( $photos );
$quotes_query = new WP_Query( $quotes );
$result = new WP_Query();

// start putting the contents in the new object
$result->posts = array_merge( $photos_query->posts, $quotes_query->posts );

// here you might wanna apply some sort of sorting on $result->posts

// we also need to set post count correctly so as to enable the looping
$result->post_count = count( $result->posts );

আপনার দ্বিতীয় সমাধান (এসকিউএল ছাড়াই) কৌশলটি করেছে! লুপে যাওয়ার আগে সেই চূড়ান্ত ক্যোয়ারিতে যা চলছে তার উপর এখন আমার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে। আপনার সাহায্যের জন্য ধন্যবাদ!
অ্যান্ডি মার্সকিন

1
প্রথমটি কঠিন তবে আরও কার্যকর (দ্বিতীয়টিতে এখনও 2 টি ডাটাবেস অনুসন্ধান রয়েছে)। আমি এটি ব্যক্তিগত পছন্দ নেমে আসতে বলব
মৃদুল আগরওয়াল

প্রথম সমাধানটি সম্পাদন করার উপায়টিতে চূড়ান্ত আগ্রহী হবে! ফিল্টারগুলির প্রয়োজন ইত্যাদি this এই UNIONপোস্টটি প্রতিটি পোস্ট_ টাইপের জন্য স্ক্যুলে কিছু প্রকারের জন্য কল করে ?
সলোমন ক্লসন

@ সলোমনক্লসন এই ফিল্টারটি সাহায্য করতে পারেন
মৃদুল আগরওয়াল

7

@ মৃগুয়াল আগরওয়াল আপনার উত্তরটি খুব ভাল তবে দুর্ভাগ্যক্রমে এটি 2 টির সংমিশ্রণ নয় wp_queryএটি কেবল উভয়ের পোস্টগুলি সাজিয়ে দেখায় আমি প্রথম থেকে 5 টি এবং দ্বিতীয় থেকে 5 টি পোস্ট করেছি তবে সবগুলিকে একটিতে সাজানো হয়নি তাই আমার কাছে এটি আছে সমাধান এবং এটি অন্তত আমার নিজের জন্য লক্ষ্য অর্জন করেছে

<?php
$term = get_term_by( 'slug', get_query_var( 'tag' ), "post_tag" );
$tagslug = $term->slug;
$post_types = get_post_types('','names');
?>
<?php
//first query
$blogposts = get_posts(array(
    'tag' => $tagslug, //first taxonomy
    'post_type' => $post_types,
    'post_status' => 'publish',
    ));
//second query
$authorposts = get_posts(array(
    'bookauthor' => $tagslug, //second taxonomy
    'post_type' => $post_types,
    'post_status' => 'publish',
    ));
$mergedposts = array_merge( $blogposts, $authorposts ); //combine queries

$postids = array();
foreach( $mergedposts as $item ) {
$postids[]=$item->ID; //create a new query only of the post ids
}
$uniqueposts = array_unique($postids); //remove duplicate post ids

$posts = get_posts(array(
        //new query of only the unique post ids on the merged queries from above
    'post__in' => $uniqueposts,  
    'post_type' => $post_types,
    'post_status' => 'publish',
    ));
foreach( $posts as $post ) :
setup_postdata($post);
?>
// posts layout
<?php endforeach; ?>
<?php wp_reset_postdata();?>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.