प्रति पोस्ट प्रकार के विभिन्न तर्कों के साथ प्रश्नों का संयोजन


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 );
    

... और इसी तरह।

मैं डेटाबेस में सीधे SQL क्वेरी का उपयोग कर सकता हूं, लेकिन मुझे एक लूप के लिए इन दो अलग-अलग पोस्ट प्रकारों को संयोजित करने में सक्षम होने की आवश्यकता है, यादृच्छिक रूप से व्यवस्थित, और प्रति प्रकार पोस्ट की एक निश्चित राशि तक सीमित।

आपकी सहायताके लिए धन्यवाद!

जवाबों:


16

एक तरीका यह है कि posts_clausesइस तरह के फिल्टर का उपयोग करके निष्पादित SQL क्वेरी को अनुकूलित करें । उन्हें posts_clauses"wp-शामिल / query.php" के लिए खोज करने के लिए और इस लाइन से ठीक पहले फ़िल्टर की श्रृंखला देखें। ये एक साथ क्वेरी के किसी भी भाग को अनुकूलित करने में सक्षम हैं

एक और चीज जो आप कर सकते हैं वह है मैन्युअल रूप से ऑब्जेक्ट्स में क्वेरिड पोस्ट्स को मर्ज करना

$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 );

आपके दूसरे समाधान (SQL के बिना) ने चाल चली! अब लूप में जाने से पहले उस अंतिम प्रश्न में क्या होगा, इस पर मेरा पूरा नियंत्रण है। आपकी सहायताके लिए धन्यवाद!
एंडी मर्सकिन

1
पहला मुश्किल है, लेकिन अधिक कुशल है (दूसरे में अभी भी 2 डेटाबेस प्रश्न हैं)। मैं कहूंगा कि यह व्यक्तिगत प्राथमिकता पर आता है
मृदुल अग्रवाल

पहले समाधान को पूरा करने के लिए एक तरह से बेहद दिलचस्पी होगी! फिल्टर आदि की जरूरत है, क्या यह UNIONप्रत्येक post_type के लिए sql में कुछ प्रकार के लिए कॉल करता है ?
सोलोमन क्लॉसन

@SolomonClosson यह फ़िल्टर मदद कर सकता है- codex.wordpress.org/Plugin_API/Filter_Reference/posts_clauses
मृदुल अग्रवाल

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();?>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.