您所问的是一个通用(我的)SQL问题,但无论如何,正如我在评论中所说的,如果帖子标题是always 形式为TM.74.G.<number>
喜欢TM.74.G.358
和TM.74.G.1000
, 然后您可以使用SUBSTRING()
function in MySQL/MariaDB 首先提取<number>
价值(例如。358
) 然后按照这个数字对帖子进行排序。
因此,在过滤器函数中,只需替换return
部件:
return "SUBSTRING( wp_posts.post_title, 9 ) + 0 ASC";
现在有一个特定于WordPress的东西:你应该
conditionally 应用筛选器,因为
posts_orderby
在许多页面上运行,如类别归档页面、搜索结果页面、单篇文章页面等,包括在管理端,例如;“发布”;页码(例如,在
wp-admin/edit.php
), 所以你不会想搞乱这些页面上帖子的排序,对吧?
其次,不要硬编码表前缀(默认为wp_
), 您应该使用$wpdb->prefix
就像这样{$wpdb->prefix}posts
, 但对于核心表,它们实际上可以作为公共属性在wpdb
类,例如posts表,您可以使用$wpdb->posts
以引用该表。
global $wpdb; // don\'t forget to declare the $wpdb global
return "SUBSTRING( $wpdb->posts.post_title, 9 ) + 0 ASC";
下面是一个如何有条件地应用过滤器的示例:
add_filter( \'posts_orderby\', \'my_posts_orderby\', 10, 2 );
// **Replace "foo" with the correct post type.
function my_posts_orderby( $orderby, $query ) {
// Check if it\'s *not* the main query (which runs automatically on page load).
// And if it\'s not, then do nothing.
if ( ! $query->is_main_query() ) {
return $orderby; // always return it :D
}
// 1. Apply the filter if we\'re on the "foo" post type archive.
if ( ! is_admin() && is_post_type_archive( \'foo\' ) ) {
global $wpdb;
return "SUBSTRING( $wpdb->posts.post_title, 9 ) + 0 ASC";
}
// 2. Or if we\'re on the admin page for managing the CPT\'s posts.
if ( is_admin() && \'edit-foo\' === get_current_screen()->id ) {
global $wpdb;
return "SUBSTRING( $wpdb->posts.post_title, 9 ) + 0 ASC";
}
return $orderby;
}