कस्टम फ़ील्ड कुंजी (क्रॉस-पोस्ट) के लिए सभी मान प्राप्त करना


44

मुझे पता है कि किसी विशिष्ट पोस्ट के लिए कस्टम फ़ील्ड मान कैसे प्राप्त करें।

get_post_meta($post_id, $key, $single);

मुझे एक विशिष्ट कस्टम पोस्ट कुंजी के साथ जुड़े सभी मूल्यों को सभी पोस्टों पर प्राप्त करने की आवश्यकता है ।

किसी को भी ऐसा करने का एक कुशल तरीका पता है? मैं DB में सभी पोस्ट आईडी के माध्यम से लूप नहीं करना चाहता।

उदाहरण:

। मूड ’नामक एक कस्टम फ़ील्ड के लिए सभी विभिन्न मानों के साथ 4 पोस्ट। 2 पदों का मूल्य 'खुश' है, 1 पद का 'गुस्सा' है और 1 पद का 'दुख' है

मैं आउटपुट करना चाहता हूं: हमारे पास सभी पोस्टों में: दो खुश, एक नाराज़ और एक उदास लेखक।

लेकिन बहुत सारे पदों के लिए।

जो मैं देख रहा हूँ वह या तो है:

  • यह पाने के लिए एक WP फ़ंक्शन। या
  • एक कस्टम क्वेरी इसे यथासंभव कुशलता से प्राप्त करने के लिए।

5
लगता है कि आप इसे एक वर्गीकरण के रूप में उपयोग कर रहे हैं। बचत करते समय केवल (स्वचालित रूप से) इन पदों में एक शब्द क्यों न जोड़ें? क्वेरी करना बहुत आसान बना देगा।
कैसर

@kaiser मैं प्रतिभाशाली होने के लिए आपको पर्याप्त धन्यवाद नहीं दे सकता!
user2128576

जवाबों:


58

एक संभव दृष्टिकोण WPDB वर्ग में सहायक विधियों में से एक का उपयोग अधिक परिष्कृत मेटा आधारित क्वेरी करने के लिए होगा। हालांकि, इनमें से कुछ कार्यों का उपयोग करने के लिए चेतावनी यह है कि आप आमतौर पर डेटा का एक साधारण सरणी वापस नहीं लेते हैं और आमतौर पर ऑब्जेक्ट गुणों के लिए अनावश्यक संदर्भ बनाना पड़ता है, भले ही आप केवल एक कॉलम या पंक्ति के लिए कॉल कर रहे हों।

बेशक, सभी फ़ंक्शन एक और समान नहीं हैं, और एक उद्देश्यपूर्ण उल्लेख WPDB विधि के लिए निकलता है , get_colजो डेटा के लिए सरल फ्लैट सरणी देता है , जिसके लिए मैं विशेष रूप से उल्लेख करता हूं क्योंकि निम्नलिखित उदाहरण इस पद्धति पर कॉल करेंगे ।

वर्डप्रेस - WPDB डेटा के एक कॉलम का चयन
$ wpdb-> get_col ()

यहां एक उदाहरण फ़ंक्शन है जो चुने हुए पोस्ट प्रकार, पद की स्थिति और विशिष्ट मेटा कुंजी (या कम तकनीकी रूप से मन लगाने के लिए कस्टम फ़ील्ड) के सभी पदों के लिए डेटाबेस पर सवाल उठाता है।

function get_meta_values( $key = '', $type = 'post', $status = 'publish' ) {

    global $wpdb;

    if( empty( $key ) )
        return;

    $r = $wpdb->get_col( $wpdb->prepare( "
        SELECT pm.meta_value FROM {$wpdb->postmeta} pm
        LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
        WHERE pm.meta_key = %s 
        AND p.post_status = %s 
        AND p.post_type = %s
    ", $key, $status, $type ) );

    return $r;
}

उदाहरण के लिए, यदि आप यह जानना चाहते हैं कि किन पोस्टों में रेटिंग की मेटा कुंजी है , पोस्ट प्रकार की फिल्मों के लिए और आप उस जानकारी को एक चर के अंदर संग्रहीत करना चाहते हैं, तो ऐसी कॉल का एक उदाहरण होगा।

$movie_ratings = get_meta_values( 'rating', 'movies' );

यदि आप उस डेटा को स्क्रीन पर प्रिंट करने के अलावा और कुछ नहीं करना चाहते हैं, तो PHP का फंक्शन फ़ंक्शन उस सरल सरणी को डेटा की रेखाओं में विभाजित कर सकता है।

// Print the meta values seperate by a line break
echo implode( '<br />', get_meta_values( 'YOURKEY' ));

आप लौटे डेटा का उपयोग यह जानने के लिए भी कर सकते हैं कि लौटाए गए डेटा पर एक साधारण लूप बनाकर और कितने काउंट्स हैं, उदाहरण के लिए, काउंट की एक सरणी का निर्माण करके।

$movie_ratings = get_meta_values( 'rating', 'movies' );
if( !empty( $movie_ratings ) ) {
    $num_of_ratings = array();
    foreach( $movie_ratings as $meta_value )
        $num_of_ratings[$meta_value] = ( isset( $num_of_ratings[$meta_value] ) ) ? $num_of_ratings[$meta_value] + 1 : 1;
}

/*
Result:
Array(
    [5] => 10
    [9] => 2
)
// ie. there are 10 movie posts with a rating of 5 and 2 movie posts with a rating of 9.
*/

इस तर्क को विभिन्न प्रकार के डेटा पर लागू किया जा सकता है, और विभिन्न तरीकों से किसी भी संख्या में काम करने के लिए बढ़ाया जा सकता है। इसलिए मुझे आशा है कि मेरे उदाहरण सहायक और सरल रूप से अनुसरण करने के लिए पर्याप्त हैं।


3
भविष्य के दर्शकों के लिए भी मजेदार तथ्य, यदि आप केवल विशिष्ट मेटा मानों को खींचना चाहते हैं - आप ऊपर दिए गए फ़ंक्शन के DISTINCTठीक बाद टाइप SELECTकरते हैं। उपयोगी हो सकता है।
Howdy_McGee

मुझे लगता है कि यह अत्यंत उपयोगी है
पाब्लो एसजी पचेको

यह कैसे करें, और मानों को वापस लौटाएं? मुझे लगता है कि ORDER का उपयोग करके, लेकिन मैं इसका उपयोग करने का तरीका पता नहीं लगा सकता हूं
efirvida

14

मैं बस t31os कोड के ऊपर एक छोटी सी बात जोड़ना चाहूंगा । जब मैंने स्वयं इस कोड का उपयोग किया तो मैंने डुप्लिकेट प्रविष्टियों को समाप्त करने के लिए "SELECT" को "SELECT DISTINCT" में बदल दिया।


1
मैं ऐसे मामलों की कल्पना कर सकता हूं जहां एक ही मूल्य के कई मेटा मान होना मान्य होगा, और इस तरह से मेरे कोड के अतिरिक्त नहीं बना। यदि आप अलग मूल्य चाहते हैं, तो यह हालांकि जाने का रास्ता होगा। इसके अतिरिक्त आप फ़ंक्शन के लिए एक तर्क के रूप में भी जोड़ सकते हैं (ताकि आप इसका उपयोग कर सकते हैं या नहीं, उपयुक्त के रूप में)।
t31os

10

यह वैश्विक $ wpdb का उपयोग करने के लिए अच्छा या आवश्यक नहीं है:

// function to grab all possible meta values of the chosen meta key.
function get_meta_values( $meta_key,  $post_type = 'post' ) {

    $posts = get_posts(
        array(
            'post_type' => $post_type,
            'meta_key' => $meta_key,
            'posts_per_page' => -1,
        )
    );

    $meta_values = array();
    foreach( $posts as $post ) {
        $meta_values[] = get_post_meta( $post->ID, $meta_key, true );
    }

    return $meta_values;

}

$meta_values = get_meta_values( $meta_key, $post_type );

ज्यादातर मामलों में यह ऐसा करने का मेरा पसंदीदा तरीका होगा। यह केवल एक के बजाय पांच क्वेरी करता है, लेकिन जैसा कि यह मानक वर्डप्रेस प्रक्रियाओं का उपयोग कर उन्हें उत्पन्न और प्रस्तुत करने के लिए करता है, किसी भी प्लेटफ़ॉर्म-विशिष्ट कैशिंग (जैसे WP इंजन की ऑब्जेक्ट कैशिंग या कुछ यादृच्छिक प्लगइन) में डेटा भी किक करेगा। अनुरोध की अवधि के लिए वर्डप्रेस के आंतरिक कैश में संग्रहीत किया जाता है, इसलिए यदि आवश्यक हो, तो डेटाबेस से फिर से प्राप्त करने की आवश्यकता नहीं होगी।
एंड्रयू डीनमोर

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

4

सबसे तेज़ तरीका एक कस्टम sql क्वेरी होगी और मुझे यकीन नहीं है लेकिन आप कोशिश कर सकते हैं

$wpdb->get_results("
  SELECT posts.* , COUNT(*) 'moodcount'
  FROM $wpdb->posts as posts
  JOIN $wpdb->postmeta as postmeta
  ON postmeta.post_id = posts.ID
  AND postmeta.meta_key = 'Mood'
  GROUP BY postmeta.meta_key
");

अगर कुछ है तो इसकी शुरुआत है।


1
धन्यवाद, लेकिन कस्टम quesries 'हर कीमत पर' से बचा जाना चाहिए? मैं WP अमूर्त परत का उपयोग करना पसंद करूंगा (यह है कि इसे क्या कहा जाता है?) ... लेकिन निश्चित रूप से यदि यह संभव नहीं है ..
mikkelbreum

कस्टम क्वेरी, यदि सही तरीके से लिखा गया है, तो बेहतर हो सकता है और आपको केवल उनसे बचना चाहिए यदि आपको नहीं पता कि आप क्या कर रहे हैं।
बैनेटर्न

1
मैं mwb के साथ सहमत हूँ। कस्टम प्रश्न बहुत उपयोगी और व्यावहारिक हैं, लेकिन मुझे लगता है कि वे डीबी पर बहुत अधिक भारी हैं .. विशेष रूप से SRT फ़ंक्शन का उपयोग करते हुए ..
krembo99

3

मेटा कुंजी द्वारा सभी मेटा मान प्राप्त करने के लिए

Check wp-> db wordpress codex

$values = $wpdb->get_col("SELECT meta_value
    FROM $wpdb->postmeta WHERE meta_key = 'yourmetakey'" );

3
इस दृष्टिकोण के साथ समस्या विशिष्टता की कमी है, आपको ऐसी क्वेरी से कई परिणाम मिलेंगे, जिसमें ड्राफ्ट, ट्रैश किए गए आइटम, पोस्ट, पेज और किसी भी अन्य प्रकार के पोस्ट शामिल हो सकते हैं। आपको कभी भी उस चीज के लिए क्वेरी नहीं करनी चाहिए जिसकी आपको आवश्यकता नहीं है, विशिष्टता की सबसे अधिक आवश्यकता है।
t31os

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

2

कोई कारण नहीं है कि आप t31os और Bainternet के कोड को एक पुन: प्रयोज्य तैयार कथन (वर्डप्रेस शैली) में विलय नहीं कर सकते हैं जो एक कुशल संचालन में गिनती और मान लौटाता है।

यह एक कस्टम क्वेरी है लेकिन यह अभी भी वर्डप्रेस डेटाबेस अमूर्त परत का उपयोग कर रहा है - इसलिए उदाहरण के लिए यह मायने नहीं रखता है कि तालिका के नाम वास्तव में क्या हैं, या यदि वे बदलते हैं, और यह एक तैयार कथन है, तो हम SQL हमलों आदि से बहुत सुरक्षित हैं। ।

इस उदाहरण में मैं अब पोस्ट प्रकार के लिए जाँच नहीं कर रहा हूँ और मैं खाली स्ट्रिंग को बाहर कर रहा हूँ:

    $r = $wpdb->get_results(  $wpdb->prepare( "
        SELECT pm.meta_value AS name, count(*) AS count  FROM {$wpdb->postmeta} pm
        LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
        WHERE pm.meta_key = '%s'
        AND pm.meta_value != '' 
        AND p.post_type = '%s'
        GROUP BY pm.meta_value
        ORDER BY pm.meta_value          
        ", $key, $type) 
        );
    return $r;

इसमें विशेष रूप से

यह वस्तुओं की एक सरणी लौटाएगा जैसे:

array  
 0 => 
 object(stdClass)[359]
  public 'name' => string 'Hamish' (length=6)
  public 'count' => string '3' (length=1)
 1 => 
 object(stdClass)[360]
  public 'name' => string 'Ida' (length=11)
  public 'count' => string '1' (length=1)
 2 => 
 object(stdClass)[361]
  public 'name' => string 'John' (length=12)
  public 'count' => string '1' (length=1)

0

निम्नलिखित के साथ foreach का उपयोग करें

 $key = get_post_custom_values( 'key' );

माना जाता है कि आपकी कस्टम फ़ील्ड कुंजी का नाम है


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