আমি আংশিক মেটা কী দ্বারা পোস্টগুলির জন্য কীভাবে জিজ্ঞাসা করব?


9

আমার একটি ফাংশন রয়েছে যা পোস্ট মেটা হিসাবে কোনও পোস্টের জন্য "লাইক" স্থিতি সঞ্চয় করে। আমি এটি পছন্দ করে এমন ব্যবহারকারীর সাথে "লাইক" যুক্ত করতে চাই, তাই আমি "লাইক_স্ট্যাটাস_ {ইউজার_আইডি}" নামে একটি কাস্টম ফিল্ড সেটআপ করি (যেখানে {ইউজার_আইডি currently বর্তমানে লগইন করা ইউজারের আইডি) যা আমি 0 বা সংরক্ষণ করি ১. তাই বেশ কয়েকটি "লাইক" সহ একটি পোস্টের জন্য ডিবিতে কয়েকটি মেটা মান থাকবে যা সেটআপ হয়:

'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,
));

আমি যখন পোস্টটি পছন্দ করেছি তখন প্রত্যেকের কাছেই একটি বিজ্ঞপ্তি ঠেকানোর চেষ্টা করছি ... যখন অন্য কেউ সেই পোস্ট পছন্দ করে ... এমন কিছু, "আরে, আপনার পোস্টটি অন্য কেউ পছন্দ করেছে You আপনার এটি পরীক্ষা করে দেখা উচিত!" তবে আমার অন্য কোনও পোস্টটি পছন্দ করেছে কিনা তা সন্ধান করার জন্য আমার একটি উপায় প্রয়োজন এবং যদি তাই হয় তবে তারা কে হবেন তাই আমি তাদের জানাতে পারি।

যদি এটি সম্ভব না হয় তবে আপনি কোনও পোস্টে কোনও একক ব্যবহারকারীর মতো অবস্থা দ্রুত আপডেট করার দক্ষতা বজায় রেখে পোস্ট_মেটা হিসাবে এই ডেটা সংরক্ষণ করার আরও ভাল উপায়ের পরামর্শ দিতে পারেন?

উত্তর:


6

দুর্ভাগ্যক্রমে আপনি যখন ব্যবহার করছেন তখন মানটির সাথে তুলনা meta_queryকরে কোনও সম্পাদন করতে পারবেন না । আমি এই রাস্তায় নেমেছি ...LIKEmeta_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 থেকে নীচে আমার উত্তরটি একবার দেখুন
কে ট্রাম্প

@ কে ট্রাম্প হুজাহ!
আদম

সর্বশেষ ডাব্লুপি সামর্থ্য প্রতিবিম্বিত করার জন্য দয়া করে গৃহীত উত্তর আপডেট করুন বা @ কে। ট্রাম্পের উত্তর সর্বাধিক আপ-টু-ডেট উত্তর হিসাবে চিহ্নিত হয়েছে
zumek

10

আপনার প্রশ্নের দৃ concrete়ভাবে উত্তর দেওয়া বেশ কঠিন। প্রথম অংশ যদিও সহজ। আমি সম্প্রতি স্ট্যাকওভারফ্লোতে অনুরূপ কিছু করেছি

মেটা কীগুলি তুলনা করা হয় এবং ঠিক মিলছে। 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। এই চেক আউট, কেবলমাত্র আমরা পরিবর্তন যখন =comparator করার LIKEcomparator

এটির জন্য কেবল একটি নোট, LIKEতুলনাগুলি সহজাতভাবে আরও ব্যয়বহুল যে অন্যান্য তুলনাগুলি চালানো

দ্য QUERY

মেটা কী সহ সমস্ত পোস্ট পেতে আপনি কেবল নিজের পোস্টগুলিকে অনুসরণ করতে পারেন like_status_{user_id}

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

অন্য প্রশ্ন

কাস্টম ক্ষেত্রগুলি পারফরম্যান্সে প্রভাব ফেলবে না, আপনি এই বিষয়ে আমার পোস্টটি এখানে পড়তে পারেন । আমি তবে এতে সমস্যায় পড়েছি যে আপনি বলেছিলেন যে প্রতিটি পোস্টে কয়েকশ বা হাজার হাজার পছন্দ থাকতে পারে। এটি আপনার প্রচুর পরিমাণে কাস্টম ফিল্ড ডেটা এবং পারফরম্যান্স লাভ করতে পারে। এটি আপনার ডিবিতে প্রচুর পরিমাণে অপ্রয়োজনীয় কাস্টম ফিল্ড ডেটা আটকে রাখতে পারে যা এটি বজায় রাখা বেশ শক্ত করে তোলে।

কাস্টম ক্ষেত্রগুলিতে সিরিয়ালযুক্ত ডেটা সংরক্ষণ করার আমি খুব বড় ভক্ত নই কারণ সিরিয়ালযুক্ত ডেটা দ্বারা কেউ অনুসন্ধান বা অর্ডার করতে পারে না। তবে আমি সমস্ত ব্যবহারকারীর আইডি হ'ল একটি কাস্টম ক্ষেত্রের অধীনে একটি অ্যারেতে সংরক্ষণ করার পরামর্শ দেব। কোনও ব্যবহারকারী যখন কোনও পোস্ট পছন্দ করেন তখন আপনি কেবল ব্যবহারকারী আইডি দিয়ে অ্যারে আপডেট করতে পারেন। কাস্টম ফিল্ড ডেটা পাওয়া এবং আইডির অ্যারের উপরে লুপিং করা এবং আইডির সাহায্যে কিছু করা সহজ। শুধু একবার দেখুনget_post_meta()

একটি কাস্টম ক্ষেত্র আপডেট করাও সহজ। তার জন্য, আপনাকে সন্ধান করতে হবে, আপনি update_post_meta()কীভাবে আপনার পছন্দসই ক্ষেত্র তৈরি করেন তা আমি জানি না, তবে update_post_meta()অবশ্যই আপনি এটি ব্যবহার করতে চান।

কাস্টম ক্ষেত্রটি আপডেট হওয়ার পরে আপনার যদি ইমেলগুলি প্রেরণ বা বিজ্ঞপ্তিগুলি ধাক্কা দেওয়ার দরকার হয় তবে আপনার সাথে কাজ করার জন্য নিম্নলিখিত হুকগুলি উপলব্ধ। ( প্রসঙ্গে দেখুনupdate_metadata() )

উপসংহার

আমি এটি পোস্ট করার ঠিক আগে, আবার সিরিয়ালাইজড রুটে যাওয়ার আগে, নিশ্চিত হয়ে নিন যে আপনাকে ক্রমযুক্ত ডেটা অনুসারে বাছাই করার দরকার নেই বা সিরিয়ালযুক্ত ডেটার ভিতরে নির্দিষ্ট ডেটা অনুসন্ধান করার দরকার নেই।


1
পোস্ট_মেটা পারফরম্যান্সে আপনার ব্যাখ্যার জন্য ধন্যবাদ! সুপার দরকারী।
কোডসেব্লব্লার

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, কাস্টম অনুসন্ধানগুলি ব্যবহার না করে ফিল্টার ব্যবহার করা সবসময় ভাল। এছাড়াও নোট করুন, আপনি যদি ডাব্লুপি_কিউরিয়ের পরিবর্তে get_posts ব্যবহার করছেন তবে আপনাকে suppress_filters => মিথ্যা দিয়ে যেতে হবে বা এটি ফিল্টারকে ট্রিগার করবে না। মেটা কীতে লাইক সম্পাদন করতে, আপনি কী ধরণের পছন্দ করতে চান তার উপর নির্ভর করে আপনার অ্যারের মধ্যে কী এর সামনে এবং পিছনেও% রাখতে হবে।
আর্ল ডেভিস

আপনি যদি পোস্টগুলি জিজ্ঞাসা করতে চান তবে আপনি কীভাবে এটি ফিল্টার করবেন যদি উপসর্গ দ্বারা পোস্ট মেটা কী থাকা সমস্ত পোস্টকে বাদ দেয়? ।? (যেমন সকল পোস্ট একটি পোস্ট মেটা মত 'my_prefix_' থাকার অগ্রাহ্য
Gordie

6

ওয়ার্ডপ্রেস 5.1 যেহেতু এখন যেমন মেটা ক্যোয়ারী ব্যবহার করা সম্ভব: এখানে চিত্র বর্ণনা লিখুন


আন্ডারস্কোরগুলি থেকে পালানো এই পদ্ধতিটির সাথে একটি সমস্যা বলে মনে হচ্ছে, তবে অন্যথায়, এটি বেশ ভাল দেখাচ্ছে। হাইলাইট করার জন্য ধন্যবাদ।
জেক 21

2

যদি পরে আপনি আরও বিশদ পরিসংখ্যান, বৈশিষ্ট্যাদি ইত্যাদি দিয়ে এটি প্রসারিত করতে চান তবে আর একটি বিকল্প হতে পারে: কাস্টম টেবিল (গুলি)

  • পেশাদাররা : আপনার প্রয়োজন অনুসারে তৈরি এবং আরও ভাল পারফরম্যান্সের জন্য সূচকযুক্ত হতে পারে ।

  • কনস : আরও কাজ

মূল টেবিলগুলি কীভাবে সূচিবদ্ধ করা হয় তার কারণে কাস্টম টেকনোমমি ব্যবহার করে একটি কার্যবিধিত্ব থাকতে পারে যা পোস্ট মেটা প্রশ্নের তুলনায় আরও ভাল ক্যোয়ারী পারফরম্যান্স দিতে পারে।

আমি যখন পোস্টটি পছন্দ করেছি তখন প্রত্যেকের কাছেই একটি বিজ্ঞপ্তি ঠেকানোর চেষ্টা করছি ... যখন অন্য কেউ সেই পোস্ট পছন্দ করে ... এমন কিছু, "আরে, আপনার পোস্টটি অন্য কেউ পছন্দ করেছে You আপনার এটি পরীক্ষা করে দেখা উচিত!" তবে আমার অন্য কোনও পোস্টটি পছন্দ করেছে কিনা তা সন্ধান করার জন্য আমার একটি উপায় প্রয়োজন এবং যদি তাই হয় তবে তারা কে হবেন তাই আমি তাদের জানাতে পারি।

আপনি এখানে কী ধরণের বিজ্ঞপ্তি বোঝাতে চাইছেন তা নিশ্চিত নন তবে এটি দ্রুত বিপুল পরিমাণে পেতে পারে।

উদাহরণ : এমন এক ব্যবহারকারী যা posts 1000 টি পোষ্ট পছন্দ করে এবং প্রতিটি পোস্টে 1000 ডলার পছন্দ হয়, তবে পাইপগুলিতে 1M বিজ্ঞপ্তি রয়েছে কেবলমাত্র সেই ব্যবহারকারীর জন্য! এগুলি যদি ইমেল বিজ্ঞপ্তি হয় তবে হোস্ট প্রদানকারীটি খুশি না হতে পারে এবং ব্যবহারকারী পাগল হয়ে যাবে। এটি তৃতীয় পক্ষের ইমেল পরিষেবা সহ ব্যয়বহুলও হতে পারে।


আমি প্রকৃতপক্ষে প্রতি পোস্টে জন প্রতি এক বার বিজ্ঞপ্তি প্রেরণ করছি। সুতরাং এটি যত কম শোনাচ্ছে তা কম - যদিও এখনও অনেক বেশি। সারণীতে অন্তর্নির্মিত ব্যবহার করার চেষ্টা করার কারণটি হ'ল আমি এই ডেটা সহ কোনও বাস্তব অ্যাপে রাস্তায় স্ট্যান্ডার্ড ডাব্লুপিইএসইএসটি এএসপি ব্যবহার করতে সক্ষম হতে চাই।
কোডসেব্লব্লার

-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);

প্রদত্ত যে আপনি keyব্যবহারকারীর মেটাতে পছন্দ করা পোস্টগুলি যুক্ত করতে এবং সেই পোস্টটি পছন্দ করেছেন এমন ব্যবহারকারীদের জন্য ডব্লিউপি_উস_কুয়েরি অনুসন্ধান করার পরামর্শ দিয়েছি: আপনি 'লাইক' অনুসন্ধান করতে পারবেন না

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

$users = new WP_User_Query($arguments);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.