织梦评论调用头像昵称标签

原生标签局限性分析

织梦默认的{dede:feedback}标签只能调用评论内容、评论人用户名(username字段),但无法直接调用会员头像和昵称。原因在于评论表dede_feedback与会员表dede_member没有做关联查询,标签底层SQL只取了feedback表字段。

常见的错误做法是在模板里直接写{dede:field.userid/},结果输出为空。正确的做法是改用自定义标签或扩展SQL。

方案一:修改feedback标签SQL

打开/include/taglib/feedback.lib.php,找到查询语句:

$query="SELECT fb.*,mb.userid,mb.face,mb.uname
          FROM dede_feedback fb
          LEFT JOIN dede_member mb ON fb.username=mb.userid
          WHERE fb.aid='$aid'
          ORDER BY fb.id DESC";

通过LEFT JOIN把会员表的face(头像字段)和uname(昵称)关联进来。修改后模板里即可用:

{dede:feedback row='10'}
 <img src="[field:face function="empty([field:face/],'/images/defaultpic.gif')"/]" alt="[field:uname/]">
 <span>[field:uname function="empty(@me,[field:username/])"/]</span>
 <p>[field:msg/]</p>
{/dede:feedback}

说明:face字段存的是头像相对路径,为空时显示默认头像;uname为空时回退显示username

方案二:自定义函数调用

若不想改标签文件,可在/include/extend.func.php中新增函数,根据用户名反查头像:

function GetMemberFace($username){
    global $dsql;
    $row=$dsql->GetOne("SELECT face FROM dede_member WHERE userid='$username'");
    if($row && $row['face']){
        return $row['face'];
    }
    return '/images/defaultpic.gif';
}

function GetMemberUname($username){
    global $dsql;
    $row=$dsql->GetOne("SELECT uname FROM dede_member WHERE userid='$username'");
    return $row['uname'] ? $row['uname'] : $username;
}

模板里调用方式:

<img src="{dede:field.username function=GetMemberFace(@me)/}" alt="">
<b>{dede:field.username function=GetMemberUname(@me)/}</b>
extend.func.php中的函数名不能与系统函数重名,且必须用global $dsql引入数据库对象。

方案三:SQL标签直接查

对于文章页评论,可直接用{dede:sql}标签:

{dede:sql sql="SELECT fb.*,mb.face,mb.uname
FROM dede_feedback fb
LEFT JOIN dede_member mb ON fb.username=mb.userid
WHERE fb.aid=~aid~ AND fb.ischeck=1
ORDER BY fb.id DESC LIMIT 10"}
<li>
<img src="[field:face/]">
<span>[field:uname/]</span>
<p>[field:msg/]</p>
</li>
{/dede:sql}

其中~aid~是当前文档ID占位符,ischeck=1过滤已审核评论。

头像路径处理细节

路径前缀问题

会员上传头像时,face字段存储的是相对路径如/uploads/userup/2024/01/xxx.jpg,但旧版织梦可能存为userup/2024/xxx.jpg缺少前导斜杠。建议在函数中统一处理:

function FormatFace($face){
    if(empty($face)) return '/images/defaultpic.gif';
    if(strpos($face,'http')===0) return $face;
    if(strpos($face,'/')!==0) $face='/'.$face;
    return $face;
}

游客评论处理

未登录用户评论时username为游客填写的昵称,JOIN会员表查不到记录,face返回null。需在模板层做空值判断,统一显示默认头像。

缓存优化提示

若评论量大,每条评论都查一次会员表会造成N+1查询问题。方案一的JOIN写法性能最优,推荐优先采用。另外可在feedback.lib.php中给usernameuserid字段加索引,加速关联查询。

落地建议

实施前先在测试环境验证JOIN后的SQL执行计划,确认dede_member.userid有索引。上线后留意会员头像是否存在大量外链导致加载缓慢,必要时将第三方头像下载到本地做CDN加速,提升评论列表的渲染体验。