मैं आंशिक मेटा कुंजी द्वारा पोस्ट के लिए क्वेरी कैसे करूं?


9

मेरे पास एक फ़ंक्शन है जो पोस्ट मेटा के रूप में एक पोस्ट के लिए "जैसे" स्थिति को संग्रहीत करता है। मैं उस "पसंद" को उस उपयोगकर्ता के साथ जोड़ना चाहता हूं जो उसे पसंद आया, इसलिए मैंने "like_status_ {user_id}" नामक एक कस्टम फ़ील्ड सेट किया (जहाँ {user_id} वर्तमान में लॉग इन उपयोगकर्ता की आईडी है) जिसे मैं 0 या के रूप में संग्रहीत करता हूं 1. तो कई "पसंद" वाले पोस्ट के लिए db में कई मेटा मान होंगे जो इस तरह से सेटअप हैं:

'meta_key' = 'like_status_0'
'meta_value' = 1
'meta_key' = 'like_status_2'
'meta_value' = 1
'meta_key' = 'like_status_34'
'meta_value' = 1

....और इसी तरह।

किसी विशिष्ट पोस्ट पर संभावित रूप से हजारों लाइक्स हैं। मैं एक ऐसी क्वेरी कैसे चलाऊंगा जिसमें दिखाया गया हो कि कोई अन्य व्यक्ति भी उस पोस्ट को पसंद करता है?

मैं कुछ इस तरह सोच रहा था:

$query = new WP_Query(array(
    'meta_key' => 'like_status_{user_id}',
    'meta_value' => 1,
));

मैं हर किसी को एक अधिसूचना को धक्का देने की कोशिश कर रहा हूं, जिसे कोई पोस्ट पसंद आया है जब कोई व्यक्ति उस पोस्ट को पसंद करता है ... कुछ ऐसा है, "अरे, किसी और को वह पोस्ट पसंद आया जो आपको पसंद आया। आपको इसे देखना चाहिए!" लेकिन मुझे यह पता लगाने के लिए एक तरीका चाहिए कि क्या किसी और ने भी उस पोस्ट को पसंद किया है और यदि हां, तो वे कौन होंगे इसलिए मैं उन्हें सूचित कर सकता हूं।

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

जवाबों:


6

दुर्भाग्य से आप meta_queryका उपयोग करते समय मूल्य LIKEपर एक तुलना का उपयोग नहीं कर सकते । मैं इस सड़क से नीचे उतर गया हूँ ...meta_keyWP_Query

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

विकल्प 1

  • अपने मेटा स्कीमा के संशोधन की आवश्यकता नहीं है
  • wpdbकस्टम क्वेरी करने के लिए कक्षा का उपयोग करता है

उदाहरण:

//when a user likes a post...
$current_user_id = get_current_user_id();
add_post_meta($current_user_id, "like_status_{$current_user_id}", 1, false);

//later in the request...
global $wpdb;

$results = $wpdb->get_results(
    "
    SELECT meta_key 
    FROM {$wpdb->prefix}postmeta 
    WHERE meta_key 
    LIKE 'like_status_%'
    ",
    ARRAY_N
);

$results = array_map(function($value){

    return (int) str_replace('like_status_', '', $value[0]);

}, $results);

array_walk($results, function($notify_user_id, $key){

    //apply to all users except the user who just liked the post
    if ( $notify_user_id !== $current_user_id ) {
        //notify logic here...           
    }

});

नोट: यदि आप चाहें तो तर्क को और सरल बनाया जा सकता है।

विकल्प 2

  • आपको अपना मेटा स्कीमा बदलने की आवश्यकता है
  • आपको मेटा आईडी के रूप में यूजर आईडी स्टोर करने की आवश्यकता है
  • आप WP_Queryके साथ उपयोग करने की अनुमति देता हैmeta_query

विकल्प 2 के लिए आवश्यक है कि आप अपनी मेटा कुंजी like_status_{user_id}को कुछ सार्वभौमिक से बदल दें जैसे कि like_statusया liked_by_user_idजहां 1कुंजी के विरुद्ध मूल्य को संग्रहीत करने के बजाय, आप इसके बजाय उपयोगकर्ता की आईडी को मान के रूप में संग्रहीत करते हैं।

//when a user likes a post...
$current_user_id = get_current_user_id();
add_post_meta($current_user_id, "liked_by_user_id", $current_user_id, false);

//later in the request
$args = array(
    'post_type'  => 'post', //or a post type of your choosing
    'posts_per_page' => -1,
    'meta_query' => array(
        array(
            'key' => 'liked_by_user_id',
            'value' => 0,
            'type' => 'numeric'
            'compare' => '>'
        )
    )
);

$query = new WP_Query($args);   

array_walk($query->posts, function($post, $key){

    $user_ids = get_post_meta($post->ID, 'liked_by_user_id');

    array_walk($user_ids, function($notify_user_id, $key){

        //notify all users except the user who just like the post
        if ( $notify_user_id !== $current_user_id ) {

            //notify logic here...
            //get user e.g. $user = get_user_by('id', $notify_user_id);

        }

    });

});

1
अब यह है क्योंकि 5.1 के नीचे मेरे जवाब पर एक नजर है
। ट्रॉमp

@ के। ट्रम्प हुज़ाह!
एडम

नवीनतम WP क्षमता को दर्शाने के लिए कृपया स्वीकृत उत्तर को अपडेट करें या @ K.Tromp का उत्तर सबसे अद्यतित उत्तर के रूप में चिह्नित किया गया है
zumek

10

अपने प्रश्न का उत्तर देना काफी कठिन है। पहला भाग हालांकि आसान है। मैं हाल ही में कुछ किया stackoverflow पर समान

मेटा कीज़ की तुलना की जाती है और बिल्कुल मेल खाती है। WP_Queryएक साधारण पैरामीटर के साथ इस व्यवहार को समायोजित करने का कोई साधन नहीं है, लेकिन हम हमेशा एक स्वयं का परिचय कर सकते हैं और फिर मेटाफ़ॉर्म कीज़ पर तुलना करने के लिए posts_whereक्लॉज़ को समायोजित कर LIKEसकते हैं।

फिल्टर

यह सिर्फ एक बुनियादी फिल्टर है, इसे आवश्यकतानुसार समायोजित करें।

add_filter( 'posts_where', function ( $where, \WP_Query $q )
{ 
    // Check for our custom query var
    if ( true !== $q->get( 'wildcard_on_key' ) )
        return $where;

    // Lets filter the clause
    $where = str_replace( 'meta_key =', 'meta_key LIKE', $where );

    return $where;
}, 10, 2 );

जैसा कि आप देख सकते हैं, फ़िल्टर तभी निकाल दिया जाता है जब हम अपना नया कस्टम पैरामीटर, wildcard_on_keyपर सेट करते हैं true। इस चेक, हम बस बदलते हैं =तुलनित्र को LIKEतुलनित्र

इस पर सिर्फ एक ध्यान दें, LIKEतुलनात्मक रूप से उस अन्य तुलनाओं को चलाने के लिए अधिक महंगा है

पूछताछ

आप केवल मेटा कुंजियों के साथ सभी पोस्ट प्राप्त करने के लिए अपने पोस्ट को क्वेरी कर सकते हैं like_status_{user_id}

$args = [
    'wildcard_on_key' => true,
    'meta_query'      => [
        [
            'key'   => 'like_status_',
            'value' => 1,
        ]
    ]
];
$query = new WP_Query( $args );

दूसरा प्रश्न

कस्टम फ़ील्ड के प्रदर्शन पर प्रभाव नहीं है, तो आप इस विषय पर मेरी पोस्ट पढ़ सकते हैं यहाँ । लेकिन मैं इससे परेशान हूं कि आप कहते हैं कि प्रत्येक पोस्ट में सैकड़ों या हजारों लाइक्स हो सकते हैं। यह कस्टम फील्ड डेटा की इतनी बड़ी मात्रा को प्राप्त करने और कैशिंग करने पर आपको प्रभावित कर सकता है। यह आपके db को अनावश्यक कस्टम फ़ील्ड डेटा की एक बड़ी मात्रा के साथ रोक सकता है जो इसे बनाए रखना काफी कठिन बनाता है।

मैं कस्टम फ़ील्ड में क्रमबद्ध डेटा संग्रहीत करने का बहुत बड़ा प्रशंसक नहीं हूं क्योंकि कोई भी अनुक्रमित डेटा द्वारा खोज या आदेश नहीं दे सकता है। मैं फिर भी एक कस्टम फ़ील्ड के तहत एक सरणी में सभी उपयोगकर्ता आईडी को संग्रहीत करने का सुझाव दूंगा। आप बस उपयोगकर्ता आईडी के साथ सरणी को अपडेट कर सकते हैं जब कोई उपयोगकर्ता किसी पोस्ट की तरह। कस्टम फ़ील्ड डेटा प्राप्त करना और आईडी के सरणी पर लूप करना और आईडी के साथ कुछ करना आसान है। बस एक नजर हैget_post_meta()

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

यदि आपको एक कस्टम फ़ील्ड अपडेट होने पर ईमेल भेजने या सूचनाएं भेजने की आवश्यकता है, तो आपके पास काम करने के लिए निम्नलिखित हुक उपलब्ध हैं। ( संदर्भ के update_metadata()लिए देखें )

निष्कर्ष

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


1
Post_meta प्रदर्शन पर आपकी व्याख्या के लिए धन्यवाद! सुपर उपयोगी है।
कोडस्क्रबर्ल

यह स्वीकृत उत्तर होना चाहिए, कस्टम क्वेरी का उपयोग करने के बजाय फ़िल्टर का उपयोग करना हमेशा बेहतर होता है। यह भी ध्यान दें कि यदि आप WP_Query के बजाय get_posts का उपयोग कर रहे हैं, तो आपको suppress_filters => झूठा से गुजरना होगा या यह फ़िल्टर को ट्रिगर नहीं करेगा। मेटा कुंजी पर LIKE करने के लिए, आपको सरणी में कुंजी के आगे और पीछे% लगाना होगा, जिसके आधार पर आप किस प्रकार की खोज करना चाहते हैं।
अर्ल डेविस

और यदि आप पोस्टों को क्वेरी करना चाहते हैं, तो इसे कैसे फ़िल्टर करेंगे, लेकिन उपसर्ग द्वारा पोस्ट मेटा कुंजी वाले सभी पोस्टों को हटा दें? (उदा। पोस्ट मेटा के सभी पोस्टों को बाहर करें 'LIKE' my_prefix_ ';
gordie

6

वर्डप्रेस 5.1 के बाद अब मेटा क्वेरी का उपयोग करना संभव है जैसे: यहाँ छवि विवरण दर्ज करें


अंडरस्कोर से बचना इस पद्धति के साथ एक मुद्दा लगता है, लेकिन अन्यथा, यह बहुत अच्छा लगता है। धन्यवाद हाइलाइटिंग
जेक

2

यदि बाद में आप इसे और अधिक विस्तृत आंकड़ों, विशेषताओं आदि के साथ विस्तारित करना चाहते हैं, तो अभी तक एक और विकल्प हो सकता है: कस्टम टेबल (s)

  • पेशेवरों : अपनी आवश्यकताओं के अनुरूप और बेहतर प्रदर्शन के लिए अनुक्रमित किया जा सकता है

  • विपक्ष : अधिक काम

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

मैं हर किसी को एक अधिसूचना को धक्का देने की कोशिश कर रहा हूं, जिसे कोई पोस्ट पसंद आया है जब कोई व्यक्ति उस पोस्ट को पसंद करता है ... कुछ ऐसा है, "अरे, किसी और को वह पोस्ट पसंद आया जो आपको पसंद आया। आपको इसे देखना चाहिए!" लेकिन मुझे यह पता लगाने के लिए एक तरीका चाहिए कि क्या किसी और ने भी उस पोस्ट को पसंद किया है और यदि हां, तो वे कौन होंगे इसलिए मैं उन्हें सूचित कर सकता हूं।

सुनिश्चित नहीं हैं कि आपके यहां किस तरह के नोटिफिकेशन का मतलब है, लेकिन यह जल्दी से भारी हो सकता है।

उदाहरण : एक उपयोगकर्ता जो ~ 1000 पोस्ट पसंद करता है और प्रत्येक पोस्ट को ~ 1000 लाइक मिलते हैं, फिर पाइप में 1M सूचनाएँ होती हैं, केवल उस उपयोगकर्ता के लिए! यदि ये ईमेल सूचनाएं हैं, तो होस्ट प्रदाता खुश नहीं हो सकता है और उपयोगकर्ता पागल हो जाएगा। यह भी एक 3 पार्टी ईमेल सेवा के साथ महंगा हो सकता है।


मैं वास्तव में प्रति व्यक्ति प्रति पोस्ट केवल एक बार सूचनाएं भेज रहा हूं। तो यह जितना लगता है उससे कम है - हालांकि अभी भी बहुत कुछ है। तालिकाओं में निर्मित उपयोग करने का कारण यह है कि मैं इस डेटा के साथ वास्तविक ऐप में सड़क के नीचे मानक WP REST API का उपयोग करने में सक्षम होना चाहूंगा।
codecribblr

-1

प्रति WP_Meta_Query प्रलेखन आप उपयोग कर सकते compareमें तर्क meta_queryWP_Query का तर्क। हालाँकि, आप केवल इस पर तुलना कर सकते हैं valueऔर keyइसलिए आप यह सोचना चाहते हैं कि आप इसे कैसे बनाते हैं।

एक likeतर्क इस तरह दिखेगा:

$arguments = array(
    'meta_query' => array(
        array(
            'key' => 'foo',
            'value' => 'ba',
            'compare' => 'LIKE'
        )
    )
);

$query = new WP_Query($arguments);

यह देखते हुए कि आप keyI मेटा पर 'LIKE' खोज नहीं कर सकते हैं, आपको सुझाव देते हैं कि आप उपयोगकर्ता मेटा में पसंद की गई पोस्ट जोड़ें और उन पोस्ट्स को पसंद करने वाले उपयोगकर्ताओं के लिए WP_User_Query खोज करें:

$arguments = array(
    'meta_query' => array(
        array(
            'key' => 'liked_post',
            'value' => '<post_id>'
        )
    )
);

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