牛猫笔记 - 友情链接
type: channel
link: https://www.oxcat.com/tag/%E5%8F%8B%E6%83%85%E9%93%BE%E6%8E%A5/
items: Typecho 通过短代码无插件实现友情链接页面功能

Typecho 通过短代码无插件实现友情链接页面功能
type: item
date: 2025-05-17T14:00:00+00:00
description: Typecho 默认没有友情链接功能，虽然可以通过插件 Links 来实现，但我目前愣是没找到这个插件靠谱的出处（也或许是插件作者没发布到 Github 所以一直心理不想承认出处），所以，最后选择了通过短代码的方式来实现友情链接页面功能。 添加解析短代码函数 在主题 functions.php 文件中添加以下代码 /** * 解析友情链接短代码 * 新格式： * {blogroll} * {名称,URL,描述} * {名称2,URL2,描述2} * {/blogroll} * 不解析 内的短代码 */ function oxcat_parseBlogrollShortcode($content) { // 提取 标签内的内容，避免被解析 $prePattern = '/ ([\s\S]*?)<\/pre>/i'; $preMatches = []; preg_match_all($prePattern, $content, $preMatches, PREG_SET_ORDER); // 用占位符替换 内容 $placeholders = []; foreach ($preMatches as $index => $match) { $placeholder = "###PRE_BLOCK_{$index}###"; $placeholders[$placeholder] = $match[0]; $content = str_replace($match[0], $placeholder, $content); } // 匹配 {blogroll} 和 {/blogroll} 之间的内容 $pattern = '/\{blogroll\}([\s\S]*?)\{\/blogroll\}/is'; $content = preg_replace_callback($pattern, function ($matches) { $linksText = trim($matches[1]); $links = []; // 匹配每一行的 {名称,URL,描述} preg_match_all('/\{([^,]+),([^,]+),([^\}]+)\}/', $linksText, $linkMatches, PREG_SET_ORDER); foreach ($linkMatches as $link) { $links[] = [ 'name' => trim($link[1]), 'url' => trim($link[2]), 'desc' => trim($link[3]) ]; } if (empty($links)) { return ' 未定义友情链接 '; } $html = ' '; foreach ($links as $link) { $html .= sprintf(' %s %s ', htmlspecialchars($link['url'], ENT_QUOTES, 'UTF-8'), htmlspecialchars($link['name'], ENT_QUOTES, 'UTF-8'), htmlspecialchars($link['desc'], ENT_QUOTES, 'UTF-8') ); } $html .= ' '; return $html; }, $content); // 将占位符替换回原来的 内容 foreach ($placeholders as $placeholder => $originalContent) { $content = str_replace($placeholder, $originalContent, $content); } return $content; } 友情链接页面模板 主题文件夹下新建个友情链接模板，关键的是解析页面内容输出的部分修改为 echo oxcat_parseBlogrollShortcode($this->content); 新建友情链接页面并添加友链 Typecho 后台新建友情链接的独立页面，然后选择该页面的自定义模板为上一步建立的友情链接模板 在有情链接页面的编辑框中按以下格式输入友链信息，友情链接页面就会自动解析。 {blogroll} {Typecho官网,https://typecho.org,轻量级博客系统} {牛猫笔记,https://www.oxcat.com,似牛是猫} {GitHub,https://github.com,代码托管平台} {/blogroll} 自定义样式 根据需要自行添加友情链接显示样式，如果需要定义友情链接头像什么的，可自行添加参数。 插件冲突解决 如果使用了 MarkdownPars…