按 metabox 值自定义 post 类型查询

Custom post type query by metabox value

我已经为“投资组合”创建了一个自定义 post 类型,其中包含一个带有许多额外字段的自定义元框,其中之一是一个复选框,我用它来确定是否 post type 包含一个案例研究,但我遇到了一个障碍,我看不出哪里出了问题。复选框的输出是 'yes' 或 ''.

我的 metabox 构建中的设置是:

<input type="checkbox" name="rccustom_fields[case_study]" value="yes" <?php if ( isset($meta['case_study']) && $meta['case_study'] === 'yes' ) echo 'checked'; ?>>

而且我可以通过输出看到值按预期存在:

$meta = get_post_meta( $post->ID, 'rccustom_fields', true );
 print_r($meta);

但是,当我提取带有 args 的基本 WP 查询以过滤这些结果时:

$args = array(
'numberposts'   => -1,
'post_type'     => 'portfolio',
'meta_key'      => 'case_study',
'meta_value'    => 'yes',

我没有得到任何返回,即使执行 print_r 显示元值确实存在并且等于 'yes'。 (如果我注释掉 meta_key/meta_value 行,自定义 post 类型的所有 post 都会显示)

有人看到我没看到的东西吗?

试试下面的代码,可能对你有帮助。

$args_portfolio = array (
    'post_type' => 'portfolio',
    'posts_per_page' => -1,
    'post_status' => 'publish',
    'meta_query' => array(
        array(
            'key' => 'case_study',
            'value' => 'yes',
            'compare' => '=',
        ),
    ),
);

$data_portfolio = new WP_Query( $args_portfolio );

万一它对任何人有帮助...我无法找到一种优雅的方式将这个额外的过滤器合并到我的查询中,但是因为这个项目的自定义 post 类型将很少(少于 30 ) posts,我选择在我的循环中简单地添加一个 IF 语句以仅过滤匹配 case_study 字段的 posts:

$portfolio_query = new WP_Query( $args_portfolio );


if( $portfolio_query->have_posts() ) :

    echo '<ul>';

    while( $portfolio_query->have_posts() ) : $portfolio_query->the_post();
        
    $meta = get_post_meta( $post->ID, 'rccustom_fields', true );

        if ( isset( $meta['case_study'] ) ) :
            the_title();
        endif;

    endwhile;

    echo '</ul>';

endif;

我觉得这样做很笨拙,而不是找到一种方法来过滤查询,但为了继续使用此页面,它确实如此。