将元密钥值存储为数组

时间:2019-11-11 作者:DevSem

如何获取_octopus_id 并将其存储为数组。

以下是我努力实现的目标:

呼叫WP_Query 把所有的办公室_octopus_id _octopus_id 并将其存储在一个数组中最终目标:只需使用_octopus_id 有人能告诉我我可能做错了什么吗?这个is_array($posts) 打印出true,但我就是不知道如何在那里存储键值。

完整代码:

    /* Set the WP offices in an array */
    $ids = new WP_Query([
        \'post_type\' => \'office\',
        \'post_status\' => \'any\',
        \'posts_per_page\' => 10,
        \'meta_query\'     => array(
            array(
                \'key\'        => \'_octopus_id\',
            ),
        )
    ]);

    $posts[] = $ids->posts;

    var_dump($posts);
    var_dump(is_array($posts));

1 个回复
最合适的回答,由SO网友:kero 整理而成

我不认为WP_Query 也为您返回元字段。所以你需要在帖子上循环并运行get_post_meta() 手动。假设一个office 最多有一个_octopus_id, 你可以这样写:

// here we will store the ids
$octopiIds = [];

$query = new WP_Query([
    \'post_type\' => \'office\',
    \'post_status\' => \'any\',
    \'posts_per_page\' => 10,
    \'meta_query\'     => [
        [
            \'key\'        => \'_octopus_id\',
        ],
    ]
]);
while ($query->have_posts()) {
    $query->the_post();
    $octopiIds[] = get_post_meta(get_the_ID(), \'_octopus_id\', true);
}
wp_reset_postdata();
你真的需要分页吗WP_Query? 如果没有,我建议您通过$wpdbsget_col(), 因为它可以为您节省大量查询。上述代码将创建至少11个查询(1个用于WP_Query, 每个帖子1个,以获得元数据),但您只能在一个帖子中完成此操作。

(未经测试)

global $wpdb;
$octopiIds = $wpdb->get_cols(
    $wpdb->query("
        SELECT DISTINCT pm.meta_value
        FROM {$wpdb->posts} AS p
        INNER JOIN {$wpdb->postmeta} AS pm
            ON p.ID = pm.post_id AND pm.meta_key = \'_octopus_id\'
        WHERE pm.meta_value != \'\' AND pm.meta_value IS NOT NULL
    ")
);
另外,如果您在这里存储octopi和办公室之间的某种关系,请考虑使用分类法,而不是Posteta,因为这将大大加快速度。