获取元键的所有唯一后Meta值

时间:2015-09-22 19:42:44

标签: php mysql wordpress

我需要检索特定元键的一组唯一元值。我找到了Paul Chimoy的一个功能,它几乎可以满足我的要求。我只需要1)。具有二级资格的版本,以及2)。具有二级和三级资格的版本,以便输出我需要的内容。

该函数输出meta_key'树的所有元值。和'州'但我需要能够输出,1)。 meta_key'树的所有唯一元值。 meta_key' where'等于加利福尼亚'和2)。 meta_key'树的所有唯一值meta_key' where'等于加利福尼亚'和meta_key'国家'等于'美国'。

Trees
meta_key = trees
meta_value = pine, oak, sequoia

States
meta_key = states
meta_value = california, washington, florida

Countries
meta_key = countries
meta_value = usa, uk, ireland

没有成功,我调整了功能以包括:

AND (pm.meta_key = 'states' AND pm.meta_value = 'california')

这是原始功能,没有我的额外资格:

 function get_unique_post_meta_values( $key = 'trees', $type = 'post', $status = 'publish' ) {
    global $wpdb;
    if( empty( $key ) )
        return;
    $res = $wpdb->get_col( $wpdb->prepare( "
SELECT DISTINCT pm.meta_value FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = '%s'
AND p.post_status = '%s'
AND p.post_type = '%s'
", $key, $status, $type ) );
    return $res;
}

我的有限知识不允许我根据自己的需要适当调整功能。我感谢为实现目标而提供的任何帮助。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我知道这已经过时了,你可能不再寻找了,但如果其他人需要这个,那么这就是需要做的事情。

现在你的select语句是:

SELECT DISTINCT pm.meta_value FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = '%s'
AND p.post_status = '%s'
AND p.post_type = '%s'

这将基于一个键选择元值。

相反,您希望基于一个键获取另一个键的唯一元值。

要执行此操作,您需要选择帖子,然后根据您所需的键选择其他不同的元数据值。这意味着您需要嵌套SQL,并获取您的帖子ID。

SELECT DISTINCT pm.meta_value FROM {$wpdb->postmeta} pm WHERE pm.post_id IN 
(SELECT pm.post_id FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = '%s'
AND pm.meta_value = '%s'
AND p.post_status = '%s'
AND p.post_type = '%s') 
AND pm.meta_key = '%s'

您的包装语句应如下所示:

$res = $wpdb->get_col( $wpdb->prepare($sql, $searchkey, $searchvalue, $poststatus, $posttype, $findkey ) );

假设您输入上面的SQL,树,松树,发布,发布,状态 - 您应该检索松树生长的状态列表。

希望这有助于任何偶然发现此事的人!