按包含数字的标题对帖子进行排序

时间:2022-01-15 作者:Alessio Baccarini

我正在使用wordpress中的posts\\u orderby挂钩寻求帮助。请原谅抽象程度低,但我真的需要快速的帮助。我有一些自定义类型的帖子,其标题由一个固定的8字符文本字符串(TM.74.G.)和358到1000以上的数字组成(这是我需要它们遵循的顺序)。正如预期的那样,ASC中的排序返回一个从1000开始的后序(标题不作为整数处理);如果我使用这样的过滤器

function orderby_post_title_int( $orderby )
{ return ‘(wp_posts.post_title+0) ASC’; }
结果尚不清楚。有什么提示吗?提前谢谢你,阿莱西奥

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

您所问的是一个通用(我的)SQL问题,但无论如何,正如我在评论中所说的,如果帖子标题是always 形式为TM.74.G.<number> 喜欢TM.74.G.358TM.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;
}

相关推荐

元查询字段ORDER和POST_DATE ORDER一起导致不带元字段的帖子无序

我已经设法让wordpress对一个名为start_date 保存在Ymd 通过ACF插件在数据库中设置格式。然而,在我的查询中,没有此字段的其他帖子类型是无序的,并且似乎总是位于包含元字段的所有帖子之后。当前如何返回订单的示例:贴子类型:右对齐日期:年月日新闻2020年9月19日新闻2019年3月12日新闻2018年6月5日出版2020年10月16日出版物2020年10月19日出版物2020年11月2日,这是我正在使用的pre\\u get\\u posts挂钩的摘录。 function ord