Bir özel alana göre filtreleme, diğerine göre sıralama?


10

Özel bir yazı türü "Liste" var ve ben özel bir alana sahip tüm Listeleri almak gateway_value != 'Yes've sonuçları başka bir özel alana göre sipariş etmek istiyorum location_level1_value. Sorguları ayrı ayrı çalıştırabilirim, ancak bunları birleştiremiyorum:

Sorgu 1 (konuma göre sırala):

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'post_status' => 'publish',
                    'posts_per_page' => '9',
                    'meta_key' => 'location_level1_value',
                    'orderby' => 'location_level1_value',
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                 );

Sorgu 2 (özel alan değeri! = Evet):

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'posts_per_page' => '9',
                    'post_status' => 'publish',
                    'meta_key' => 'gateway_value',
                    'meta_value' => 'Yes',
                    'meta_compare' => '!=',
                    'paged' => $paged
                    )
                );

Birleşik sorgu:

Bu konuda yardım için codex baktım , ancak aşağıdaki sorgu çalışmıyor:

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'posts_per_page' => '9',
                    'post_status' => 'publish',
                    'meta_query' => array(
                        array(
                            'key' => 'gateway_value',
                            'value' => 'Yes',
                            'compare' => '!='
                        ),
                        array(
                            'key' => 'location_level1_value'
                        )
                    ),
                    'orderby' => "location_level1_value",
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                );

Birleşik sorguda neyi yanlış yapıyorum?

[GÜNCELLEME]: Şimdi 3.1 yayınlandı, yukarıdaki birleştirilmiş sorgu hala çalışmıyor. Sonuçları doğru şekilde sıralamıyorum.

[UPDATE]: var_dump($wp_query->request)aşağıdakileri verir:
string(527) " SELECT SQL_CALC_FOUND_ROWS wp_7v1oev_posts.* FROM wp_7v1oev_posts INNER JOIN wp_7v1oev_postmeta ON (wp_7v1oev_posts.ID = wp_7v1oev_postmeta.post_id) INNER JOIN wp_7v1oev_postmeta AS mt1 ON (wp_7v1oev_posts.ID = mt1.post_id) WHERE 1=1 AND wp_7v1oev_posts.post_type = 'listing' AND (wp_7v1oev_posts.post_status = 'publish') AND wp_7v1oev_postmeta.meta_key = 'gateway_value' AND CAST(wp_7v1oev_postmeta.meta_value AS CHAR) != 'Yes' AND mt1.meta_key = 'location_level1_value' ORDER BY wp_7v1oev_posts.post_date DESC LIMIT 0, 9"


3
WordPress 3.1 mi kullanıyorsunuz? meta_queryParametre çok yakında serbest bırakıldı, ama mevcut kararlı sürümü bu parametre olmadan hala 3.0.5 olduğunu gereken ve 3.1 yenidir.
Jan Fabry

Ee ... evet, o zaman muhtemelen bu olabilir. 3.0.5 çalışmak için herhangi bir yolu var mı?
gillespieza

Miljenko senin yerine kabul etmen gereken en iyi cevaba sahip.
Hugo

Yanıtlar:


9

Sorguyu, filtreleme seçenekleriyle 'meta_query' kullanarak içeriği istediğiniz gibi filtrelemek için kullanabilirsiniz ve sipariş bölümü için aşağıdaki parametreleri ekleyin / değiştirin:

  • 'orderby' => 'meta_değer'
  • 'meta_key' => 'location_level1_value'
  • 'order' => 'ASC'

    $wp_query = new WP_Query( array (
        'post_type'      => 'listing',
        'posts_per_page' => '9',
        'post_status'    => 'publish',
        'meta_query'     => array(
            array(
                'key'       => 'gateway_value',
                'value'     => 'Yes',
                'compare'   => '!='
            )
        ),
        'orderby'  => 'meta_value',            // this means we will be using a selected 
                                               // meta field to order
    
        'meta_key' => 'location_level1_value', // this states which meta field 
                                               // will be used in the ordering, 
                                               // regardless of the filters
        'order'    => 'ASC',
        'paged'    => $paged
        )
    );

2

Tıpkı Jan'ın yeni WordPress 3.1'de söylediği gibi kullanabilirsiniz, meta_queryancak bu çıkana kadar İlk sorgunuzu kullanarak döngünüzün içinde sipariş vermek ve filtrelemek için kullanabilirsiniz:

 Global $my_query;
$my_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'post_status' => 'publish',
                    'posts_per_page' => '9',
                    'meta_key' => 'location_level1_value',
                    'orderby' => 'location_level1_value',
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                 );
while ($my_query->have_posts){
    $my_query->the_post();
              //do your loop stuff
} 

ve bu kodu işlevlerinize ekleyin. php

   //join filter
         add_filter('posts_join', 'listing_join_865' );
         function listing_join_865($join){
Global$ my_query;            
if ('listing' = $my_query->query['post_type']){
                $restriction1 = 'gateway_value';
                return $join .="
                LEFT JOIN $wpdb->postmeta AS $restriction1 ON(
                $wpdb->posts.ID = $restriction1.post_id
                AND $restriction1.meta_key = '$restriction1'
                )";
             }else {
                return $join;
            }
         }
         //where filter
         add_filter('posts_where', 'listing_where_865' );
         function listing_where_865($where){
             global $my_query;
            if ('listing' = $my_query->query['post_type']){
                return $where.= " AND $restriction1.meta_value != 'yes'";
            }else{
                return $where;
            }
         }

şimdi bu işe yaramalı.


Bunun için teşekkürler. Bu çalışır, ancak disk belleği artık düzgün çalışmıyor bu yan etkisi var. Sayfa başına 9 yerine, benim gateway_value == "Yes"koşullarında koşulsuz olurdu özel gönderiler "boş noktalar" var ... Bunu düzeltmek için herhangi bir fikir?
gillespieza

evet bu kadar karmaşa olur bu yüzden etrafında tek yolu özel bir sql sorgusu olacağını tahmin, bana birkaç dakika verin.
Bainternet

Merak etmeyin - 3.1'i piyasaya
sürene

Baraj, bir çözüm bulduktan sonra yorumunuzu görmek için şimdi döndüm. her neyse, gelecekteki sorular için burada.
Bainternet

1
@ t31os - bunu genellikle yaparım ama cep telefonumdan cevaplarken değil.
Bainternet

1

Kendi soruma cevap verdiğim için özür dilerim:

[Http://core.trac.wordpress.org/ticket/15031 Sisteme[1] 'e bakmak, bunun bilinen bir sorun olduğu anlaşılıyor. Ben, post_filter(sadece aynı cevabı arayan herkesin referansı için ) kullanarak , çalışmak için (hack?) Sabit var :

Function.php ### içinde

add_filter('posts_orderby', 'EV_locationl1' );
function EV_locationl1 ($orderby) {
    global $EV_locationl1_orderby;
    if ($EV_locationl1_orderby) $orderby = $EV_locationl1_orderby;
    return $orderby;
}

### şablon dosyasında değiştirilen wp_query

$EV_locationl1_orderby = " mt1.meta_value ASC";

$wp_query = new WP_Query( array (
    'post_type' => 'listing',
    'posts_per_page' => '9',
    'post_status' => 'publish',
    'meta_query' => array(
            array(
                    'key' => 'gateway_value',
                    'value' => 'Yes',
                    'compare' => '!='
                    ),
            array(
                    'key' => 'location_level1_value'
            )
        ),
    'order' => $EV_locationl1_orderby,
    'paged' => $paged
    ));
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.