একক অনুরোধে wp_query পোস্ট মেটা ফিরতে পারে?


22

আমি এমন একটি ডাব্লুপিউইউ ক্যুরি তৈরি করতে চাই যা postsঅ্যারের ভিতরে পোস্ট মেটা ফিরিয়ে দেবে ।

$args = array (
    'post_type' => 'page',
    'meta_key' => 'someMetaKeyName',
);

// The Query
$query = new WP_Query( $args );

এটি এমন কিছু ফেরত দেয়:

এখানে চিত্র বর্ণনা লিখুন

আপনি দেখতে পাচ্ছেন যে পোস্টগুলিতে কোনও মেটা ডেটা নেই, তবে কি ফিরে আসা অ্যারেতে মেটা ডেটা অন্তর্ভুক্ত করা সম্ভব?

PS আমি পারফরম্যান্সের কারণে অতিরিক্ত wp_ ক্যোয়ারী চাই না।


2
স্ট্যান্ডার্ড ডাব্লুপিউকিউয়ারি কোনও পোস্ট মেটা ডেটা ফেরত দেয় না। আপনার কাছে কেবলমাত্র বিকল্পগুলি হ'ল: 1) get_post_metaস্বতন্ত্র কীগুলিতে চালানো , ২) get_post_customএক শটে সমস্ত পোস্টের কাস্টম ফিল্ড পেতে রান করুন , বা 3) get_results()আপনার নিজের রিটার্ন অবজেক্ট তৈরি করতে $ wpdb বর্গ ( ) ব্যবহার করে আপনার নিজের ক্যোয়ারী তৈরি করুন । ( p wpdb বর্গ ডকুমেন্টেশন: codex.wordpress.org/Class_References/wpdb )
BODA82

উত্তর:


20

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

এই অভিনয় হবে? আমার মতে, এটি পারফরম্যান্সকে আরও আঘাত করবে কারণ আপনার প্রশ্নের জন্য আপনার ফলাফলের সাথে যোগ দিতে হবে কারণ কাস্টম ক্ষেত্রগুলি wp_postsসারণীতে সংরক্ষণ করা হয়নি , তবে wp_postmetaটেবিলের মধ্যে রয়েছে

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

আমার মতে, অতিরিক্ত ডাটাবেস কল এবং ব্যয় করা আসল সময়টি মূল্যবান এবং দ্রুত WP_Queryপোস্ট স্ট্যান্ডার্ড পোস্ট অবজেক্টে কাস্টম ক্ষেত্রগুলি অন্তর্ভুক্ত করার জন্য এমনভাবে পুনর্লিখনের চেয়ে দ্রুত is$posts


ঠিক আছে, ধন্যবাদ, আমি এটিকে গ্রহণযোগ্য হিসাবে বেছে নেব, তবে সত্যি কথা বলতে এটি get_post_meta()প্রতিটি পোস্টের জন্য কেবল এত ঝামেলার কলিংহই .. আমি বরং কেবল wp_postsটেবিলের মধ্যে অতিরিক্ত ডেটা সংরক্ষণ করার উপায় বা একটিতে থাকতাম সম্পর্কিত টেবিল যা মাইন্ডফ * সিকে হিসাবে wp_postsmetaতেমন হয় না।
ইয়ামসালাত

ভাল, সত্যি বলতে, কল করা হোক get_post_meta()বা পোস্ট পোস্ট হিসাবে, আপনার প্রতিটি পোস্টে এটি কল করতে হবে। টেমপ্লেট ট্যাগগুলির সাথে এটি একই রকম the_content(), আপনাকে প্রতিটি পোস্টে এটি কল করতে হবে।
পিটার গুজন

2
এর অর্থ এই যে আপনি যদি 120 টি পোস্ট দেখাতে চান তবে আপনার পৃষ্ঠায় অতিরিক্ত 120 টি প্রশ্ন থাকবে?
chifliiiii

সমস্ত পোস্টডেটা একটি ক্যাশে সংরক্ষিত হয়ে যায়, তাই আপনার যখন ক্যালি হয় তখন অতিরিক্ত জিজ্ঞাসা থাকবে না; লিঙ্গ পোস্ট মেটা
পিটার গুজন

তুমি ঠিক. আমি পোস্ট_থাম্বনেলগুলি উল্লেখ করছি তবে আমি সম্প্রতি আপডেট_পোস্ট_থম্বনেল_ক্যাচ (_ the_query) পেয়েছি। যাইহোক
স্পষ্টির

4

এই প্রশ্নটি 1 বছরেরও বেশি পুরানো, তবে আমার একই প্রোব্লোল্লেম রয়েছে এবং এখানে এমন ফাংশন রয়েছে যা প্রতিটি মেটা_ভ্যালু এবং মেটা_কি $ wp_query অবজেক্টে যুক্ত করবে,

লুপ করার সময় প্রতিটি পোস্ট মেটা সম্পর্কে জিজ্ঞাসা করার পরিবর্তে, এই ফাংশনটি একটি অতিরিক্ত ক্যোয়ারির উদাহরণ করবে:

"মেটা_কি, মেটা_ভ্যালু, পোস্ট_আইডি থেকে নির্বাচন করুন $ wpdb-> পোস্টমেটা যেখানে পোস্ট_ইডে রয়েছে (1,2,3,4,5 ...)"

যেখানে (1,2,3,4,5 ...) $ ডাব্লুপি_কোয়ারি থেকে তাত্ক্ষণিকভাবে পোস্ট আইডি আইকন

if(!function_exists('add_query_meta')) {
  function add_query_meta($wp_query = "") {

      //return In case if wp_query is empty or postmeta already exist
      if( (empty($wp_query)) || (!empty($wp_query) && !empty($wp_query->posts) && isset($wp_query->posts[0]->postmeta)) ) { return $wp_query; }

      $sql = $postmeta = '';
      $post_ids = array();
      $post_ids = wp_list_pluck( $wp_query->posts, 'ID' );
      if(!empty($post_ids)) {
        global $wpdb;
        $post_ids = implode(',', $post_ids);
        $sql = "SELECT meta_key, meta_value, post_id FROM $wpdb->postmeta WHERE post_id IN ($post_ids)";
        $postmeta = $wpdb->get_results($sql, OBJECT);
        if(!empty($postmeta)) {
          foreach($wp_query->posts as $pKey => $pVal) {
            $wp_query->posts[$pKey]->postmeta = new StdClass();
            foreach($postmeta as $mKey => $mVal) {
              if($postmeta[$mKey]->post_id == $wp_query->posts[$pKey]->ID) {
                $newmeta[$mKey] = new stdClass();
                $newmeta[$mKey]->meta_key = $postmeta[$mKey]->meta_key;
                $newmeta[$mKey]->meta_value = maybe_unserialize($postmeta[$mKey]->meta_value);
                $wp_query->posts[$pKey]->postmeta = (object) array_merge((array) $wp_query->posts[$pKey]->postmeta, (array) $newmeta);
                unset($newmeta);
              }
            }
          }
        }
        unset($post_ids); unset($sql); unset($postmeta);
      }
      return $wp_query;
  }
}

অ্যাডিটিওয়ানাল "পোস্টমেটা" প্রতিটি $ wp_query-> পোস্টগুলিতে লেখা হবে [$ i]

$wp_query->posts[0]->postmeta

উদাহরণস্বরূপ 'SomeMetaKeyName' রাখতে ভুলবেন না

add_query_meta() আপনার থিম functin.php

$args = array (
    'post_type' => 'page',
    'meta_key' => 'someMetaKeyName',
);

// The Query
$query = new WP_Query( $args );
if($wp_query->have_posts()) {
  $wp_query = add_query_meta($wp_query);
    $i = 0;
    while($wp_query->have_posts()) {
      $wp_query->the_post();
      $post_id = get_the_id();

      //Get $someMetaKeyName in current post
      foreach($wp_query->posts[$i]->postmeta as $k => $v) {
        switch($v->meta_key) {
          case('someMetaKeyName') : {
            $someMetaKeyName = $v->meta_value;
            break;
          }
        }
      }

      //Your Code here
      //Example 
      echo isset($someMetaKeyName) ? '<h3>'.$someMetaKeyName.'</h3>' : '';


      $i++;
    }
}

আমি এই সমাধান ভালবাসি।
আর্মস্ট্রোনজেস্ট

3

আমার সম্প্রতি একইরকম সমস্যা হয়েছিল, কাস্টম পোস্ট টাইপ থেকে আমার 7 পিস মেটাডেটা নেওয়া দরকার ছিল, তবে মেটাডেটার টুকরো ভিত্তিক পোস্টটিও পাওয়া দরকার।

সুতরাং আমি নিম্নলিখিত এসকিউএল বিবৃতি তৈরি করেছি, আমি প্রায়শই এটি ব্যবহার করি। আশা করি এটি অন্য কাউকে সহায়তা করবে। আমি চেষ্টা করব এবং এটিকে যথাসাধ্য ব্যাখ্যা করব।

        global $wpdb;
        $pt = 'clients';
        $mk = 'trainerid';
        $mv = $pid;
        $mk1 = 'email';
        $mk2 = 'phone';
        $mk3 = 'gender';
        $mk4 = 'dob';
        $mk5 = 'photo';
        $mk6 = 'registrationts';
        $mk7 = 'activationts';
        $ord = 'p.post_name ASC';

        $sql = "
        SELECT p.ID, p.post_title AS fullname, pm1.meta_value AS email, pm2.meta_value AS phone, pm3.meta_value AS gender, pm4.meta_value AS dob, pm5.meta_value AS photo, pm6.meta_value AS regts, pm7.meta_value AS actemailts
        FROM {$wpdb->posts} p
            LEFT JOIN {$wpdb->postmeta} pm ON pm.post_id = p.ID
            AND pm.meta_key = '{$mk}'
            LEFT JOIN {$wpdb->postmeta} pm1 ON pm1.post_id = p.ID
            AND pm1.meta_key = '{$mk1}'
            LEFT JOIN {$wpdb->postmeta} pm2 ON pm2.post_id = p.ID
            AND pm2.meta_key = '{$mk2}'
            LEFT JOIN {$wpdb->postmeta} pm3 ON pm3.post_id = p.ID
            AND pm3.meta_key = '{$mk3}'
            LEFT JOIN {$wpdb->postmeta} pm4 ON pm4.post_id = p.ID
            AND pm4.meta_key = '{$mk4}'
            LEFT JOIN {$wpdb->postmeta} pm5 ON pm5.post_id = p.ID
            AND pm5.meta_key = '{$mk5}'
            LEFT JOIN {$wpdb->postmeta} pm6 ON pm6.post_id = p.ID
            AND pm6.meta_key = '{$mk6}'
            LEFT JOIN {$wpdb->postmeta} pm7 ON pm7.post_id = p.ID
            AND pm7.meta_key = '{$mk7}'
            WHERE pm.meta_value = '{$mv}'
            AND p.post_type = '{$pt}'
            AND p.post_status NOT IN ('draft','auto-draft')
            ORDER BY {$ord}
        ";

        $clients = $wpdb->get_results( $wpdb->prepare( $sql ), OBJECT );

প্রথমে আমি ওয়ার্ল্ড $ wpdb সহ ওয়ার্ডপ্রেস ডাটাবেস ফাংশন পাই। তারপরে আমি পোস্ট টাইপটি $ pt দিয়ে সেট করেছিলাম। পোস্ট_মেটাতে একটি নির্দিষ্ট মানের সাথে মেলে এমন সঠিক পোস্টটি পেতে, আমি $ এমকে (মেটা_কি) সেট করেছি

তারপরে আমি $ এমভি (মেটা_ভ্যালু) ভেরি সেট করেছি। (এই ক্ষেত্রে মেটা মান একটি পোস্টের সাথে মেলে)

post mk1- $ mk7 হ'ল মেটা_কিগুলি প্রতিটি পোস্ট থেকে আমি চাই। (আমি নির্বাচিত বিবৃতিতে মানগুলি ধরব)

আমি var অর্ডার করে একটি 'অর্ডার বাই' করে একটি ভারও তৈরি করি

নির্বাচনের বিবৃতিটি নিম্নরূপ: আমি পোস্ট আইডি এবং পোস্ট_শিরোনামটি পোস্ট বা 'পি' থেকে নির্বাচন করি।

তারপরে আমি আমার সমস্ত মেটাডেটা সিএম 1 দিয়ে তাদের নির্বাচন করতে চাই। -> সন্ধ্যায় and. এবং মেটা_ভ্যালুটি ধরে ফেলুন এবং তাদের (এএস) নামকরণ করুন যাতে আমার অবজেক্ট থেকে ডেটা পুনরুদ্ধার করার সময় এটি আরও পঠনযোগ্য।

পোস্টের সাথে মেটাতে থাকা মেটা ডেটার জন্য আমি একটি বাম জয়েন্ট তৈরি করি। (PM)

আমি পুনরুদ্ধার করতে হবে এমন প্রতিটি মেটা ডেটার জন্য আমি 7 টি বাম জোড় তৈরি করি। (Pm1-pm7)

WHERE বিবৃতিটি প্রথম বাম যোগদানের (বিকেলে) উপর ভিত্তি করে তৈরি করা হয় যাতে এটি জানতে পারে যে মেটাডেটা মেলে সেখানে কেবল আমার পোস্টের প্রয়োজন need

আমি পোস্টের ধরণের জন্য এবং পোস্ট_ স্ট্যাটাসগুলির জন্য একটি 'এবং' যুক্ত করি যা খসড়া নয়। (কেবলমাত্র প্রকাশিত পোস্ট)

অবশেষে আমি 'অর্ডার বাই' ধারাটি যুক্ত করব।

এটি দ্রুত এবং ওয়ার্ডপ্রেসে অন্তর্নির্মিত ইনডেক্সগুলির সাথে কাজ করে, সুতরাং এটি কার্যকর বলে মনে হচ্ছে।

এর থেকে ভাল কিছু আছে কিনা তা জানেন না তবে এটি যদি হয় তবে আমি এটি ব্যবহার করতে পছন্দ করব।

আশাকরি এটা সাহায্য করবে.

মার্কাস


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

0

আরে দয়া করে এটি চেষ্টা করে দেখুন আমি মনে করি এটি ঠিক আছে work

$args = array(
            'post_type' => 'page',
            'meta_key' => 'someMetaKeyName',
            'meta_query' => array(
                array(
                        'key' => 'someMetaKeyName',
                        'type' => 'CHAR',
                   ),
                ),
        );

    $query = new WP_Query( $args );

কারণ ক্ষেত্রে আপনাকে ব্যবহৃত কী meta_keyএবং meta_query[]['key']পাশাপাশি?
কায়সার

1
না, এটি কাজ করে না এবং তাদের সাথে মেটা ছাড়া কোনও পোস্টের অ্যারে ফিরিয়ে আনে।
ইয়ামসালাত

3
meta_keyএবং / অথবা meta_queryফলাফলের প্রকার পরিবর্তিত হয় না, কেবলমাত্র ক্যোয়ারী।
BODA82
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.