按自定义日期字段排序WordPress文章求助
解决WordPress按d/m/Y格式自定义日期字段排序文章的问题
你的核心问题是data_evento字段是d/m/Y字符串格式,直接按字符串排序会导致日期逻辑错误,必须先将其转换为MySQL可识别的标准日期格式再排序。以下是两种可行方案:
方案一:通过钩子修改主查询(推荐,无需改动模板循环)
在主题的functions.php文件中添加以下代码,它会自动修改首页的主查询排序逻辑:
function custom_sort_by_data_evento( $query ) { // 仅对前台主查询生效,避免影响后台或其他自定义查询 if ( $query->is_main_query() && ! is_admin() && is_home() ) { $query->set( 'meta_key', 'data_evento' ); $query->set( 'meta_query', array( array( 'key' => 'data_evento', 'compare' => 'EXISTS', ) )); // 过滤排序规则,将d/m/Y字符串转成标准日期后倒序 add_filter( 'posts_orderby', 'custom_orderby_data_evento' ); } } add_action( 'pre_get_posts', 'custom_sort_by_data_evento' ); function custom_orderby_data_evento( $orderby ) { global $wpdb; return "STR_TO_DATE({$wpdb->postmeta}.meta_value, '%d/%m/%Y') DESC"; }
添加后,你原来的模板循环代码不需要做任何改动,即可实现按data_evento从新到旧排序。
方案二:在模板中自定义查询(适合仅修改当前页面)
如果你只需要在这个特定模板页面修改排序,可以直接替换原循环代码为以下内容:
<?php $args = array( 'post_type' => get_post_type(), // 自动匹配当前文章类型 'meta_key' => 'data_evento', 'meta_query' => array( array( 'key' => 'data_evento', 'compare' => 'EXISTS', ) ), ); $custom_query = new WP_Query( $args ); // 注入日期转换排序逻辑 add_filter( 'posts_orderby', function( $orderby ) use ( $wpdb ) { return "STR_TO_DATE({$wpdb->postmeta}.meta_value, '%d/%m/%Y') DESC"; } ); if ( $custom_query->have_posts() ) : while ( $custom_query->have_posts() ) : $custom_query->the_post(); ?> <div class="col"> <?php get_template_part( 'template-parts/content-home', get_post_type() ); ?> </div> <?php endwhile; wp_reset_postdata(); // 重置查询上下文,避免后续代码出错 else : echo '<p>暂无相关文章</p>'; endif; ?>
关键说明
- 必须使用
STR_TO_DATE函数将d/m/Y格式的字符串转换为MySQL标准日期格式,否则字符串排序会出现逻辑错误(比如10/01/2024会被认为比09/12/2024新)。 - 两种方案都添加了
meta_query确保只查询存在data_evento字段的文章,你可以根据需求移除这个条件。
内容的提问来源于stack exchange,提问作者Riccardo Vescovo
相关产品推荐
相关产品推荐

