按标题中的数字升序排列帖子

时间:2015-01-12 作者:bartligthart

我有一个页面显示足球俱乐部的球队。我用“order”=>“ASC”订购这些。但问题是球队的顺序和我的一样。

顺序如下:E1队、E10队、E11队、E2队

一定是这样的:E1队,E2队。。。。。E10队,E11队

以正确的方式订购此产品的最佳解决方案是什么?

2 个回复
最合适的回答,由SO网友:bonger 整理而成

Old answer (which no longer works):

使用MySQL的一种偷偷摸摸的方法是,假设数字总是在末尾,将标题反转,将其转换为数字(+0), 然后再次反转并将其转换为数字:

function wpse174646_posts_orderby( $orderby, $query ) {
    if ( $query->get( \'orderby\' ) != \'title_number\' ) return $orderby;
    global $wpdb;
    return \'REVERSE(REVERSE(TRIM(\' . $wpdb->posts . \'.post_title))+0)+0 \' . $query->get( \'order\' );
}
$args = array( \'orderby\' => \'title_number\', \'order\' => \'ASC\' );
add_filter( \'posts_orderby\', \'wpse174646_posts_orderby\', 10, 2 );
$query = new WP_Query( $args );
remove_filter( \'posts_orderby\', \'wpse174646_posts_orderby\', 10 );

New answer:

一种可靠(希望如此)的方法是使用我在stackexchange上发布的答案(https://stackoverflow.com/a/28808798/664741), 一个简化的非udf版本的@plaix/richardtoth/lukehoggett的最佳响应,它将(第一次遇到的)数字填充为零:

add_filter( \'posts_clauses\', function ( $pieces, $query ) {
    if ( $query->get( \'orderby\' ) != \'title_number\' ) return $pieces;
    global $wpdb;
    $field = $wpdb->posts . \'.post_title\';
    $pieces[ \'fields\' ] .= $wpdb->prepare(
        \', LEAST(\' . implode( \',\', array_fill( 0, 10, \'IFNULL(NULLIF(LOCATE(%s, \' . $field . \'), 0), ~0)\' ) )
        . \') AS first_int\',
        \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\'
    );
    $pieces[ \'orderby\' ] = $wpdb->prepare(
        \'IF(first_int = ~0, \' . $field . \', CONCAT(\'
            . \'SUBSTR(\' . $field . \', 1, first_int - 1),\'
            . \'LPAD(CAST(SUBSTR(\' . $field . \', first_int) AS UNSIGNED), LENGTH(~0), %s),\'
            . \'SUBSTR(\' . $field . \', first_int + LENGTH(CAST(SUBSTR(\' . $field . \', first_int) AS UNSIGNED)))\'
        . \')) \' . $query->get( \'order\' )
        , 0
    );
    return $pieces;
}, 10, 2 );
$args = array( \'orderby\' => \'title_number\', \'order\' => \'ASC\' );
$query = new WP_Query( $args );

SO网友:darrinb

PHP有一个sort_natural 它的sort()函数上的标志(MySQL没有)。因此,如果在显示它们之前将它们构建到一个数组中,就可以按这种方式进行排序。

类似于:

$teams = array(
    \'Team E1\',
    \'Team E10\',
    \'Team E2\',
    \'Team E11\',
);

sort($teams, SORT_NATURAL);

print_r($teams);
将输出:

Array
(
    [0] => Team E1
    [1] => Team E2
    [2] => Team E10
    [3] => Team E11
)

结束

相关推荐

Custom Admin Menu Order

我的函数中有一个简单的解决方案。php用于重新排序管理菜单。这是:// Admin menu - reorder function custom_menu_order($menu_ord){ if (!$menu_ord) return true; return array( \'index.php\', // Dashboard \'edit.php?post_type=page\', // Pages \'edit.php