Saya memiliki masalah yang sama baru-baru ini, saya perlu mendapatkan 7 lembar metadata dari jenis pos kustom, tetapi juga perlu mendapatkan pos berdasarkan sepotong metadata.
Jadi saya membuat pernyataan SQL berikut, saya sering menggunakannya. Semoga ini bisa membantu orang lain. Saya akan mencoba menjelaskannya semampu saya.
global $wpdb;
$pt = 'clients';
$mk = 'trainerid';
$mv = $pid;
$mk1 = 'email';
$mk2 = 'phone';
$mk3 = 'gender';
$mk4 = 'dob';
$mk5 = 'photo';
$mk6 = 'registrationts';
$mk7 = 'activationts';
$ord = 'p.post_name ASC';
$sql = "
SELECT p.ID, p.post_title AS fullname, pm1.meta_value AS email, pm2.meta_value AS phone, pm3.meta_value AS gender, pm4.meta_value AS dob, pm5.meta_value AS photo, pm6.meta_value AS regts, pm7.meta_value AS actemailts
FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->postmeta} pm ON pm.post_id = p.ID
AND pm.meta_key = '{$mk}'
LEFT JOIN {$wpdb->postmeta} pm1 ON pm1.post_id = p.ID
AND pm1.meta_key = '{$mk1}'
LEFT JOIN {$wpdb->postmeta} pm2 ON pm2.post_id = p.ID
AND pm2.meta_key = '{$mk2}'
LEFT JOIN {$wpdb->postmeta} pm3 ON pm3.post_id = p.ID
AND pm3.meta_key = '{$mk3}'
LEFT JOIN {$wpdb->postmeta} pm4 ON pm4.post_id = p.ID
AND pm4.meta_key = '{$mk4}'
LEFT JOIN {$wpdb->postmeta} pm5 ON pm5.post_id = p.ID
AND pm5.meta_key = '{$mk5}'
LEFT JOIN {$wpdb->postmeta} pm6 ON pm6.post_id = p.ID
AND pm6.meta_key = '{$mk6}'
LEFT JOIN {$wpdb->postmeta} pm7 ON pm7.post_id = p.ID
AND pm7.meta_key = '{$mk7}'
WHERE pm.meta_value = '{$mv}'
AND p.post_type = '{$pt}'
AND p.post_status NOT IN ('draft','auto-draft')
ORDER BY {$ord}
";
$clients = $wpdb->get_results( $wpdb->prepare( $sql ), OBJECT );
Pertama saya mendapatkan fungsi database wordpress dengan global $ wpdb. Lalu saya mengatur posttype dengan $ pt. Untuk mendapatkan postingan yang benar yang cocok dengan nilai spesifik di post_meta, saya menetapkan $ mk (meta_key)
Lalu saya atur $ mv (meta_value) var. (dalam hal ini nilai meta cocok dengan postid)
$ mk1- $ mk7 adalah meta_keys yang saya inginkan dari setiap posting. (Saya akan mengambil nilai dalam pernyataan pilih)
Saya juga membuat 'order by' var, dengan menetapkan $ ord
Pernyataan pilih berjalan sebagai berikut: Saya memilih ID posting dan post_title dari POST atau 'hal.'
Kemudian saya memilih semua metadata yang saya perlu memilihnya dengan pm1. -> pm.7 dan meraih meta_value dan menamainya kembali (AS) sehingga lebih mudah dibaca ketika mengambil data dari objek saya.
Saya membuat BERGABUNG KIRI untuk meta data yang saya butuhkan untuk mencocokkan dengan posting. (sore)
Saya membuat 7 gabungan kiri untuk masing-masing meta data yang perlu saya ambil. (pm1-pm7)
Pernyataan WHERE didasarkan pada LEFT JOIN (pm) pertama sehingga saya akan tahu bahwa saya hanya perlu posting di mana metadata cocok.
Saya juga menambahkan 'DAN' untuk jenis posting, dan untuk post_status yang bukan konsep. (jadi hanya posting yang dipublikasikan)
Akhirnya saya menambahkan klausa 'pesanan oleh'.
Ini berfungsi cepat dan dengan indeks bawaan di Wordpress, sehingga tampaknya efisien.
Tidak tahu apakah ada sesuatu yang lebih baik dari ini, tetapi jika ya, saya ingin menggunakannya.
Semoga ini membantu.
Marcus
get_post_meta
pada kunci individual, 2) menjalankanget_post_custom
untuk mendapatkan semua bidang kustom posting dalam satu kesempatan, atau 3) membuat kueri Anda sendiri menggunakan $ wpdb class (get_results()
) untuk membangun objek kembali Anda sendiri . ($ wpdb dokumentasi kelas: codex.wordpress.org/Class_Reference/wpdb )