Overview: 我不想回复帖子。我只是希望所有帖子中某个特定meta\\u值的单个最高值。。。只是价值本身。
Details: 我在所有帖子中添加了一个自定义meta\\u键“price”。值始终为整数(无小数或非数字字符)。我正在尝试执行一个查询,返回与此特定meta\\u键关联的最高/最大/最大meta\\u值。
Buggy Code
function max_meta_value(){
global $wpdb;
$query = "SELECT max(meta_value) FROM wp_postmeta WHERE meta_key=\'price\'";
$the_max = $wpdb->get_var($query);
return $the_max;
}
Buggy Results: 起初,我认为上面的代码是有效的,因为如果所有meta\\u值都小于999,则会有效。我很快发现,如果meta\\u值大于999,那么它就会被忽略。因此,上面的代码实际上为我提供了meta\\u值小于1000的最大值(meta\\u值)。
Plea to Community: 显然,我不知道它为什么会失败,但我有一种感觉,它与WP存储值的方式有关——可能与它的数据类型有关?或者我不应该使用$wpdb->get\\u var()。任何指导都将不胜感激。
最合适的回答,由SO网友:Dakshinamurthy Karra 整理而成
meta\\u值不是整数类型,max无法返回正确的值。您可以使用mysqlcast
方法转换为整数,如下所示:
SELECT max(cast(meta_value as unsigned)) FROM wp_postmeta WHERE meta_key=\'price\'
SO网友:szajmon
我修改了原始函数和KDM的解决方案,使其具有更通用的函数。它是这样的:
function end_meta_value( $end = "max", $meta )
{
global $wpdb;
$query = $wpdb->prepare(
"SELECT %s( cast( meta_value as UNSIGNED ) ) FROM {$wpdb->postmeta} WHERE meta_key=\'%s\'",
$end,
$meta
);
return $wpdb->get_var( $query );
}
通过这种方式,您可以获得任何自定义meta\\u值的最小值和最大值。我也改变了
wp_postmeta
到
$wpdb->postmeta
以适应您使用的任何前缀。
注意:如果要查询数字,请替换%s
在$wpdb->prepare()
具有的声明%d
.
SO网友:Laxmana
我修改了szajmon解决方案以使用wp\\u缓存,并修复了我得到的sql语法错误。
wpdb->prepare用引号将$end变量包装起来,这会引发一个错误(至少在我的例子中是这样)
function get_min_max_meta_value( $type = \'max\', $key ){
global $wpdb;
$cash_key = md5($key . $type);
$results = wp_cache_get($key);
if($results === false){
$sql = "SELECT " . $type . "( cast( meta_value as UNSIGNED ) ) FROM {$wpdb->postmeta} WHERE meta_key=\'%s\'";
$query = $wpdb->prepare( $sql, $key);
return $wpdb->get_var( $query );
}
return $results;
}