我创建了一个筛选函数来筛选帖子类型items
根据它的元价值_item_price
. 问题是它只按升序工作,我不知道为什么。我的pre_get_posts
函数如下所示:
function frontend_items_filter( $query ) {
global $page_items_id
if(!is_page($page_items_id))
return;
if($query->query_vars[\'post_type\'] == \'items\' && isset($_GET[\'filter\'])){
$sort = $_GET[\'item_sort\'];
// Set Ordering Parameter
if(isset($_GET[\'item_sort\']) && !empty($_GET[\'item_sort\'])){
switch($_GET[\'item_sort\']){
case \'price_lowest\':
$query->set(\'meta_key\', \'_item_price\');
$query->set(\'orderby\', \'meta_value_num title\');
$query->set(\'order\', \'ASC\');
break;
case \'price_highest\':
$query->set(\'meta_key\', \'_item_price\');
$query->set(\'orderby\', \'meta_value_num title\');
$query->set(\'order\', \'DESC\');
break;
default:
$query->set(\'orderby\', \'post_date title\');
$query->set(\'order\', \'ASC\');
}
}
}
return $query;
}
add_action( \'pre_get_posts\', \'frontend_items_filter\' );
在我保存价格元之前,我正在验证
is_numeric()
. 我试图打印出我的查询并将SQL直接运行到PHPmyadmin中,如果我使用下面的SQL并将ASC更改为DESC,那么在PHPmyadmin中,结果不会改变,这很奇怪。
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts
INNER JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_postmeta
ON (wp_posts.ID = wp_postmeta.post_id)
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (10) )
AND wp_posts.post_type = \'items\'
AND (wp_posts.post_status = \'publish\'
OR wp_posts.post_status = \'private\')
AND (wp_postmeta.meta_key = \'_item_price\' )
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value+0,wp_posts.post_title ASC LIMIT 0, 10
每次我的结果出来
_item_price
升序(从最低价格到最高价格)。问题可能是什么?我还可以检查/验证什么?
Edit 我已经在其他几个字段中尝试过了,结果是一样的——它将显示ASC,但不显示DESC。
最合适的回答,由SO网友:Howdy_McGee 整理而成
我不知道为什么,但这和title
在我的订单中,一旦删除,一切都开始正常工作。我会把这个留给任何知道原因的人。
$query->set(\'orderby\', \'meta_value_num title\');
- 不起作用
$query->set(\'orderby\', \'meta_value_num\');
- 作品