WordPress:通过自定义字段排序文章(PHP实现)
WordPress 多自定义字段排序解决方案
1. 自定义WP_Query查询场景
如果你是在页面模板、短代码里自行编写查询,直接在WP_Query参数中指定多字段排序规则即可:
$args = array( 'post_type' => 'post', // 替换为你的目标文章类型,比如自定义文章类型的slug 'posts_per_page' => -1, // 显示所有符合条件的文章,可按需修改数量 'meta_query' => array( 'relation' => 'AND', 'start_date_clause' => array( 'key' => 'start_date', 'compare' => 'EXISTS' // 仅筛选包含该字段的文章 ), 'start_time_clause' => array( 'key' => 'start_time', 'compare' => 'EXISTS' ) ), 'orderby' => array( 'start_date_clause' => 'ASC', // 优先按start_date升序,改成DESC即为降序 'start_time_clause' => 'ASC' // 日期相同时,按start_time升序排序 ) ); $query = new WP_Query( $args ); // 循环输出文章内容 if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); // 这里替换成你的文章输出逻辑 the_title( '<h3>', '</h3>' ); echo '<p>日期:' . get_post_meta( get_the_ID(), 'start_date', true ) . ' 时间:' . get_post_meta( get_the_ID(), 'start_time', true ) . '</p>'; } wp_reset_postdata(); }
2. 修改全局查询场景(首页、归档页等)
如果要修改博客首页、分类/标签归档等默认全局查询,把以下代码放到主题的functions.php文件里:
add_action( 'pre_get_posts', 'custom_sort_posts_by_date_time' ); function custom_sort_posts_by_date_time( $query ) { // 仅修改前台主查询,排除后台和自定义查询 if ( ! is_admin() && $query->is_main_query() ) { // 可选:限制生效页面,比如仅首页is_home(),仅分类页is_category() // if ( $query->is_home() ) { $query->set( 'meta_query', array( 'relation' => 'AND', 'start_date_clause' => array( 'key' => 'start_date', 'compare' => 'EXISTS' ), 'start_time_clause' => array( 'key' => 'start_time', 'compare' => 'EXISTS' ) ) ); $query->set( 'orderby', array( 'start_date_clause' => 'ASC', 'start_time_clause' => 'ASC' ) ); // } } }
关键注意点
- 确保
start_date用YYYY-MM-DD格式,start_time用HH:mm:ss格式,这样MySQL能正确按字符串排序。 - 如果需要包含没有这两个字段的文章,把
meta_query里的relation改成OR,或者去掉compare => 'EXISTS',但无字段的文章会根据排序方向排到最前或最后。 - 可根据需求将
ASC改为DESC,实现倒序排序。
内容的提问来源于stack exchange,提问作者Raven Rabbit
相关产品推荐
相关产品推荐

