\'meta_value_num\'
不是魔术,它将值转换为数字,但是,要正确转换为数字,值必须与数字兼容。
在OP中,据说字段值是“数字”的,但我敢打赌有些不是数字,例如货币符号,如“10$”或“10.00”,或其他符号,如“10-”。
还要考虑使用千分位分隔符很可能会导致转换失败,因为MySQL可能会将其误认为十进制分隔符。
如果要使用元字段进行排序,请遵循以下规则:
请勿使用任何其他非数字字符(无货币或其他符号,无空格…)请勿使用任何千位分隔符当值为整数(无小数)时,请勿使用小数,例如,如果值为10,请勿使用10.00,请将点用作小数分隔符如果您遵循之前的规则,则订单\'meta_value_num\'
将按预期工作。
如果您问自己如何正确设置使用以前规则输入的价格的格式,答案是number_format
.
例如,在意大利,格式正确的价格是€ 1.000,50 (一千欧元五十美分)。
按照之前的规则,应将该价格输入为1000.50
要输出正确的格式化价格,可以使用如下自定义函数:
function formatted_price( $number ) {
// force 2 decimals, comma as decimal separator and dot as thousands separator
return \'€ \' . number_format ( (float) $number, 2, ",", "." );
}
并像这样使用它:
while ( have_posts() ) :
the_post();
if ( $price = get_post_meta( get_the_ID(), \'property_price\', TRUE ) ) {
// assuming the price is stored in the \'property_price\' custom field
echo formatted_price( $price );
}
也就是说,
I strongly suggest you avoid the usage of query_posts
并将其替换为
\'pre_get_posts\'
.
从…起Codex:
。。。它效率低下(重新运行SQL查询),并且在某些情况下会彻底失败(尤其是在处理POST分页时)。任何现代的WP代码都应该使用更可靠的方法,比如使用pre\\u get\\u posts钩子。
因此,请从category.php
在你的functions.php
写入:
add_action( \'pre_get_posts\', \'order_properties_by_price\' );
function order_properties_by_price( $query ) {
if ( is_admin() || ! $query->is_main_query() || ! $query->is_category( \'property\' ) )
return;
$byprice = filter_input( INPUT_GET, \'orderby\', FILTER_SANITIZE_STRING );
if ( empty( $byprice ) )
return;
if ( $byprice === \'price\' ) {
$order = strtoupper( filter_input( INPUT_GET, \'order\', FILTER_SANITIZE_STRING ) );
if ( $order !== \'DESC\' ) $order = \'ASC\';
$query->set( \'meta_key\', \'property_price\' );
$query->set( \'orderby\', \'meta_value_num\' );
$query->set( \'order\', $order );
}
}
现在,假设您的“属性”存档URL为
http://www.example.com/category/property/
当然,它将显示“属性”类别中按日期排序的帖子(从新到旧)。
使用上面发布的代码,URL
http://www.example.com/category/property/?orderby=price
将按价格和URL升序显示“property”类别中的帖子
http://www.example.com/category/property/?orderby=price&order=DESC
将按价格降序显示“属性”类别中的帖子。
因此,您需要做的是,创建一个下拉列表,将页面重定向到正确的URL。
您可以编写自定义函数来输出下拉列表:
function order_properties_menu() {
if ( ! is_category(\'property\') ) return;
$url = get_category_link( get_term_by( \'slug\', \'property\', \'category\' ) );
$form = \'<form id="orderbyprice" action="#" method="GET">\'
. \'<label>Order by:</label><select name="order">\';
$htl = esc_url( add_query_arg( array( \'orderby\' => \'price\', \'order\' => \'DESC\' ), $url ) ) ;
$lth = esc_url( add_query_arg( array(\'orderby\' => \'price\', \'order\' => \'ASC\' ), $url ) );
$options = array(
\'latest\' => array( \'Latest\', $url ),
\'htl\' => array( \'Price High to Low\', $htl ),
\'lth\' => array( \'Price Low to High\', $lth )
);
$format = \'<option value="%s"%s>%s</option>\';
foreach( $options as $id => $option ) {
$sel = \'latest\';
if ( get_query_var( \'orderby\' ) === \'meta_value_num\' )
$sel = get_query_var( \'order\' ) === \'DESC\' ? \'htl\' : \'lth\';
$selected = selected( $sel, $id, FALSE );
$form .= sprintf( $format, esc_url( $option[1] ), $selected, esc_html( $option[0] ) );
}
echo $form . \'</select></form>\';
?>
<script>
jQuery(document).on( \'change\', \'#orderbyprice select\', function() {
window.location.href = jQuery(this).val();
});
</script>
<?php
}
此功能输出一个下拉菜单,允许用户从3个订购选项中进行选择,当选择其中一个选项时,页面将相应重定向。
在中添加此函数后functions.php
, 把它放在你的category.php
order_properties_menu();
将显示select(选择)。
请注意order_properties_menu()
函数需要jQuery。