获取所有帖子中的元密钥数组

时间:2015-10-01 作者:Bram_Boterham

我的帖子包含一个保存外部id的元字段。我正在尝试创建一个带有循环的函数,该循环遍历所有帖子,并将所有元键放入一个数组中,然后返回这个数组。

这是我想到的,但似乎我遗漏了什么。有人有线索吗?

function gather_ids ()
{

    $args = array(
            \'post_type\' => \'post\',
    );
        $posts = new WP_Query( $args );

        // The Loop
        if ( $posts->have_posts() ) {

            while ( $posts->have_posts() ) {
                $temp[] = get_post_meta($post_id, \'json_id\');
            }
            return $temp;
        } else {
        // no posts found
        echo "no posts found to delete";
        }
    /* Restore original Post Data */
    wp_reset_postdata();
}

3 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

你的功能不可靠,完全过火,而且非常昂贵。此外,正如@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  
您还可以在函数中内置一些缓存/瞬态系统,以进一步优化它

SO网友:Mitul

请传递第三个参数true。

喜欢

get_post_meta($post_id, \'json_id\', true);

SO网友:Mark Kaplun

您没有设置$post_id 对任何事情。你可能需要打电话the_post() 在循环中使用$post 全局访问id。