Gần đây tôi có một vấn đề tương tự, tôi cần lấy 7 mẩu siêu dữ liệu từ một loại bài đăng tùy chỉnh, nhưng cũng cần để có được bài đăng dựa trên một mẩu siêu dữ liệu.
Vì vậy, tôi đã tạo ra câu lệnh SQL sau đây, tôi sử dụng nó thường xuyên. Hy vọng nó sẽ giúp được người khác. Tôi sẽ cố gắng giải thích nó tốt nhất có thể.
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 );
Đầu tiên tôi nhận các hàm cơ sở dữ liệu wordpress với toàn cầu $ wpdb. Sau đó, tôi đặt posttype với $ pt. Để có được bài đăng chính xác phù hợp với một giá trị cụ thể trong post_meta, tôi đặt $ mk (meta_key)
Sau đó, tôi đặt var $ mv (meta_value). (trong trường hợp này giá trị meta khớp với một postid)
$ mk1- $ mk7 là meta_key tôi muốn từ mỗi bài đăng. (Tôi sẽ lấy các giá trị trong câu lệnh chọn)
Tôi cũng thực hiện 'order by' một var, bằng cách đặt $ ord
Câu lệnh select diễn ra như sau: Tôi chọn ID bài đăng và post_title từ POST hoặc 'p.'
Sau đó, tôi chọn tất cả các siêu dữ liệu tôi cần chọn chúng với pm1. -> pm.7 và lấy meta_value và đổi tên chúng (AS) để dễ đọc hơn khi lấy dữ liệu từ đối tượng của tôi.
Tôi tạo một THAM GIA TRÁI PHIẾU cho dữ liệu meta tôi cần để khớp với bài viết. (PM)
Tôi tạo 7 liên kết trái cho mỗi dữ liệu meta tôi cần truy xuất. (pm1-pm7)
Câu lệnh WHERE dựa trên LEFT THAM GIA đầu tiên (chiều) để nó sẽ biết tôi chỉ cần các bài đăng có siêu dữ liệu khớp.
Tôi cũng thêm một 'VÀ' cho loại bài đăng và cho các post_statuses không phải là bản nháp. (vì vậy chỉ có bài viết được xuất bản)
Cuối cùng tôi thêm mệnh đề 'order by'.
Điều này hoạt động nhanh và với các chỉ mục tích hợp trong Wordpress, vì vậy nó có vẻ hiệu quả.
Không biết có thứ gì tốt hơn cái này không, nhưng nếu có, tôi rất thích sử dụng nó.
Hi vọng điêu nay co ich.
Marcus
get_post_meta
trên các khóa riêng lẻ, 2) chạyget_post_custom
để nhận tất cả các trường tùy chỉnh bài đăng trong một lần chụp hoặc 3) tạo truy vấn của riêng bạn bằng cách sử dụng lớp $ wpdb (get_results()
) để xây dựng đối tượng trả về của riêng bạn . (tài liệu lớp $ wpdb: codex.wordpress.org/Class_Reference/wpdb )