可说欢喜
Typecho

三种方法实现typecho免插件评论加@显示功能

by 温柔, 2021-11-04


第一种也是Elise在用的一种,具体来源因为时间久远实在找不到了一点印象都没有了,原理是通过替换输出前原始内容实现评论加@并且有链接 显示效果比较完美(此方法网络上是搜不到的)

方法一:

在function里面加上

/**
 * 输出评论回复内容,配合 commentAtContent($coid)一起使用
 */
function showCommentContent($coid)
{
    $db = Typecho_Db::get();
    $result = $db->fetchRow($db->select('text')->from('table.comments')->where('coid = ? AND status = ?', $coid, 'approved'));
    $text = $result['text'];
    $atStr = commentAtContent($coid);
    $_content = Markdown::convert($text);
    //<p>
    if ($atStr !== '') {
        $content = substr_replace($_content, $atStr, 0, 3);
    } else {
        $content = $_content;
    }

    echo $content;
}

/**
 * 评论回复加@ 
 */
function commentAtContent($coid)
{
    $db = Typecho_Db::get();
    $prow = $db->fetchRow($db->select('parent')->from('table.comments')->where('coid = ? AND status = ?', $coid, 'approved'));
    $parent = $prow['parent'];
    if ($parent != "0") {
        $arow = $db->fetchRow($db->select('author')->from('table.comments')
            ->where('coid = ? AND status = ?', $parent, 'approved'));
        $author = $arow['author'];
        $href = '<a  id="post-atcomm" href="#comment-' . $parent . '">@' . $author . '</a> ';
        return $href;
    } else {
        return '';
    }
}

使用方法: <?php $comments->content(); ?>替换为<?php showCommentContent($comments->coid); ?>

第二种作者(染念)只在functions.php添加了一个get_comment函数获取评论相关id剩下的在前台判断输出只有一个数据库操作性能较好,实测比第一种页面加载快10ms左右,缺点是没有回复楼层链接信息也没有第一种方法完美不能融合进评论文字里面属于独立显示信息。(因为兼容性问题Elise1.5准备换成此代码,还用了作者分享的私密评论功能所以为了感谢作者请了一杯杨枝甘露🤣)

方法二:
在function里面加上

function get_comment($coid){
    $db = Typecho_Db::get();
    return $db->fetchRow($db->select()
            ->from('table.comments')
            ->where('coid = ?', $coid)
            ->limit(1));
}

使用方法:

在comments.php内要显示的位置加上
<?php

  $pcomments = get_comment($comments->parent);
  if ($pcomments) echo '<code style="margin:0 .3em 0 0;padding:0;font-size:.9em;">@' . $pcomments['author'] . '</code>';
                ?>

第三种作者(小灯泡)在寻找方法二有没有其他代替方案的时候找到,小灯泡大佬分享的一种全新的方案代码原理和方法二类似代码看起来有些许冗余但是支持显示评论楼层链接。

方法三:

//获取评论的锚点链接
function get_comment_at($coid)
{
    $db   = Typecho_Db::get();
    $prow = $db->fetchRow($db->select('parent,status')->from('table.comments')
        ->where('coid = ?', $coid));//当前评论
    $mail = "";
    $parent = @$prow['parent'];
    if ($parent != "0") {//子评论
        $arow = $db->fetchRow($db->select('author,status,mail')->from('table.comments')
            ->where('coid = ?', $parent));//查询该条评论的父评论的信息
        @$author = @$arow['author'];//作者名称
        $mail = @$arow['mail'];
        if(@$author && $arow['status'] == "approved"){//父评论作者存在且父评论已经审核通过
            if (@$prow['status'] == "waiting"){
                echo '<p class="commentReview">(评论审核中))</p>';
            }
            echo '<a href="#comment-' . $parent . '">@' . $author . '</a>';
        }else{//父评论作者不存在或者父评论没有审核通过
            if (@$prow['status'] == "waiting"){
                echo '<p class="commentReview">(评论审核中))</p>';
            }else{
                echo '';
            }
        }

    } else {//母评论,无需输出锚点链接
        if (@$prow['status'] == "waiting"){
            echo '<p class="commentReview">(评论审核中))</p>';
        }else{
            echo '';
        }
    }
}

使用方法:

放在评论输出内容的地方前面

<?php $parentMail = get_comment_at($comments->coid)?><?php echo $parentMail;?>

网络上能搜索到的基本都是第三种,第二种还是我提取出来的 第一种可能也是提取的某个大佬的代码,好了上面是近年来收集到的三种免插件评论加@功能代码,感谢各位大佬的分享和无私奉献。

typecho
温柔

作者: 温柔

2024 © typecho & elise