如何按带美元($)符号的meta_value_num排序

时间:2014-07-26 作者:coder

自定义字段都有价格,包括$符号和一个点作为分隔符。

$theQuery = new WP_Query(array(
\'orderby\' => \'meta_value_num\',
\'meta_key\' => \'price\',
\'order\' => ASC  
));
所有格式如下:

24.95美元190.00美元1.40美元

由于美元符号,它们无法正确排序,是否可以忽略或删除此WP\\U查询中的第一个字符/$符号?

2 个回复
SO网友:bonger

您也可以使用posts_orderby 过滤器:

function wpse155827_posts_orderby_price( $orderby ) {
    return str_replace( \'wp_postmeta.meta_value\', \'substr(wp_postmeta.meta_value, 1)\', $orderby );
}
add_filter( \'posts_orderby\', \'wpse155827_posts_orderby_price\' );
$theQuery = new WP_Query( array(
    \'orderby\' => \'meta_value_num\',
    \'meta_key\' => \'price\',
    \'order\' => \'ASC\',
    \'suppress_filters\' => false,
) );
remove_filter( \'posts_orderby\', \'wpse155827_posts_orderby_price\' );

SO网友:Manny Fleurmond

您必须使用post_clauses 筛选以创建一些自定义SQL:

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

function wpse155827_price_sort( $clauses, $wp_query ) {
    $orderby = $wp_query->get( \'orderby\' ); 
    $order = ( $wp_query->get( \'order\' ) == \'desc\') ? \'DESC\' : \'ASC\';
    if( \'price\' === $orderby ) {
        $clauses[\'join\'] .= " LEFT JOIN {$wpdb->postmeta} price ON( {$wpdb->posts }.ID = price.post_id AND price.meta_key = \'price\') ";
        $clauses[\'orderby\'] = " CONVERT( REPLACE(price.meta_value, \'$\', \'\'), DECIMAL(13,2) ) " . $order;
    }

    return $clauses;
}
基本上,这是一个过滤器,每当您设置orderbyprice. 在mySQL代码中,它接受元值,删除$ 符号,则将其转换为十进制。这将允许它现在正确排序。

结束

相关推荐

从header.php中删除了jQuery脚本,有什么问题吗?

为了避免从我的主题和插件中调用多个jQuery,我删除了<script language=\"javascript\" type=\"text/javascript\" src=\"<?php bloginfo(\'template_url\'); ?>/javascripts/jquery.js\"></script> .现在,我的滑块插件在前端开始正常工作。我不知道将来它是否会给我的网站带来任何问题任何建议。