按POST_META在搜索和分类中对帖子进行排序

时间:2017-10-17 作者:Randomer11

我不确定我的做法是否正确,似乎有很多人这样做,但从模板中的查询到函数,都有完全不同的方法,所以我不确定该走哪条路。

我有一个自定义的帖子类型(业务),其中包含特色帖子,每个帖子都有一个“featured\\u listing”post\\u meta,它可以是空的,也可以是附加到帖子的“featured listing”值**。我想在搜索结果和类别中显示那些没有空post\\u meta值的帖子。

**请注意值的-而不是\\u0。

这是我认为可能有效的方法,但我开始认为我找错了方向。

// Order posts by meta data
function custom_special_sort( $query ) {
    //is this the main query and is this post type of post
    if ( $query->is_main_query() && $query->is_post_type( \'business\' ) ) {
        //Do a meta query
        $query->get_post_meta(get_the_ID(), "featured_listing", TRUE);

        //sort by a meta value
        $query->set( \'orderby\', \'featured_listing\' );
        $query->set( \'order\', \'ASC\' );
    }
}
add_action( \'pre_get_posts\', \'custom_special_sort\' );
我也试着稍微改变一下,如下所示。但可以提供一些指导,说明为什么它不起作用,或者我是否做得正确:

    function custom_special_sort( $query ) {
    // Check this is main query and other conditionals as needed
    if ( $query->is_main_query() && $query->is_post_type( \'business\' ) ) {
        $query->set( 
          \'meta_query\', 
          array( 
            array(
              \'key\' => \'featured_listing\',
              \'value\' => \'featured-listing\',
              \'orderby\' => \'featured_listing\',
              \'order\' => \'DESC\'  
            )
          )
        );
    }
  }
add_action( \'pre_get_posts\' , \'custom_special_sort\' );

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

您尝试的代码有几个问题。

To check the query is for your CPT archive: 您正在使用$query->is_post_type() 但它不起作用(据我所知,它甚至不是一个函数)。相反,您可以使用:

if (is_post_type_archive(\'business\')) {...}
或(如果不仅在存档页上)

if ($query->get(\'post_type\') == \'business\') {...}
To order by meta value in pre_get_posts, 您需要设置meta_key 以及orderby (可选)order).


Complete Function: 将这些应用于“custom\\u special\\u sort”函数,我们得到:

function custom_special_sort( $query ) {

    // if is this the main query and is this post type of business
    if ( $query->is_main_query() && is_post_type_archive( \'business\' ) ) {

        // order results by the meta_key \'featured_listing\'
        $query->set( \'meta_key\', \'featured_listing\' );
        $query->set( \'orderby\', \'featured_listing\' );
        $query->set( \'order\', \'DESC\' );
    }
}
add_action( \'pre_get_posts\', \'custom_special_sort\' );

SO网友:Randomer11

我已将上面的Fluffykittens答案标记为正确答案。我想扩展这个答案(希望它能帮助其他人)。

根据Fluffykitten提供的答案,我发现在我的特定主题中,我使用了不同的档案循环和自定义分类法,这导致了对搜索档案中的帖子进行重新排序,其中is_post_type_archive 是真的。然而,我的分类法归档了没有发生的重新排序,因此将查询更改为包含is_tax 成功了。

作为php新手,我不确定这是否是添加到查询中的最佳方式,但它确实有效。欢迎有人纠正/改进:)

function custom_special_sort( $query ) {

    // if is this the main query and is this post type of business

    if ( ($query->is_main_query() && is_post_type_archive(\'business\')) || (is_main_query() && is_tax (\'location\')) ) {

        // order results by the meta_key \'featured_listing\'
       $query->set( \'meta_key\', \'featured_listing\' );
        $query->set( \'orderby\', \'featured_listing\' );
        $query->set( \'order\', \'DESC\' );
    }
}
add_action( \'pre_get_posts\', \'custom_special_sort\' );

结束

相关推荐

Ordering posts by an array

我有一个查询,它返回许多不同的自定义帖子类型。我想按帖子类型数组的内容对帖子数组进行排序;e、 g。array(\'post\', \'video\', \'testimonial\'..... );数组(顺序)是固定的。如何在不对每种职位类型进行不同查询的情况下管理此问题?