पहले क्रम और फिर क्रम को क्रमबद्ध करने के लिए ऑर्डरबी और मेटा_वेल्यू_एनम का उपयोग करना


16

मेरे पास उत्पादों की एक सूची है, प्रत्येक में एक कस्टम फ़ील्ड की कीमत है जो "2.50" या "5.00" जैसे पाठ के रूप में संग्रहीत है और मैं उन्हें पृष्ठ पर एक कस्टम क्वेरी के साथ प्रदर्शित कर रहा हूं जो कि मूल्य के अनुसार है:

    if(!$wp_query) {
        global $wp_query;
    }

    $args = array(
        'meta_key' => 'price',
        'orderby' => 'meta_value_num',
        'order' => 'ASC'
    );

    query_posts( array_merge( $args , $wp_query->query ) );

यह कीमतों के लिए ठीक काम करता है, लेकिन कुछ कीमतें "पीओए" हैं और मैं उन्हें अंतिम दिखाना चाहूंगा, हालांकि उपरोक्त आदेश इस तरह से हैं कि "पीओए" पहले दिखाया गया है।

क्या इसे बदलने का कोई तरीका है, या एक त्वरित हैक मैं बाद में सरणी को सॉर्ट करने और किसी भी "पीओए" की कीमतें लगाने के लिए उपयोग कर सकता हूं?


बदलने का प्रयास 'orderby' => 'meta_value_num', करने के लिए'orderby' => 'meta_value_num meta_value',
Bainternet

धन्यवाद, लेकिन यह काम नहीं करता है :(
शॉन

अहा! लेकिन दूसरी तरह के आसपास काम करता है meta_value meta_value_num,! धन्यवाद! क्या आप एक उत्तर लिखना चाहते हैं ताकि मैं इसे वोट कर सकूं?
शॉन

1
उन लोगों के लिए एक उत्तर के रूप में पोस्ट किया गया जो टिप्पणी नहीं पढ़ते हैं।
बैनटेनट

POA का अर्थ है "पूछने पर कीमत" en.wikipedia.org/wiki/Price_on_application
sudip

जवाबों:


23

OrderByतर्क एक से अधिक पैरामीटर ले जा सकते हैं तो समाधान परिवर्तन करने के लिए किया गया था:

'orderby' => 'meta_value_num',

सेवा:

'orderby' => 'meta_value meta_value_num',

3
यह सिर्फ वर्णानुक्रम में सॉर्ट करता है, क्योंकि दूसरा पैरामीटर एक नो-ऑप है, उसी फ़ील्ड को बिना किसी प्रभाव के सॉर्ट करना। ऐसा करने के लिए कि संख्याएँ संख्यात्मक रूप से छांटें और वर्णमाला वर्णानुक्रम में आपको किसी प्रकार के SQL आवरण का उपयोग करने के लिए क्रम को अनुकूलित करने के लिए फ़िल्टर का उपयोग करना होगा, जैसेORDER BY CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC
9

@bonger धन्यवाद! इस समस्या के लिए आपका समाधान पूर्ण समाधान है। और यहाँ बाकी कोड है जहाँ आपकी क्वेरी रखी गई है। मैं इसे नए आगंतुकों के लिए उत्तर के रूप में पोस्ट करने जा रहा हूं।
गंगेश

2

मुझे यह हल @bonger और /programming/18084199/wordpress-query-order-by-case-wh द्वारा कोड के संयोजन से मिला।

और यह अच्छी तरह से काम करता है।

समारोह

function filter_case($orderby = '') {
  $orderby .= "CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC";
  return $orderby;
}

क्वेरी से पहले

add_filter( 'posts_orderby', 'filter_case' );

$wp_query = new WP_Query($args);

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