How metadata API works?

时间:2016-07-01 作者:dan9vu

Update 2: 签出@NateWr方法,使用add_post_meta 使用默认帖子:

add_post_meta( 1, \'my_items\', 1 );
add_post_meta( 1, \'my_items\', 2 );
add_post_meta( 1, \'my_items\', new \\stdClass );  

var_dump(get_post_meta(1, \'my_items\', true));
echo "<br><br>";
var_dump(get_post_meta(1));
echo "<br><br>";

$GLOBALS[\'wp_object_cache\']->stats();
结果是:

string(1) "1" 

array(1) {
  ["my_items"]=>array(3) {
    [0]=> string(1) "1"
    [1]=> string(1) "2"
    [2]=> string(19) "O:8:"stdClass":0:{}"
  }
}
这次,它命中了缓存,但元值不同。现在,如果我不知道meta_key 我只使用post ID手动检索和解析post meta,很明显,我会得到错误的值。

<小时>Update 1: 签出@NateWr方法,使用update_post_meta 使用默认帖子:

update_post_meta(1, \'my_items\', 1);
update_post_meta(1, \'my_items\', 2);
update_post_meta(1, \'my_items\', 3);

var_dump( get_post_meta(1) );

echo "<br><br>";

$GLOBALS[\'wp_object_cache\']->stats();
结果:

array(1) {
  ["my_items"]=>array(1) {
    [0]=>string(1) "3"
  }
} 
看起来像Cache Hits 不会更改,WordPress仍然返回一个无意义的数组meta_value. 还是我错过了什么?

<小时>Question:

我试图通过在WP_Query 正在检索帖子。基本上是这样的:

add_filter(\'the_posts\', function($posts, $query)
{
  if ( !is_admin() ) {
    $mapper = new Vendor\\PostMapper($GLOBALS[\'wpdb\']);
    foreach ($posts as $post) {
      $post->post_link = get_permalink($post);
      $post->post_meta = $mapper->getMetadata($post);
      $post->post_thumbnail = $mapper->getThumbnail($post);
      ...
    }
  }

  return $posts;
}, PHP_INT_MAX, 2);
一切正常,但在解析元数据时我感到不安。通过使用metadata API, 如果我没有指定meta_key, 元值始终是仅包含一个元素的数组,例如:

array(3) {
  ["_edit_last"]=>array(1) {
    [0]=>string(1) "1"
  }
  ["_edit_lock"]=>array(1) {
    [0]=>string(12) "1467358332:1"
  }
  ["_thumbnail_id"]=>array(1) {
    [0]=>string(3) "767"
  }
}
我想我永远都不可能知道一切meta_key. 我也不知道为什么WordPress需要这么做。数组看起来毫无意义,这让我很困扰。

鉴于此meta_key 不需要,我也不指定meta_key, 我真的需要你的帮助来理解:

Q1: Can一号meta_key 有多个meta_value? 如果没有,为什么WordPress需要使用无意义的数组作为meta_value?

Q2: 为什么WordPress不取消序列化所有序列化的元数据?

1 个回复
最合适的回答,由SO网友:NateWr 整理而成

Q1是的,您可以将序列化数组存储为单个元键,例如:

update_post_meta( $post_id, \'my_items\', array( 1, 2, 3, 4 );
此外,您可以针对单个元键存储多个值,例如:

add_post_meta( $post_id, \'my_items\', 1 );
add_post_meta( $post_id, \'my_items\', 2 );
后者是首选,因为可以更有效地对其执行元查询。

在第一个示例中,在post_meta 桌子在第二个示例中,有两行。

因此,在第二个示例中,可以对具有my_item 的元值2 无需拉出并取消序列化my_item 数据库中的条目。

包括我在内的许多人都通过艰苦的方式学会了这一点。

Q2很抱歉,我无法回答为什么,尽管我知道序列化和非序列化可能会对大型数据集的性能产生影响。

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在