WP_QUERY检查自定义字段数组中是否存在整数

时间:2015-03-06 作者:Joe

我用的是wp_query 在自定义字段中查找具有指定数值的自定义帖子。该自定义字段的值是一个数字数组(使用高级自定义字段的关系字段的选定帖子的ID)。

因此,我试图在该字段的数组中找到所有具有指定值的帖子。

这是我的代码:

foreach ($selectedAuthors as $myAuthor){
    $args = array(
        \'posts_per_page\' => -1,
        \'post_type\' => \'resource\',
        \'resource_types\' => \'ml-special-reports\',
        \'meta_query\' => array (
            \'key\' => \'qd_resource_author_selector\',
            \'value\' => $myAuthor,
        ),
        \'orderby\' => \'title\',
        \'order\' => \'ASC\'
    );
    $query = new WP_Query( $args );
    if ( $query->have_posts() ) { 
        echo \'<h3>\'.get_the_title($myAuthor).\'</h3>\';
        while ( $query->have_posts() ) :
            $query->the_post();
            echo \'<h3>\'.get_the_title().\'</h3>\';
        endwhile;
        wp_reset_postdata();
    }
}
如果我var_dump() $selectedAuthors 我得到:

array(3) { [0]=> int(214) [1]=> int(216) [2]=> int(211) }
每次运行while($query->have_posts()) 返回该类型的每个帖子resource 使用resource_types 分类术语ml-special-reports 无论是否$myAuthor 存在于中qd_resource_author_selector 自定义字段的数组。

有没有想过我做错了什么?

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

我使用Pieter Goosen的一些代码解决了这个问题,并仔细查看了SQL中字段的值。它以一种奇怪的方式保存信息,要求我用引号将值括起来,以返回正确的帖子。

以下是工作代码:

foreach ($selectedAuthors as $myAuthor){
    echo \'<hr /><p>my author = \'.$myAuthor.\'</p>\';  
    $args = array(
        \'posts_per_page\' => -1,
        \'post_type\' => \'resource\',
        \'tax_query\' => array(
            array(
                \'taxonomy\' => \'resource_types\',
                \'field\'    => \'slug\',
                \'terms\'    => \'ml-special-reports\',
            ),
        ),
        \'meta_query\' => array (
            array(
                \'key\' => \'qd_resource_author_selector\',
                \'value\' => \'"\'.$myAuthor.\'"\',
                \'compare\' => \'LIKE\',                       
            ),
        ),
        \'orderby\' => \'title\',
        \'order\' => \'ASC\'
        );
    $query = new WP_Query( $args );
    if ( $query->have_posts() ) { 
        echo \'<h3>\'.get_the_title($myAuthor).\'</h3>\';
        while ( $query->have_posts() ) {
            $query->the_post();
            echo \'<h3>\'.get_the_title().\'</h3>\';
        }
        wp_reset_postdata();
    }
}
因此,在这一行中,我不得不强制使用引号:

\'value\' => \'"\'.$myAuthor.\'"\',
现在,它返回作者的姓名,然后返回每个帖子的名称,以及它们所分配到的正确分类术语。

SO网友:Pieter Goosen

首先,你的meta_query 是错误的。它应该是一个数组中的一个数组,而不仅仅是一个数组

因此,以下内容

\'meta_query\' => array (
    \'key\' => \'qd_resource_author_selector\',
    \'value\' => $myAuthor,
),
成为

\'meta_query\' => array (
    array(
        \'key\' => \'qd_resource_author_selector\',
        \'value\' => $myAuthor,
    ),
),
其次,可以优化查询。您正在对每个值运行查询。如果您有100个值,那么将运行100个查询,这很昂贵

您可以通过在数组中添加值并将数组直接传递给meta_query

只是一些其他问题tax_query. 您正在使用的语法已贬值

您的第一个实例get_the_title() 在环路外看起来不合适。不知道你在那里做什么

不要混淆语法,这很容易混淆,而且很难在出现故障时进行调试。为您的if 声明您正在使用卷曲(我更喜欢卷曲,因为基本上所有编辑器都支持它们,很容易调试),并且while 您使用的声明:endwhile. 我建议你用卷发,以后继续用

综上所述,您可以不用foreach

$myAuthor = array(\'value1\', \'value2\', \'value3\');
$args = array(
    \'posts_per_page\' => -1,
    \'post_type\' => \'resource\',
    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'resource_types\',
            \'field\'    => \'slug\',
            \'terms\'    => \'ml-special-reports\',
        ),
    ),
    \'meta_query\' => array (
        array(
            \'key\'       => \'qd_resource_author_selector\',
            \'value\'     => $myAuthor,
            \'compare\'   => \'IN\',
        ),
    ),
    \'orderby\' => \'title\',
    \'order\' => \'ASC\'
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) { 
    while ( $query->have_posts() ) {
        $query->the_post();
        echo \'<h3>\'.get_the_title().\'</h3>\';
    }
    wp_reset_postdata();
}

结束

相关推荐

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

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