我有自定义的帖子类型,名为"律师"我想查询自定义字段"姓氏"然后按自定义字段" name"进行排序。我的查询如下:
query_posts( array ( 'post_type' => 'lawyer', 'posts_per_page' => -1, 'meta_query' => array(array('key' => 'surname', 'orderby' => 'meta_value', 'order' => ASC), array('key' => 'name', 'orderby' => 'meta_value', 'order' => ASC) )) );
但它没有用。我得到了结果,但它们没有按我希望的方式排序。知道这里有什么问题吗?
答案 0 :(得分:1)
永远不要使用query_posts()
。
参考When should you use WP_Query vs query_posts() vs get_posts()?
您可以使用WP_QUERY
并将过滤器添加到posts_orderby
function custom_orderby($orderby) {
global $wpdb;
return str_replace($wpdb->prefix.'postmeta.meta_value', 'mt1.meta_value, mt2.meta_value ASC', $orderby);
}
然后准备你的论点。
$args = array(
'post_type'=>'lawyer',
'orderby' => 'meta_value',
'meta_key' => 'surname',
'meta_query' => array(
array(
'key' => 'surname',
'value' => '',
),
array(
'key' => 'name',
'value' => '',
)
)
);
在查询执行之前,通过过滤器添加自定义订单。
add_filter('posts_orderby','custom_orderby');
$loop = new WP_Query( $args );
remove_filter('posts_orderby','custom_orderby');
答案 1 :(得分:0)
最后使用此代码:
function double_meta_posts_orderby($orderby) {
remove_filter('posts_orderby', 'double_meta_posts_orderby');
global $wpdb;
return " {$wpdb->postmeta}.meta_value, mt1.meta_value";
}
$args = array(
'post_type'=>'lawyer',
'post_per_page' => -1,
'meta_query' => array(
array(
'key' => 'surname',
),
array(
'key' => 'name',
)
),
'orderby' => 'meta_value',
'order' => ASC,
);
add_filter('posts_orderby', 'double_meta_posts_orderby');
$loop = new WP_Query( $args );
// the Loop
while ($loop->have_posts()) : $loop->the_post();
...