这里有一个想法,在循环执行之前对其进行排序。您当前的问题就是这个。您将看到,排序类型(如果我正确,我认为您的顺序不是按文章类型的字母顺序)在本机上是不可能的,因此我们需要解决方法(即使您只需要按字母顺序排序的文章类型,本机方法仍然缺乏适当的功能)。这就是usort()
进来后,我们可以按我们想要的任何顺序对帖子类型进行排序。这将在the_posts
滤器
我可以给你们两个例子。NOTE: 代码示例至少需要PHP 5.4+,这应该是您现在的最低版本。5.4之前的所有版本都已过期,不受支持,因此,如果您仍在使用这些版本,则存在巨大的安全风险。
按自定义邮件类型顺序排序
add_filter( \'the_posts\', function( $posts, $q )
{
if( $q->is_main_query() && $q->is_search() )
{
usort( $posts, function( $a, $b ){
/**
* Sort by post type. If the post type between two posts are the same
* sort by post date. Make sure you change your post types according to
* your specific post types. This is my post types on my test site
*/
$post_types = [
\'event_type\' => 1,
\'post\' => 2,
\'cameras\' => 3
];
if ( $post_types[$a->post_type] != $post_types[$b->post_type] ) {
return $post_types[$a->post_type] - $post_types[$b->post_type];
} else {
return $a->post_date < $b->post_date; // Change to > if you need oldest posts first
}
});
}
return $posts;
}, 10, 2 );
按帖子类型字母顺序排序
add_filter( \'the_posts\', function( $posts, $q )
{
if( $q->is_main_query() && $q->is_search() )
{
usort( $posts, function( $a, $b ){
/**
* Sort by post type. If the post type between two posts are the same
* sort by post date. Be sure to change this accordingly
*/
if ( $a->post_type != $b->post_type ) {
return strcasecmp(
$a->post_type, // Change these two values around to sort descending
$b->post_type
);
} else {
return $a->post_date < $b->post_date; // Change to > if you need oldest posts first
}
});
}
return $posts;
}, 10, 2 );
现在,如果您没有使用自定义查询代替主查询,您的帖子应该在搜索页面上按帖子类型排序。对于上面的代码,请保持原样,无需对其进行任何调整