如何自动每周切换WordPress餐厅周菜单短码ID(6周循环)?
当然可以实现!这里提供几种不同方案,你可以根据自己的技术能力和需求选择:
方案一:动态短码(推荐,无需定时任务)
这个方案不用反复修改页面内容,而是用自定义短码替代原来的静态短码,每次页面加载时自动计算当前周并显示对应菜单,完全自动循环,稳定性拉满。
操作步骤:
- 打开WordPress后台,进入「外观」→「主题文件编辑器」找到
functions.php(更安全的方式是用Code Snippets插件添加代码,避免主题更新丢失代码)。 - 粘贴以下代码,记得根据你的实际情况修改配置项:
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');
- 保存后,回到你的餐厅菜单页面,把原来的
[erm_menu_fullweek id=11910]替换为[dynamic_restaurant_menu]即可。 - 测试小技巧:临时把
$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(更可靠)
- 登录服务器控制面板(比如cPanel),找到「Cron Jobs」。
- 设置执行时间为每周一凌晨1点(比如时间规则填
0 1 * * 1)。 - 执行命令填写:
wget -q -O - https://你的网站域名/wp-cron.php?doing_wp_cron > /dev/null 2>&1
这样能确保任务按时运行,不受站点访问量影响。
方案三:无代码插件方案
如果你不想写代码,可以用插件组合实现:
- Code Snippets:用来添加方案一的动态短码代码,不用修改主题文件。
- WP Crontrol:可视化管理WordPress的Cron任务,方便设置定时更新(如果选方案二的话)。
或者试试Post Content Replace配合Advanced Cron Manager,可视化设置每周替换短码ID的规则,但这种方式需要手动维护替换规则,灵活性不如动态短码。
注意事项:
- 操作前记得备份页面内容和数据库,避免出错。
- 测试时可以手动触发函数(比如临时在
functions.php里加一行update_restaurant_menu_page();,访问站点后再删掉),确认更新是否正常。
内容的提问来源于stack exchange,提问作者Székely Tamás
相关产品推荐
相关产品推荐

