具有多个值的Meta_Query

时间:2016-12-23 作者:libor

我需要你的帮助。

我的问题是:我有自定义的帖子类型“Player”。这个CPT有自定义字段“季节”。季节可以有多个用逗号分隔的值,例如“201420152016”等。

现在我需要筛选在特定赛季(例如2015年和2016年)踢球的球员名单。

现在我需要你的帮助wp_query. 我尝试了此代码,但不起作用:-/

query_posts(
    array(

        \'post_type\' => \'player\',
        \'meta_query\' => array(

            array(
                \'key\'     => \'seasons\',
                \'value\'   => array( \'2015\',\'2016\'),
                \'compare\' => \'IN\',
            ),

        ),

    )

);
请帮忙。

谢谢,伦敦银行同业拆借利率

2 个回复
SO网友:Michael Mizner

对@dgarceran的答案进行一点扩展

通常,使用WP_Query 类可能是查询帖子的好方法。

我们将要向该查询传递参数。

在您的情况下,我们可能需要使用以下选项之一:

  1. Custom Field Parameters“-meta_query
  2. Taxonomy Parameters“-tax_query
关于所有选项的一个近乎全面的示例,我想参考以下要点:https://gist.github.com/luetkemj/2023628.

另请参见法典:https://codex.wordpress.org/Class_Reference/WP_Query

两者都采用关联数组,例如。

Note: 我将使用与PHP 5.4兼容的语法

    $meta_query_args = [
        [
            \'key\'     => \'season\',
            \'value\'   => [ \'2015\', \'2016\' ],
            \'compare\' => \'IN\',
        ],
    ];
我们可以把这些论点带到WP_Query

    $args = [
        \'post_type\'      => \'player\',
        \'posts_per_page\' => 100, // Set this to a reasonable limit
        \'meta_query\'     => $meta_query_args,

    ];

    $the_query = new WP_Query( $args );
现在的情况是WordPress将检查所有与您的custom post type player. 然后,它将查询您用key设置的元数据season. 任何匹配的帖子20152016 将返回。

Note: 使用meta_query 通常不建议使用这种方法,因为它对数据库的负担有点大。大家的共识似乎是,查询分类法的性能更高(不要引用我的话,找不到我的源代码)

因此,作为一个快速的替代方案,我推荐以下示例:

    $tax_query_args = [
        [
            \'taxonomy\' => \'season\',
            \'field\'    => \'slug\',
            \'terms\'    => [ \'2015\', \'2016\' ],
            \'operator\' => \'IN\',
        ],
    ];

    $args = [
        \'post_type\'      => \'player\',
        \'posts_per_page\' => 100, // Set this to a reasonable limit
        \'tax_query\'      => $tax_query_args,
    ];

    $the_query = new WP_Query( $args );
现在我们可以实际循环数据了,下面是一些示例标记:

        <section class="season-list">
            <?php while ( $the_query->have_posts() ) : $the_query->the_post();
                $post_id = get_the_ID();
                // $season  = get_post_meta( $post_id, \'season\', true ); // example if you are still going to use post meta
                $season = wp_get_object_terms( $post_id, \'season\', [ \'fields\' => \'names\' ] );
                ?>

                <h3><?php the_title(); ?></h3>
                <p><?php echo __( \'Season: \' ) . sanitize_text_field( implode( $season ) ); ?></p>

            <?php endwhile; ?>
        </section>
当您使用WP_Query 尤其是在模板中,请确保以wp_reset_postdata();

总而言之(tl;dr)

    $tax_query_args = [
        [
            \'taxonomy\' => \'season\',
            \'field\'    => \'slug\',
            \'terms\'    => [ \'2015\', \'2016\' ],
            \'operator\' => \'IN\',
        ],
    ];

    $args = [
        \'post_type\'      => \'player\',
        \'posts_per_page\' => 100, // Set this to a reasonable limit
        \'tax_query\'      => $tax_query_args,
    ];

    $the_query = new WP_Query( $args );

    ?>
        <section class="season-list">
            <?php while ( $the_query->have_posts() ) : $the_query->the_post();
                $post_id = get_the_ID();
                // $season  = get_post_meta( $post_id, \'season\', true ); // example if you are still going to use post meta
                $season = wp_get_object_terms( $post_id, \'season\', [ \'fields\' => \'names\' ] );
                ?>

                <h3><?php the_title(); ?></h3>
                <p><?php echo __( \'Season: \' ) . sanitize_text_field( implode( $season ) ); ?></p>

            <?php endwhile; ?>
        </section>
    <?php

    wp_reset_postdata();
Front-end view of our query:Example Front EndDashboard view of CPT Player posts:Example CPT Player posts

希望能提供一点背景

SO网友:dgarceran

我会这样做The Loop 和使用Codex examples.

$args = array(
    \'post_type\'  => \'player\',
    \'meta_key\'   => \'age\',
    \'meta_query\' => array(
        array(
            \'key\'     => \'seasons\',
            \'value\'   => array( 2015, 2016 ), // or array( \'2015\', \'2016\' )
            \'compare\' => \'IN\',
        ),
    ),
);
// The Query
$query = new WP_Query( $args );

// The Loop
if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post();
        // do something
    }
} else {
    // no posts found
}

// Restore original Post Data
wp_reset_postdata();
您的问题是在一个字符串中添加值,如“201520162017”。。。您应该在不同的字段中分隔每个值。具有ACF 您可以选择添加季节转发器,还可以执行custom taxonomy 来保存这些值,而不是post meta。如果你不想改变这一点,你应该先用get_post_meta, 和使用explode 使用PHP。

相关推荐