是否在没有WP_QUERY的情况下对结果进行排序?

时间:2016-02-08 作者:Emmanuel Henri

我对编写WP\\u查询还不熟悉,我尝试了一些方法,但似乎不起作用。现在(您可以在此处看到页面:http://boomerang.mannydesigns.co/artistes/parcourir/musique/ )

我需要通过我添加的自定义字段(使用ACF)name exclusif重新组织这些艺术家的排序,该字段是一个包含3个选项的选择字段。

是否可以在不执行WP\\U查询的情况下执行此操作(&U);只需添加到当前代码(这是常见的post循环)?

    /**
 * Alters queries
 */
add_action( \'pre_get_posts\', \'wp_order_artists\' );
function wp_order_artists( $query ) {

    // don\'t run on the backend
    if ( is_admin() )
      return;

    // Only run on post types artists
    if ( is_post_type_archive(\'artists\') && $query->is_main_query() || $post_type == \'artists\' ) {

        $query->set( \'orderby\', \'meta_value\' );
        $query->set( \'meta_key\', \'exclusif\' );
        $query->set( \'order\', \'DESC\' );
    }

    return;
}
if ( have_posts() ) : ?>
    <div class="remix_items grid clearfix <?php echo $artists_col; ?>">
        <?php while ( have_posts() ): the_post(); ?>
            <a class="item<?php $i++; echo ($i % $artists_col_num === 0) ? \' last_item\' : \'\'; ?>" href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" rel="bookmark">
                <figure class="effect-bubba">
                    <?php if ( has_post_thumbnail() ) {
                         the_post_thumbnail(\'type_cover\');
                        } else {
                            echo \'<img src="" alt="\'.the_title().\'">\';
                        } ?>
                        <figcaption>
                            <h2><?php the_title(); ?></h2>
                        </figcaption>
                </figure>
            </a>
        <?php endwhile; ?>
   </div>

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

如果要更改现有查询的顺序,则不应创建新的WP_Query 对象,但使用pre_get_posts 更改现有查询,以防止不必要地运行多个查询。

pre_get_posts docs:

此挂钩在创建查询变量对象之后,但在实际查询运行之前调用。

这是一个如何将自定义帖子类型的所有查询更改为按自定义字段排序的示例。显然,它需要改变以适应您的情况,但应该让您知道该怎么做:

/**
 * Alters queries
 */
add_action( \'pre_get_posts\', \'wpse_217090_pre_get_posts\' );
function wpse_217090_pre_get_posts( $query ) {

    // don\'t run on the backend
    if ( is_admin() )
      return;

    // Only run on post types \'your_custom_post_type\'
    if ( is_post_type_archive(\'your_custom_post_type\') && $query->is_main_query() || $post_type == \'your_custom_post_type\' ) {

        $query->set( \'orderby\', \'meta_value\' );
        $query->set( \'meta_key\', \'_your_custom_field\' );
        $query->set( \'order\', \'ASC\' );
    }

    return;
}
作为参考,你应该仔细阅读;