Önce sayıları sonra da dizeleri sıralamak için Orderby ve meta_value_num kullanma


16

Her biri "2.50" veya "5.00" gibi metin olarak depolanan özel bir alanda bir fiyat ile ürün listesi var ve bunları fiyata göre özel bir sorgu ile sayfada görüntülüyorum:

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

Bu fiyatlar için iyi çalışıyor, ancak bazı fiyatlar "POA" ve ben en son göstermek istiyorum, ancak yukarıdaki siparişleri "POA" ilk gösterildiği şekilde.

Bunu değiştirmek için herhangi bir yolu var mı, ya da ben daha sonra dizi sıralamak ve herhangi bir "POA" fiyatları son koymak için kullanabilirsiniz hızlı bir kesmek?


değiştirmeyi deneyin 'orderby' => 'meta_value_num', için'orderby' => 'meta_value_num meta_value',
Bainternet

Teşekkürler ama bu işe yaramıyor :(
Shaun

Aha! Ama bunun tersi işe yarıyor meta_value meta_value_num! Teşekkürler! Oy verebilmem için bir cevap yazmak ister misiniz?
Shaun

1
yorum okumayan insanlar için bir cevap olarak gönderildi.
Bainternet

Talep Üzerine aracı "soran üzerine fiyat" en.wikipedia.org/wiki/Price_on_application
Sudip

Yanıtlar:


23

OrderByÇözelti değişikliğine nedenle argüman daha sonra bir parametre alabilir:

'orderby' => 'meta_value_num',

için:

'orderby' => 'meta_value meta_value_num',

3
Bu sadece alfabetik olarak sıralar, çünkü ikinci parametre bir op-no'dur, aynı alanda hiçbir etki yaratmaz. Bunu yapmak için, rakamlar sayısal olarak ve alfalar alfabetik olarak sıralanır, böylece bir çeşit SQL muhafazası kullanmak için ORDER BY CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC
siparişi

@bonger Teşekkür ederim! Çözümünüz bu sorun için eksiksiz bir çözümdür. Ve burada sorgunuzun yerleştirildiği kodun geri kalanı. Yeni ziyaretçiler için cevap olarak göndereceğim.
Ganjş

2

Bu çözümü kodu @bonger ve /programming/18084199/wordpress-query-order-by-case-when ile birleştirerek buldum

Ve iyi çalışıyor.

fonksiyon

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

Sorgudan Önce

add_filter( 'posts_orderby', 'filter_case' );

$wp_query = new WP_Query($args);

remove_filter( 'posts_orderby', 'filter_case' );
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.