Wp_query का उपयोग कर वर्गीकरण को व्यवस्थित करना संभव है?


49

मेरा प्रश्न सरल है, मैं कुछ कस्टम प्रकार के पदों को टैक्स_क्वेरी का उपयोग करके एक वर्गीकरण द्वारा पुनर्प्राप्त करने के लिए WP_Query का उपयोग कर रहा हूं।

अब मेरी समस्या यह है कि मैं वर्गीकरण का आदेश देना चाहूंगा, लेकिन दस्तावेज़ीकरण और वेब में खोज करने से मुझे कोई समाधान नहीं मिल सकता है।

WP_Query में क्रम चलो आप कस्टम मेटा फ़ील्ड भी फ़ील्ड का एक समूह द्वारा आदेश देते हैं, लेकिन यह वर्गीकरण का समर्थन नहीं करता है।

सही दिशा में कोई संकेत?

आप सभी को धन्यवाद।

जवाबों:


12

नहीं, यह वर्गीकरण द्वारा ऑर्डर करना संभव नहीं है, क्योंकि एक निश्चित प्रकार के दृष्टिकोण से, जो वास्तव में बहुत मायने नहीं रखता है।

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

ऐसी स्थिति में आपको जो उपयोग करना चाहिए वह पोस्ट मेटा है। आप पोस्ट मेटा द्वारा ऑर्डर कर सकते हैं, और यह प्रत्येक पोस्ट के लिए अद्वितीय है।

संपादित करें: उसने कहा, आप फ़िल्टर का उपयोग करके एक कस्टम SQL क्वेरी बनाकर वर्गीकरण से ऑर्डर कर सकते हैं, आप बस इसे अनमॉडिफाइड WP_Query से नहीं कर सकते हैं: http://scribu.net/wordpress/sortable-taxonomy-colours.html

हालाँकि, यदि आप इस प्रकार की चीज़ों का सहारा ले रहे हैं, तो आपकी डेटा डिज़ाइन संरचना पहले स्थान पर गलत है। वर्गीकरण में "शर्तें" वास्तविक "डेटा" नहीं हैं। स्वयं के शब्दों का कोई अंतर्निहित अर्थ नहीं है, वे केवल उस विशेष समूह के लिए लेबल हैं जिसका वे वर्णन कर रहे हैं। यदि आप उन्हें सार्थक डेटा के रूप में मान रहे हैं, तो आपके पास अंतर्निहित डिज़ाइन दोष है।

टैक्सोनॉमीज उन्हें शर्तों को बताकर समूह की चीजें बनाती हैं। यह समूहीकरण टैक्सोनोमीज़ का पूरा बिंदु है, समूह बनाने पर शब्द बहुत सुंदर हैं। यदि आपके पास किसी पोस्ट को असाइन करने के लिए सार्थक मेटाडेटा है, तो आपको इसके बजाय पोस्ट मेटा का उपयोग करना चाहिए। और यह कि आप ऑर्डर कर सकते हैं , क्योंकि पोस्ट मेटा जानकारी संग्रहीत करने के लिए कुंजी और मान दोनों का उपयोग करता है। एक वर्गीकरण के साथ, आप वास्तव में केवल कुंजी संग्रहीत कर रहे हैं, उनके मानों को उस शब्द द्वारा एक साथ समूहीकृत किया जा रहा है।

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


नमस्ते ओटो, उत्तर के लिए धन्यवाद। मुझे आपकी बात दिखती है और शायद मैं इसके साथ गलत रास्ते पर जा रहा हूं। मेरे उदाहरण में टीवी शो की एक साइट है, मेरे पास श्रृंखला 1, सीरी 2, सीरी 3 आदि के लिए टैक्सोनॉमी है। इसलिए मैं सभी अलग-अलग टीवी शो को श्रृंखला संख्या द्वारा समूहित कर सकता हूं। फिर एपिसोड, एपिसोड 01, एपिसोड 02, आदि के लिए मेरे पास समान है। मैं क्या चाहूंगा जब एपिसोड और सीरी द्वारा ऑर्डर किए जाने वाले सभी एपिसोड की सूची दिखाई जाएगी। मैं तब मेटा और कस्टम फ़ील्ड्स का विश्लेषण करूँगा। धन्यवाद ओटो।
yeope

@ आपकी रचना को श्रृंखला होना चाहिए और आपकी शर्तें श्रृंखला 1, श्रृंखला 2 आदि होनी चाहिए। जिन एपिसोडों के साथ मैं मान रहा हूं कि एक श्रृंखला में कई एपिसोड हैं, तो यह एक ही वर्गीकरण, "श्रृंखला" का उपयोग कर सकता है और यदि वे पदानुक्रम हैं तो एपिसोड 1, एपिसोड 2 आदि में मूल शब्द "सीरीज़ x" होगा। तब आप पूरी श्रृंखला को क्वेरी कर सकते हैं ताकि वे जहां भी हों, उसके साथ आने वाले एपिसोड के साथ।
क्रिस_ओ

@Chris_O मैं देखता हूं, आप वहां पैसे पर हो सकते हैं! एकमात्र समस्या जो मुझे दिखाई दे रही है, वह प्रत्येक श्रृंखला के लिए "एपिसोड 1", "एपिसोड 2" की शर्तों को दोहराने की है। इसके अलावा सभी एपिसोड 1 को श्रृंखला के आधार पर समूह में शामिल नहीं किया जा सकता है, लेकिन मुझे लगता है कि शायद इसके चारों ओर एक रास्ता है। साभार क्रिस_ओ
yeope

2
एपिसोड के लिए एक वर्गीकरण का उपयोग करना वास्तव में बहुत मायने नहीं रखता है, क्योंकि समूह बेकार है। इसके बारे में सोचें, यदि आपके पास कार्यकाल के रूप में "एपिसोड 1" है, तो आप प्रत्येक दूसरे टीवी शो से प्रत्येक दूसरे एपिसोड 1 के साथ एपिसोड 1 का समूह बना रहे हैं। एपिसोड और श्रृंखला संख्याएँ post_meta के रूप में अधिक मायने रखती हैं, क्योंकि वे उस विशेष शो के लिए विशिष्ट हैं, और समूह के रूप में उपयोगी नहीं हैं। टीवी शो का नाम टीवी-शो टैक्सोनॉमी में एक शब्द के रूप में उपयोगी होगा, क्योंकि तब आप शो को पूरे समूह के रूप में जोड़ रहे हैं।
ओट्टो

1
ओटो ने इसके बाद एक दिलचस्प ब्लॉग पोस्ट किया: व्हेन टू (नॉट) कस्टम टैक्सोनॉमी का उपयोग करें
जाॅन फेब्री

47

इस प्रश्न का स्वीकृत उत्तर अस्वीकार्य है। यह मान लेना अतार्किक है कि कर द्वारा आदेश देना "कोई मतलब नहीं है"। उसने जो जवाब दिया, उसका कोई मतलब नहीं है।

मेनू पोस्ट प्रकार होने पर विचार करें। फिर आपके पास "FoodCategories" का एक कस्टम टैक्स है। FoodCategories टैक्स में "ब्रेकफास्ट", "लंच" और "डिनर" शब्द हैं। यदि आप टैक्स_क्वेरी परम का उपयोग करते हुए एक क्वेरी सबमिट करते हैं, तो अब आपके पास सभी शर्तों के साथ एक परिणाम सेट है, हालांकि वे पोस्ट डेट द्वारा ऑर्डर किए गए हैं।

इनमें से सही क्रम प्राप्त करने के लिए, उनकी शर्तों के सापेक्ष, और फिर उनके विभिन्न श्रेणियों में पदों को अलग करके उचित रूप से सामने के छोर पर प्रदर्शित करने के लिए, आपको परिणाम सेट के माध्यम से लूप करना होगा, फिर प्रत्येक व्यक्तिगत पोस्ट को क्वेरी करना होगा। परिणाम इसे खोजने के लिए सेट है और वर्तमान शब्द की तुलना करें, एक सरणी में फ़िल्टर करें और पूरे जारी रखें। फिर आपको प्रदर्शन के लिए नए सरणी के माध्यम से फिर से लूप करना होगा। यह उत्पादक नहीं है।

यह अच्छा होगा यदि WP में "tax__in" ऑर्डरबी विकल्प होता है क्योंकि यह "post__in" एक करता है, लेकिन चूंकि यह नहीं है, आपको या तो उपरोक्त हास्यास्पद प्रक्रिया करनी होगी; क्रमबद्ध विधि को समायोजित करने और क्रमशः परिणाम सेट में शब्द जोड़ने के लिए 'पोस्ट_ऑर्डरबी' फ़िल्टर और 'पोस्ट_जॉइन' फिल्टर के माध्यम से क्वेरी को स्वयं अनुकूलित करें; या आपको उन शर्तों के सापेक्ष HTML अनुभागों के लिए फ़िल्टर किए जा रहे प्रत्येक पद के लिए एक नई क्वेरी बनानी होगी।

फ़िल्टर के माध्यम से क्वेरी स्ट्रिंग को बदलने के लिए सबसे अधिक कुशल होगा। सबसे आसान तीन अलग-अलग प्रश्न करना होगा। डब्ल्यूपी एपीआई को कर, या किसी भी प्रतिबंधात्मक क्वेरी मापदंडों द्वारा आदेश को संभालना चाहिए। यदि आप कुछ शर्तों के आधार पर किसी क्वेरी को प्रतिबंधित कर रहे हैं, तो एक उच्च संभावना है कि कई को उन्हीं शर्तों के अनुसार ऑर्डर करने की आवश्यकता होगी।


2
क्षमा करें, लेकिन आप गलत हैं। वर्गीकरण द्वारा आदेश देने से आपके मामले में कोई मतलब नहीं है। आप क्या दिखाना चाहते हैं? पहले सभी नाश्ते, उसके बाद सभी डिनर, फिर सभी लंच? आपको वह चुनना चाहिए जो आप चाहते हैं और वह क्रम जिसमें आप इसे चाहते हैं, लेकिन वर्गीकरण केवल एक समूह लेबल है। यह सार्थक "डेटा" नहीं है जिसे आपको आदेश देना चाहिए। यदि यह है, तो यह एक वर्गीकरण में एक शब्द नहीं होना चाहिए, आपको इसके बजाय एक पोस्ट-मेटा बनाना चाहिए।
ओटो

15
चलो, निश्चित रूप से कुछ उदाहरण हैं, जिसमें आप वर्गीकरण शब्द द्वारा पदों का आदेश देना चाहेंगे। एक अन्य उदाहरण एक रेटिंग रेटिंग के साथ एक मूवी पोस्ट प्रकार है। फिल्मों की सूची में, उन लोगों की कल्पना करना बहुत आसान है, जो सभी जी-रेटेड, फिर पीजी-रेटेड, आदि फिल्में शीर्ष पर दिखाई देती हैं। (इस और भोजन के उदाहरण में उन्हें नाम के बजाय term_id द्वारा आदेश दिया जा सकता है।) ऐसे उदाहरणों का एक बड़ा भूरा क्षेत्र है जहां आप शायद एक करोनॉमी और मेटा द्वारा सर्वोत्तम रूप से कार्य करते हैं, लेकिन यह संभवतः उस वर्गीकरण के लिए भी उपयोगी है ताकि आदेश दिया जा सके -योग्य।
सेवंत्सल

2
पीजी और जी रेटिंग और इस तरह के एक अच्छा वर्गीकरण विकल्प हैं, सिवाय इसके कि वे विशिष्ट फिल्मों के बारे में डेटा हैं। इस प्रकार, वे मेटा हैं। वे डेटा हैं, श्रेणियां नहीं। बस विकल्पों की एक सीमित संख्या होने से एक वर्गीकरण नहीं होता है। यदि इसे इसके आधार पर छाँटने की आवश्यकता है, तो या तो इसे मेटा करें, या वर्गीकरण को विशिष्ट स्वायत्त कोड के माध्यम से छांटे। BTW, NC17 PG के बाद आता है। तो, आपको उस ऑर्डर को करने के लिए कोड की आवश्यकता है।
ओटो

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

एक अन्य उपयोग मामला: एक ग्राहक के पास लेखों का एक समूह होता है, जिनमें से प्रत्येक में एक श्रेणी होती है। ग्राहक चाहता है कि सभी लेखों को सूचीबद्ध करने वाला एक पृष्ठ हो, जिसे वर्णानुक्रम में, तिथि या श्रेणी के आधार पर क्रमबद्ध किया जा सके। श्रेणियों को फ़िल्टर भी किया जा सकता है, लेकिन श्रेणी के अनुसार सभी लेखों को वर्णानुक्रम में सूचीबद्ध करना किसी उपयोग के मामले का दीवाना नहीं है और आप इसे बहुत बार देखते हैं।
विल्सन बिग्स

15

हाँ, लेकिन यह बहुत शामिल है ...

अपनी थीम में functions.php में जोड़ें:

function orderby_tax_clauses( $clauses, $wp_query ) {
    global $wpdb;
    $taxonomies = get_taxonomies();
    foreach ($taxonomies as $taxonomy) {
        if ( isset( $wp_query->query['orderby'] ) && $taxonomy == $wp_query->query['orderby'] ) {
            $clauses['join'] .=<<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
            $clauses['where'] .= " AND (taxonomy = '{$taxonomy}' OR taxonomy IS NULL)";
            $clauses['groupby'] = "object_id";
            $clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
            $clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ? 'ASC' : 'DESC';
        }
    }
    return $clauses;
}

    add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );

यह कुछ पाया सामान से फ्रेंकस्टेनइस्टेड है और कुछ सामान मैंने खुद किया है। स्पष्ट करना बहुत कठिन है, लेकिन नीचे की रेखा इस दौड़ के साथ है, आप डाल सकते हैं;


धन्यवाद आकर्षित किया, मैं एक जाऊंगा और उस एसक्यूएल को चलाने की कोशिश करूंगा, थोड़ा संपादित करने की आवश्यकता होगी, लेकिन यह काम कर सकता है। मेरी एकमात्र समस्या अब है, क्या मैं ओटो द्वारा इंगित गलत दिशाओं पर जा सकता हूं। धन्यवाद आकर्षित किया। संपादित करें - संपादित करने की आवश्यकता नहीं है मैं देख सकता हूँ कि इसे कहाँ की आवश्यकता है :) धन्यवाद
yeope

यदि आपने इसे पिछले दो मिनटों में पकड़ लिया है, तो यह काम नहीं करेगा, आगे बढ़ें और इसे अभी पकड़ लें, मैंने इसे ठीक कर दिया। यह दो विशिष्ट टैक्सोनॉमी के लिए निर्धारित किया गया था, मैंने सभी पंजीकृत टैक्सोनॉमी पर काम करने के लिए कोड में सुधार किया।
आकर्षित लौरी

एक बार फिर आपका धन्यवाद। बस मामले में मैंने आपके समाधान की कोशिश की और यह काम करता है। इसके अलावा अगर कोई और इसका उपयोग करना चाहता है तो आपको धन्यवाद add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );करने की आवश्यकता है add_filter('posts_clauses', 'todo_tax_clauses', 10, 2 );:)
yeope

हां, यह अब कोड ब्लॉक में तय हो गया है, मैंने इसे एक ऐसी परियोजना से लिया है जिस पर मैं काम कर रहा हूं और फ़ंक्शन का नाम बदलना भूल गया, भले ही मैंने इसे हुक में बदल दिया हो।
ड्रू ग्रेले

1
क्या आप जानते हैं कि नाम के बजाय आईडी द्वारा टैक्सोनोमी का आदेश देना संभव है? मैं ID
जेवियर विलानुएवा

9

मैं यहाँ खेल के लिए देर से आ रहा हूँ, लेकिन ऐसा करने का एक अधिक सरल वर्डप्रेस तरीका है।

अपनी टैक्स क्वेरी को सामान्य की तरह बनाएँ।

$tax_query = array();
$tax_query['relation']="OR";
$tax_query[] = array(
    'taxonomy' => 'product_cat',
    'field'    => 'slug',
    'terms'    => $cat_terms,
);
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

अपने args को query_posts या WP_Query के लिए सेट करें

$args = array(
    'post_type'=>'post',
    'posts_per_page'=>12,
    'paged'=>$paged,
    'tax_query' => $tax_query,
);

इससे पहले कि आप अपना query_posts / WP_Query कॉल करें, ऑर्डरबी फ़िल्टर में हुक करें और इसे ओवरराइड करें

add_filter('posts_orderby', 'edit_posts_orderby');
function edit_posts_orderby($orderby_statement) {
    $orderby_statement = " term_taxonomy_id ASC ";
    return $orderby_statement;
}
query_posts($args);
remove_filter('posts_orderby', 'edit_posts_orderby');

बाद में फ़िल्टर निकालना न भूलें ...

यह काम करता है b / c tax_query आपके लिए जॉन्स आदि बनाता है, आपको बस ज्वाइन से एक फ़ील्ड द्वारा ऑर्डर करना होगा।


2
Term_taxonomy_id के बजाय नाम से ऑर्डर करने का कोई विचार? बदलते शब्द_टैक्सोनॉमी_एड में आर्डर_स्टैटमेंट में त्रुटियाँ हैं
तहलवी

यह रुचि रखने वाले के लिए सही उत्तर है!
मायरा एम

2

खैर, मैं श्रेणी / वर्गीकरण द्वारा कस्टम पोस्ट प्रकारों को छाँटने में अपने अनुभव को उजागर करना चाहूंगा।

मकड़जाल

  1. वर्डप्रेस पर चलने वाली एक ट्रैवल एजेंसी वेब साइट
  2. कस्टम पोस्ट प्रकार पर मुख्य सामग्री जिसे 'रूटा' कहा जाता है
  3. इस संरचना के साथ वर्गीकरण - प्रकार> देश> महाद्वीप> देश

मुकदमा

संग्रह श्रेणी सूची पृष्ठों में, ग्राहक चाहते थे कि पदों को क्रमबद्ध किया जाए

  1. महाद्वीप, प्रत्येक पर मार्गों की संख्या के आधार पर।
  2. देश, वर्णानुक्रम में आदेश दिया।

कदम

सबसे पहले , मैं अनमॉडिफाइड आर्काइव पेज क्वेरी से अनुरोध को पकड़ता हूं जो इस तरह से हुआ:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
WHERE 1=1 
AND ( wp_term_relationships.term_taxonomy_id IN (5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,26,28,29,31,32,33,35,38,95,101,102,193) )
AND wp_posts.post_type IN ('ruta', 'nav_menu_item') 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 45 
AND wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC LIMIT 0, 20

दूसरा , मैंने अपनी आवश्यकताओं के अनुरूप डेटाबेस के लिए सीक्वल प्रो में एसक्यूएल कोड को संपादित किया। मैं इसके साथ बाहर आता हूं (हां, शायद इसमें सुधार किया जा सकता है: MySQL पर मेरा ज्ञान बकाया नहीं है):

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID, tt1.parent AS pare,
    (
    SELECT COUNT(*) 
    FROM  wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id =      wp_term_relationships.term_taxonomy_id )
    INNER JOIN wp_term_taxonomy AS tt2 ON ( tt2.term_taxonomy_id =  tt1.term_taxonomy_id )
    WHERE 1=1  
    AND tt1.parent = pare
    ) AS Total
FROM  wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id =      wp_term_relationships.term_taxonomy_id )
INNER JOIN wp_terms ON ( tt1.term_id = wp_terms.term_id )
WHERE 1=1  
AND ( wp_term_relationships.term_taxonomy_id IN (5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,26,28,29,31,32,33,35,38,95,101,102,193) ) 
AND wp_posts.post_type IN ('ruta', 'nav_menu_item') 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 45 
AND wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY
total DESC,
wp_terms.name  

तीसरा , मैंने फंक्शन को क्वेरी को तीन फ़िल्टर के साथ जोड़ दिया है। तीन फ़िल्टर के साथ फ़ाइल: posts_fields, posts_join और posts_orderby

Functions.php में कोड:

function xc_query_fields( $fields ) {

   $fields = "wp_posts.ID, wp_posts.post_title, wp_terms.name, tt1.parent AS pare,
    (
    SELECT COUNT(*) 
    FROM  wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
    INNER JOIN wp_term_taxonomy AS tt2 ON ( tt2.term_taxonomy_id = tt1.term_taxonomy_id )
    WHERE 1=1  
    AND tt1.parent = pare
    )
    AS Total";
     return $fields;
}


function xc_query_joins( $join ) {
$join .= "INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
   INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
   INNER JOIN wp_terms ON ( tt1.term_id = wp_terms.term_id )";
 return $join;
}


function xc_query_orderby( $join ) {
    $join = "total DESC, wp_terms.name ";
    return $join;
 }

अंत में मैंने कुछ शर्तों के अनुसार pre_get_post हुक से फ़िल्टर चालू किया

function filtra_queries( $query )
{

  if (  is_archive()  && $query->is_main_query() && !is_admin()  ) {

$rutes = array('viajes-privados', 'asia', 'africa', 'oceania', 'america', 'oriente-proximo');

if  ( in_array( $query->get('category_name'), $rutes ) ) 
  {
  add_filter( 'posts_fields', 'xc_query_fields' );
  add_filter( 'posts_join', 'xc_query_joins' );
  add_filter( 'posts_orderby', 'xc_query_orderby' );
}// end if in_array

  }// end if is_archive

}
 add_filter('pre_get_posts', 'filtra_queries');

आशा है कि यह किसी की मदद कर सकता है


अच्छा काम, हास्यास्पद जो एक वर्गीकरण द्वारा कुछ छाँटने के लिए कोड की इस मात्रा को लिया जाता है। WP के साथ बड़ी समस्या।
सेरासोइस जूल

2

मेरे पास एक समान समस्या थी जिसे मैंने निपटाया: मैं एक कस्टम टैक्सोनॉमी (मुद्दों) द्वारा एक कस्टम पोस्ट-टाइप आर्काइव (पत्रिका लेख) ऑर्डर करना चाहता हूं। मैं अपनी साइट पर कभी भी एसक्यूएल प्रश्नों को निर्देशित नहीं करता हूं - और आमतौर पर यदि आप इन अन्य उत्तरों की तरह हैं - तो आपको अपने दृष्टिकोण पर पुनर्विचार करने की आवश्यकता है।

समस्या:

1) वर्डप्रेस आपको किसी भी बुद्धिमान तरीके से टैक्सोनॉमी ऑर्डर करने की अनुमति नहीं देता है।

2) वर्डप्रेस बस orderbyपोस्ट-टाइप WP_Query पर टैक्सोनोमी का उपयोग करने की अनुमति नहीं देता है (जैसा कि ओटो द्वारा वर्तनी)।

समाधान:

1) वर्तमान में कस्टम टैक्सोनॉमी ऑर्डर NE प्लगइन द्वारा कर वर्गीकरण को क्रमबद्ध करना सबसे अच्छा है । यह आपको WYSIWYG के माध्यम से टैक्सोनॉमी का आदेश देने की अनुमति देता है, wp-adminजिसमें यह नहीं है कि मैं इसे कैसे करूंगा लेकिन मुझे कुछ भी बेहतर नहीं मिला।

जब आप प्लगइन सेटअप करते हैं, तो आपको यहां जो कुछ भी मिला है, उसके समान ही मिलेगा। विकल्प पर ध्यान दें Auto-sort Queries of this Taxonomy- इसे इस पर सेट करें Custom Order as Defined Above; यह आपको वह आदेश देता है जिसकी आपको आवश्यकता होती है। स्क्रीनशॉट:

कस्टम टैक्सोनॉमी ऑर्डर NE डिस्प्ले

2) जगह में एक तरह से वर्गीकरण के साथ, अब आप WP_Query कॉल की एक श्रृंखला बना सकते हैं जो प्रत्येक शब्द के माध्यम से चलते हैं, प्रभावी रूप से वर्गीकरण द्वारा आदेशित एक संग्रह बनाते हैं। get_terms()सभी कर शर्तों की एक सरणी बनाने के लिए उपयोग करें , फिर foreachप्रत्येक शब्द पर एक रन बनाएं । यह WP_Queryप्रत्येक टर्म आइटम के लिए बनाता है जो किसी भी पद के लिए सभी पदों को वापस कर देगा, प्रभावी रूप से टैक्सोनॉमी टर्म द्वारा आदेशित एक संग्रह बना देगा। ऐसा करने के लिए कोड:

  // Get your terms and put them into an array
  $issue_terms = get_terms([
    'taxonomy' => 'issues',
    'hide_empty' => false,
  ]);

  // Run foreach over each term to setup query and display for posts
  foreach ($issue_terms as $issue_term) {
    $the_query = new WP_Query( array(
      'post_type' => 'post',
      'tax_query' => array(
        array(
          'taxonomy' => 'issues',
          'field' => 'slug',
          'terms' => array( $issue_term->slug ),
          'operator' => 'IN'
        )
      )
    ) );

    // Run loop over each query
    while($the_query->have_posts()) :
      $the_query->the_post();

      // YOUR TEMPLATE OUTPUT FOR EACH POST

    endwhile;
  }

इस साइट पर संबंधित रीडिंग: कस्टम पोस्ट प्रकार में सभी पोस्ट प्रदर्शित करें, जो कस्टम टैक्सोनॉमी द्वारा समूहीकृत हैं


2

मुझे यकीन नहीं है कि क्यों यहाँ सभी समाधान बहुत ज्यादा overkilling हैं। ठीक है, यह आधा दशक पहले है, लेकिन मैं अभी निम्नलिखित कोड चला रहा हूं और यह काम करता है:

   <?php // Default
    $wheels_args = array(
        'post_type' => 'wheels',
        'posts_per_page' => '96',
        'orderby' => 'taxonomy, name', // Just enter 2 parameters here, seprated by comma
        'order'=>'ASC'
    );
    $loop = new WP_Query($wheels_args);
    ?>

यह आपके CPT के वर्गीकरण को पहले वर्णानुक्रम में क्रमबद्ध करके और इन करोनॉमी समूहों के भीतर वर्णमाला क्रम के अनुसार छाँटेगा।


@yeope यह क्यों स्वीकार किया गया जवाब है !? भगवान का शुक्र है कि मैंने स्क्रॉल किया
जुआन सोलानो

1

इस समस्या के समाधान के लिए मैंने इसका उपयोग किया है। यह समाधान चरम मामलों के लिए है, जहां एक pre_get_postsफिल्टर का उपयोग करना दोनों संभव नहीं है और क्वेरी पर मौजूदा पेजिनेशन है (यानी: WWECOM):

global $wpdb;

$taxonomies = array('my-tax-1', 'my-tax-2', 'my-tax-3');

$orderby = "'".implode("', '", array_keys($taxonomies))."'";
$id_sql = $GLOBALS['wp_query']->request;

$id_sql = preg_replace('/LIMIT\s+\d+\s?,?\s\d*/', '', $id_sql);
$id_sql = str_replace('SQL_CALC_FOUND_ROWS', '', $id_sql);

$term_sql = "SELECT
  tt.taxonomy AS `taxonomy`,
  t.name AS `term_name`,
  t.slug AS `term_slug`,
  count(*) AS `term_count`
FROM ({$id_sql}) p 
JOIN wp_term_relationships tr
  ON p.ID = tr.object_id
JOIN wp_term_taxonomy tt
  ON tr.term_taxonomy_id = tt.term_taxonomy_id
JOIN wp_terms t
  ON tt.term_id = t.term_id
WHERE tt.taxonomy IN ({$orderby})
GROUP BY t.slug
ORDER BY
  FIELD(tt.taxonomy, {$orderby})"; // Add further specific ordering here

$results = $wpdb->get_results($term_sql, ARRAY_A);

मैंने इसका उपयोग प्रति-अवधि के हिसाब से वर्गीकरण, शब्द, और गिनती द्वारा आदेशित एक नव मेनू बनाने के लिए किया है।

यदि आप केवल पोस्ट चाहते हैं तो क्वेरी को SELECT p.*और में बदलेंGROUP BY p.ID


0

यह क्वेरी से पहले एक प्रश्न की तरह है, लेकिन परेशान नहीं करेंगे यदि हम बहुत सारे पदों को क्वेरी नहीं कर रहे हैं ... विचार मुख्य क्वेरी को संशोधित करना है, इसलिए हमें टेम्पलेट्स में जाने और नए प्रश्न बनाने की आवश्यकता नहीं है और लूप ...

function grouped_by_taxonomy_main_query( $query ) {

    if ( $query->is_home() && $query->is_main_query() ) { // Run only on the homepage

        $post_ids = array();

        $terms = get_terms('my_custom_taxonomy');

        foreach ( $terms as $term ) {
            $post_ids = array_merge( $post_ids, get_posts( array( 
                'posts_per_page' => 4, // as you wish...
                'post_type' => 'my_custom_post_type', // If needed... Default is posts
                'fields' => 'ids', // we only want the ids to use later in 'post__in'
                'tax_query' => array( array( 'taxonomy' => $term->taxonomy, 'field' => 'term_id', 'terms' => $term->term_id, )))) // getting posts in the current term
            );
        }

        $query->query_vars['post_type'] = 'my_custom_post_type'; // Again, if needed... Default is posts
        $query->query_vars['posts_per_page'] = 16; // If needed...
        $query->query_vars['post__in'] = $post_ids; // Filtering with the post ids we've obtained above
        $query->query_vars['orderby'] = 'post__in'; // Here we keep the order we generated in the terms loop
        $query->query_vars['ignore_sticky_posts'] = 1; // If you dont want your sticky posts to change the order

    }
}

// Hook my above function to the pre_get_posts action
add_action( 'pre_get_posts', 'grouped_by_taxonomy_main_query' );
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.