SELECT max(meta_value) FROM wp_postmeta WHERE meta_key='price'... încetează să funcționeze când valoarea depășește 999
Prezentare generală: Nu încerc să returnez un post. Vreau doar cea mai mare valoare pentru un anumit meta_value din toate posturile... doar valoarea în sine.
Detalii: Am adăugat un meta_key personalizat "price" la toate postările mele. Valoarea este întotdeauna un număr întreg (fără zecimale sau caractere non-numerice). Încerc să fac o interogare care să returneze cea mai mare valoare meta_value asociată cu acest meta_key.
Cod problematic
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;
}
Rezultate eronate: Inițial am crezut că codul de mai sus funcționează, pentru că o face dacă toate meta_value sunt mai mici de 999. Am descoperit ulterior că dacă meta_value este mai mare de 999, atunci este ignorat. Deci, de fapt, codul de mai sus îmi dă max(meta_value) doar pentru valori mai mici de 1000.
Apel la comunitate: Evident, nu știu de ce eșuează, dar am senzația că are legătură cu modul în care WP stochează valoarea - poate este legat de tipul de date? Sau poate nu ar trebui să folosesc $wpdb->get_var(). Orice îndrumare va fi apreciată.

Valoarea meta_value nu este de tip întreg pentru ca funcția max să returneze valori corecte. Puteți folosi metoda cast
din MySQL pentru a converti în numere întregi, după cum urmează:
SELECT max(cast(meta_value as unsigned)) FROM wp_postmeta WHERE meta_key='price'

Includ doar postări publicate: http://pastebin.com/pR6SDEdf

Am modificat funcția originală și soluția KDM pentru a avea o funcție mai universală. Iată cum arată:
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 );
}
În acest fel poți obține atât valorile minime cât și maxime ale oricărui meta_value personalizat.
De asemenea, am schimbat wp_postmeta
în $wpdb->postmeta
pentru a se potrivi cu orice prefix folosit.
Notă: Dacă dorești să interoghezi o cifră, înlocuiește %s
în instrucțiunea $wpdb->prepare()
cu %d
.

Mulțumesc pentru răspuns. Am primit o eroare de sintaxă SQL. Problema este că wpdb->prepare încadrează variabila $end între ghilimele simple '', așa că interogarea devine SELECT 'max'(cast... ceea ce generează o eroare. Puteți concatena astfel: $sql = "SELECT " . $end . "(cast...". Așa a funcționat pentru mine.

Am modificat soluția lui szajmon pentru a funcționa cu wp_cache și pentru a repara eroarea de sintaxă SQL pe care o primesc.
wpdb->prepare încadrează variabila $end între ghilimele și asta aruncă o eroare (cel puțin în cazul meu)
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;
}

Aici este o soluție improvizată pe care am folosit-o utilizând funcția php max array și WP_Query integrat
function get_max_post_meta_value($category_id) {
$args = array(
'post_type' => 'cpt-name', // tipul postului personalizat
'post_status' => 'publish', // doar postări publicate
'cat' => $category_id, // ID-ul categoriei
'posts_per_page' => 1000, // numărul maxim de postări
);
$max_meta_value_array = array(); // inițializare array pentru valori meta
$loop = new WP_Query( $args ); // interogare WP
while ( $loop->have_posts() ) : $loop->the_post();
// adăugare valoare meta în array
array_push($max_meta_value_array, get_post_meta( get_the_ID(), 'post_meta_name', true) );
endwhile;
wp_reset_postdata(); // resetare date post
return max($max_meta_value_array) ; // returnare valoarea maximă
}
