Saring menurut satu bidang khusus, pesan dengan yang lain?

10

Saya memiliki jenis pos kustom "Daftar" dan saya ingin mendapatkan semua Cantuman yang memiliki bidang khusus gateway_value != 'Yes', dan memesan hasilnya dengan bidang khusus lain location_level1_value,. Saya bisa membuat kueri berfungsi secara terpisah, tetapi saya tidak bisa menggabungkannya:

Kueri 1 (urutkan berdasarkan lokasi):

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

Kueri 2 (nilai bidang khusus! = Ya):

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

Kueri gabungan:

Saya melihat bantuan codex untuk ini, tetapi kueri berikut tidak berfungsi:

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

Apa yang saya lakukan salah dengan permintaan gabungan?

[UPDATE]: Jadi sekarang 3.1 telah dirilis, permintaan gabungan di atas masih tidak berfungsi. Saya mendapatkan hasil, hanya saja tidak diurutkan dengan benar.

[PEMBARUAN]: var_dump($wp_query->request)memberikan yang berikut:
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"

gillespieza
sumber
3
Apakah Anda menggunakan WordPress 3.1? The meta_queryparameter baru dalam 3.1, yang akan dirilis segera, tapi versi stabil saat ini adalah masih 3.0.5, tanpa parameter ini.
Jan Fabry
Er ... benar, mungkin itu sebabnya. Adakah cara untuk membuatnya bekerja di 3.0.5?
gillespieza
Miljenko memiliki jawaban terbaik yang harus Anda terima, bukan jawaban Anda.
Hugo

Jawaban:

9

Anda bisa menggunakan kueri untuk memfilter konten seperti yang Anda inginkan dengan menggunakan 'meta_query' dengan opsi pemfilteran, dan untuk bagian pesanan, cukup tambahkan / ubah parameter berikut:

  • 'orderby' => 'meta_value'
  • '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
        )
    );
Miljenko Barbir
sumber
2

Sama seperti yang dikatakan Jan di WordPress 3.1 baru yang dapat Anda gunakan meta_querytetapi sampai itu keluar, Anda dapat menggunakan kueri Pertama untuk mengatur dan memfilter di dalam lingkaran Anda seperti:

 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
} 

dan tambahkan kode ini ke functions.php Anda

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

sekarang ini seharusnya bekerja.

Bainternet
sumber
Terima kasih untuk ini. Ini berfungsi, kecuali saya memiliki efek samping yang aneh bahwa halaman saya tidak berfungsi dengan baik lagi. Alih-alih 9 per halaman, saya memiliki "tempat kosong" di kisi saya tempat pos kustom yang gateway_value == "Yes"seharusnya tanpa persyaratan ... Ada ide tentang cara memperbaikinya?
gillespieza
ya yang akan mengacaukan halaman jadi saya kira satu-satunya cara mengatasinya adalah permintaan sql kustom, beri saya beberapa menit.
Bainternet
Jangan khawatir - Saya hanya akan menggunakan kueri kedua dan menggunakan plugin wordpress.org/extend/plugins/post-types-order hingga 3.1 dirilis :)
gillespieza
dam, saya baru saja kembali untuk melihat komentar Anda setelah menemukan solusi. toh itu di sini untuk penanya di masa depan.
Bainternet
1
@ t31os - saya biasanya melakukannya tetapi tidak ketika menjawab dari ponsel saya.
Bainternet
1

Permintaan maaf untuk menjawab pertanyaan saya sendiri:

Melihat [http://core.trac.wordpress.org/ticket/15031[[1], sepertinya ini adalah masalah yang diketahui. Saya telah memperbaikinya (diretas?) Agar berfungsi menggunakan post_filter, seperti (hanya untuk referensi siapa pun yang mungkin mencari jawaban yang sama):

Di functions.php ###

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

Diubah wp_query dalam file templat ###

$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
    ));
gillespieza
sumber