你的功能不可靠,完全过火,而且非常昂贵。此外,正如@markkaplen所述,您没有呼叫the_post()
这导致$post
全局不更新到当前正在循环的帖子,因此get_post_meta()
将始终具有相同的值。
虽然$post_id
可能有用,这是一个在全球范围内设置的糟糕变量,实际上用于获取注释。最好使用get_the_ID()
甚至$post->ID
因为你在循环中。有关更多信息,请阅读this post
为了解决您的问题,我只需要创建一个带有自定义SQL查询的函数,以从特定的元键获取所有唯一值。这是我在另一个答案上使用的函数
/**
* Description: Getting all the values associated with a specific custom post meta key, across all posts
* Author: Chinmoy Paul
* Author URL: http://pwdtechnology.com
*
* @param string $key Post Meta Key.
*
* @param string $type Post Type. Default is post. You can pass custom post type here.
*
* @param string $status Post Status like Publish, draft, future etc. default is publish
*
* @return array
*/
function get_unique_post_meta_values( $key = \'\', $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;
}
然后,您可以按如下方式使用它来获取唯一元值的数组
$unique_values = get_unique_post_meta_values( \'json_id\' );
?><pre><?php var_dump( $unique_values ); ?></pre><?php
您还可以在函数中内置一些缓存/瞬态系统,以进一步优化它