Typecho 默认没有友情链接功能,虽然可以通过插件 Links 来实现,但我目前愣是没找到这个插件靠谱的出处(也或许是插件作者没发布到 Github 所以一直心理不想承认出处),所以,最后选择了通过短代码的方式来实现友情链接页面功能。
添加解析短代码函数
在主题 functions.php
文件中添加以下代码
/**
* 解析友情链接短代码
* 新格式:
* {blogroll}
* {名称,URL,描述}
* {名称2,URL2,描述2}
* {/blogroll}
* 不解析 <pre></pre> 内的短代码
*/
function oxcat_parseBlogrollShortcode($content) {
// 提取 <pre></pre> 标签内的内容,避免被解析
$prePattern = '/<pre>([\s\S]*?)<\/pre>/i';
$preMatches = [];
preg_match_all($prePattern, $content, $preMatches, PREG_SET_ORDER);
// 用占位符替换 <pre></pre> 内容
$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 '<div class="alert alert-warning">未定义友情链接</div>';
}
$html = '<div class="friend-links row mt-4">';
foreach ($links as $link) {
$html .= sprintf('
<div class="friend-link col-6 col-lg-4 mb-3" style="--bs-gutter-x: 1rem">
<a href="%s" target="_blank" rel="noopener nofollow" class="d-block p-3 border rounded text-decoration-none bg-secondary">
<strong>%s</strong>
<span class="d-block text-muted small mt-1">%s</span>
</a>
</div>',
htmlspecialchars($link['url'], ENT_QUOTES, 'UTF-8'),
htmlspecialchars($link['name'], ENT_QUOTES, 'UTF-8'),
htmlspecialchars($link['desc'], ENT_QUOTES, 'UTF-8')
);
}
$html .= '</div>';
return $html;
}, $content);
// 将占位符替换回原来的 <pre></pre> 内容
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}
自定义样式
根据需要自行添加友情链接显示样式,如果需要定义友情链接头像什么的,可自行添加参数。
插件冲突解决
如果使用了 MarkdownParse
插件,会强行解析链接,导致显示问题,可以通过去掉链接的 https:
来解决该问题,比如:
{blogroll}
{Typecho官网,//typecho.org,轻量级博客系统}
{牛猫笔记,//www.oxcat.com,似牛是猫}
{GitHub,//github.com,代码托管平台}
{/blogroll}
//
双斜杠一定要留着。
效果可查看本站 有链 页面。