Wp_Query可以在单个请求中返回POST META吗?

时间:2014-12-12 作者:YemSalat

我想创建一个wp\\u查询,该查询将返回posts 大堆

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

// The Query
$query = new WP_Query( $args );
这将返回如下结果:

enter image description here

正如您所看到的,帖子没有任何元数据,是否可以将元数据也包含在返回的数组中?

PS,出于性能原因,我不需要额外的wp\\U查询。

4 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

默认情况下,WP_Query 返回标准WP_Post 要查询的帖子的对象。我相信通过一些巧妙的重写和使用WP_Query 您可以将对象添加到返回的WP_Post 对象数组。

这会被执行吗?在我看来,由于自定义字段未保存在wp_posts 表,但在wp_postmeta 桌子

检索post meta非常快,不需要任何额外的WP_Query. 只需使用get_post_meta(). 引入自定义字段时,WordPress考虑得很周到。他们添加了一个缓存来缓存这些字段,因此无论您查询1个或100个自定义字段,您都只需访问一次数据库,超高速。有关完整的测试和说明,请参阅this post 我最近在这个问题上做了很多工作。

在我看来,额外的数据库调用和实际花费的时间是值得的,而且比重写更快WP_Query 以这样的方式在返回的标准post对象中包含自定义字段$posts

SO网友:Jonny

这个问题已经有一年多的历史了,但我也遇到了同样的问题,下面是一个将每个meta\\u值和meta\\u键添加到$wp\\u查询对象的函数,

此函数将执行一个额外的查询示例,而不是在while循环中查询每个post meta:

“从$wpdb中选择meta\\U key、meta\\U value、post\\U id->POSTETA WHERE post\\U id IN(1,2,3,4,5…)”

式中(1,2,3,4,5…)是当前从$wp\\u query查询的帖子ID

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;
  }
}
额外的“Posteta”将写入每个$wp\\U查询->帖子[$i]

$wp_query->posts[0]->postmeta

“someMetaKeyName”示例不要忘记

add_query_meta() 到您的主题函数。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++;
    }
}

SO网友:Marcus

最近我遇到了一个类似的问题,我需要从自定义帖子类型中获取7条元数据,但也需要基于一条元数据获取帖子。

所以我创建了下面的SQL语句,我经常使用它。希望它能帮助其他人。我会尽力解释的。

        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 );
首先,我使用global$wpdb获取wordpress数据库函数。然后我将posttype设置为$pt。为了获得与post\\u meta中的特定值匹配的正确post,我设置了$mk(meta\\u键)

然后我设置$mv(meta\\u value)变量(在本例中,meta值与postid匹配)

$mk1-$mk7是我想从每篇文章中获得的meta\\u密钥。(我将获取select语句中的值)

我还通过设置$ord,将“order by”设置为var

select语句如下所示:我从post或“p.”中选择post ID和post\\u标题

然后我选择所有需要的元数据,用pm1选择它们。->pm。7获取meta\\u值并将其重命名(AS),以便在从我的对象检索数据时更具可读性。

我为需要匹配到帖子的元数据创建一个左连接。(pm)

我为需要检索的每个元数据创建了7个左连接。(pm1-pm7)

WHERE语句基于第一个左连接(pm),因此它将知道我只需要元数据匹配的帖子。

我还为post类型和非草稿的post\\u状态添加了“AND”。(所以只发布帖子)

最后,我添加了“order by”子句。

这项工作速度很快,并且使用Wordpress中的内置索引,因此看起来很有效。

不知道是否有比这更好的东西,但如果是,我很乐意使用它。

希望这有帮助。

马库斯

SO网友:Amit Mishra

嘿,请试试这个,我觉得它很好用。

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

    $query = new WP_Query( $args );

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post