0
分享

Typecho 通过短代码无插件实现友情链接页面功能

网站代码 浏览 78 评论 0

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}

// 双斜杠一定要留着。

效果可查看本站 有链 页面。

评论

还没有评论,快来抢沙发吧!