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

如何自动每周切换WordPress餐厅周菜单短码ID(6周循环)?

当然可以实现!这里提供几种不同方案,你可以根据自己的技术能力和需求选择:

方案一:动态短码(推荐,无需定时任务)

这个方案不用反复修改页面内容,而是用自定义短码替代原来的静态短码,每次页面加载时自动计算当前周并显示对应菜单,完全自动循环,稳定性拉满。

操作步骤:

  1. 打开WordPress后台,进入「外观」→「主题文件编辑器」找到functions.php(更安全的方式是用Code Snippets插件添加代码,避免主题更新丢失代码)。
  2. 粘贴以下代码,记得根据你的实际情况修改配置项:
function dynamic_restaurant_menu_shortcode() {
    // 替换为你的餐厅周起始日期(比如第一周的周一)
    $start_date = strtotime('2024-01-01');
    $current_date = strtotime('today');
    
    // 计算从起始日到当前日的周数(每周以周一为起点,可按需调整)
    $weeks_since_start = floor(($current_date - $start_date) / 604800); // 604800秒 = 1周
    
    // 6周循环,取模后得到0-5,对应第1-6周
    $current_cycle_week = $weeks_since_start % 6;
    
    // 替换成你实际的6周菜单ID列表
    $menu_ids = [
        11910,  // 第1周ID
        12345,  // 第2周ID
        67890,  // 第3周ID
        11223,  // 第4周ID
        44556,  // 第5周ID
        77889   // 第6周ID
    ];
    
    // 获取当前周对应的菜单ID,输出原插件短码
    $current_menu_id = $menu_ids[$current_cycle_week];
    return do_shortcode("[erm_menu_fullweek id={$current_menu_id}]");
}
add_shortcode('dynamic_restaurant_menu', 'dynamic_restaurant_menu_shortcode');
  1. 保存后,回到你的餐厅菜单页面,把原来的[erm_menu_fullweek id=11910]替换为[dynamic_restaurant_menu]即可。
  2. 测试小技巧:临时把$current_date改成strtotime('+1 week'),刷新页面就能看到下一周的菜单是否正常显示,没问题后改回strtotime('today')。

这个方案的优势是完全依赖日期计算,不用依赖定时任务,哪怕服务器Cron出问题,页面也能正确显示当前周的菜单,后续维护只需要更新$menu_ids里的ID就行。

方案二:PHP+Cron定时更新页面内容

如果你坚持要定时修改页面里的短码ID,可以用这个方案,通过WordPress内置Cron或服务器Cron触发更新。

步骤1:编写更新页面的PHP函数

同样在functions.php或Code Snippets里添加以下代码:

function update_restaurant_menu_page() {
    // 以下配置和方案一一致,按需修改
    $start_date = strtotime('2024-01-01');
    $current_date = strtotime('today');
    $weeks_since_start = floor(($current_date - $start_date) / 604800);
    $current_cycle_week = $weeks_since_start % 6;
    $menu_ids = [11910, 12345, 67890, 11223, 44556, 77889];
    $current_menu_id = $menu_ids[$current_cycle_week];
    
    // 替换为你的菜单页面ID
    $page_id = 123;
    
    $page = get_post($page_id);
    if (!$page || $page->post_type !== 'page') {
        error_log('餐厅菜单页面未找到');
        return;
    }
    
    // 替换页面内容中的短码ID
    $new_content = preg_replace('/\[erm_menu_fullweek id=\d+\]/', "[erm_menu_fullweek id={$current_menu_id}]", $page->post_content);
    
    // 更新页面
    wp_update_post([
        'ID' => $page_id,
        'post_content' => $new_content
    ]);
    
    error_log('菜单页面已更新为周' . ($current_cycle_week + 1) . '的ID: ' . $current_menu_id);
}

步骤2:设置定时任务

方法A:WordPress内置Cron(适合访问量较高的站点)

在functions.php里添加代码,注册每周一凌晨1点运行的任务:

if (!wp_next_scheduled('update_restaurant_menu_cron')) {
    wp_schedule_event(strtotime('next Monday 01:00'), 'weekly', 'update_restaurant_menu_cron');
}
add_action('update_restaurant_menu_cron', 'update_restaurant_menu_page');

注意:WordPress的Cron依赖用户访问触发,如果站点访问量低,可能会导致任务延迟。

方法B:服务器Cron(更可靠)

  1. 登录服务器控制面板(比如cPanel),找到「Cron Jobs」。
  2. 设置执行时间为每周一凌晨1点(比如时间规则填0 1 * * 1)。
  3. 执行命令填写:
wget -q -O - https://你的网站域名/wp-cron.php?doing_wp_cron > /dev/null 2>&1

这样能确保任务按时运行,不受站点访问量影响。

方案三:无代码插件方案

如果你不想写代码,可以用插件组合实现:

  1. Code Snippets:用来添加方案一的动态短码代码,不用修改主题文件。
  2. WP Crontrol:可视化管理WordPress的Cron任务,方便设置定时更新(如果选方案二的话)。
    或者试试Post Content Replace配合Advanced Cron Manager,可视化设置每周替换短码ID的规则,但这种方式需要手动维护替换规则,灵活性不如动态短码。

注意事项:

  • 操作前记得备份页面内容和数据库,避免出错。
  • 测试时可以手动触发函数(比如临时在functions.php里加一行update_restaurant_menu_page();,访问站点后再删掉),确认更新是否正常。

内容的提问来源于stack exchange,提问作者Székely Tamás

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:36:07