मेटा मूल्य या दिनांक द्वारा आदेश?


10

कहा जाता है एक कस्टम क्षेत्र है, startDateलेकिन यह केवल कुछ घटनाओं पर। मैं सोच रहा था कि क्या यह उस पोस्ट के लिए सेट नहीं है जिसका उपयोग मैं post_dateपोस्ट लिस्ट बनाने के लिए कर सकता हूं ?

// if meta_key _postmeta.startDate isn't set get the rest by posts.post_date

query_posts(
    array(
        array(
            'posts_per_page' => 10,
            'meta_key' => 'startDate',
            'meta_value' => date('Y-m-d'),
            'meta_compare' => '<',
            'orderby' => 'meta_value',
            'order' => 'ASC'
        ), 
        array(
            'meta_key' => 'post_date',
            'meta_value' => date('Y-m-d'),
            'meta_compare' => '<'
        )
    )
);

एक कस्टम फ़ील्ड post_date है?
बैनेटर्न

मैं अपने डिफ़ॉल्ट वर्डप्रेस प्रकाशित क्षेत्र हालांकि गलत हो सकता है अनुमान? किसी भी तरह से आईडी को डिफ़ॉल्ट तिथि का उपयोग करना पसंद है ...
v3nt

ठीक है, तो यह एक मेटा फ़ील्ड नहीं है इसके पोस्ट टेबल में
बैनटर्नेट

अपनी क्वेरी दलीलों को निश्चित करें, आशा है कि आपने जो कुछ भी चित्रण नहीं किया था, वह तिरछा नहीं किया है, कृपया यदि आवश्यक हो तो वापस करने के लिए स्वतंत्र महसूस करें।
t31os

चीयर्स t31os - इसे फिर से स्पष्ट करने के लिए इसे संपादित किया। अब इसे स्टार्टडेट का उपयोग करके पुराने से पुराने कंटेंट को चुनने की आवश्यकता है, और यदि स्टार्टडैट को डिफ़ॉल्ट पोस्ट्स की तारीख post_date का उपयोग करने के लिए सेट नहीं किया गया है।
v3nt

जवाबों:


11

यदि आप इसे SQL में समझा सकते हैं, तो आप इसके लिए क्वेरी कर सकते हैं! तीन स्थान हैं जहाँ हम डिफ़ॉल्ट क्वेरी बदलना चाहते हैं:

SELECT wp_posts.*
FROM wp_posts 
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
WHERE 1=1
    AND wp_posts.post_type = 'post'
    AND (wp_posts.post_status = 'publish')
    AND wp_postmeta.meta_key = 'startDate'
    AND CAST(wp_postmeta.meta_value AS CHAR) < '2011-03-23'
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value DESC
LIMIT 0, 10
  • ज्वाइन लेफ्ट जॉइन होना चाहिए
  • जहाँ-तहाँ
  • आदेश

में शामिल होने और जहां-खंड के माध्यम से जोड़ रहे हैं समारोह । आउटपुट फ़िल्टर किया गया है, इसलिए हम इसमें हुक कर सकते हैं:_get_meta_sql()

add_filter( 'get_meta_sql', 'wpse12814_get_meta_sql' );
function wpse12814_get_meta_sql( $meta_sql )
{
    // Move the `meta_key` comparison in the join so it can handle posts without this meta_key
    $meta_sql['join'] = " LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'startDate') ";
    $meta_sql['where'] = " AND (wp_postmeta.meta_value IS NULL OR wp_postmeta.meta_value < '" . date('Y-m-d') . "')";
    return $meta_sql;
}

ऑर्डर क्लॉज के माध्यम से फ़िल्टर किया जाता है posts_orderby:

add_filter( 'posts_orderby', 'wpse12814_posts_orderby' );
function wpse12814_posts_orderby( $orderby )
{
    $orderby = 'COALESCE(wp_postmeta.meta_value, wp_posts.post_date) ASC';
    return $orderby;
}

यह हमें निम्नलिखित SQL क्वेरी देता है:

SELECT wp_posts.*
FROM wp_posts
LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'startDate')
WHERE 1=1
    AND wp_posts.post_type = 'post'
    AND (wp_posts.post_status = 'publish')
    AND (wp_postmeta.meta_value IS NULL OR wp_postmeta.meta_value < '2011-03-23')
GROUP BY wp_posts.ID
ORDER BY COALESCE(wp_postmeta.meta_value, wp_posts.post_date) ASC
LIMIT 0, 10

अपनी क्वेरी करने के बाद फ़िल्टर को अनहुक करना याद रखें, अन्यथा आप अन्य प्रश्नों को भी गड़बड़ कर देंगे। और यदि संभव हो तो आपको query_posts()खुद को कॉल नहीं करना चाहिए , लेकिन पृष्ठ को सेट करते समय वर्डप्रेस द्वारा की जाने वाली मुख्य पोस्ट क्वेरी को संशोधित करें।


2
बहुत ही सुंदर समाधान है, मैंने उस तरह COALESCE का उपयोग करने के बारे में नहीं सोचा होगा। मैं सिर्फ डिफ़ॉल्ट 'wp_' उपसर्ग नहीं मानने की सलाह दूंगा और इसके बजाय {$ wpdb-> उपसर्ग} का उपयोग कर रहा हूँ ...
Goldenapples

@goldenapples: हां, आप इसे सामान्य कर सकते हैं, लेकिन यह इस क्वेरी के लिए पहले से ही इतना विशिष्ट है (यह मेटा पार्ट के साथ अन्य प्रश्नों को गड़बड़ कर देगा), कि मुझे लगा कि यह आवश्यक नहीं था।
Jan Fabry

धन्यवाद जनवरी - कि एक आंख खोलने वाला है! अभी भी WordPress के साथ पकड़ रहा है और सोच रहा है कि यह मेरे पृष्ठ पर कहाँ कहा जाता है? और मैं इसे 'अन-हुक' कैसे करूंगा? यानी // $ theQuery ... तो <? php if (has_posts ()): जबकि (has_posts ()): the_post (); ?>?
v3nt

@daniel: आप अपनी थीम की functions.phpफ़ाइल में फ़ंक्शन रख सकते हैं । इसके बाद आप जिस क्वेरी को निष्पादित करते हैं, उसे दो add_filter()पंक्तियों में रखने से ठीक पहले । क्वेरी के बाद आप remove_filter( 'get_meta_sql', 'wpse12814_get_meta_sql' ); remove_filter( 'posts_orderby', 'wpse12814_posts_orderby' );उन्हें फिर से निकालने के लिए लिखते हैं ।
जन फैब्री

आह - यह सब अब समझ में आ रहा है और काम भी कर रहा है! बहुत धन्यवाद Jan. Thats उपयोगी होने वाला ...
v3nt

0

की तर्ज पर कुछ प्रयास करें:

$postedtime = get_post_meta($post->ID, 'startDate');

if($postedtime != null){
$orderby = $postedtime;

}else{
$orderby = 'date';
}

धन्यवाद एलेक्स, लेकिन यह कैसे पाश शामिल हो जाता है यकीन नहीं है?
v3nt

doh! जब आप query_posts (ऐरे ('ऑर्डरबी' => $ ऑर्डरबी))
एलेक्स ओल्ड

0

एक क्वेरी पोस्ट कॉल केवल एक क्वेरी बनाता है, दो नहीं। तो नहीं, आपके पास दो अलग-अलग प्रश्न नहीं हो सकते हैं और फिर परिणामों को संक्षिप्त कर सकते हैं।

याद रखें, आप यहाँ पोस्ट के कुछ सेट का चयन कर रहे हैं, फिर उन्हें प्रदर्शित कर रहे हैं। वह सेट एक ही बार में चुना जाता है। यदि आप पोस्ट के दो अलग-अलग सेट प्राप्त करना चाहते हैं और फिर उन्हें मर्ज करते हैं, तो यह कुछ ऐसा है जो आपको अपने आप को get_post या समान के साथ करना होगा।

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