@@ -2033,6 +2033,7 @@
if ( !empty($q('meta_key')) ) ( $allowed_keys() = $q('meta_key'); $allowed_keys() = 'meta_value'; + $allowed_keys() = 'meta_value_num'; ) $q('orderby') = urldecode($q('orderby')); $q('orderby') = addslashes_gpc($q('orderby'));
@@ -2056,6 +2057,9 @@
case 'meta_value': $orderby = "$wpdb->postmeta.meta_value"; break; + case 'meta_value_num': + $orderby = "$wpdb->postmeta.meta_value+0"; + break; default: $orderby = "$wpdb->posts.post_" . $orderby; )
Dette er en direkte redigering av en kjernefil: /wp-includes/query.php Merk plusstegnene i koden ovenfor angir nye linjer å legge til .
Forfatternotater:
En klient ønsket at jeg skulle sette opp et tilpasset felt kalt “Guide Rank” som tillot dem å tildele nr. 1 - 20 for en liste over barer de la ut om.
Etter å ha kjørt innleggsspørringen fant jeg ut at meta_value ble behandlet som en streng, og som sådan ble sorteringsrekkefølgen blandet:
f.eks. 1, 10, 2, 3css-tricks.com C 7, 8, 9
For å få WordPress / MySQL til å bruke “Natural Sort Order”, trenger du bare å bruke +0 på feltnavnet, og det blir behandlet som et tall (f.eks. Meta_value + 0).
For at eksisterende oppførsel ikke blir avbrutt, har jeg nettopp lagt til den nye typen 'meta_value_num'.
Forespørselslinjen min ser nå ut som:
$guide_posts = new WP_Query("cat=12&meta_key=guide_rank&orderby=meta_value_num&order=ASC&showposts=10");
Som returnerer: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Dette er for inkludering i WordPress-kofferten - så forhåpentligvis når det blir brukt, bør det ikke være behov for manuell redigering av filen.