एक कस्टम फ़ील्ड द्वारा फ़िल्टर करें, दूसरे द्वारा ऑर्डर करें?


10

मैं एक कस्टम पोस्ट प्रकार "लिस्टिंग" है और मैं सभी लिस्टिंग एक कस्टम फ़ील्ड है कि प्राप्त करना चाहते हैं gateway_value != 'Yes', और एक अन्य कस्टम फ़ील्ड के आधार पर परिणामों के आदेश, location_level1_value। मुझे अलग से काम करने के लिए प्रश्न मिल सकते हैं, लेकिन मैं उन्हें संयोजित नहीं कर सकता:

क्वेरी 1 (स्थान के आधार पर छाँटें):

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'post_status' => 'publish',
                    'posts_per_page' => '9',
                    'meta_key' => 'location_level1_value',
                    'orderby' => 'location_level1_value',
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                 );

क्वेरी 2 (कस्टम फ़ील्ड मान! = हाँ):

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'posts_per_page' => '9',
                    'post_status' => 'publish',
                    'meta_key' => 'gateway_value',
                    'meta_value' => 'Yes',
                    'meta_compare' => '!=',
                    'paged' => $paged
                    )
                );

संयुक्त प्रश्न:

मैंने इसके लिए मदद के लिए कोडेक्स को देखा , लेकिन निम्नलिखित क्वेरी काम नहीं करती है:

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'posts_per_page' => '9',
                    'post_status' => 'publish',
                    'meta_query' => array(
                        array(
                            'key' => 'gateway_value',
                            'value' => 'Yes',
                            'compare' => '!='
                        ),
                        array(
                            'key' => 'location_level1_value'
                        )
                    ),
                    'orderby' => "location_level1_value",
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                );

मैं संयुक्त क्वेरी में क्या गलत कर रहा हूं?

[अद्यतन]: तो अब जब ३.१ जारी किया गया है, तो ऊपर दिया गया संयुक्त प्रश्न अभी भी काम नहीं करता है। मुझे परिणाम मिलते हैं, बस सही ढंग से हल नहीं किया जाता है।

[अद्यतन]: var_dump($wp_query->request)निम्नलिखित देता है:
string(527) " SELECT SQL_CALC_FOUND_ROWS wp_7v1oev_posts.* FROM wp_7v1oev_posts INNER JOIN wp_7v1oev_postmeta ON (wp_7v1oev_posts.ID = wp_7v1oev_postmeta.post_id) INNER JOIN wp_7v1oev_postmeta AS mt1 ON (wp_7v1oev_posts.ID = mt1.post_id) WHERE 1=1 AND wp_7v1oev_posts.post_type = 'listing' AND (wp_7v1oev_posts.post_status = 'publish') AND wp_7v1oev_postmeta.meta_key = 'gateway_value' AND CAST(wp_7v1oev_postmeta.meta_value AS CHAR) != 'Yes' AND mt1.meta_key = 'location_level1_value' ORDER BY wp_7v1oev_posts.post_date DESC LIMIT 0, 9"


3
क्या आप वर्डप्रेस 3.1 का उपयोग कर रहे हैं? meta_queryपैरामीटर 3.1 में नया है, कारण बहुत जल्द ही रिलीज होने वाली है, लेकिन मौजूदा स्थिर संस्करण अभी भी 3.0.5 है, इस पैरामीटर के बिना।
जनवरी को जान फेब्री

एर ... ठीक है, यह शायद तब होगा। किसी भी तरह से यह 3.0.5 में काम करने के लिए?
गिलेस्पीजा

मिलजेंको के पास सबसे अच्छा जवाब है कि आपको उनकी जगह अपना मानना ​​चाहिए।
ह्यूगो

जवाबों:


9

आप फ़िल्टरिंग विकल्पों के साथ 'मेटा_क्वरी' का उपयोग करके इच्छित सामग्री को फ़िल्टर करने के लिए क्वेरी का उपयोग कर सकते हैं, और आदेश भाग के लिए, बस निम्नलिखित पैरामीटर जोड़ें / संशोधित करें:

  • 'ऑर्डरबी' => 'मेटा_वल्यू'
  • 'meta_key' => 'location_level1_value'
  • 'आदेश' => 'एएससी'

    $wp_query = new WP_Query( array (
        'post_type'      => 'listing',
        'posts_per_page' => '9',
        'post_status'    => 'publish',
        'meta_query'     => array(
            array(
                'key'       => 'gateway_value',
                'value'     => 'Yes',
                'compare'   => '!='
            )
        ),
        'orderby'  => 'meta_value',            // this means we will be using a selected 
                                               // meta field to order
    
        'meta_key' => 'location_level1_value', // this states which meta field 
                                               // will be used in the ordering, 
                                               // regardless of the filters
        'order'    => 'ASC',
        'paged'    => $paged
        )
    );
    

2

ठीक उसी तरह जैसे जनवरी ने नए वर्डप्रेस 3.1 में कहा था कि आप इसका उपयोग कर सकते हैं, meta_queryलेकिन जब तक यह नहीं आएगा तब तक आप अपनी पहली क्वेरी को ऑर्डर करने और अपने लूप के अंदर फिल्टर करने के लिए उपयोग कर सकते हैं:

 Global $my_query;
$my_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'post_status' => 'publish',
                    'posts_per_page' => '9',
                    'meta_key' => 'location_level1_value',
                    'orderby' => 'location_level1_value',
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                 );
while ($my_query->have_posts){
    $my_query->the_post();
              //do your loop stuff
} 

और इस कोड को अपने functions.php में जोड़ें

   //join filter
         add_filter('posts_join', 'listing_join_865' );
         function listing_join_865($join){
Global$ my_query;            
if ('listing' = $my_query->query['post_type']){
                $restriction1 = 'gateway_value';
                return $join .="
                LEFT JOIN $wpdb->postmeta AS $restriction1 ON(
                $wpdb->posts.ID = $restriction1.post_id
                AND $restriction1.meta_key = '$restriction1'
                )";
             }else {
                return $join;
            }
         }
         //where filter
         add_filter('posts_where', 'listing_where_865' );
         function listing_where_865($where){
             global $my_query;
            if ('listing' = $my_query->query['post_type']){
                return $where.= " AND $restriction1.meta_value != 'yes'";
            }else{
                return $where;
            }
         }

अब यह काम करना चाहिए।


इसके लिए धन्यवाद। यह काम करता है, सिवाय इसके कि मेरे पास यह अजीब दुष्प्रभाव है कि मेरा पेजिंग ठीक से काम नहीं करता है। प्रति पृष्ठ 9 के बजाय, मेरे ग्रिड में "रिक्त स्थान" हैं, जहां कस्टम पोस्ट जो gateway_value == "Yes"सशर्त के बिना होती ... किसी भी विचार को कैसे ठीक किया जाए?
गिलेस्पी 16

हाँ, जो पेजिंग को गड़बड़ कर देगा इसलिए मुझे लगता है कि इसके चारों ओर एकमात्र तरीका एक कस्टम sql क्वेरी होगी, मुझे कुछ मिनट दें।
बैनटेनट

चिंता न करें - मैं सिर्फ दूसरी क्वेरी का उपयोग करूँगा और प्लगइन का उपयोग करूँगा। WordPress
netend

बांध, मैं अभी एक समाधान खोजने के बाद आपकी टिप्पणी देखने के लिए वापस आ गया। वैसे भी यह भविष्य पूछने वालों के लिए यहाँ है।
बैनटेनट

1
@ t31os - मैं आमतौर पर ऐसा करता हूं लेकिन मेरे सेल फोन से जवाब देने पर नहीं।
बैनटेनट

1

मेरे अपने प्रश्न का उत्तर देने के लिए क्षमा याचना:

[Http://core.trac.wordpress.org/ticket/15031 ग्रेडिंग [1] को देखते हुए, ऐसा लगता है कि यह एक ज्ञात मुद्दा है। मैंने इसका उपयोग करके काम करने के लिए (हैक किया गया) तय किया है post_filter, जैसे (बस किसी के संदर्भ के लिए जो उसी उत्तर की खोज कर सकता है):

Functions.php में ###

add_filter('posts_orderby', 'EV_locationl1' );
function EV_locationl1 ($orderby) {
    global $EV_locationl1_orderby;
    if ($EV_locationl1_orderby) $orderby = $EV_locationl1_orderby;
    return $orderby;
}

टेम्पलेट फ़ाइल ### में संशोधित wp_query

$EV_locationl1_orderby = " mt1.meta_value ASC";

$wp_query = new WP_Query( array (
    'post_type' => 'listing',
    'posts_per_page' => '9',
    'post_status' => 'publish',
    'meta_query' => array(
            array(
                    'key' => 'gateway_value',
                    'value' => 'Yes',
                    'compare' => '!='
                    ),
            array(
                    'key' => 'location_level1_value'
            )
        ),
    'order' => $EV_locationl1_orderby,
    'paged' => $paged
    ));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.