如何修改WordPress短代码仅显示随机即将到来的活动?
嘿,我帮你排查了这段代码的问题,核心是日期格式转换的语法错误导致筛选未来活动的条件失效,加上ORDER BY子句写法有误,才会随机显示所有活动。咱们一步步修正:
1. 修复日期格式转换(关键问题)
你在MySQL的STR_TO_DATE函数里用了PHP的日期格式符(j. M Y),但MySQL和PHP的日期格式规则不一样,这就导致MySQL没法正确解析你的活动日期,筛选条件自然起不了作用。需要把格式符换成MySQL对应的规则:
- PHP的
j(不带前导零的日)→ MySQL的%e - PHP的
M(三位月份缩写,比如Oct)→ MySQL的%b - PHP的
Y(四位年份)→ MySQL的%Y
2. 修正ORDER BY子句
原代码里ORDER BY STR_TO_DATE(...) RAND的写法是错误的,如果你要随机取一个未来活动,直接用ORDER BY RAND()即可,不需要额外的日期排序(如果想优先随机近期活动,可以再调整,但先满足基础需求)。
3. 额外优化:修正HTML结构和重置Post数据
原代码里的<a>标签闭合位置错误,而且用了setup_postdata($post)后最好重置全局Post变量,避免影响后续查询。
修改后的完整代码
<?php // Build a custom query to get random upcoming event $querystr = " SELECT wposts.* FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta WHERE wposts.ID = wpostmeta.post_id AND wpostmeta.meta_key = 'f21_event_startdate' AND STR_TO_DATE(wpostmeta.meta_value,'%e. %b %Y') >= CURDATE() AND wposts.post_status = 'publish' AND wposts.post_type = 'events' ORDER BY RAND() LIMIT 1 "; $events = $wpdb->get_results($querystr, OBJECT); if ($events): global $post; foreach ($events as $post): setup_postdata($post); ?> <div class="upcoming-event"> <?php the_field('f21_event_startdate'); ?> <h2><a style="color:#1e73be;" href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2> <div style="margin-top:10px; margin-bottom: 10px;"> <?php the_post_thumbnail('full'); ?> </div> <b><?php the_field('f21_event_sub_header'); ?></b> </div> <?php endforeach; wp_reset_postdata(); // 重置全局post变量,避免后续查询出错 else : ?> <li>Sorry, no events coming up.</li> <?php endif; ?>
补充说明
如果你的f21_event_startdate字段存储的是全拼月份(比如5. October 2024),那要把%b换成%M,确保日期能被正确解析。
内容的提问来源于stack exchange,提问作者Hans Dampf
相关产品推荐
相关产品推荐

