我不确定我的做法是否正确,似乎有很多人这样做,但从模板中的查询到函数,都有完全不同的方法,所以我不确定该走哪条路。
我有一个自定义的帖子类型(业务),其中包含特色帖子,每个帖子都有一个“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\' );
最合适的回答,由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\' );