मेटा मान पर क्रमित करें, लेकिन ऐसे पोस्ट शामिल करें जिनमें एक नहीं है


37

मैं pre_get_postsफ़िल्टर का उपयोग करके निर्मित WP खोज में संशोधन कर रहा हूं , जिससे उपयोगकर्ता विभिन्न क्षेत्रों द्वारा पदों (कस्टम पोस्ट प्रकारों का एक गुच्छा सहित) को सॉर्ट करने की अनुमति देता है।

हालाँकि मुझे जो समस्या हो रही है वह यह है कि जब मैं WP को एक मेटा वैल्यू के आधार पर छाँटने के लिए कहता हूँ तो यह उन सभी पोस्टों को बाहर कर देगा जिनमें मेटा वैल्यू सेट नहीं है। यह परिणामों की संख्या को बदलने का कारण बनता है यदि आप "मूल्य" से "दिनांक" तक छँटाई को बदलते हैं क्योंकि "पोस्ट" में "मूल्य" सेट नहीं है लेकिन "आइटम" हैं।

यह वह नहीं है जो मैं चाहता हूं, इसलिए मैं यह जानना चाहूंगा कि क्या सभी पोस्टों को शामिल करने का एक तरीका है - यहां तक ​​कि उन लोगों की भी कमी है जो मेरे द्वारा छंटनी कर रहे हैं - और अंतिम मान के बिना किसी को डाल दिया है।

मैं जानता हूं कि एक से अधिक क्षेत्रों पर कैसे छांटा जाए लेकिन इससे कोई मदद नहीं मिलती है।

धन्यवाद

लगता है कि मैं इस सवाल के साथ एक ही नहीं हूँ: wp_dery के लिए args में कुछ meta_key के साथ और बिना पोस्ट शामिल करने का तरीका? लेकिन वहाँ कोई समाधान नहीं है।

अद्यतन करें

मैंने जवाब देने की कोशिश की है, लेकिन यकीन नहीं है कि अगर मैं सही ढंग से समझ गया, तो यहां मेरे पास अभी क्या है:

<?php
function my_stuff ($qry) {
    $qry->set('meta_query', array(array(
        'key' => 'item_price', 
        'value' => '', 
        'compare' => 'NOT EXISTS'
    )));

    $qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
    $qry->set('order', 'ASC DESC');
    $qry->set('meta_key', 'item_price');
}

मेटा वैल्यू एक संख्या है (इसका उपयोग मूल्य को स्टोर करने के लिए किया जाता है जैसा कि नाम से पता चलता है)

अपडेट २

मैंने ऑर्डर-सामान पर टिप्पणी की है और मेरे पास अब यही है:

<?php
$qry->set('meta_query', array(array(
    'key' => 'item_price', 
    'value' => '', 
    'compare' => 'NOT EXISTS'
)));

इस कोड के साथ क्वेरी उन सभी पोस्टों को वापस कर देती है जिनके पास item_priceकुंजी नहीं है और जो भी पोस्ट हैं उनमें से कोई भी नहीं है। IE समस्या अब उलट है।

यदि मैं ऑर्डर-कोड में जोड़ता हूं तो मुझे 0 परिणाम मिलते हैं।

संपादित करें: ... तीन साल बाद ... पीआई का यह मुद्दा फिर से था। मैंने दिए गए सभी उत्तरों की कोशिश की और कोई भी काम नहीं किया। निश्चित नहीं है कि कुछ लोगों को लगता है कि वे काम करते हैं लेकिन वे मेरे लिए कम से कम काम नहीं करते हैं।

मैं जिस समाधान के साथ समाप्त हुआ वह save_postफ़िल्टर का उपयोग कर रहा है - सुनिश्चित करें कि सभी पोस्ट में कस्टम फ़ील्ड है जिसे मैं सॉर्ट करना चाहता हूं। यह थोड़ा परेशान करने वाला है जो मुझे करना है, लेकिन जब तक आप इसे जल्दी करते हैं, तब तक आपके पास कोई समस्या नहीं होगी।

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

add_action('save_post', function ($postId) {
    add_post_meta($postId, '_sleek_view_count', 0, true);
});

कृपया हमें अपना कोड दिखाएं। उत्तर देना आसान बनाता है।
kaiser

पहली: meta_queryऔर tax_queryकर रहे हैं हमेशा एक array( array() )के रूप में वे कई सरणियों गठबंधन। दूसरा - जैसा कि मेरे उत्तर में बताया गया है - आपको meta_value_numसंख्याओं के लिए उपयोग करने की आवश्यकता है । यह वास्तव में meta_value_num(देखें WP_Query-कोड पृष्ठ प्रविष्टि) को परिभाषित करने के लिए आवश्यक हो सकता है । अंत में, यह और दिशा orderमें कोई मतलब नहीं है । यह संभव नहीं है। अंतरिक्ष सीमांकक केवल काम करता है और आप इसे पहले और दूसरे क्रमबद्ध करने के लिए नहीं कह सकते । फिल्टर किस लिए है ASC DESCorderbyASCDESCposts_clauses
कैसर

और सुनिश्चित करें कि आपकी meta_value_numप्रविष्टियाँ वास्तविक संख्याएँ हैं। यह भी अक्सर देखा कि किसी ने कहा कि यह एक संख्या है, लेकिन वास्तव में इसे डेटाबेस में एक स्ट्रिंग के रूप में सहेज रहा है।
कैसर

आपकी मदद के लिए धन्यवाद, मैं यह कोशिश करूंगा और आपको वापस मिलूंगा। इसका कारण ASC DESCयह है कि यह meta_valueअंदर ASCऔर बाहर की ओर dateहै DESC, जहां तक ​​मैं बता सकता हूं कि यह काम करता है।
पॉवरबॉय

1
@Howdy_McGee जो सही है। मेरे कुछ कस्टम पोस्ट प्रकार इस मान सेट हैं। कुछ नहीं। और पोस्ट प्रकार (जैसे पोस्ट और पेज) में निर्मित नहीं है। इसलिए जब भी मैं उस कस्टम फील्ड पर सॉर्ट करने की कोशिश करता हूं तो कस्टम फील्ड शो के साथ ही पोस्ट करता है।
पॉवरबॉय

जवाबों:


4

इसके दो संभावित समाधान हैं:

1. सभी पोस्ट मेटा हैं

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

भविष्य में इस प्रबंधनीय बनाने के लिए आप हुक कर सकते हैं save_postऔर उन्हें मूल्य दे सकते हैं जब वे पहली बार जोड़े जाते हैं (केवल अगर यह खाली है)।

2. एकाधिक क्वेरी

आप पहली क्वेरी चला सकते हैं क्योंकि आप कर रहे हैं और लौटाए गए पदों की आईडी स्टोर कर सकते हैं। फिर आप सभी पोस्ट और ऑर्डर की तारीख के लिए एक और क्वेरी चला सकते हैं, पहली क्वेरी से आईडी को छोड़कर

फिर आप दो परिणामों को अलग-अलग क्रम से प्रिंट कर सकते हैं और आपको वांछित परिणाम मिलेंगे।


1
तीन साल बाद और मेरे पास एक ही मुद्दा फिर से था: पी को save_postविधि का उपयोग करना पड़ा (मैंने अपने प्रश्न को मेरे द्वारा उपयोग किए गए कोड के साथ अपडेट किया है)।
पॉवरबॉय

10

वर्तमान में उत्पादन में उपयोग कर आसान पेसी, 2018 का परीक्षण किया गया।

$query->set( 'meta_query', array(
    'relation' => 'OR',
    array(
        'key' => 'custom_meta_key', 
        'compare' => 'EXISTS'
    ),
    array(
        'key' => 'custom_meta_key', 
        'compare' => 'NOT EXISTS'
    )
) );
$query->set( 'orderby', 'meta_value title' ); 

यह मेटा कुंजी के साथ और उसके बिना सभी वस्तुओं के लिए जाँच करता है, जिसमें कोई मूल्य निर्दिष्ट नहीं है। मेटा क्वेरी ऑर्डरबी के लिए कुंजी को मज़बूती से प्रदान करती है। इसका परीक्षण किया गया है। मुझे यकीन नहीं है, हालांकि, जब मेटा क्वेरी कई कुंजियों का उपयोग करती है तो यह कैसे काम करेगी।

व्यावहारिक उदाहरण

/**
 * Modifies query before retrieving posts. Sets the 
 * `meta_query` and `orderby` param when no `orderby` 
 * param is set, (default ordering).
 * 
 * @param   WP_Query  $query  The full `WP_Query` object.
 * @return  void
 */
function example_post_ordering( $query ) {

    // if not in wp-admin, 
    // and the query is the main query, 
    // and the query is not a singular query, 
    // and the query does not have an orderby param set...
    // Note: check for post types, etc. here as desired.
    if ( ! is_admin() 
    && $query->is_main_query() 
    && ! $query->is_singular() 
    && empty( $query->get( 'orderby' ) ) ) {

        // Setting just `meta_key` is not sufficient, as this 
        // will ignore posts that do not yet, or never will have 
        // a value for the specified key. This meta query will 
        // register the `meta_key` for ordering, but will not 
        // ignore those posts without a value for this key.
        $query->set( 'meta_query', array(
            'relation' => 'OR',
            array(
                'key' => 'custom_meta_key', 
                'compare' => 'EXISTS'
            ),
            array(
                'key' => 'custom_meta_key', 
                'compare' => 'NOT EXISTS'
            )
        ) );

        // Order by the meta value, then by the title if multiple 
        // posts share the same value for the provided meta key.
        // Use `meta_value_num` if the meta values are numeric.
        $query->set( 'orderby', 'meta_value title' );
    }

}

add_action( 'pre_get_posts', 'example_post_ordering', 10 );

यह custom_meta_keyडिफ़ॉल्ट रूप से पोस्ट का आदेश देगा , और उस कुंजी के लिए बिना मूल्य के पोस्ट को अनदेखा नहीं करेगा।


बस कोड को पढ़ने से, लगता है कि सभी को ऐसे पद मिलते हैं, जो होते हैं custom_meta_keyऔर जिन पदों को प्राप्त होता है, वे नहीं होते हैं custom_meta_key। छँटाई के साथ एक वास्तविक कामकाजी उदाहरण को शामिल करने के लिए स्वतंत्र महसूस करें।
पॉवरबॉय

1
आप सही कह रहे हैं, यह सब कर रही है, लेकिन नीचे की लाइन मेटा_वेल्यू (मेटा कीर की जा रही है) द्वारा आदेश देने के लिए जिम्मेदार है। $query->set( 'orderby', 'meta_value title' );(मेटा मूल्य द्वारा आदेश, फिर शीर्षक द्वारा जब कई पोस्ट मेटा कुंजी के लिए समान मूल्य है)। यह चर pre_get_postsमें पारित का उपयोग करके, हुक में किया जाना चाहिए $query। ध्यान रखें कि पूछा गया प्रश्न मेटा मूल्य द्वारा ऑर्डर करने का तरीका था, जबकि उन पोस्टों को अनदेखा न करें जिनमें उस मेटा कुंजी का कोई मूल्य नहीं है।
नोहमासन

@powerbuoy अद्यतन व्यावहारिक उदाहरण देखें
noahmason

ठीक है, मैं इसे अगली बार जाने दूंगा मैं इस समस्या का सामना कर रहा हूं।
पावरबॉय

1
मेरे लिए एक कस्टम get_posts()कॉल में _featuredमेटा के साथ पोस्टों को ऊपर की तरफ उछालने के लिए काम किया , उसके बाद तारीख तक ऑर्डर करें। धन्यवाद!
नैटबीटी

8

यह विधि उन सभी पोस्टों को वापस कर देगी जिनमें अनुरोध के साथ और बिना शामिल हैं meta_key, लेकिन ऑर्डर करते समय यह अजीब चीजें करेगा।

add_action('pre_get_posts', 'my_stuff');
function my_stuff ($qry) {
    $qry->set(
        'meta_query',
        array(
            'relation' => 'OR', # Matches to this meta_query should be added to those matching the 'meta_key' query
            array(
                'key' => 'item_price', 
                'value' => 'bug #23268', 
                'compare' => 'NOT EXISTS'
            )
        )
    );

    $qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
    $qry->set('order', 'ASC DESC');
    $qry->set('meta_key', 'item_price');
}

मैंने इस प्रश्न के सभी अलग-अलग उत्तरों के साथ चक्कर लगाकर और परीक्षण और त्रुटि के माध्यम से उत्पन्न एसक्यूएल का विश्लेषण करके पाया । ऐसा लगता है कि मेटाडेटा को गायब करने वाले पोस्ट को शामिल करने के लिए इसके बजाय array('meta_query' => array('relation' => 'OR'))एक उपयुक्त आउटपुट सेट करना आवश्यक है। निर्दिष्ट करने से मेटा फ़ील्ड की कमी वाले पदों को फ़िल्टर करने से रोकती है । इस विशेष के लिए , उत्पन्न SQL है (इंडेंटेशन / नईलाइन्स जोड़ी गई):LEFT JOININNER JOINNOT EXISTSWHEREWP_Query

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)
    INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
    LEFT JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id AND mt1.meta_key = 'item_price')
    WHERE 1=1
    AND ( wp_term_relationships.term_taxonomy_id IN (2) )
    AND wp_posts.post_type = 'post'
    AND (wp_posts.post_status = 'publish'
        OR wp_posts.post_status = 'private')
    AND (wp_postmeta.meta_key = 'item_price'
        -- Oh look, here we give SQL permission to choose a random
        -- row from wp_postmeta when this particular post is missing
        -- 'item_price':
        OR  mt1.post_id IS NULL )
    GROUP BY wp_posts.ID
    ORDER BY wp_postmeta.meta_value,wp_posts.post_date DESC
    LIMIT 0, 10

नतीजा मेटा के सभी पोस्ट item_priceऔर लापता होने वालों की सूची है item_price। साथ पदों की सभी item_priceसही ढंग से एक दूसरे के सापेक्ष आदेश दिया जाएगा, लेकिन पदों लापता item_priceकुछ यादृच्छिक का उपयोग करेगा अन्य मेटा मूल्य (जैसे कि, _edit_lastजो हो रहा है 1उसके लिए मेरे डेटाबेस या कुछ अन्य आंतरिक वर्डप्रेस मेटाडाटा कि पूरी तरह से मनमाना है में अक्सर) wp_postmeta.meta_valueमें ORDER BYखंड। इसलिए, जबकि यह विधि करीब है और कुछ डेटा के लिए काम करने के लिए प्रकट हो सकता है, यह टूट गया है। इसलिए, मैं केवल इतना कह सकता हूं कि यदि आपके item_priceमान यादृच्छिक मेटा फ़ील्ड के साथ संघर्ष नहीं करते हैं तो MySQL लापता पदों के लिए चुनता है item_price, यह आपके लिए ठीक काम कर सकता है। यदि आप सभी की जरूरत है एक गारंटी है कि आपके पदों के साथitem_priceअन्य पदों के आदेश के लिए एक दूसरे के सापेक्ष सही ढंग से आदेश दिए गए हैं, यह ठीक हो सकता है। लेकिन मुझे लगता है कि यह सिर्फ वर्डप्रेस में कमी है। कृपया मुझे सही करें, मुझे आशा है कि मैं गलत हूं और इसे संबोधित करने का एक तरीका है ;-)।

ऐसा लगता है कि INNER JOIN wp_postmeta, MySQL postmetaपोस्ट के साथ जुड़ी कई पंक्तियों में से एक यादृच्छिक पंक्ति चुन रहा है जब meta_keyदिए गए पोस्ट से गायब है। एक SQL परिप्रेक्ष्य से, हमें यह पता लगाने की आवश्यकता है कि आउटपुट के लिए वर्डप्रेस कैसे बताएं ORDER BY mt1.meta_value। यह कॉलम ठीक से NULLतब है जब हमारा अनुरोध meta_keyअनुपस्थित है wp_postmeta.meta_value। अगर हम ऐसा कर सकते हैं, तो एसक्यूएल NULLकिसी अन्य मूल्य से पहले इन (लापता प्रविष्टियों) को छांटेगा, हमें एक अच्छी तरह से परिभाषित आदेश देगा: पहले सभी पोस्ट को विशेष पोस्टमेटा फ़ील्ड गुम होने दें, दूसरे में फ़ील्ड वाले पोस्ट आते हैं। लेकिन है कि पूरे समस्या है: 'orderby' => 'meta_value'केवल उल्लेख कर सकते हैं 'meta_key' => 'item_price' और unaliased wp_postmetaहमेशा एक है INNER JOINके बजाय कभी एक LEFT JOIN, जिसका अर्थ है wp_postmeta.meta_valueऔर wp_postmeta.meta_keyकर सकते हैंकभी नहीं हो NULL

इसलिए मुझे लगता है कि मुझे यह कहना होगा कि यह वर्डप्रेस के बिल्ट-इन के साथ संभव नहीं है WP_Queryक्योंकि यह अब दस्तावेज में है (वर्डप्रेस-3.9.1 में)। नाक में दम करना। इसलिए यदि आपको वास्तव में सही ढंग से काम करने के लिए इसकी आवश्यकता है, तो आपको संभवतः वर्डप्रेस को कहीं और हुक करना होगा और उत्पन्न एसक्यूएल को सीधे संशोधित करना होगा


बहुत होनहार लग रहा है! मैं अगली बार इस मुद्दे पर कोशिश करूंगा। मैं आपको अभी उत्तर देना चाहता हूं, लेकिन यह पुष्टि करना पसंद करूंगा कि यह मेरे लिए पहले काम करता है।
पावरबॉय

इसने मेरे लिए सब कुछ दिखाने से रखा। इसे लागू करने के बाद कुछ नहीं दिखा।
जेक

@ जेक यहीं। आज फिर से यह मुद्दा था और यह कोशिश की। 0 परिणाम लौटाता है।
पॉवरबॉय

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

2

मुझे लगता है कि मेरे पास एक समाधान है।

आप दो meta_keyएस, एक कि सभी पदों का उपयोग कर सकते हैं (like "_thumbnail_id"), और meta_keyआप फिल्टर के रूप में उपयोग करना चाहते हैं।

तो अपने args:

$qry->set(
    'meta_query',
    array(
        'relation' => 'OR',
        array(
            'key' => 'item_price', 
            'value' => '', 
            'compare' => 'EXISTS'
        ),
        array(
            'key' => 'item_price', 
            'value' => '', 
            'compare' => 'EXISTS'
        )
    )
);

$qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
$qry->set('order', 'ASC DESC');
$qry->set('meta_key', 'item_price');

1
यहाँ समस्या खाली स्ट्रिंग तुलना है, इसे हटा दें और यह काम करता है 'value' => '', दूसरी तुलना भी होनी चाहिए NOT EXISTSऔर अंतिम सेट निर्देश की आवश्यकता नहीं है
नोड्स

2

समस्या यह है कि यहाँ सभी को मेटा प्रश्नों के क्रम के साथ क्या करना है। सही ढंग से सॉर्ट करने के लिए, आपको "EXISTS" क्वेरी से पहले "NOT EXISTS" क्वेरी डालनी होगी।

इसका कारण यह है क्योंकि वर्डप्रेस "ORDER BY" क्लॉज में अंतिम "LEFT JOIN" कथन के मेटा_वल्यू का उपयोग करता है।

उदाहरण के लिए:

$pageQuery = new WP_Query([
    'meta_query' => [
        'relation' => 'OR',
        ['key' => 'item_price', 'compare' => 'NOT EXISTS'], // this comes first!
        ['key' => 'item_price', 'compare' => 'EXISTS'],
    ],
    'order' => 'DESC',
    'orderby' => 'meta_value_num',
    'post_status' => 'publish',
    'post_type' => 'page',
    'posts_per_page' => 10,
]);

1

यदि उपयुक्त है, तो प्रत्येक बार पोस्ट सहेजे जाने या अपडेट होने पर आप डिफ़ॉल्ट मेटा वैल्यू जोड़ सकते हैं, यदि मेटा वैल्यू मौजूद नहीं है।

function addDefaultMetaValue($post_id) {
    add_post_meta($post_id, 'item_price', 0, true);
}
add_action('save_post', 'addDefaultMetaValue');

आप एक कस्टम पोस्ट प्रकार का उपयोग कर रहे हैं, तो बदलने के add_action('save_post', 'addDefaultMetaValue');द्वारा add_action('save_post_{post_type}', 'addDefaultMetaValue');जैसेadd_action('save_post_product', 'addDefaultMetaValue');


1

मुझे संख्यात्मक मेटा मूल्यों के लिए खुद से समस्या थी और बताया कि यह क्वेरी का क्रम भी महत्वपूर्ण है। मेरे लिए NOT EXISTSक्वेरी पहले वाली होनी चाहिए।

उदाहरण:

$query->set( 'orderby', 'meta_value_num' );
$query->set( 'meta_query', [
    'relation' => 'OR',
    [ 'key' => 'your_meta_name', 'compare' => 'NOT EXISTS' ],
    [
        'key' => 'your_meta_name',
        'compare' => 'EXISTS',
    ],
] );

सांख्यिक मूल्यों के लिए सही दिशा पाने के लिए भी महत्वपूर्ण है कि ’orderby’इसे सेट किया जाना सामान्य है ’meta_value_num’। अन्यथा आपके पास संख्यात्मक मानों के लिए अजीब परिणाम हैं, उदाहरण के लिए:

1, 2, 20, 21, 3, 4, 5…

के बजाय:

1, 2, 3, 4, 5… 20, 21


1

मुझे भी इसी तरह की समस्या का सामना करना पड़ा और निम्नलिखित समाधान से मुझे मदद मिली:

$args = array(
'post_type' => 'kosh_products',
'posts_per_page' => -1,
'meta_query' => array(
    'relation' => 'OR',
    'category_sort_order' => array(
        'key' => '_sort_order',
        'compare' => 'EXISTS'
    ),
    'category_sort_order_not_exists' => array(
        'key' => '_sort_order',
        'compare' => 'NOT EXISTS'
    ), 
),
'orderby' => array( 
    'category_sort_order' => 'ASC',
    'date' => 'ASC'
));
$query = new WP_Query( $args );

मुझे वर्डप्रेस कोडेक्स पर कई "मेटा_की " के साथ " ऑर्डरबाय " शीर्षक के साथ विवरण मिला : https://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_OrderbyParameters यहाँ छवि विवरण दर्ज करें


0

उसके लिए एक संभावित orderbyमूल्य meta_valueहै।

$query = new WP_Query( array ( 
    'meta_key'   => 'your_keys_name',
    'orderby'    => 'meta_value',
    'order'      => 'DESC',
    'meta_query' => array( array(
         'key'     => 'your_meta_key',
         'value'   => '',
         'compare' => 'NOT EXISTS',
         // 'type'    => 'CHAR',
    ) )
) );

यदि आपको संख्यात्मक मान मिले हैं, तो meta_value_numइसके बजाय उपयोग करें ।

अस्वीकरण: यह परीक्षण नहीं है, लेकिन यह काम करना चाहिए । बिंदु यह है कि आपको अपने meta_keyऔर keyमूल्यों को निर्दिष्ट करने की आवश्यकता है । इसके बजाय आप गैर-मौजूदा मूल्यों के खिलाफ तुलना नहीं कर सकते हैं, जिससे दोनों तरह के पदों को क्वेरी करना संभव हो सके। यह किसी तरह का हैक-ईश है, लेकिन जब तक यह काम करता है ...


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

मैंने अभी भी यह काम नहीं किया है, यदि आपके पास कोई समाधान है तो मुझे यह जानना अच्छा लगेगा कि मैं क्या गलत कर रहा हूं। इसके अलावा, मैं SO पर एक इनाम निर्धारित करता हूं अगर आप इसे दावा करना चाहते हैं: stackoverflow.com/questions/17016770/…
powerbuoy

1
दो चीज़ें। 'your_keys_name'और 'your_meta_key'दोनों को अलग-अलग के बजाय एक ही स्ट्रिंग होना चाहिए, अन्यथा ऐसा लगता है कि आपने प्रश्न को गलत समझा है। दूसरे, मैंने अपने स्थानीय सेटअप पर इसका परीक्षण किया और यह उन किसी भी पोस्ट को शामिल करता है जहां कुंजी मौजूद है (के माध्यम से meta_query) और किसी भी ऐसे पोस्ट को बाहर करता है जहां कुंजी गायब है ( meta_keyजिसके माध्यम से ) कोई पोस्ट नहीं दिखा रहा है। हालाँकि, यह उत्तर कम से कम ;-) कुछ शब्दों की ओर एक कदम है ।
बिंकी जू

1
ओह, दिलचस्प है, यह जवाब काम करता है अगर आप सिर्फ जोड़ते 'relation' => 'OR'हैं meta_query। निराला सामान o_o।
binki

@binki मेरे प्रश्न का संपादन करें और बिट्स को बदलें जो आपको लगता है कि बदलना चाहिए। यह एक समुदाय संचालित साइट है :)
kaiser

0

मुझे लगता है कि @kaiser क्या करने की कोशिश कर रहा था, यह बताने के लिए कि सभी पोस्ट को वापस करने के लिए क्वेरी है कि मेटा कुंजी एक प्रकार की डमी को लागू करने के लिए है जहां उन पदों में से किसी को भी फ़िल्टर नहीं करने की शर्त है । तो अगर आप जानते हैं कि सभी को महत्व देता है अपने कस्टम फ़ील्ड एक्स, वाई, जेड आप कह सकते हैं "कहां meta_key हैं ले जा सकते हैं में (एक्स, वाई, जेड) " लेकिन यह विचार आप कह कर सभी को एक साथ कि समस्या से बचने कर सकते हैं ! = ( ' ' :

$query = new WP_Query( array ( 
    'orderby'    => 'meta_value_num',
    'order'      => 'DESC',
    'meta_query' => array( array(
         'key'     => 'item_price',
         'value'   => '',
         'compare' => '!=',
    ) )
) );

यह भी परीक्षण नहीं किया गया है, लेकिन ऐसा लगता है कि यह एक कोशिश के लायक है :-)।


1
वास्तव में अभी इसका परीक्षण नहीं कर सकते, लेकिन बहुत यकीन है कि केवल वे पोस्ट लौटाएंगे जहाँ item_price सेट है और यह '' नहीं है।
पावरबॉय

0

मैंने एक हैक (IMHO) के एक बिट के साथ इसे प्राप्त करना समाप्त कर दिया, लेकिन इसने मेरे मामले में मेरे लिए काम किया।

ज्वाइन और ऑर्डर स्ट्रिंग्स को अपडेट करने के लिए आप फ़िल्टर पोस्ट_जॉइन_पेड और पोस्ट_ऑर्डर को हुक कर सकते हैं। यह आपको अनुमति देता है कि जब तक आप इसमें शामिल होना चाहते हैं, तब तक WP_Query के बजाय यह मान लें कि उस विशेष पद के लिए क्षेत्र मौजूद है। इसके बाद आप निकाल सकते हैं meta_key, orderbyअपने WP_Query आर्ग से, और `आदेश।

नीचे एक उदाहरण है। प्रत्येक फ़ंक्शन के शीर्ष पर मुझे कुछ मामलों के लिए बचना था क्योंकि यह WP_Query का उपयोग करने वाली हर चीज़ से इसे जोड़ देगा। आपको अपनी विशेष आवश्यकताओं को पूरा करने के लिए इसे संशोधित करने की आवश्यकता हो सकती है।

इन दोनों फ़िल्टरों पर दस्तावेज़ीकरण में बहुत कमी है ... सौभाग्य! :)

add_filter('posts_join_paged', 'edit_join', 999, 2);
add_filter('posts_orderby', 'edit_orderby', 999, 2);

/**
 * Edit join
 *
 * @param string $join_paged_statement
 * @param WP_Query $wp_query
 * @return string
 */
function edit_join($join_paged_statement, $wp_query)
{
    global $wpdb;
    if (
        !isset($wp_query->query)
        || $wp_query->is_page
        || $wp_query->is_admin
        || (isset($wp_query->query['post_type']) && $wp_query->query['post_type'] != 'my_custom_post_type')
    ) {
        return $join_paged_statement;
    }

    $join_to_add = "
        LEFT JOIN {$wpdb->prefix}postmeta AS my_custom_meta_key
            ON ({$wpdb->prefix}posts.ID = my_custom_meta_key.post_id
                AND my_custom_meta_key.meta_key = 'my_custom_meta_key')
    ";

    // Only add if it's not already in there
    if (strpos($join_paged_statement, $join_to_add) === false) {
        $join_paged_statement = $join_paged_statement . $join_to_add;
    }

    return $join_paged_statement;
}

/** 
 * Edit orderby
 *
 * @param string $orderby_statement
 * @param WP_Query $wp_query
 * @return string
 */
function edit_orderby($orderby_statement, $wp_query)
{
    if (
        !isset($wp_query->query)
        || $wp_query->is_page
        || $wp_query->is_admin
        || (isset($wp_query->query['post_type']) && $wp_query->query['post_type'] != 'my_custom_post_type')
    ) {
        return $orderby_statement;
    }

    $orderby_statement = "my_custom_meta_key.meta_value DESC";

    return $orderby_statement;
}

कोड काम करता है। लेकिन मेटा_वल्यू को एक स्ट्रिंग के रूप में संभाला जाता है। तो 6 को 50 के रूप में उच्च दर्जा दिया गया है। कोई भी संशोधन उन्हें संख्याओं के रूप में व्यवहार करना संभव है?
ड्राइविंग

@Drivingralle cast(my_custom_meta_key.meta_value as unsigned) DESCको करना चाहिए ट्रिक ...
tfrommen

1
धन्यवाद @tfrommen $orderby_statement = "cast(my_custom_meta_key.meta_value as unsigned) DESC";बहुत अच्छा काम करता है।
ड्राइविंग फेयर

0

इस समाधान ने मेरे लिए काम किया:

add_action( 'pre_get_posts', 'orden_portfolio' );
function orden_portfolio( $query ) {

    if( ! is_admin() ) {

        $query->set( 'orderby', 'meta_value_num' );
        $query->set( 'order', 'ASC' );
        $query->set( 'meta_query', [
            'relation' => 'OR',
            [ 
                'key' => 'ce_orden', 
                'compare' => 'NOT EXISTS' ],
            [
                'key' => 'ce_orden',
                'compare' => 'EXISTS',
            ],
        ] );

        return $query;

    }

}

हालाँकि, यह समाधान सबसे पहले अशक्त मेटा_वल्यू के साथ रिकॉर्ड दिखाता है। यह अन्य समाधान एएससी आदेश और नल को दिखाता है:

function custom_join($join) {
    global $wpdb;

    if( ! is_admin() ) {
        $join .= $wpdb->prepare(
        ' LEFT JOIN ' . $wpdb->postmeta . ' cpm ON cpm.post_id = ' . $wpdb->posts . '.ID AND cpm.meta_key = %s'
        , 'ce_orden' );
    }

    return $join;
}

add_filter('posts_join','custom_join');

function custom_orderby($orderby_statement){
    global $wpdb;

    if ( ! is_admin() ) {
        $orderby_statement = "CAST( COALESCE(cpm.meta_value,99999) as SIGNED INTEGER) ASC";
    }

    return $orderby_statement;
}

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