get_post_meta($post_id, $key, $single);
我需要的是获取所有帖子中与特定自定义帖子键相关的所有值。
任何人都知道有效的方法吗?我不想遍历数据库中的所有帖子ID。
示例:
4个帖子都具有不同的值,用于名为“ Mood”的自定义字段。 /> 2个帖子的价值为'happy',1个帖子的值为'angry',1个帖子的值为'sad'
我要输出的信息:在所有帖子中,我们有:2个快乐,1个愤怒和1个可悲的作者。
但是很多帖子。
我正在寻找的是:
a WP函数来获取此信息。
或
一个自定义查询,以尽可能高效地获取此信息。
#1 楼
一种可能的方法是使用WPDB类中的辅助方法之一来进行更精细的基于元的查询。但是,使用其中一些功能的警告是,即使您只需要调用一列或一行,通常也不需要获取简单的数据数组,并且通常不必对对象属性进行不必要的引用。 />当然,并非所有功能都是相同的,WPDB方法
get_col
有目的地提及,该方法返回一个简单的平面数组,用于查询数据,我之所以这样说是因为下面的示例将调用此方法。WordPress-WPDB选择数据列$ 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' );
如果您只想将数据打印到屏幕上,PHP的implode函数可以将简单的数组快速拼接成数据行。 br />
// 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.
*/
该逻辑可以应用于各种数据,并可以扩展为许多不同的方式。因此,我希望我的示例对您有所帮助,并且足够简单。
评论
如果您只想提取“唯一”元值,则对以后的查看者也很有趣-您可以在上面的函数中的SELECT之后直接键入DISTINCT。可能有用。
– Howdy_McGee♦
2014年2月7日在18:24
我认为这非常有用
– Pablo S G Pacheco
17年5月1日在14:54
如何做到这一点,并返回排序的值?,我认为使用ORDER by,但我无法弄清楚如何使用它
– efirvida
18年4月17日在3:43
#2 楼
我只想在上面的t31os代码中添加一个小东西。我自己使用此代码时,将“ SELECT”更改为“ SELECT DISTINCT”以消除重复的条目。评论
我可以想象有多个具有相同值的元值是有效的情况,因此没有在我的代码中添加该值。如果您想要独特的价值,那将是您的最佳选择。另外,您还可以将其添加为函数的参数(因此,可以根据需要使用或不使用它)。
– t31os
2014年1月24日18:19
#3 楼
使用全局$ 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 );
评论
在大多数情况下,这是我首选的方法。它会进行五个查询,而不仅仅是一个查询,但是,由于它使用标准的WordPress过程来生成和提交查询,因此任何特定于平台的缓存(例如WP Engine的对象缓存或某些随机插件)都将启动。数据还将在请求期间将其存储在WordPress的内部缓存中,因此如果需要,无需再次从数据库中检索。
–安德鲁·丁莫(Andrew Dinmore)
17年6月2日在15:33
任何过滤器也将应用于数据,这在例如多语言站点上可能非常重要。最后,由于它仅使用标准的WordPress核心功能,因此将来更新可能会破坏它的可能性很小。
–安德鲁·丁莫(Andrew Dinmore)
17年2月2日在15:34
通过将查询限制为发布ID,可以提高性能。添加:'fields'=>'ids'因此,查询数组将类似于:array('post_type'=> $ post_type,'meta_key'=> $ meta_key,'posts_per_page'=> -1,'fields'=> 'ids')
–豌豆
20-4-13在18:31
注意,这也会滤除仅在未发布的帖子中存在的元值,因此请确保使用“ post_status” arg将此功能设置为不是错误
– jnhghy-Alexandru Jantea
20年7月23日在22:25
#4 楼
最快的方法是自定义sql查询,但我不确定,但是您可以尝试$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
");
如果有的话,它是一个开始。
评论
谢谢,但是是否不应该“不惜一切代价”避免自定义查询?我更喜欢使用WP抽象层(这就是所谓的吗?)……但是,当然不可能。
–mikkelbreum
2011年6月8日在10:53
如果以正确的方式编写自定义查询,可能会更好,并且仅在不知道自己在做什么的情况下才应避免使用它们。
–互联网
2011年6月8日在13:07
我同意mwb .custom查询非常有用且实用,但是我认为它们在数据库上也要重得多,尤其是使用SRT函数时。
–krembo99
2011-12-10 3:20
#5 楼
为了通过meta键获取所有meta值检查wp-> db wordpress Codex
$values = $wpdb->get_col("SELECT meta_value
FROM $wpdb->postmeta WHERE meta_key = 'yourmetakey'" );
评论
这种方法的问题是缺乏特异性,您会从这种查询中获得大量结果,其中可能包括草稿,已删除邮件,帖子,页面以及任何其他现有的帖子类型。您永远不应查询不需要的内容,在这里肯定需要特定性。
– t31os
2014年1月24日18:23
虽然确实可以从其他帖子类型和状态获取值,但是有时您所需要的只是值,并且除了需要的地方没有使用过meta_key。如果所有/大多数值都是唯一的,则这可能是最佳解决方案。
–路加登(Luke Gedeon)
18年6月23日在18:36
#6 楼
没有理由不能将t31os和Bainternet的代码合并为一个可重用的预处理语句(wordpress样式),该语句可以通过一次有效的操作返回计数和值。这是一个自定义查询,但仍使用wordpress数据库抽象层-因此,例如,表名到底是什么或它们是否更改都无关紧要,这是一个准备好的语句,因此我们可以使SQL攻击等安全得多。
在这种情况下,我不再检查帖子类型,而是排除空字符串:
$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)
#7 楼
将以下内容与foreach一起使用 $key = get_post_custom_values( 'key' );
假设您的自定义字段键的名称为
评论
请注意,如果未指定post_id,则默认为当前帖子。
– birgire
17年7月29日在11:23
评论
似乎您将其用作分类法。为什么不在保存时简单地(自动)在这些帖子中添加术语?将使查询变得容易得多。@kaiser我非常感谢您成为天才!