Saya sedang mengerjakan proyek tempat saya membuat jenis posting khusus dan data khusus yang dimasukkan melalui kotak meta yang terkait dengan jenis posting kustom saya. Untuk alasan apa pun saya memutuskan untuk memberi kode pada kotak meta sedemikian rupa sehingga input di setiap kotak metabox adalah bagian dari array. Misalnya, saya menyimpan garis bujur dan lintang:
<p>
<label for="latitude">Latitude:</label><br />
<input type="text" id="latitude" name="coordinates[latitude]" class="full-width" value="" />
</p>
<p>
<label for="longitude">Longitude:</label><br />
<input type="text" id="longitude" name="coordinates[longitude]" class="full-width" value="" />
</p>
Untuk alasan apa pun, saya menyukai gagasan memiliki entri postmeta tunggal untuk setiap metabox. Di save_post
hook, saya menyimpan data seperti ini:
update_post_meta($post_id, '_coordinates', $_POST['coordinates']);
Saya melakukan ini karena saya memiliki tiga metabox dan saya suka hanya memiliki 3 nilai postmeta untuk setiap posting; Namun, saya sekarang menyadari masalah potensial dengan ini. Saya mungkin ingin menggunakan WP_Query hanya untuk menarik posting tertentu berdasarkan nilai-nilai meta ini. Misalnya, saya mungkin ingin mendapatkan semua posting yang memiliki nilai garis lintang di atas 50. Jika saya memiliki data ini di database secara individual, mungkin menggunakan kunci latitude
, saya akan melakukan sesuatu seperti:
$args = array(
'post_type' => 'my-post-type',
'meta_query' => array(
array(
'key' => 'latitude',
'value' => '50',
'compare' => '>'
)
)
);
$query = new WP_Query( $args );
Karena saya memiliki garis lintang sebagai bagian dari _coordinates
postmeta, ini tidak akan berhasil.
Jadi, pertanyaan saya adalah, apakah ada cara untuk memanfaatkan meta_query
untuk meminta array serial seperti yang saya miliki dalam skenario ini?
sumber
Saya juga mengalami situasi ini. Inilah yang saya lakukan:
Semoga bantuan ini
sumber
$value
ID juga. Dalam hal ini, saya sarankan untuk membuat fungsi untuk menambahkan karakter ke setiap elemen array sebelum menyimpan data dan fungsi lain untuk menghapus karakter sebelum menggunakan data. Ini wat,i:2
indeks serial tidak akan bingung dengani:D2
data "nyata". Parameter meta query seharusnya menjadi'value' => sprintf(':"D%s";', $value),
dan Anda akan menjaga fungsionalitas yang benar dari jawaban yang luar biasa ini!LIKE
adalah cara yang bagus dan cepat untuk menjatuhkan server Anda (belum lagi positif palsu) Anda sebaiknya memiliki caching yang sangat baik.Anda benar-benar akan kehilangan kemampuan untuk meng-query data Anda dengan cara yang efisien ketika membuat serial entri ke dalam database WP.
Penghematan dan perolehan kinerja secara keseluruhan yang Anda pikir Anda capai dengan serialisasi tidak akan terlihat sampai batas tertentu. Anda mungkin mendapatkan ukuran basis data yang sedikit lebih kecil tetapi biaya transaksi SQL akan menjadi berat jika Anda pernah meminta bidang-bidang itu dan mencoba membandingkannya dengan cara yang bermanfaat dan bermakna.
Alih-alih, simpan serialisasi untuk data yang tidak ingin Anda tanyakan di alam itu, tetapi sebaliknya hanya akan mengakses secara pasif oleh panggilan API WP langsung
get_post_meta()
- dari fungsi itu Anda dapat membongkar entri serial untuk mengakses properti arraynya juga.Bahkan diberi nilai true seperti pada;
$meta = get_post_meta( $post->ID, 'key', true );
Akan mengembalikan data sebagai array, dapat diakses bagi Anda untuk beralih seperti biasa.
Anda dapat fokus pada optimasi database / situs lain seperti caching, CSS dan JS minification dan menggunakan layanan seperti CDN jika Anda memerlukannya. Untuk beberapa nama .... WordPress Codex adalah titik awal yang baik untuk mengungkap lebih banyak tentang topik itu: DI SINI
sumber
Saya baru saja berurusan dengan bidang serial dan bisa menanyakannya. Tidak menggunakan meta_query tetapi menggunakan kueri SQL.
Permintaan pertama mencari posting dengan post_type yang cocok sehingga jumlah catatan wp_postmeta akan lebih sedikit untuk difilter. Lalu saya telah menambahkan pernyataan di mana untuk mengurangi baris lebih lanjut dengan memfilter
meta_key
ID berakhir dengan baik dalam array yang diperlukan untuk get_posts.
PS. MySQL v5.6 atau lebih tinggi diperlukan untuk kinerja subquery yang bagus
sumber
Contoh ini sangat membantu saya. Ini khusus untuk plugin S2Members (yang membuat serial pengguna metadata). Tapi itu memungkinkan Anda untuk meminta sebagian dari array serial dalam meta_key.
Ia bekerja dengan menggunakan fungsi MySQL REGEXP.
Ini sumbernya
Berikut adalah kode yang menanyakan semua pengguna yang tinggal di AS. Saya dengan mudah memodifikasinya untuk meminta salah satu bidang pendaftaran kustom saya dan membuatnya berfungsi dalam waktu singkat.
sumber
Saya pikir ada 2 solusi yang dapat mencoba memecahkan masalah hasil yang disimpan sebagai String dan Integer. Namun, penting untuk mengatakan, seperti yang ditunjukkan oleh orang lain, bahwa tidak mungkin untuk menjamin integritas hasil yang disimpan sebagai Integer, karena nilai-nilai ini disimpan sebagai array serial, indeks dan nilai disimpan persis dengan pola yang sama. Contoh:
disimpan sebagai array serial, seperti ini
Catat
i:0
sebagai posisi pertama array dani:37
sebagai nilai pertama. Polanya sama. Tapi mari kita pergi ke solusinya1) Solusi REGEXP
Solusi ini berfungsi untuk saya terlepas dari nilai meta yang disimpan sebagai string atau angka / id. Namun ia menggunakan
REGEXP
, yang tidak secepat menggunakanLIKE
2) SEPERTI Solusi
Saya tidak yakin tentang perbedaan kinerja tetapi ini adalah solusi yang menggunakan
LIKE
dan juga berfungsi untuk angka dan stringsumber
REGEXP
bagus dalam situasi tertentu, tetapi jika Anda dapat menggunakanLIKE
, saya pikir itu metode yang lebih disukai. Tautan lama, tetapi masih cukup berguna, menurut saya: thingsilearn.wordpress.com/2008/02/28/… :-)LIKE
lebih cepat. Tetapi ini adalah solusi yang bekerja untuk string dan angkaLIKE
tetapi berfungsi untuk angka dan string. Saya tidak yakin tentang kinerjanya karena harus membandingkan hasil menggunakanOR
Setelah membaca banyak tips untuk menjalankan
WP_Query
pemfilteran dengan array berseri, inilah cara saya akhirnya melakukannya: dengan membuat array nilai yang dipisahkan koma menggunakan implode bersama dengan$wpdb
kueri SQL kustom yang digunakanFIND_IN_SET
untuk mencari daftar yang dipisahkan koma untuk nilai yang diminta.(ini mirip dengan jawaban Tomas, tetapi kinerjanya sedikit kurang intensif untuk query SQL)
1. Dalam functions.php:
Di file functions.php Anda (atau di mana pun Anda menyiapkan kotak meta) dalam penggunaan
yourname_save_post()
fungsiuntuk membuat array yang berisi nilai yang dipisahkan koma.
Anda juga ingin mengubah variabel output Anda di
yourname_post_meta()
fungsi konstruksi kotak meta admin menjadi2. Dalam file PHP templat:
Tes: jika Anda menjalankan,
get_post_meta( $id );
Anda akan melihatcheckboxArray
sebagai array yang berisi nilai yang dipisahkan koma, bukan array serial.Sekarang, kami membangun kueri SQL khusus kami menggunakan
$wpdb
.Perhatikan
FIND_IN_SET
, di situlah keajaiban terjadi.Sekarang ... karena saya menggunakan
SELECT *
ini mengembalikan semua data posting dan di dalamforeach
Anda dapat menggemakan apa yang Anda inginkan dari itu (lakukanprint_r($posts);
jika Anda tidak tahu apa yang termasuk. Itu tidak mengatur "loop" untuk Anda (saya lebih suka seperti ini), tetapi dapat dengan mudah dimodifikasi untuk mengatur loop jika Anda mau (lihat disetup_postdata($post);
dalam codex, Anda mungkin perlu mengubahSELECT *
untuk memilih hanya memposting ID dan$wpdb->get_results
ke$wpdb
jenis yang benar - - melihat naskah kuno untuk$wpdb
juga untuk informasi tentang itu subjek).Whelp, butuh sedikit usaha, tetapi karena
wp_query
tidak mendukung melakukan nilai'compare' => 'IN'
serial atau koma dipisahkan shim ini adalah pilihan terbaik Anda!Semoga ini bisa membantu seseorang.
sumber
Jika Anda menggunakan
like
operator pembanding dalam kueri meta Anda, itu akan berfungsi dengan baik untuk melihat ke dalam array serial.menghasilkan:
sumber
Jika data meta saya adalah tipe array, saya menggunakan metode ini untuk kueri dengan meta:
sumber
Saya jadi penasaran dengan jawaban di atas, di mana yang menjadi
meta_query
sasaran kuncilatitude
alih - alih_coordinates
. Harus pergi dan menguji apakah benar-benar mungkin dalam meta queries untuk menargetkan kunci tertentu di dalam array serial. :)Jelas bukan itu masalahnya.
Jadi, perhatikan bahwa kunci yang tepat untuk menargetkan
_coordinates
bukanlatitude
.CATATAN:
Pendekatan ini hanya memungkinkan untuk menargetkan pencocokan tepat. Jadi hal-hal seperti semua garis lintang lebih besar dari 50 tidak mungkin.
Untuk memasukkan kecocokan substring, seseorang dapat menggunakan
'value' => sprintf(':"%%%s%%";', $value),
. (belum diuji)sumber
Saya punya pertanyaan yang sama. Mungkin Anda membutuhkan parameter 'type'? Lihat pertanyaan terkait ini: Kueri Bidang Kustom - Nilai Meta adalah Array
Mungkin mencoba:
sumber
Saya mengalami sesuatu yang serupa saat menggunakan plugin Magic Fields. Ini mungkin berhasil
sumber
serialize()
tidak diperlukan dalam hal ini ...