Son zamanlarda benzer bir sorun yaşadım, özel bir yazı türünden 7 parça meta veri almam gerekiyordu, ancak bir meta veri parçasını temel alarak yazıyı da almam gerekiyordu.
Bu yüzden aşağıdaki SQL deyimini oluşturdum, sık kullanıyorum. Umarım başka birine yardım eder. Bunu elimden geldiğince açıklamaya çalışacağım.
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 );
İlk önce wordpress veritabanı fonksiyonlarını global $ wpdb ile alıyorum. Sonra posttipi $ pt ile ayarlıyorum. Post_meta'da belirli bir değerle eşleşen doğru gönderiyi almak için, $ mk (meta_key) değerini ayarladım.
Sonra $ mv (meta_value) var değerini ayarladım. (bu durumda meta değeri bir postid ile eşleşir)
$ mk1- $ mk7, her yazıdan istediğim meta_keylerdir. (Select deyimindeki değerleri alacağım)
Ayrıca $ ord ayarlayarak 'order' a var var
Select deyimi şu şekilde gider: POST veya 'p' arasından yazı kimliğini ve yazı_yazısını seçiyorum.
Ardından, pm1 ile seçmem gereken tüm meta verileri seçiyorum. -> pm.7 ve meta_value değerini alıp isimlendirmek (AS), böylece nesnemden veri alınırken daha okunabilir.
Gönderi ile eşleştirmem gereken meta veriler için bir LEFT JOIN yaratıyorum. (Pm)
Almam gereken her meta veri için 7 tane solaryum oluşturdum. (PM1-PM7)
WHERE ifadesi, ilk LEFT JOIN (pm) 'e dayanmaktadır, böylece yalnızca meta verinin eşleştiği noktalara ihtiyacım olduğunu bilecektir.
Ayrıca yazı tipi ve taslak olmayan post_status için 'VE' eklerim. (bu yüzden yalnızca yayınlanmış yayınlar)
Sonunda 'by by' cümlesini ekliyorum.
Bu hızlı ve Wordpress'teki yerleşik indekslerle çalışır, bu yüzden verimli görünüyor.
Bundan daha iyi bir şey olup olmadığını bilmiyorum, ama öyleyse, onu kullanmayı çok isterim.
Bu yardımcı olur umarım.
Marcus
get_post_meta
tek tek tuşlar üzerinde koşmak , 2)get_post_custom
tüm gönderilerin özel alanları tek seferde almak için koşmak veya 3) $ wpdb sınıfını (get_results()
) kullanarak kendi dönüş nesnenizi oluşturmak için kendi sorgunuzu oluşturmak . ($ wpdb sınıfı dokümantasyon: codex.wordpress.org/Class_Reference/wpdb )