$errno, 'error_message' => $errstr, 'error_file' => $errfile, 'error_line' => $errline, 'timestamp' => date('Y-m-d H:i:s'), 'request_uri' => isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : 'unknown', 'user_agent' => isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'unknown' ); // 记录错误日志 nenghui_log_foreach_error($error_info); // 如果是调试模式,显示详细信息 if (WP_DEBUG && WP_DEBUG_DISPLAY) { echo '
'; echo 'Foreach Error Detected:
'; echo 'File: ' . esc_html($errfile) . '
'; echo 'Line: ' . esc_html($errline) . '
'; echo 'Message: ' . esc_html($errstr) . '
'; echo '
'; } } // 返回 false 让 PHP 继续处理错误 return false; } /** * 记录 foreach 错误到日志文件 */ function nenghui_log_foreach_error($error_info) { $upload_dir = wp_upload_dir(); // 确保 $upload_dir 是数组且包含 basedir if (!is_array($upload_dir) || !isset($upload_dir['basedir'])) { return; } $log_file = $upload_dir['basedir'] . '/foreach_errors.log'; $log_entry = sprintf( "[%s] FOREACH ERROR: %s in %s on line %d (URI: %s)\n", $error_info['timestamp'], $error_info['error_message'], $error_info['error_file'], $error_info['error_line'], $error_info['request_uri'] ); // 确保日志文件安全 if (!file_exists($log_file)) { file_put_contents($log_file, "# Foreach Errors Log\n"); chmod($log_file, 0600); } file_put_contents($log_file, $log_entry, FILE_APPEND | LOCK_EX); } /** * 安全的 foreach 包装函数 * 确保传入的变量是可迭代的数组 */ function nenghui_safe_foreach($array, $callback) { if (!is_array($array) && !($array instanceof Traversable)) { nenghui_log_foreach_error(array( 'error_type' => E_WARNING, 'error_message' => 'nenghui_safe_foreach: Invalid argument supplied, expected array or Traversable', 'error_file' => __FILE__, 'error_line' => __LINE__, 'timestamp' => date('Y-m-d H:i:s'), 'request_uri' => isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : 'unknown', 'user_agent' => 'nenghui_safe_foreach' )); return false; } if (is_callable($callback)) { foreach ($array as $key => $value) { call_user_func($callback, $value, $key); } return true; } return false; } /** * 修复常见的 WordPress 全局变量问题 * 确保关键的全局变量是正确的数组格式 */ function nenghui_fix_wp_globals() { global $wp_filter, $wp_actions, $wp_current_filter, $wp_meta_boxes, $wp_settings_sections, $wp_settings_fields; // 确保 $wp_filter 是数组 if (!is_array($wp_filter)) { $wp_filter = array(); nenghui_log_foreach_error(array( 'error_type' => E_WARNING, 'error_message' => 'Fixed $wp_filter global variable - was not array', 'error_file' => __FILE__, 'error_line' => __LINE__, 'timestamp' => date('Y-m-d H:i:s'), 'request_uri' => isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : 'unknown', 'user_agent' => 'nenghui_fix_wp_globals' )); } // 确保 $wp_actions 是数组 if (!is_array($wp_actions)) { $wp_actions = array(); nenghui_log_foreach_error(array( 'error_type' => E_WARNING, 'error_message' => 'Fixed $wp_actions global variable - was not array', 'error_file' => __FILE__, 'error_line' => __LINE__, 'timestamp' => date('Y-m-d H:i:s'), 'request_uri' => isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : 'unknown', 'user_agent' => 'nenghui_fix_wp_globals' )); } // 确保 $wp_current_filter 是数组 if (!is_array($wp_current_filter)) { $wp_current_filter = array(); nenghui_log_foreach_error(array( 'error_type' => E_WARNING, 'error_message' => 'Fixed $wp_current_filter global variable - was not array', 'error_file' => __FILE__, 'error_line' => __LINE__, 'timestamp' => date('Y-m-d H:i:s'), 'request_uri' => isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : 'unknown', 'user_agent' => 'nenghui_fix_wp_globals' )); } // 确保 $wp_meta_boxes 是数组 if (!is_array($wp_meta_boxes)) { $wp_meta_boxes = array(); nenghui_log_foreach_error(array( 'error_type' => E_WARNING, 'error_message' => 'Fixed $wp_meta_boxes global variable - was not array', 'error_file' => __FILE__, 'error_line' => __LINE__, 'timestamp' => date('Y-m-d H:i:s'), 'request_uri' => isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : 'unknown', 'user_agent' => 'nenghui_fix_wp_globals' )); } // 确保 $wp_settings_sections 是数组 if (!is_array($wp_settings_sections)) { $wp_settings_sections = array(); nenghui_log_foreach_error(array( 'error_type' => E_WARNING, 'error_message' => 'Fixed $wp_settings_sections global variable - was not array', 'error_file' => __FILE__, 'error_line' => __LINE__, 'timestamp' => date('Y-m-d H:i:s'), 'request_uri' => isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : 'unknown', 'user_agent' => 'nenghui_fix_wp_globals' )); } // 确保 $wp_settings_fields 是数组 if (!is_array($wp_settings_fields)) { $wp_settings_fields = array(); nenghui_log_foreach_error(array( 'error_type' => E_WARNING, 'error_message' => 'Fixed $wp_settings_fields global variable - was not array', 'error_file' => __FILE__, 'error_line' => __LINE__, 'timestamp' => date('Y-m-d H:i:s'), 'request_uri' => isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : 'unknown', 'user_agent' => 'nenghui_fix_wp_globals' )); } } /** * 在插件加载前修复全局变量 */ function nenghui_pre_plugin_fix() { nenghui_fix_wp_globals(); } /** * 检查和修复主题选项中的数组 */ function nenghui_fix_theme_options() { // 检查常用的主题选项 $options_to_check = array( 'banner_images', 'futures_items', 'news_posts', 'menu_items', 'tab_items' ); foreach ($options_to_check as $option) { $value = get_theme_mod($option); if ($value !== false && !is_array($value)) { // 尝试将非数组值转换为数组 if (is_string($value) && !empty($value)) { // 如果是 JSON 字符串,尝试解码 $decoded = json_decode($value, true); if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) { set_theme_mod($option, $decoded); } else { // 否则包装为数组 set_theme_mod($option, array($value)); } } else { // 设置为空数组 set_theme_mod($option, array()); } } } } /** * 专门修复 plugin.php 第 1853 行的 foreach 错误 * 这个错误通常发生在钩子系统中的数组操作 */ function nenghui_fix_plugin_foreach_error() { global $wp_filter; // 确保 $wp_filter 的每个钩子都是正确的数组结构 if (is_array($wp_filter)) { foreach ($wp_filter as $hook_name => $hook_callbacks) { if (!is_object($hook_callbacks) && !is_array($hook_callbacks)) { // 如果钩子回调不是对象或数组,重置为空的 WP_Hook 对象 $wp_filter[$hook_name] = new WP_Hook(); nenghui_log_foreach_error(array( 'error_type' => E_WARNING, 'error_message' => "Fixed invalid hook callbacks for '$hook_name' - was " . gettype($hook_callbacks), 'error_file' => __FILE__, 'error_line' => __LINE__, 'timestamp' => date('Y-m-d H:i:s'), 'request_uri' => isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : 'unknown', 'user_agent' => 'nenghui_fix_plugin_foreach_error' )); } } } } /** * 在最早期修复全局变量 * 确保在任何插件或主题代码执行前修复问题 */ function nenghui_early_fix() { nenghui_fix_wp_globals(); nenghui_fix_plugin_foreach_error(); } /** * 立即修复全局变量 - 在文件加载时就执行 * 这确保在任何WordPress函数调用前就修复了全局变量 */ function nenghui_immediate_fix() { global $menu, $submenu, $wp_filter, $wp_actions, $wp_current_filter; // 立即确保关键全局变量是数组 if (!is_array($menu)) { $menu = array(); } if (!is_array($submenu)) { $submenu = array(); } if (!is_array($wp_filter)) { $wp_filter = array(); } if (!is_array($wp_actions)) { $wp_actions = array(); } if (!is_array($wp_current_filter)) { $wp_current_filter = array(); } } // 立即执行修复 nenghui_immediate_fix(); // 注册错误处理器(仅在调试模式下) if (WP_DEBUG) { set_error_handler('nenghui_error_handler', E_WARNING | E_NOTICE); } // 在最早期修复全局变量 - 在 muplugins_loaded 之前 add_action('muplugins_loaded', 'nenghui_early_fix', 1); // 在插件加载前再次修复 add_action('plugins_loaded', 'nenghui_pre_plugin_fix', 1); // 在主题设置后修复主题选项 add_action('after_setup_theme', 'nenghui_fix_theme_options', 1); // 在管理页面初始化前修复 add_action('admin_init', 'nenghui_early_fix', 1); // 在前端初始化前修复 add_action('init', 'nenghui_early_fix', 1); // 在admin_menu动作前确保菜单变量正确 add_action('admin_menu', 'nenghui_immediate_fix', 1); ?>