You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:07:59