একটি কাস্টম ফিল্ড কী (ক্রস পোস্ট) এর জন্য সমস্ত মান পাওয়া


44

আমি জানি যে একটি নির্দিষ্ট পোস্টের জন্য কীভাবে কাস্টম ফিল্ডের মান পাবেন।

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

আমার যা দরকার তা হ'ল সমস্ত পোস্ট জুড়ে একটি নির্দিষ্ট কাস্টম পোস্ট কীটির সাথে সম্পর্কিত সমস্ত মান ।

কেউ এটি করতে একটি দক্ষ উপায় জানেন? আমি ডিবিতে সমস্ত পোস্ট আইডি লুপ করতে চাই না।

উদাহরণ:

'মুড' নামক একটি কাস্টম ফিল্ডের জন্য বিভিন্ন মান সহ 4 টি পোস্ট। 2 টি পোস্টের মান 'হ্যাপি', 1 টি পোস্টে 'রাগান্বিত' এবং 1 টি পোস্টের 'দু: খিত' রয়েছে

আমি আউটপুট দিতে চাই: আমাদের সকল পোস্ট জুড়ে: দুজন খুশি, একজন রাগান্বিত এবং একজন দুঃখী লেখক (গুলি)।

তবে প্রচুর পোস্টের জন্য।

আমি যা খুঁজছি তা হ'ল:

  • এটি পেতে একটি ডাব্লুপি ফাংশন। অথবা
  • এটি যথাসম্ভব দক্ষতার সাথে পাওয়ার জন্য একটি কাস্টম ক্যোয়ারী।

5
দেখে মনে হচ্ছে আপনি এটি একটি করশক্তি হিসাবে ব্যবহার করছেন। সংরক্ষণ করার সময় কেন এই পোস্টগুলিতে কেবল (স্বয়ংক্রিয়ভাবে) একটি পদ যুক্ত করবেন না? অনুসন্ধানগুলি অনেক সহজ করে তুলবে।
কায়সার

@ কাইজার আমি প্রতিভা হওয়ার জন্য আপনাকে যথেষ্ট ধন্যবাদ জানাতে পারি না!
ব্যবহারকারী2128576

উত্তর:


58

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

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

ওয়ার্ডপ্রেস - ডাব্লুপিডিবি ডেটা কলাম নির্বাচন করছে
$ 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' );

আপনি যদি স্ক্রিনে সেই ডেটা প্রিন্ট করা ছাড়া আর কিছু করতে চান না, পিএইচপি-র ইমপ্লোড ফাংশনটি সেই সাধারণ অ্যারেটিকে ডেটা লাইনে দ্রুত বিভক্ত করতে পারে।

// 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। দরকারী হতে পারে।
হাওডি_এমসিজি

আমি মনে করি এটি অত্যন্ত দরকারী
পাবলো এসজি পাচেকো

কিভাবে এটি করেন, এবং রিটার্ন মান সাজানো ?, আমি মনে করি যে করে অর্ডার ব্যবহার কিন্তু আমি নাকিসুরে কথা চিন্তা এটি কিভাবে ব্যবহার করতে করতে
efirvida

14

আমি উপরের t31os এর কোডটিতে একটি ছোট জিনিস যুক্ত করতে চাই । আমি যখন এই কোডটি নিজে ব্যবহার করি তখন সদৃশ এন্ট্রিগুলি মুছে ফেলার জন্য আমি "নির্বাচন" কে "নির্বাচন করুন" তে পরিবর্তন করেছি।


1
আমি এমন কেসগুলিতে কল্পনা করতে পারি যেখানে একই মানের একাধিক মেটা মান থাকা বৈধ হবে এবং এইভাবে আমার কোডটিতে এটি যোগ করে নি। আপনি যদি স্বতন্ত্র মান চান তবে এটি যাওয়ার উপায় হবে। অতিরিক্ত হিসাবে আপনি এটি ফাংশনের আর্গুমেন্ট হিসাবে যুক্ত করতে পারেন (যাতে আপনি এটি যথাযথ হিসাবে এটি ব্যবহার করতে পারেন বা না করতে পারেন)।
t31os

10

এটি বিশ্বব্যাপী p 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 );

বেশিরভাগ ক্ষেত্রে এটি করা আমার পছন্দসই পদ্ধতি হবে। এটি কেবল একটির চেয়ে পাঁচটি ক্যোরিয়াস তৈরি করে, তবে এটি স্ট্যান্ডার্ড ওয়ার্ডপ্রেস পদ্ধতিগুলি তৈরি ও জমা দেওয়ার জন্য ব্যবহার করে, প্ল্যাটফর্ম-নির্দিষ্ট কোনও ক্যাচিং (যেমন ডাব্লুপি ইঞ্জিনের অবজেক্ট ক্যাচিং বা কিছু এলোমেলো প্লাগইন) প্রবেশ করবে data অনুরোধের সময়কালের জন্য ওয়ার্ডপ্রেসের অভ্যন্তরীণ ক্যাশে সংরক্ষণ করুন, সুতরাং প্রয়োজনে আবার ডাটাবেস থেকে পুনরুদ্ধার করার প্রয়োজন হবে না।
অ্যান্ড্রু ডিনমোর

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

4

দ্রুততম উপায়টি একটি কাস্টম এসকিএল কোয়েরি হবে এবং আমি নিশ্চিত নই তবে আপনি চেষ্টা করতে পারেন

$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
ধন্যবাদ, তবে কাস্টম অনুসন্ধানগুলি 'কোনও মূল্যে' এড়ানো উচিত নয়? আমি ডাব্লুপি অ্যাবস্ট্রাকশন স্তরটি ব্যবহার করতে পছন্দ করতাম (এটি কি এটি বলা হয়?) ... তবে অবশ্যই যদি এটি সম্ভব না হয় ..
মিক্কেলব্র্যাম

কাস্টম ক্যোয়ারীস, যদি সঠিকভাবে লেখা থাকে তবে আরও ভাল হতে পারে এবং আপনি কী করছেন তা যদি না জানেন তবে কেবলমাত্র এগুলি এড়ানো উচিত।
বেন্টারনেট

1
আমি এমডব্লু। কাস্টম প্রশ্নের সাথে একমত, খুব দরকারী এবং ব্যবহারিক, তবে আমি মনে করি তারা ডিবিতেও অনেক বেশি ভারী ... বিশেষত এসআরটি ফাংশন ব্যবহার করে ..
krembo99

3

একটি মেটা কী দ্বারা সমস্ত মেটা মান পাওয়ার জন্য

Wp-> db ওয়ার্ডপ্রেস কোডেক্স পরীক্ষা করুন

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

3
এই পদ্ধতির সমস্যাটি হ'ল নির্দিষ্টতার অভাব, আপনি এমন কোয়েরি থেকে অসংখ্য ফলাফল পাবেন, যার মধ্যে খসড়া, ট্র্যাশ আইটেম, পোস্ট, পৃষ্ঠাগুলি এবং যে কোনও পোস্টের প্রকার বিদ্যমান রয়েছে type আপনার যা প্রয়োজন নেই তার জন্য আপনার কখনই জিজ্ঞাসা করা উচিত নয়, সুনির্দিষ্টতা এখানে অবশ্যই প্রয়োজনীয়।
t31os

যদিও এটি সত্য যে আপনি অন্যান্য পোস্টের ধরণ এবং স্ট্যাটাসগুলি থেকে মান পেতে পারেন, এমন সময় আসে যখন আপনার প্রয়োজন সমস্ত মান হয় এবং আপনি যে মেটা_কিটি কোথাও ব্যবহার করেন নি তবে যেখানে আপনার এটি প্রয়োজন। যদি সমস্ত / সর্বাধিক মানগুলি অনন্য হয় তবে এটি সেরা সমাধান হতে পারে।
লুক গিডিয়ন

2

আপনি t31os এবং বেনটারনেটের কোডটিকে পুনরায় ব্যবহারযোগ্য প্রস্তুত বিবৃতি (ওয়ার্ডপ্রেস শৈলী )গুলিতে একীভূত করতে পারবেন না এমন কোনও কারণ নেই যা একটি দক্ষ অপারেশনে গণনা এবং মানগুলি ফেরত দেয়।

এটি একটি কাস্টম ক্যোয়ারী তবে এটি এখনও ওয়ার্ডপ্রেস ডাটাবেস বিমূর্তকরণ স্তরটি ব্যবহার করছে - উদাহরণস্বরূপ এটি টেবিলের নামগুলি আসলে কী তা বিবেচনাধীন নয়, বা যদি তারা পরিবর্তন করে, এবং এটি একটি প্রস্তুত বিবৃতি যাতে আমরা এসকিউএল আক্রমণগুলি থেকে অনেক বেশি নিরাপদ ইত্যাদি etc ।

এই উদাহরণে আমি আর পোস্টের ধরণের জন্য যাচাই করি না এবং খালি স্ট্রিংগুলি বাদ দিচ্ছি:

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

ধরে নিন আপনার কাস্টম ফিল্ড কীটির নাম


নোট করুন যে বর্তমান পোস্টে এই ডিফল্ট হয়, যখন কোনও পোস্ট_আইড নির্দিষ্ট করা হয় না।
বার্জায়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.