自定义发布类型(CPT)的GET_POST_META

时间:2016-08-09 作者:Armstrongest

这里是TLDR:是否可以从特定的CPT获取所有元密钥,而不必为每个帖子命中数据库这似乎是一件简单的事情(至少从数据库的角度来看),但我正在寻找Wordpress从一堆CPT中获取多个post\\u元数据的方法。示例:

每一个Product 自定义帖子类型具有以下字段(以及更多字段),用于保存离散的信息片段:

  • _ns_research_document
  • _ns_monograph_document
  • _ns_profile_documentResearch 文档MonographsProfile 文档。目前该站点有72个product 帖子,但其他网站将有超过1000个帖子。

    我假设有一种方法可以用wordpress方法做到这一点,它不涉及[至少]73个调用(一个用于所有帖子,然后get_post_meta 循环内部)。

    我找到的一般解决方案建议在foreach循环中使用get\\u post\\u meta:https://stackoverflow.com/questions/14699686/custom-post-type-loop-only-displays-first-post-meta-data

    但在这种情况下,我真的只想meta_values 在特定CPT.

    数据库逻辑告诉我这应该只有2个查询。。。一个在post\\u meta表上,一个在posts表上。它可能包括一些连接,但仍然是一些相当便宜的查询。

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

好吧,长话短说。。。没有内置的wordpress方式可以直接查询元数据,但为了帮助他人,基本上你需要用老式的方式来做。。。使用SQL:

我要写一篇帖子,我会链接到。。。但本质上它涉及直接SQL和$wpdb->get_results 还有一些PHP循环。

获取的所有值_ns_research_document, _ns_monograph_document, 和_ns_profile_document 我做到了:

// prepare SQL
$wpdb->prepare("SELECT DISTINCT post_id, meta_key, meta_value"
 ." FROM " $wpdb->postmeta 
 ." WHERE meta_key IN ( \'_ns_research_document\', \'_ns_monograph_document\', \'_ns_profile_document\') "
 ." ORDER BY post_id, meta_key ASC" );

// call DB
$results = $wpdb->get_results( $sql );
它返回一个数组,每行有一个数组,我可以循环遍历并重新分类。有点奇怪,没有SQL我找不到一种WP方法来实现这一点,但这就是生活。

请注意,如果您想确保product 发布后,您可能必须在sql中进行内部连接。

SO网友:vol4ikman

我建议使用此函数将所有post meta字段带到一个查询中:https://codex.wordpress.org/Function_Reference/get_post_custom

在循环中使用它,对于查询所有post字段,它将返回所有post字段的数组。