最近我遇到了一个类似的问题,我需要从自定义帖子类型中获取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 );
首先,我使用global$wpdb获取wordpress数据库函数。然后我将posttype设置为$pt。为了获得与post\\u meta中的特定值匹配的正确post,我设置了$mk(meta\\u键)
然后我设置$mv(meta\\u value)变量(在本例中,meta值与postid匹配)
$mk1-$mk7是我想从每篇文章中获得的meta\\u密钥。(我将获取select语句中的值)
我还通过设置$ord,将“order by”设置为var
select语句如下所示:我从post或“p.”中选择post ID和post\\u标题
然后我选择所有需要的元数据,用pm1选择它们。->pm。7获取meta\\u值并将其重命名(AS),以便在从我的对象检索数据时更具可读性。
我为需要匹配到帖子的元数据创建一个左连接。(pm)
我为需要检索的每个元数据创建了7个左连接。(pm1-pm7)
WHERE语句基于第一个左连接(pm),因此它将知道我只需要元数据匹配的帖子。
我还为post类型和非草稿的post\\u状态添加了“AND”。(所以只发布帖子)
最后,我添加了“order by”子句。
这项工作速度很快,并且使用Wordpress中的内置索引,因此看起来很有效。
不知道是否有比这更好的东西,但如果是,我很乐意使用它。
希望这有帮助。
马库斯