我希望我能正确解释它,所以我们开始吧!
我有一个房产列表页面,应该在发布列表的日期之前排序(数据来自 API,所以它不是 WP 发布日期),然后任何已售出的房产都应该排在列表的最后,按它们与最近售出的商品在该子列表中排在第一位。 第一个自定义字段称为 listing_date,另一个称为 agreed_date。
有谁知道这种排序是否可行? 我在想我可能需要使用 2 个查询,但这意味着我无法在该解决方案中使用分页。 这是我最近失败的尝试。
<?php
$args = array(
'post_type' => 'listing',
'posts_per_page' => 10,
'paged' => $paged,
'tax_query' => array(
array(
'taxonomy' => 'listingcategory',
'field' => 'slug',
'terms' => 'commercial',
),
),
'orderby' => array(
'agreed_date' => 'ASC',
'listing_date' => 'DESC'
),
);
$listing_posts = new WP_Query($args);
谢谢!
更新代码:
$args = array(
'post_type' => 'listing',
'posts_per_page' => 10,
'paged' => $paged,
'tax_query' => array(
array(
'taxonomy' => 'listingcategory',
'field' => 'slug',
'terms' => 'commercial',
),
'meta_query' => array(
'relation' => 'AND',
'listing_date_clause' => array(
'key' => 'listing_date',
'compare' => 'EXISTS',
),
'agreed_date_clause' => array(
'key' => 'agreed_date',
'compare' => 'EXISTS',
),
),
),
'orderby' => array(
'listing_date_clause' => 'DESC',
'agreed_date_clause' => 'DESC'
),
);
根据 https://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters 你想指定它类似于下面的代码示例:
$args = array(
'orderby' => array(
'title' => 'DESC',
'menu_order' => 'ASC'
)
);
$query = new WP_Query( $args );
这是从 WordPress 4.0 开始支持的。
对于自定义字段(post meta),您需要添加元查询,详见 https://make.wordpress.org/core/2015/03/30/query-improvements-in-wp-4-2-orderby-和元查询
例如:
$q = new WP_Query( array(
'meta_query' => array(
'relation' => 'AND',
'state_clause' => array(
'key' => 'state',
'value' => 'Wisconsin',
),
'city_clause' => array(
'key' => 'city',
'compare' => 'EXISTS',
),
),
'orderby' => 'city_clause',
) );
这是从 4.2 开始支持的。
在你的情况下(根据你的问题编辑)我认为你需要:
$args = array(
'post_type' => 'listing',
'posts_per_page' => 10,
'paged' => $paged,
'tax_query' => array(
array(
'taxonomy' => 'listingcategory',
'field' => 'slug',
'terms' => 'commercial',
)
),
'meta_query' => array(
'relation' => 'AND',
'listing_date_clause' => array(
'key' => 'listing_date',
'compare' => 'EXISTS',
),
'agreed_date_clause' => array(
'key' => 'agreed_date',
'compare' => 'EXISTS',
),
),
'orderby' => array(
'listing_date_clause' => 'DESC',
'agreed_date_clause' => 'DESC'
),
);
