making php value numeric

时间:2013-05-23 作者:Lars van Peij

我在堆栈溢出上使用了此页面中的一些代码:Using wp_query is it possible to orderby taxonomy?

这是一个能够根据分类法值对查询进行排序的函数。虽然它工作得很好,但我想更进一步。

我从分类术语中检索到的值是一个数字。但是,如果我按这个数字排序,它会给出以下顺序:1 10 11 2 21 22,依此类推。

我希望它能“正常”排序,1 2 3 5 9 11 15 21 22等等。

根据谷歌的说法,我应该在值中加0,使其成为一个数值,但我不知道在这段代码中应该放在哪里。在某个地方,它应该表示值+0。你知道我应该把它放在哪里吗?

关于此代码:

function orderby_tax_clauses( $clauses, $wp_query ) {
    global $wpdb;
    $taxonomies = get_taxonomies();
    foreach ($taxonomies as $taxonomy) {
        if ( isset( $wp_query->query[\'orderby\'] ) && $taxonomy == $wp_query->query[\'orderby\'] ) {
            $clauses[\'join\'] .=<<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
            $clauses[\'where\'] .= " AND (taxonomy = \'{$taxonomy}\' OR taxonomy IS NULL)";
            $clauses[\'groupby\'] = "object_id";
            $clauses[\'orderby\'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
            $clauses[\'orderby\'] .= ( \'DESC\' == strtoupper( $wp_query->get(\'order\') ) ) ? \'ASC\' : \'DESC\';
        }
    }
    return $clauses;
}

    add_filter(\'posts_clauses\', \'orderby_tax_clauses\', 10, 2 );

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

你的问题更多的是关于SQL而不是WordPress。

如果要将术语名称按数字排序,通常可以尝试

SELECT * FROM wp_terms ORDER BY name+0 ASC

SELECT * FROM wp_terms ORDER BY name*1 ASC
或使用CAST:

SELECT * FROM wp_terms ORDER BY CAST(name AS SIGNED) ASC
您可以使用的位置SIGNED, UNSIGNED 或者也许DECIMAL(10,2), 取决于你的数字。

更新以测试排序,然后可以访问您的PHPMyAdmin并运行此查询:

SELECT  tool_terms.name AS tname, tool_posts.* FROM tool_posts 
LEFT OUTER JOIN tool_term_relationships ON tool_posts.ID=tool_term_relationships.object_id 
LEFT OUTER JOIN tool_term_taxonomy USING (term_taxonomy_id) 
LEFT OUTER JOIN tool_terms USING (term_id) 
WHERE 1=1 
AND tool_posts.post_type = \'landschapselement\' 
AND (tool_posts.post_status = \'publish\' OR tool_posts.post_status = \'draft\' OR tool_posts.post_status = \'pending\' OR tool_posts.post_status = \'private\') 
AND (taxonomy = \'beheerseenheidnummer\' OR taxonomy IS NULL) 
GROUP BY object_id 
ORDER BY tool_terms.name+0 ASC, tool_posts.post_title ASC
看看我换的地方是否有用

ORDER BY GROUP_CONCAT(tool_terms.name ORDER BY name ASC) ASC

ORDER BY tool_terms.name+0 ASC, tool_posts.post_title ASC
其中,我们按照分类法数值对文章进行排序,然后第二个顺序是在文章标题上。我还添加了字段tool_terms.name AS tnameSELECT 部分这适用于我的安装。

您也可以尝试替换

$clauses[\'orderby\'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
$clauses[\'orderby\'] .= ( \'DESC\' == strtoupper( $wp_query->get(\'order\') ) ) ? \'ASC\' : \'DESC\';
使用:

$clauses[\'orderby\'] = " {$wpdb->terms}.name+0 ";
$clauses[\'orderby\'] .= ( \'DESC\' == strtoupper( $wp_query->get(\'order\') ) ) ? \'ASC\' : \'DESC\';
$clauses[\'orderby\'] = ", {$wpdb->posts}.post_title ASC ";

SO网友:Mike Madern

请尝试使您的查询如下所示:

"SELECT *, 
CASE WHEN ASCII(RIGHT(`%column_name%`, 1)) > 47 AND ASCII(RIGHT(`%column_name%`, 1)) < 58
THEN LPAD(CONCAT(`%column_name%`,  \'-\'), 5, \'0\') 
ELSE LPAD(`%column_name%`, 5, \'0\') END AS `vsort` 
FROM `%table_name%` ORDER BY `vsort`;"

From this webpage

注意:您需要将%column\\u name%替换为实际的列名,将%table\\u name%替换为实际的表名。

结果就像PHP的natsort() 作用

结束

相关推荐

PHP如果已显示POST,则

我用jquery旋转木马创建了一个新页面,它在各种不同的新闻主题之间旋转。你可以看到here:然而,旋转木马下面是一个附加标题的静态列表。我需要做的是找到php代码,如果某个故事出现在旋转木马中,则将其从下面的帖子中排除。这是为了避免重复。我不能简单地增加偏移量。偏移量当前设置为“4”。旋转木马在任何给定时间都包含12个独特的帖子。我不能增加补偿,因为如果我从一个类别中连续获得五到六个职位,那么通过增加补偿,他们将从下面的部分中丢失。我希望这是有意义的。我甚至不确定我的目标是否可以实现(!)。这一切都需要