ВЫБЕРИТЕ max(мета-значение) ИЗ wp postmeta, ГДЕ мета-ключ="цена"... перестает работать, когда значение превышает 999
Обзор: Я не пытаюсь вернуть сообщение. Мне просто нужно единственное наивысшее значение для определенного meta_value во всех сообщениях... просто сама ценность.
Подробности: Я добавил пользовательский мета_кей "цена" ко всем своим публикациям. Значение всегда является целым числом (без десятичных знаков или нечисловых символов). Я пытаюсь выполнить запрос, который возвращает наибольшее/наибольшее/максимальное мета_значение, связанное с этим конкретным мета_кей.
Ошибочный Код
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;
}
Результаты с ошибками: Сначала я подумал, что приведенный выше код работает, потому что он работает, если все мета_значения меньше 999. Вскоре я обнаружил, что если значение meta_value больше 999, то оно игнорируется. Так что на самом деле приведенный выше код дает мне максимальное значение (meta_value) для meta_values менее 1000.
Просьба к сообществу: Очевидно, я не знаю, почему это не удается, но у меня такое чувство, что это как-то связано с тем, как WP сохраняет значение - возможно, это связано с типом данных? Или, может быть, мне не следует использовать $wpdb->get_var(). Любые рекомендации будут с благодарностью приняты.
3 answers
Значение meta_value не относится к целочисленному типу, чтобы max возвращал правильные значения. Вы можете использовать метод mysql cast
для преобразования в целые числа следующим образом:
SELECT max(cast(meta_value as unsigned)) FROM wp_postmeta WHERE meta_key='price'
Я изменил исходную функцию и решение 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 );
}
Таким образом, вы можете получить как минимальное, так и максимальное значения любого пользовательского мета_значения.
Я также изменил wp_postmeta
на $wpdb->postmeta
, чтобы соответствовать любому используемому вами префиксу.
Примечание: Если вы хотите запросить цифру, замените %s
в операторе $wpdb->prepare()
на %d
.
Я изменил решение szajmon для работы с wp_cache и исправил полученную синтаксическую ошибку sql.
Wpdb->подготовка заключает переменную $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;
}