尽管如此,MySQL并没有以本机方式进行“自然”排序there are attempts to make it work.
我不知道你提到的那个插件是如何工作的,但按排序menu_order
使用post_title
回退是微不足道的。
add_action(
\'pre_get_posts\',
function ($qry) {
if ($qry->is_main_query()) {
$qry->set(\'orderby\',\'menu_order title\');
}
}
);
当然,那会
menu_order
在排序的顶部等于0,我认为这不是您想要的。
像MySQL一样,WP_Query
没有“自然排序”功能,但如果您想按menu_order
在哪里menu_order
大于0,否则按标题,这是我认为您想要的(至少在问题的关键点上),您可以使用过滤器来实现。
add_action(
\'posts_orderby\',
function ($orderby,$post) {
global $wpdb;
return " IF({$wpdb->posts}.menu_order > 0, {$wpdb->posts}.menu_order {$wpdb->posts}.post_title, {$wpdb->posts}.post_title) ";
},
10,2
);
几乎未经测试。可能是马车
排空警告。不退款。您可以使用类似的过滤器来尝试实现真正的自然排序,但我没有时间编写、测试和调试它。