@@ -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; )
Detta är en direktredigering av en kärnfil : /wp-includes/query.php Observera plustecknen i ovanstående kod anger nya rader att lägga till .
Författarens anteckningar:
En klient ville att jag skulle ställa in ett anpassat fält med namnet “Guide Rank” som gjorde det möjligt för dem att tilldela nummer 1 - 20 för en lista med barer som de publicerade om.
Efter att ha kört inläggsfrågan fann jag att meta_value behandlades som en sträng och som sådan virvlade sorteringsordningen:
t.ex. 1, 10, 2, 3css-tricks.comC 7, 8, 9
För att WordPress / MySQL ska använda “Natural Sort Order” behöver du bara använda +0 för fältnamnet och det kommer att behandlas som ett nummer (t.ex. meta_value + 0).
Så att befintligt beteende inte avbryts har jag precis lagt till den nya typen 'meta_value_num'.
Min frågerad ser nu ut:
$guide_posts = new WP_Query("cat=12&meta_key=guide_rank&orderby=meta_value_num&order=ASC&showposts=10");
Som returnerar: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Detta är uppe för inkludering i WordPress-bagageutrymmet - så förhoppningsvis bör det inte behövas redigera filen manuellt när den appliceras.