找到
1
篇与
php优化
相关的结果
-
秒解再续前缘主题百度统计 “没有当前站点”:域名适配优化教程 秒解joe再续前缘百度统计“没有当前站点”:域名适配优化指南 很多使用joe再续前缘的站长,在百度统计配置中都会踩一个坑——明明API密钥、站点信息都填对了,前端却始终显示“没有当前站点”,导致统计数据无法正常加载。其实这不是配置问题,而是主题默认的域名匹配逻辑过于严格,今天就用一篇结构化教程,带大家一步到位解决问题! mjw77r4q.png图片 一、问题直击:你是否遇到这些现象? 主题后台已完整填写百度统计API的access_token、refresh_token、client_id等信息; 百度统计后台已添加当前站点,且状态正常; 前端页面统计区域显示“没有当前站点”,无任何统计数据展示; 排查后发现,百度统计API能正常返回站点列表,但主题无法匹配到当前域名。 二、问题根源:域名匹配逻辑的“严格性”陷阱 joe再续前缘中🐔🐔航写的默认的百度统计代码中,域名匹配采用“完全字符一致”规则,但实际场景中很容易出现格式差异: 百度统计API返回域名:www.xxx.com,主题JOE_DOMAIN常量:xxx.com; 百度统计API返回域名:http://xxx.com,主题JOE_DOMAIN常量:https://xxx.com; 域名大小写差异(如XXX.com与xxx.com)、端口号冗余等。 这些细微格式差异,会让主题代码判定“无匹配站点”,最终返回错误提示。核心需求是:让域名匹配具备“容错性”,忽略无关格式差异。 三、解决方案:3步替换优化代码 3.1 准备工作:明确文件路径 操作前先确认文件位置,避免找错文件: 服务器环境:宝塔面板(可视化操作更高效); 核心路径:网站根目录 → usr/themes/joe/(若主题文件夹重命名,对应修改); 目标文件:通常为 core/function.php 或 api.php(含“没有当前站点”文本的文件)。 3.2 第一步:定位目标代码块 登录宝塔面板,进入网站根目录,导航至 usr/themes/joe/; 点击文件管理器右上角“搜索”,输入关键词“没有当前站点”; 搜索结果中打开对应文件,找到 public static function baiduStatistic($self) 方法——该方法即为百度统计核心逻辑,从方法定义到结束大括号 } 为完整代码块。 3.3 第二步:替换为优化后代码 将以下优化后的代码,完整替换原 baiduStatistic 方法(删除原有代码,粘贴新代码): // 百度统计展示 public static function baiduStatistic($self) { $normalizeDomain = function ($domain) { $domain = preg_replace('/^https?:\/\//', '', $domain); $domain = preg_replace('/^www\./', '', $domain); return strtolower(trim($domain)); }; $statistics_config = \joe\baidu_statistic_config(); if (!is_array($statistics_config)) { return (array('access_token' => 'off')); } if (empty($statistics_config['access_token'])) { return (array('access_token' => 'off')); } $baidu_list = function () use ($statistics_config, $self) { $url = 'https://openapi.baidu.com/rest/2.0/tongji/config/getSiteList?access_token=' . $statistics_config['access_token']; $data = json_decode(file_get_contents($url), true); if (isset($data['error_code'])) { if ($data['error_code'] == 111) { $refresh_token = \network\http\get('http://openapi.baidu.com/oauth/2.0/token', [ 'grant_type' => 'refresh_token', 'refresh_token' => $statistics_config['refresh_token'], 'client_id' => $statistics_config['client_id'], 'client_secret' => $statistics_config['client_secret'] ])->toArray(); if (is_array($refresh_token)) { $theme_options = self::$options->__get('theme:' . THEME_NAME); if (empty($theme_options)) return (['message' => '请更新您的 access_token']); $backup_field = 'theme:' . THEME_NAME . '_backup'; $backup = Db::name('options')->where('name', $backup_field)->find(); if ($backup) { Db::name('options')->where('name', $backup_field)->update(['value' => $theme_options]); } else { Db::name('options')->where('name', $backup_field)->insert(['user' => '0', 'name' => $backup_field, 'value' => $theme_options]); } $theme_options = unserialize($theme_options); $theme_options['baidu_statistics'] = trim($refresh_token['access_token']) . "\r\n" . trim($refresh_token['refresh_token']) . "\r\n" . $statistics_config['client_id'] . "\r\n" . $statistics_config['client_secret']; $options_update = Db::name('options')->where('name', 'theme:' . THEME_NAME)->update(['value' => serialize($theme_options)]); if ($options_update) { $statistics_config['access_token'] = $refresh_token['access_token']; $new_url = 'https://openapi.baidu.com/rest/2.0/tongji/config/getSiteList?access_token=' . $statistics_config['access_token']; $new_data = json_decode(file_get_contents($new_url), true); return $new_data['list'] ?? []; } else { return ['message' => 'access_token 更新失败!']; } } else { return ['message' => '请更新您的 access_token']; } } return $data; } return $data['list']; }; $web_metrics = function ($site_id, $start_date, $end_date) use ($statistics_config) { $access_token = $statistics_config['access_token']; $url = "https://openapi.baidu.com/rest/2.0/tongji/report/getData?access_token=$access_token&site_id=$site_id&method=trend/time/a&start_date=$start_date&end_date=$end_date&metrics=avg_visit_time,ip_count,pv_count,&gran=day"; $data = \network\http\post($url)->toArray(); if (is_array($data)) { $data = $data['result']['sum'][0]; } else { $data = 0; } return $data; }; $list = $baidu_list(); if (!is_array($list)) { return $list; } for ($i = 0; $i < count($list); $i++) { if ($normalizeDomain($list[$i]['domain']) === $normalizeDomain(JOE_DOMAIN)) { $list = $list[$i]; break; } } if (is_array($list) && isset($list['domain'])) { $today = $web_metrics($list['site_id'], date('Ymd'), date('Ymd')); $yesterday = $web_metrics($list['site_id'], date('Ymd', strtotime("-1 days")), date('Ymd', strtotime("-1 days"))); $moon = $web_metrics($list['site_id'], date('Ym') . '01', date('Ymd')); $data = [ 'code' => 200, 'today' => $today, 'yesterday' => $yesterday, 'month' => $moon ]; return ($data); } else { return ['message' => '没有当前站点']; } }3.4 第三步:保存生效 点击文件编辑器右上角“保存”,清空浏览器缓存(Ctrl+Shift+Del),重新访问网站前端——“没有当前站点”提示消失,统计数据正常加载! mjw78h99.png图片 四、核心修改解析:域名标准化适配 优化代码的核心是新增“域名标准化”逻辑,让不同格式的域名统一规则后再匹配,关键代码如下: $normalizeDomain = function ($domain) { $domain = preg_replace('/^https?:\/\//', '', $domain); // 去除http/https协议头 $domain = preg_replace('/^www\./', '', $domain); // 去除www前缀 return strtolower(trim($domain)); // 转为小写+去除空格 }; 原逻辑:$list[$i]['domain'] == JOE_DOMAIN(完全字符匹配); 新逻辑:$normalizeDomain($list[$i]['domain']) === $normalizeDomain(JOE_DOMAIN)(标准化后匹配)。 示例:无论原域名是www.xxx.com“https://XXX.com”还是xxx.com:80,都会被标准化为xxx.com,确保匹配成功。 此外,代码还优化了access_token刷新后的逻辑——刷新成功后自动用新token重新获取站点列表,无需手动刷新页面,流程更顺畅。 五、常见问题排查 5.1 替换后仍显示“没有当前站点” 检查JOE_DOMAIN常量是否定义:需确保主题配置中已正确设置该常量,且不为空; 核实百度统计站点:登录百度统计后台,确认当前站点已添加,且域名与标准化后的JOE_DOMAIN一致; 检查文件路径:确认修改的是“含‘没有当前站点’文本”的目标文件,而非其他同名文件。 5.2 替换后出现语法错误 确保代码完整复制:未遗漏大括号、分号等语法符号; 检查PHP版本:确保服务器PHP版本≥8.0(joe再续前缘最低要求),避免语法兼容问题。 5.3 access_token频繁失效 核实refresh_token有效性:百度统计refresh_token有效期较长,若失效需重新申请API密钥; 检查client_id/client_secret:确保与百度统计开放平台配置一致,无拼写错误。 六、总结 joe再续前缘百度统计“没有当前站点”的问题,本质是域名格式匹配的“容错性不足”。通过新增域名标准化逻辑,能快速解决不同格式域名的匹配问题,且不影响原有统计功能和API交互流程。 整个操作仅需3步:定位文件→替换代码→保存生效,无需复杂配置,新手也能轻松完成。如果在操作中遇到其他问题,欢迎在评论区留言讨论~