如何查询保存在数组中的项?

时间:2011-10-19 作者:Jenny

我知道如何为WP\\u Query编写查询参数,如果它是单个键:例如,如果Query使用“type”元键发布--

$query_args[\'type\'] = (array)$type;
现在,问题是--我要查询的项目保存在一个数组中,这个数组保存为postETA。这是我的阵列:

$details = array(
\'user_id\' => 0,
\'type\'   => \'\',
\'amount\' => 0,
);
我在wordpress Posteta中保存了此数组:

update_post_meta($post_id, \'details\', $details );
现在我想查询具有相同“type”元键的帖子。怎样

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

Jenny,首先,我想你最好使用Taxonomy Parameters 在您的查询中。然而,在某种程度上,有几种黑客方法可以实现您的愿望。

$my_query = new WP_Query( \'post_type=post&posts_per_page=-1\' );

$posts = $my_query->get_posts();
foreach ( $posts as &$post ) {
    // Get the details and unset if thy type is unwanted
    $details = get_post_meta( $post->ID, \'details\', true );
    if ( isset($details[\'type\'])
        and $details[\'type\'] != \'my_type \')
            unset( $post );
}
这将筛选出与type 属于my_type 在您的details 该职位的meta。

但是,请注意性能问题-get_post_meta 为每个帖子调用,从而查询数据库。哎哟

有一种更复杂的方法可以使用自定义查询一次获取所有元,如下所示:

$sql = "SELECT `post_id`, `meta_value`".
    " FROM {$wpdb->postmeta}".
    " WHERE `meta_key` = \'details\'";

// Gather my meta
$metas = $wpdb->get_results( $sql );
$details = array();
foreach  ( $metas as $meta ) $details[$meta->post_id] = unserialize($meta->meta_value);

$my_query = new WP_Query( \'post_type=post&posts_per_page=-1\' );
$posts = $my_query->get_posts();

foreach ( $posts as &$post ) {
    // Filter the unwanted posts
    if ( isset($details[$post->ID][\'type\'])
        and $details[$post->ID][\'type\'] != \'my_type\' )
            unset( $post );
}
这样,您只需执行一个额外的查询,即在开始时引入meta。这里需要注意以下几点:

基本原则就在那里-获取所有帖子,并通过unsetting

  • $wpdb`应该在范围内(如果您在函数或方法中,请将其作为全局函数引入)
  • 如果您要使用" WHERE meta_key = \'details\'"; 请确保对输入到查询中的内容进行转义,否则会有SQL注入的风险,请将这些内容封装到函数中,以便重用它们。如果查询中有很多帖子,这可能会变得很慢

  • SO网友:Milo

    这是不可能的,您必须将数组的每个元素保存为单独的元字段。就MySQL而言,您的字段只是一个文本字符串,它无法解析PHP数组。

    结束

    相关推荐

    使用新的WP-Query()从循环中过滤后期格式;

    嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post