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

安装
- 将
FriendLinks 目录放入 usr/plugins/。 - 在 Typecho 后台启用“友情链接”。
- 打开插件设置,确认本站名称、本站链接和检测策略。
- 在“管理 → 友情链接”添加或审核友链。
激活时会自动创建 friend_links 和 friend_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.php 的 themeConfig() 中找到已有 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。新增字段为 nofollow 和 link_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 天)。
- 关闭插件默认保留业务数据;如需删除,先在插件设置中明确选择“禁用时删除数据”。
列表底部“批量操作”仅针对当前页勾选友链,支持追加/移出/替换分类、审核通过(上线)、审核拒绝、下线及删除。替换时不选择分类即归入默认分类。批量删除需二次确认,并永久删除所选友链及关联点击记录。人工下线和拒绝不会被自动检测重新上线。