工作日时段禁用WordPress插件更新问题求助
问题分析与解决方案
核心问题诊断
- wp-config.php中使用
add_filter无效:WordPress加载wp-config.php时,钩子系统尚未初始化,因此添加的auto_update_plugin过滤不会被触发,这是插件仍在中午更新的主要原因。 - 常量定义逻辑不完整:仅在工作时段定义常量,非工作时段常量未定义,导致
functions.php中访问时抛出"Undefined constant"错误。 - 时间比较存在歧义:直接用数字比较时间字符串(如
700vs0700)可能导致判断逻辑出错。
分步解决方案
1. 修正wp-config.php的常量定义
将原有条件定义常量的代码替换为以下内容,确保所有时段都定义常量,且时间比较更准确:
// 获取当前时间(24小时制字符串,格式为Hi,例:0700、1200、2200) $current_time = current_datetime()->format('Hi'); // 工作时段(7:00-22:00)禁用自动更新 $disable_updates = ($current_time > '0700' && $current_time < '2200'); // 全局禁用自动更新器(工作时段生效) define('AUTOMATIC_UPDATER_DISABLED', $disable_updates); // 禁用核心自动更新(全局生效,若需时段控制可移至functions.php) define('WP_AUTO_UPDATE_CORE', false); /* That's all, stop editing! Happy publishing. */
2. 在functions.php中添加时段控制的更新过滤
将插件/主题的自动更新过滤逻辑移至functions.php(钩子系统已初始化,过滤会生效):
// 按时段禁用插件自动更新 add_filter('auto_update_plugin', function($update, $plugin) { $current_time = current_datetime()->format('Hi'); $disable_updates = ($current_time > '0700' && $current_time < '2200'); return $disable_updates ? false : $update; }, 10, 2); // 可选:按时段禁用主题自动更新 add_filter('auto_update_theme', function($update, $theme) { $current_time = current_datetime()->format('Hi'); $disable_updates = ($current_time > '0700' && $current_time < '2200'); return $disable_updates ? false : $update; }, 10, 2); // 安全输出常量值到错误日志(避免未定义报错) add_action('init', function() { // 输出AUTOMATIC_UPDATER_DISABLED状态 error_log( defined('AUTOMATIC_UPDATER_DISABLED') ? 'AUTOMATIC_UPDATER_DISABLED: ' . (AUTOMATIC_UPDATER_DISABLED ? 'true' : 'false') : 'AUTOMATIC_UPDATER_DISABLED is not defined' ); // 输出WP_AUTO_UPDATE_CORE状态 error_log( defined('WP_AUTO_UPDATE_CORE') ? 'WP_AUTO_UPDATE_CORE: ' . (WP_AUTO_UPDATE_CORE ? 'true' : 'false') : 'WP_AUTO_UPDATE_CORE is not defined' ); });
3. 验证cron任务调度
WordPress自动更新依赖cron任务,可通过以下方式确认:
- 安装
WP Crontrol插件查看cron任务列表,找到wp_version_check、wp_update_plugins等任务的执行时间。 - 确保更新任务仅在非工作时段(22:00-次日7:00)触发,避免任务调度在工作时段执行。
补充说明
Wordfence显示"工作日时段更新已被禁用"是因为它仅检测了AUTOMATIC_UPDATER_DISABLED常量的设置,但未验证过滤钩子的有效性。修正上述代码后,过滤钩子会真正拦截工作时段的插件更新请求,避免维护页面和通知邮件的触发。
内容的提问来源于stack exchange,提问作者Johnny Craig
相关产品推荐
相关产品推荐

