秒解再续前缘主题百度统计 “没有当前站点”:域名适配优化教程

寒烟似雪
1月2日发布 /正在检测是否收录...

秒解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.comxxx.com)、端口号冗余等。

这些细微格式差异,会让主题代码判定“无匹配站点”,最终返回错误提示。核心需求是:让域名匹配具备“容错性”,忽略无关格式差异。

三、解决方案:3步替换优化代码

3.1 准备工作:明确文件路径

操作前先确认文件位置,避免找错文件:

  • 服务器环境:宝塔面板(可视化操作更高效);
  • 核心路径:网站根目录 → usr/themes/joe/(若主题文件夹重命名,对应修改);
  • 目标文件:通常为 core/function.phpapi.php(含“没有当前站点”文本的文件)。

3.2 第一步:定位目标代码块

  1. 登录宝塔面板,进入网站根目录,导航至 usr/themes/joe/
  2. 点击文件管理器右上角“搜索”,输入关键词“没有当前站点”;
  3. 搜索结果中打开对应文件,找到 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.comhttps://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步:定位文件→替换代码→保存生效,无需复杂配置,新手也能轻松完成。如果在操作中遇到其他问题,欢迎在评论区留言讨论~

© 版权声明
THE END
喜欢就支持一下吧
点赞 0 分享 收藏
评论 抢沙发
OωO
取消
SSL