Verwenden Sie Orderby und meta_value_num, um zuerst Zahlen und dann Zeichenfolgen zu bestellen

16

Ich habe eine Liste von Produkten mit einem Preis in einem benutzerdefinierten Feld, das als Text wie "2.50" oder "5.00" gespeichert ist, und ich zeige sie auf der Seite mit einer benutzerdefinierten Abfrage an, die nach dem Preis sortiert ist:

    if(!$wp_query) {
        global $wp_query;
    }

    $args = array(
        'meta_key' => 'price',
        'orderby' => 'meta_value_num',
        'order' => 'ASC'
    );

    query_posts( array_merge( $args , $wp_query->query ) );

Dies funktioniert gut für die Preise, aber einige Preise sind "POA" und ich möchte sie zuletzt zeigen, jedoch die oben genannten Bestellungen so, dass "POA" zuerst angezeigt wird.

Gibt es eine Möglichkeit, dies zu ändern, oder einen schnellen Hack, mit dem ich das Array anschließend sortieren und die "POA" -Preise zuletzt setzen könnte?

Shaun
quelle
Versuchen Sie , 'orderby' => 'meta_value_num', zu'orderby' => 'meta_value_num meta_value',
Bainternet
Danke, aber das funktioniert nicht :(
Shaun
Aha! Aber umgekehrt funktioniert es meta_value meta_value_num! Vielen Dank! Möchten Sie eine Antwort verfassen, damit ich darüber abstimmen kann?
Shaun,
1
Gepostet als Antwort für Leute, die keine Kommentare lesen.
Bainternet
POA Mittel „Preis auf der Frage“ en.wikipedia.org/wiki/Price_on_application
sudip

Antworten:

23

Das OrderByArgument kann mehr als einen Parameter annehmen, daher bestand die Lösung in einer Änderung:

'orderby' => 'meta_value_num',

zu:

'orderby' => 'meta_value meta_value_num',
Bainternet
quelle
3
Dies wird nur alphabetisch sortiert, da es sich bei dem zweiten Parameter um ein No-Op handelt, bei dem das gleiche Feld ohne Wirkung sortiert wird. Um dies zu tun , so dass die Zahlen sortiert numerisch und die Alphas alphabetisch würden Sie einen Filter verwenden, um die orderby anpassen irgendeine Art von SQL - Gehäuse zu verwenden, zBORDER BY CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC
Bonger
@bonger Danke! Ihre Lösung ist die vollständige Lösung für dieses Problem. Und hier ist der Rest des Codes, in dem Ihre Anfrage platziert wird. Ich werde es als Antwort für neue Besucher posten.
Gangesh
2

Ich habe diese Lösung gefunden, indem ich Code von @bonger und /programming/18084199/wordpress-query-order-by-case-when kombiniert habe

Und es funktioniert gut.

Funktion

function filter_case($orderby = '') {
  $orderby .= "CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC";
  return $orderby;
}

Vor der Abfrage

add_filter( 'posts_orderby', 'filter_case' );

$wp_query = new WP_Query($args);

remove_filter( 'posts_orderby', 'filter_case' );
Gangesh
quelle