FriendLinks

/ 2026-09-18/0/ 编辑


FriendLinks

Typecho 友情链接插件,兼容 Typecho 1.3.x。

下载

功能

  • 友链申请:站点名称、URL、Logo、描述、反链检测页面。
  • 后台审核:待审核、已上线、已拒绝、已下线四种状态。
  • 反链检测:自定义检测页面,批量执行,连续失败达到阈值启用安全保护,自动下线可独立开关(默认关闭)。
  • 安全跳转:先展示中英文外链确认页,显示目标名称与地址,不自动跳转;访客点击“继续访问”后重新验证友链状态和目标- 地址,再记录点击并跳转。直接链接模式不受影响。
  • 访客记录:仅确认继续访问后记录点击,IP 默认脱敏保存,可在插件设置中启用完整 IP 模式,点击明细按保留期分批清理。
  • 外链安全:只允许 HTTP/HTTPS 公网地址,检测请求不跟随重定向,并拦截本机和内网地址。

截图

Typecho友情链接插件.webp

安装

  1. FriendLinks 目录放入 usr/plugins/
  2. 在 Typecho 后台启用“友情链接”。
  3. 打开插件设置,确认本站名称、本站链接和检测策略。
  4. 在“管理 → 友情链接”添加或审核友链。

激活时会自动创建 friend_linksfriend_link_clicks 两张表,表名会自动使用 Typecho 数据库前缀。

主题调用

在需要显示友链的位置加入:

<?php \TypechoPlugin\FriendLinks\Plugin::render(); ?>

在默认主题 sidebar.php 中显示带标题的侧边栏栏目,用下面代码替换简单调用:

<?php if (in_array('ShowFriendLinks', (array)$this->options->sidebarBlock, true)
    && class_exists('\TypechoPlugin\FriendLinks\Plugin')
    && \TypechoPlugin\FriendLinks\Plugin::getLinks()): ?>
    <section class="widget">
        <h3 class="widget-title"><?php _e('友情链接'); ?></h3>
        <?php \TypechoPlugin\FriendLinks\Plugin::render(); ?>
    </section>
<?php endif; ?>

修改 _e('友情链接') 中的文字即可自定义栏目标题。关闭开关或没有已上线友链时整个栏目隐藏。在主题 functions.phpthemeConfig() 中找到已有 sidebarBlock Checkbox,向第二个参数的选项数组加入 'ShowFriendLinks' => _t('显示友情链接')(已存在则不重复添加)。第三个参数的默认值数组可加入 'ShowFriendLinks',但已有配置仍需到“设置外观 → 侧边栏显示”勾选并保存。ShowCategory 只控制分类模块。此示例沿用栏目与标题样式,内容仍是插件的 div/a 结构;默认主题窄屏会隐藏侧边栏。独立页面的基础 render() 调用不受此开关控制。

输出申请表:

<?php \TypechoPlugin\FriendLinks\Plugin::renderApplyForm(); ?>

申请提交后插件会回到原页面,并在申请表上方显示成功或失败信息;主题可以直接用 CSS 定制 .friend-links-message-success.friend-links-message-error

后台“友情链接 → 访客记录”可以查看点击时间、友链名称、IP、User-Agent 和来源页,每页 20 条。插件设置支持完整/脱敏 IP 模式;开启完整模式后仅新增记录保存完整地址,切回脱敏模式只遮蔽显示,不改写历史数据。

如果主题需要完全自定义 HTML,可使用:

<?php foreach (\TypechoPlugin\FriendLinks\Plugin::getLinks() as $link): ?>
    <a href="<?php echo \TypechoPlugin\FriendLinks\Plugin::escape(\TypechoPlugin\FriendLinks\Plugin::linkUrl($link)); ?>">
        <?php echo \TypechoPlugin\FriendLinks\Plugin::escape($link['site_name']); ?>
    </a>
<?php endforeach; ?>

“插件设置 → 前台链接方式”支持安全跳转(默认,记录点击)和站点原链接(不记录点击)。render() 自动遵循设置;自定义模板请使用 linkUrl($link) 并转义输出。写死 actionUrl() 的模板仍使用跳转,需要按上例调整。

单条友链的展示选项

新增/编辑页面的“展示设置”支持是否添加 nofollow,以及单独选择链接方式(安全跳转、站点原链接、跟随全局)。新建友链及访客申请默认不添加 nofollow,链接方式跟随全局;已有友链保留已保存的选择。选择“跟随全局”可移除单条覆盖。直链不记录点击。nofollow 是提供给搜索引擎的链接提示,不保证具体排名效果。

render() 自动应用这些选项。自定义模板用 linkUrl($link) 获取地址,用 escape(linkRel($link)) 输出 rel 属性;后者始终保留 noopener,只根据设置增减 nofollow。新增字段为 nofollowlink_mode,后台首次打开时自动兼容升级,无需禁用插件。

友情链接分类

“分类配置”支持新增、编辑分类名称、调用标识、说明和权重,并可复制单分类调用代码。一个友链可属于多个分类;没有自定义分类的友链自动属于“默认分类”(保留标识 default)。删除分类不删除友链,解除全部关联后自动回到默认分类。旧友链无需改动,原 render() / getLinks() 调用继续输出全部已上线友链。

// 单分类;多分类是去重后的并集
\TypechoPlugin\FriendLinks\Plugin::render(['categories' => ['tech']]);
\TypechoPlugin\FriendLinks\Plugin::render(['categories' => ['tech', 'friends']]);
\TypechoPlugin\FriendLinks\Plugin::render(['categories' => ['default']]);
$links = \TypechoPlugin\FriendLinks\Plugin::getLinks(['categories' => ['tech', 'friends']]);

省略 categories 表示全部,显式 [] 或全部不存在的标识返回空列表。支持默认分类与其他分类混合选择。名称修改不影响代码,调用标识修改需同步调整模板。分类排序不改变友链自身的权重排序。

列表支持状态与分类组合筛选,以及本页批量追加、移出、替换分类。“替换”且不选分类表示归入默认分类。数据通过事务保存;分类表 friend_categories 和关联表 friend_link_categories 在首次进入分类相关页面时自动创建,无需重新启用插件。

“调用代码 Tab”支持默认列表、侧边栏栏目、自定义 HTML、获取数据和申请表五种方式,可选择分类、填写栏目标题并生成代码。侧边栏模式检查 ShowFriendLinks;独立页面模式不受外观开关控制。生成代码继续应用单条链接方式、nofollow 和反链保护。

分类集成检查:在站点根目录运行 php usr/plugins/FriendLinks/tests/CategoryTest.php,临时测试记录在事务中回滚,不请求外部站点;自增 ID 可能留下间隔。

定时任务

插件默认使用访问触发的轻量调度器。生产环境建议将插件设置页生成的 Cron URL 配置到服务器计划任务,例如:

*/10 * * * * curl -fsS "https://example.com/action/friend-links?do=cron&token=YOUR_TOKEN" >/dev/null

Cron Token 只应保存在服务器计划任务中,不要放在公开页面或提交到代码仓库。

设计说明

  • 申请开启“要求反链检测”时,检测失败的申请不会入库。
  • 自动通过只会在申请资料有效且检测成功时直接上线,否则进入待审核。
  • 自动下线只作用于已上线友链,并记录 auto_offline 标记;标记的友链继续参与复检,成功后清零失败计数并重新上线,恢复原链接方式、nofollow 和标题,移除删除线。手动下线或拒绝不会自动上线。旧版本的下线记录没有原因标记,需管理员确认后手动上线一次。
  • 悬停提示为“暂未检测到本站友链,已启用安全跳转。恢复本站友链并通过下次自动检测后,将恢复正常展示。”;实际恢复发生在下一次成功检测时,受检测间隔、每批数量和服务器任务执行影响(默认间隔 1 天)。
  • 关闭插件默认保留业务数据;如需删除,先在插件设置中明确选择“禁用时删除数据”。

列表底部“批量操作”仅针对当前页勾选友链,支持追加/移出/替换分类、审核通过(上线)、审核拒绝、下线及删除。替换时不选择分类即归入默认分类。批量删除需二次确认,并永久删除所选友链及关联点击记录。人工下线和拒绝不会被自动检测重新上线。

猜你喜欢