मैंने @ मैननी फ्लेममंड के उत्तर को लागू करने की कोशिश की और @ जेक की तरह मुझे वह टाइपो को ठीक करने के बाद भी काम करने के लिए नहीं मिला जो 'orderby' => 'meta_key'
होना चाहिए 'orderby' => 'meta_value'
। (और पूर्णता के लिए यह 'posts_per_page'
नहीं होना चाहिए 'post_per_page'
लेकिन इस मुद्दे को देखा जा रहा है प्रभावित नहीं करता है।)
यदि आप SQL क्वेरी को वास्तव में @Manny Fleurmond के जवाब (टाइपो को सही करते हुए) द्वारा उत्पन्न करते हैं, तो यह वही है जो आप देखते हैं:
SELECT wp_{prefix}_posts.* FROM wp_{prefix}_posts
LEFT JOIN wp_{prefix}_postmeta ON (wp_{prefix}_posts.ID = wp_{prefix}_postmeta.post_id AND wp_{prefix}_postmeta.meta_key = 'custom_author_name' )
LEFT JOIN wp_{prefix}_postmeta AS mt1 ON ( wp_{prefix}_posts.ID = mt1.post_id )
WHERE 1=1 AND (
wp_{prefix}_postmeta.post_id IS NULL
OR
mt1.meta_key = 'custom_author_name'
) AND wp_{prefix}_posts.post_type = 'news' AND
(wp_{prefix}_posts.post_status = 'publish' OR wp_{prefix}_posts.post_author = 1 AND wp_{prefix}_posts.post_status = 'private')
GROUP BY wp_{prefix}_posts.ID ORDER BY wp_{prefix}_postmeta.meta_value ASC
यह दिखाता है कि WP क्वेरी क्वेरी को पार्स कर रहा है जिस तरह से: यह प्रत्येक मेटा_क्वारी क्लॉज के लिए एक तालिका बना रहा है, फिर यह पता लगाना है कि उन्हें कैसे शामिल किया जाए और क्या ऑर्डर किया जाए। यदि आप केवल एक ही क्लॉज़ का उपयोग कर रहे हैं, तो आदेश ठीक काम करेगा 'compare' => 'EXISTS'
, लेकिन 'compare' => 'NOT EXISTS'
(जैसा कि हमें करना होगा) के साथ दूसरे क्लॉज़ को जोड़ने से ऑर्डर गड़बड़ हो जाता है। इसका परिणाम यह है कि LEFT JOIN का उपयोग पहले क्लॉज़ / टेबल और दूसरे क्लॉज़ / टेबल दोनों में शामिल होने के लिए किया जाता है - और जिस तरह से WP सब कुछ एक साथ रखता है, इसका मतलब है कि उपयोग 'compare' => 'EXISTS'
की गई तालिका वास्तव में किसी भी कस्टम फ़ील्ड से meta_values से पॉप्युलेट की जा रही है, न कि सिर्फ 'custom_author_name'
जिस क्षेत्र में हम रुचि रखते हैं। इसलिए मुझे लगता है कि उस खंड / तालिका द्वारा आदेश देने से केवल वांछित परिणाम मिलेंगे यदि 'समाचार' के विशेष पोस्ट_टाइप में केवल एक ही कस्टम फ़ील्ड है।
मेरी स्थिति के लिए काम करने वाले समाधान को अन्य खंड / तालिका द्वारा ऑर्डर करना था - NOT EXISTS एक। मुझे पता है कि प्रति-सहजता से पता चलता है, लेकिन जिस तरह से WP क्वेरी चर को पार्स करता है, वह यह तालिका है जहां meta_value
केवल कस्टम फ़ील्ड के बाद ही हम पॉपुलेटेड होते हैं।
(मेरे द्वारा इस मामले के लिए इस क्वेरी के समतुल्य चलाने का एकमात्र तरीका यह है:
SELECT wp_{prefix}_posts.ID, wp_{prefix}_postmeta.meta_value, mt1.meta_value FROM wp_{prefix}_posts
LEFT JOIN wp_{prefix}_postmeta ON (wp_{prefix}_posts.ID = wp_{prefix}_postmeta.post_id AND wp_{prefix}_postmeta.meta_key = 'custom_author_name' )
LEFT JOIN wp_{prefix}_postmeta AS mt1 ON ( wp_{prefix}_posts.ID = mt1.post_id )
WHERE 1=1 AND (
wp_{prefix}_postmeta.post_id IS NULL
OR
mt1.meta_key = 'custom_author_name'
) AND wp_{prefix}_posts.post_type = 'news' AND
(wp_{prefix}_posts.post_status = 'publish' OR wp_{prefix}_posts.post_author = 1 AND wp_{prefix}_posts.post_status = 'private')
ORDER BY wp_{prefix}_postmeta.meta_value ASC
मैंने जो कुछ किया है वह कॉलम दिखाया जा रहा है और ग्रुप बाय क्लॉज को हटा दिया गया है। इसके बाद मुझे पता चला कि क्या चल रहा था - कि पोस्टमेटा.मेटा_वेल्यू कॉलम सभी मेटा_की से मानों में खींच रहा था, जबकि mt1.meta_value कॉलम समाचार कस्टम फ़ील्ड से केवल मेटा_वल्यूज़ में खींच रहा था।)
समाधान
जैसा कि @ मैन्नी फ्लेमर्ड कहते हैं, यह पहला क्लॉज है जो ऑर्डरबी के लिए उपयोग किया जाता है, इसलिए इसका उत्तर केवल क्लॉस राउंड को स्वैप करना है, यह दे:
$args = array(
'post_type' => 'news',
'orderby' => 'meta_value',
'order' => 'ASC',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'custom_author_name',
'compare' => 'NOT EXISTS'
),
array(
'key' => 'custom_author_name',
'compare' => 'EXISTS'
)
),
'posts_per_page' => -1
);
$query = new WP_Query($args);
वैकल्पिक रूप से आप क्लॉस साहचर्य सरणियों और इसी कुंजी द्वारा आदेश कर सकते हैं, जैसे:
$args = array(
'post_type' => 'news',
'orderby' => 'not_exists_clause',
'order' => 'ASC',
'meta_query' => array(
'relation' => 'OR',
'exists_clause' => array(
'key' => 'custom_author_name',
'compare' => 'EXISTS'
),
'not_exists_clause' => array(
'key' => 'custom_author_name',
'compare' => 'NOT EXISTS'
)
),
'posts_per_page' => -1
);
$query = new WP_Query($args);
'orderby' => 'meta_value'
, तो इसने ऑर्डर को बदल दिया, लेकिन इसका वास्तविक मेट्रो क्षेत्र से कोई लेना-देना नहीं था।