SELECT max (meta_value) FROM wp_postmeta WHERE meta_key = ‘price’ … hört auf zu arbeiten, wenn der Wert über 999 ist

Übersicht : Ich versuche nicht, einen Beitrag zurückzugeben. Ich will einfach den einzigen höchsten Wert für einen bestimmten Meta-Wert über alle Beiträge … nur den Wert selbst.

Details : Ich habe allen meinen Beiträgen einen benutzerdefinierten “Preis” hinzugefügt. Der Wert ist immer eine Ganzzahl (keine Dezimalstellen oder nicht numerische Zeichen). Ich versuche eine Abfrage auszuführen, die den höchsten / größten / maximalen meta_value zurückgibt, der diesem bestimmten meta_key zugeordnet ist.

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-Ergebnisse : Zuerst dachte ich, dass der obige Code funktioniert, weil es tut, wenn alle Meta-Werte weniger als 999 sind. Ich entdeckte bald, dass, wenn der Meta-Wert größer als 999 ist, es ignoriert wird. Also, der obige Code gibt mir den Max (Metawert) für Metawerte unter 1000.

Plädoyer für die Community : Offensichtlich weiß ich nicht, warum es scheitert, aber ich habe das Gefühl, dass es etwas damit zu tun hat, wie WP den Wert speichert – vielleicht seinen Datentypen? Oder vielleicht sollte ich $ wpdb-> get_var () nicht verwenden. Jede Anleitung wird sehr geschätzt.

Solutions Collecting From Web of "SELECT max (meta_value) FROM wp_postmeta WHERE meta_key = ‘price’ … hört auf zu arbeiten, wenn der Wert über 999 ist"

Der Metawert ist kein Integer-Typ, damit Max die richtigen Werte zurückgibt. Sie können die mysql- cast Methode wie folgt in Ganzzahlen konvertieren:

SELECT max(cast(meta_value as unsigned)) FROM wp_postmeta WHERE meta_key='price'

Ich änderte die ursprüngliche function und die KDM-Lösung, um eine universellere function zu haben. Es geht so:

 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 ); } 

Auf diese Weise können Sie sowohl minimale als auch maximale Werte für jeden benutzerdefinierten Metawert erhalten. Ich änderte wp_postmeta zu $wpdb->postmeta , um jedem Präfix zu passen, das du verwendest.

Hinweis: Wenn Sie eine Ziffer abfragen möchten, ersetzen Sie %s in der $wpdb->prepare() durch %d .

Ich modifizierte szajmon Lösung, um mit wp_cache zu arbeiten und den sql Syntaxerrors zu beheben, den ich bekomme.

wpdb-> prepare umschließt die $ end -Variable mit Anführungszeichen und das führt einen Fehler (zumindest in meinem Fall)

 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; }