ฉันมีปัญหาที่คล้ายกันเมื่อเร็ว ๆ นี้ฉันต้องการเมตาดาต้า 7 ประเภทจากประเภทโพสต์ที่กำหนดเอง แต่ยังต้องได้รับโพสต์ตามเมทาดาทาอีกด้วย
ดังนั้นฉันจึงสร้างคำสั่ง SQL ต่อไปนี้ฉันมักจะใช้มัน หวังว่ามันจะช่วยให้คนอื่น ฉันจะพยายามอธิบายให้ดีที่สุดเท่าที่จะทำได้
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 );
ก่อนอื่นฉันจะได้รับฟังก์ชั่นฐานข้อมูลเวิร์ดเพรสด้วย $ wpdb ทั่วโลก จากนั้นฉันตั้ง posttype ด้วย $ pt ในการรับโพสต์ที่ถูกต้องที่ตรงกับค่าเฉพาะใน post_meta ฉันตั้งค่า $ mk (meta_key)
จากนั้นฉันตั้งค่า $ mv (meta_value) var (ในกรณีนี้ค่าเมตาตรงกับ postid)
$ mk1- $ mk7 เป็น meta_keys ที่ฉันต้องการจากโพสต์แต่ละรายการ (ฉันจะคว้าค่าในคำสั่งเลือก)
ฉันยังสร้าง 'สั่งซื้อโดย' a var ด้วยการตั้งค่า $ ord
คำสั่ง select จะเป็นดังนี้: ฉันเลือกรหัสโพสต์และ post_title จาก POST หรือ 'p'
จากนั้นฉันเลือกเมทาดาทาทั้งหมดที่ฉันต้องเลือกด้วย pm1 -> pm.7 และคว้า meta_value และเปลี่ยนชื่อ (AS) เพื่อให้สามารถอ่านได้มากขึ้นเมื่อดึงข้อมูลจากวัตถุของฉัน
ฉันสร้าง LEFT JOIN สำหรับข้อมูลเมตาที่ฉันต้องการให้ตรงกับโพสต์ (PM)
ฉันสร้างการรวม 7 ซ้ายสำหรับข้อมูลเมตาแต่ละรายการที่ฉันต้องดึง (PM1-pm7)
คำสั่ง WHERE ขึ้นอยู่กับ LEFT JOIN แรก (PM) เพื่อที่จะรู้ว่าฉันต้องการเฉพาะโพสต์ที่เมตาดาต้าตรงกันเท่านั้น
ฉันยังเพิ่ม 'และ' สำหรับประเภทโพสต์และสำหรับ post_statuses ที่ไม่ใช่ฉบับร่าง (ดังนั้นโพสต์ที่เผยแพร่เท่านั้น)
ในที่สุดฉันก็เพิ่มประโยค 'สั่งซื้อโดย'
สิ่งนี้ใช้ได้อย่างรวดเร็วและมีดัชนีในตัวใน Wordpress ดังนั้นจึงดูเหมือนมีประสิทธิภาพ
ไม่รู้ว่ามีอะไรดีไปกว่านี้หรือไม่ แต่ถ้าเป็นฉันก็อยากจะใช้
หวังว่านี่จะช่วยได้
มาร์คัส
get_post_meta
บนแต่ละคีย์ 2) เรียกใช้get_post_custom
เพื่อรับฟิลด์โพสต์ที่กำหนดเองทั้งหมดในนัดเดียวหรือ 3) สร้างคิวรีของคุณเองโดยใช้คลาส $ wpdb (get_results()
) เพื่อสร้างออบเจ็กคืนของคุณเอง . (เอกสารคู่มือคลาส $ wpdb: codex.wordpress.org/Class_Reference/wpdb )