SELECT max(meta_value) FROM wp_postmeta WHERE meta_key='price'... smette di funzionare quando il valore supera 999
Panoramica: Non sto cercando di restituire un post. Voglio semplicemente il singolo valore più alto per un particolare meta_value tra tutti i post... solo il valore stesso.
Dettagli: Ho aggiunto un meta_key personalizzato "price" a tutti i miei post. Il valore è sempre un intero (senza decimali o caratteri non numerici). Sto cercando di eseguire una query che restituisca il meta_value più alto/più grande/massimo associato a questo specifico meta_key.
Codice problematico
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;
}
Risultati problematici: All'inizio pensavo che il codice sopra funzionasse, perché lo fa se tutti i meta_value sono inferiori a 999. Ho poi scoperto che se il meta_value è maggiore di 999 viene ignorato. Quindi in realtà il codice sopra mi restituisce il max(meta_value) solo per meta_value inferiori a 1000.
Appello alla comunità: Ovviamente non so perché fallisce, ma ho la sensazione che abbia a che fare con il modo in cui WP memorizza il valore - forse è legato al tipo di dato? O forse non dovrei usare $wpdb->get_var(). Qualsiasi guida sarà molto apprezzata.

Includere solo i post pubblicati: http://pastebin.com/pR6SDEdf

Ho modificato la funzione originale e la soluzione di KDM per ottenere una funzione più universale. Ecco come si presenta:
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 );
}
In questo modo puoi ottenere sia i valori minimi che massimi di qualsiasi meta_value personalizzato.
Ho anche cambiato wp_postmeta
in $wpdb->postmeta
per adattarsi a qualsiasi prefisso tu utilizzi.
Nota: Se vuoi eseguire una query per una cifra, sostituisci %s
nell'istruzione $wpdb->prepare()
con %d
.

Grazie per la tua risposta. Ricevo un errore di sintassi SQL. Il problema è che wpdb->prepare racchiude la variabile $end tra '', quindi la query diventa SELECT 'max'(cast.... e questo genera un errore. Puoi concatenarla così: $sql = "SELECT " . $end . "(cast...". Questo ha funzionato per me.

Ho modificato la soluzione di szajmon per funzionare con wp_cache e correggere l'errore di sintassi SQL che ottengo.
wpdb->prepare racchiude la variabile $end tra virgolette e questo genera un errore (almeno nel mio caso)
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;
}

Ecco un modo approssimativo con cui l'ho realizzato utilizzando la funzione php max sugli array e la WP_Query integrata
function get_max_post_meta_value($category_id) {
$args = array(
'post_type' => 'cpt-name',
'post_status' => 'publish',
'cat' => $category_id,
'posts_per_page' => 1000,
);
$max_meta_value_array = array();
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
array_push($max_meta_value_array, get_post_meta( get_the_ID(), 'post_meta_name', true) );
endwhile;
wp_reset_postdata();
return max($max_meta_value_array) ;
}
