Menggunakan Orderby dan meta_value_num untuk memesan nomor terlebih dahulu kemudian string

16

Saya memiliki daftar produk, masing-masing dengan harga di bidang khusus yang disimpan sebagai teks seperti "2.50" atau "5,00" dan saya menampilkannya di halaman dengan permintaan khusus yang diurutkan berdasarkan harga:

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

Ini berfungsi dengan baik untuk harga, tetapi beberapa harga adalah "POA" dan saya ingin menunjukkan kepada mereka yang terakhir, namun pesanan di atas sedemikian rupa sehingga "POA" ditampilkan terlebih dahulu.

Apakah ada cara untuk mengubah ini, atau peretasan cepat yang dapat saya gunakan untuk mengurutkan array setelahnya dan menempatkan harga "POA" terakhir?

Shaun
sumber
coba ubah 'orderby' => 'meta_value_num', ke'orderby' => 'meta_value_num meta_value',
Bainternet
Terima kasih tetapi itu tidak berhasil :(
Shaun
Aha! Tetapi sebaliknya berhasil meta_value meta_value_num,! Terima kasih! Apakah Anda ingin menulis jawaban sehingga saya dapat memilihnya?
Shaun
1
diposting sebagai jawaban untuk orang yang tidak membaca komentar.
Bainternet
POA berarti "harga saat ditanyakan" en.wikipedia.org/wiki/Price_on_application
sudip

Jawaban:

23

The OrderByArgumen dapat mengambil lebih dari satu parameter sehingga solusinya adalah untuk perubahan:

'orderby' => 'meta_value_num',

untuk:

'orderby' => 'meta_value meta_value_num',
Bainternet
sumber
3
Ini hanya mengurutkan menurut abjad, karena parameter kedua adalah no-op, pengurutan pada bidang yang sama tidak berpengaruh. Untuk melakukan ini sehingga angka-angka mengurutkan secara numerik dan alfabet, Anda harus menggunakan filter untuk menyesuaikan orderby untuk menggunakan semacam casing SQL, misalnyaORDER 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 Terima kasih! Solusi Anda adalah solusi lengkap untuk masalah ini. Dan di sini ada sisa kode tempat permintaan Anda ditempatkan. Saya akan mempostingnya sebagai jawaban untuk pengunjung baru.
Gangesh
2

Saya menemukan solusi ini dengan menggabungkan kode oleh @bonger dan /programming/18084199/wordpress-query-order-by-case-when

Dan itu bekerja dengan baik.

Fungsi

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

Sebelum Query

add_filter( 'posts_orderby', 'filter_case' );

$wp_query = new WP_Query($args);

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