meta_query untuk kunci yang belum disetel

8

Saya mencoba untuk menanyakan jenis posting khusus untuk sistem galeri. Saya memiliki kotak centang untuk mengatur galeri sebagai galeri "unggulan" (disiapkan melalui plugin More Fields) - jika ini dicentang maka nilai meta menjadi 1 dan kemudian jika tidak dicentang menjadi 0. Semua baik. Namun jika kotak belum pernah dicentang maka kunci meta tidak pernah dibuat, artinya saya tidak dapat meminta TIDAK SEPERTI 1 karena tidak ada.

Kueri yang saya inginkan adalah mengeluarkan 4 galeri yang tidak ditandai sebagai '1' dalam nilai meta ini, tetapi juga yang tidak memiliki nilai ini sama sekali. Apakah ada cara untuk selalu memberikan posting yang baru ditambahkan nilai default untuk kunci meta ini (yaitu selalu membuatnya 0 secara default jika kotak dibiarkan tidak dicentang) atau apakah ada cara untuk meminta kunci untuk kunci yang belum ditetapkan?

Permintaan saya saat ini adalah:

$args = array(
                        'post_type' => 'gallery',
                        'showposts' => 4,
                        'meta_key' => 'gal-ID',
                        'order_by' => 'meta_value',
                        'order' => 'ASC',
                        'meta_query' => array( array(
                                            'key' => 'main-gal',
                                            'value' => false,
                                        ) ),
                        ) );

Dan saya sudah mencoba berbagai upaya dengan 'bandingkan' => 'TIDAK SUKA', '! =' Dll.

Ada ide? Tiket ini sepertinya menyiratkan sesuatu yang harus disortir:

http://core.trac.wordpress.org/ticket/18158

Terima kasih!

taman seni
sumber

Jawaban:

7

Fungsi besar itu agak menakutkan, saya dapat ini berfungsi seperti itu - dengan dua argumen (yang mengecualikan fitur)

$args = array(

    'meta_query' => array(
        'relation' => 'OR',
            array( // new and edited posts
                'key' => 'Set as Featured Post',
                'compare' => '!=',
                'value' => 1
            ),

            array( // get old posts w/out custom field
                'key' => 'Set as Featured Post',
                'value' => '1',
                'compare' => 'NOT EXISTS'
            ) 
        ),
    'posts_per_page' => 30

);
ArleyM
sumber
Array pertama saya mengganti yang kedua dengan solusi ini. Tampaknya Anda tidak dapat menggandakan bidang yang sama?
Allen Gingrich
3

Sesuai Parameter Bidang Khusus dalam Codex, NOT EXISTSperbandingan khusus tersedia sejak WP versi 3.5

Secara teknis ini menghasilkan sesuatu seperti mengikuti permintaan SQL dalam permintaan posting:

$posts = get_posts( array(
    'meta_query' => array(
        array(
            'key'     => 'wrong',
            'compare' => 'NOT EXISTS',
        ),
    ),
) );
SELECT *,wp_posts.ID
FROM wp_posts
LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'wrong')
WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') AND (wp_postmeta.post_id IS NULL)
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 5

Ini bekerja dengan bergabung dengan tabel meta pada kunci yang disediakan dan hanya memilih catatan di mana itu tidak menghasilkan data yang bermakna ( IS NULL). Jadi itu hanya berfungsi untuk kasus ketika kunci tidak ada sama sekali dan tidak akan bekerja untuk kunci yang ada dengan nilai-nilai palsu .

Jarang
sumber
Saya tertarik dengan NOT EXISTSperbandingan ini . Sebagai solusi untuk kunci meta yang tidak disetel, saya hanya menyimpan 0 pada save_posthook jika kunci meta tidak disetel. Bagaimana cara NOT EXISTSkerjanya? Apakah ini akan mengurutkan permintaan OP main-galdan kemudian mengisi 4 dengan posting yang tidak memiliki meta itu?
Helgatheviking
@helgatheviking Saya telah menguraikan mekanika sebagai jawaban
Rarst
2

Seperti yang ditunjukkan tiket, tiket tidak didukung .. sampai saat itu Anda harus mengandalkan solusi kustom.

Beberapa pengguna telah menanyakan hal ini sebelumnya, atau setidaknya bertanya bagaimana cara melakukannya di forum WordPress.org, jadi saya menulis fungsi untuk melakukan pekerjaan yang tidak pernah saya pegang (sudah lama berlalu), untungnya saya menemukan topik asli tempat saya memberikan tautan pastebin (yang seharusnya tidak kedaluwarsa).

http://pastebin.com/kgLt1RrG

Saya menulis itu 8 bulan yang lalu dan saya belum mengujinya (sejak itu), jadi beri tahu saya tentang masalah apa pun.

Semoga itu bisa membantu ..

t31os
sumber
Keren, terima kasih untuk ini - akan mengujinya nanti malam dan memberi tahu Anda apa yang terjadi.
artparks
1

Metode paling sederhana, meskipun bukan yang terbersih:

$args = array(
    'post_type' => 'gallery',
    'posts_per_page' => -1,
    'meta_key' => 'gal-ID',
    'order_by' => 'meta_value',
    'order' => 'ASC',
    'meta_key' => 'main-gal',
    ) );

Ini akan memberi Anda semua galeri Anda diurutkan berdasarkan kunci meta. Langkah selanjutnya adalah mencari tahu apakah galeri dengan nilai 1 datang setelah atau sebelum posting lainnya. Dengan cara ini Anda dapat:

  • Memproses item sampai Anda telah memproses 4 item galeri, atau mencapai pos dengan nilai meta 1
  • Lewati posting dengan nilai meta 1 lalu mulailah memproses ketika Anda mencapai nilai bukan-1 pertama

Metode lain yang tidak memerlukan pernyataan SQL khusus:

  • Melakukan kueri untuk menemukan galeri yang tidak Anda inginkan, menggunakannya untuk mengisi larik ID posting, kemudian melakukan kueri kedua, meneruskan larik itu sebagai entri untuk dikecualikan
  • Menggunakan taksonomi alih-alih bidang khusus (menyelesaikan ini dengan cukup baik dan menempatkan banyak perbaikan bagus lainnya secara gratis sehingga menghemat waktu Anda juga)
Tom J Nowell
sumber