那个。。。我想说个事~~ 多说embed.js好像有更新,不过我的小本本年初的时候就摔碎了,细碎细碎的。。。而且我刚参加工作比较忙,虽然更新了,但是好像改动不是很大,所以大家先对付着看吧,技术宅们,看看本文也是能够分析出来的,等过段时间稳定下来,买了本子就开工,计划如下:

一、更新:本站多说相关的所有教程,如:回复可见、显UA、站长回复等等。。。
二、发布:修改版多说插件,一次性加入本站所涉及的所有功能,并且添加 回复等级!

所以请亲们再等等吧~~

经过俺多日不懈努力终于是实现了多说回复可见功能(类似Discuz论坛的回复可见),如果算上构思时间也有几个月了,多说官方工作人员小武哥哥特别清楚,因为为了实现这个功能他已经被俺折腾很久了,在此说声谢谢!还要感谢discuz站长群友子丫对本功能数组部分的帮助,因为俺也只是个初学者,用到一点研究一点,所以还没玩过数组,真是两眼一抹黑。。。还要感谢广大测试反馈问题的多说筒子们!

本教程实现的多说回复可见是后台判断隐藏显示,并非流传已久的Jquery前台hide。这个好处就是右键查看源代码也不会查看到隐藏的内容啦!

BUG修复记录 20150101:修复多说多页评论时,第一页评论之外的评论者无法再次查看隐藏内容,需要重新回复的BUG 20150124:多说官方更新,本文已针对新版多说作出适当修改 20150513:优化逻辑判断,修复functions.php添加代码后访问首页变慢的问题 20150526:这应该不算bug,是我一时大意忘了更新判断代码了,导致一个游客回复后,千千万万个游客都能看了[汗]感谢 @_Xiao憐_ 的反馈![嘻嘻]
温馨提示

多说回复可见是个研究很久的课题了,成果也是千奇百怪,这里提供一个验证是否有效的小技巧:

回复前,在带有隐藏内容的页面,点击鼠标右键,查看源代码,【注意不是审查元素】,然后找到有隐藏内容的位置,如果您放置隐藏内容的位置依然显示回复后可见等提示信息,并且不能查找到隐藏部分的内容,那么这才是真正的回复可见,本文所提供的就是全网首发的能够经得起考验的真正的回复可见!

目前发现有人拿着我的一小部分代码修改以后弄出些怪物发出来。。。比那些大神们曾经的做出来的还要复杂,不过效果却是一样的,右键查看源代码就全都露馅了,同样的功能,你用更多的代码,只能说明你水平不到家,自己都不去测试,还在到处炫耀,真是无语了。。。

有人可能觉得我说的这些话太狂了,但是我想说,你用我原创的东西去误导大众,我就是有责任去揭穿你的,每个人都有每个人的写法,我也有自己的独特标记,原创的东西和经我修改的东西,我都会做上标记,所以奉劝那些用我东西去误导别人的人,低调些吧,先学好技术再说!

我技术不好,所以从接触多说到现在研究了大半年才弄出来,这期间请教了很多人,还搭建了本地环境测试了无数次,失落过,放弃过,但是最后终于不负众望,拿出了令人满意的成果,所以请不要肢解我的成果,然后拿着那些肢解后的碎片去糊弄、欺骗他人!

下面开始具体操作:

一、请先将多说核心脚本embed.js本地化:多说社会化评论框核心脚本embed.js本地化方法

准备工作:为了方便您的观察与修改,建议您将embed.js脚本格式化,JavaScript/HTML格式化工具

二、搜索:function ct(),找到:

function ct(){
    return rt.data.user_id==0
}

2015年1月23日更新后(以下简称【更新后】)请搜索:function r(),找到:

function r() {
    return 0 == ot.data.user_id
}

改为:

function ct(){
    document.cookie="ssk_ds_user_id=" + rt.data.user_id;
    return rt.data.user_id == 0
}

【更新后】改为:

function r() {
    document.cookie="ssk_ds_user_id=" + ot.data.user_id;
    return 0 == ot.data.user_id
}

本处为登录判断函数,第三行的意思是:返回当前用户id是否为0,如果为0就是未登录的状态,如果不为0就是已经登陆多说;
所加的第二行的意思是:将当前用户id设置cookie,如果未登录,cookie值就是0,已登录cookie值就是当前用户的多说id。
这个cookie就是实现回复可见的关键所在!

三、接下来就是最关键的修改部分,找到主题的functions.php,在<?php下面加入如下代码:

//回复可见开始
error_reporting(0);
function reply($content){
/***** ↓↓↓ 20150513 ↓↓↓ *****/
if(is_single() && preg_match('/\[hide\]([\s\S]*?)\[\/hide\]/i', $content)){
    $stats = 'hide';
/***** 将以下代码
    if(preg_match_all('/\[hide\]([\s\S]*?)\[\/hide\]/i', $content, $hide_words)){
        $stats = 'hide';  
    }
改为下面代码*****/
    preg_match_all('/\[hide\]([\s\S]*?)\[\/hide\]/i', $content, $hide_words);
/***** ↑↑↑ 20150513 ↑↑↑ *****/

//print_r($hide_words);//请看下方说明(6)

//多说部分开始
    $thread_key= get_the_ID();//多说thread_key即为当前文章id
    $short_name="";//请在引号内填入您自己的short_name,获取方法见代码下方说明(1)
    $user_id=$_COOKIE['ssk_ds_user_id'];
    $url="http://api.duoshuo.com/threads/listPosts.json?thread_key=$thread_key&short_name=$short_name";//获取当前文章第一页已通过审核的评论的接口(多说公开接口),翻页再加参数&page=1/2/3
    $str = file_get_contents($url);//获取当前文章第一页已通过审核的评论的内容
    $data = json_decode($str,true);//将第一页评论信息json格式数据转换为数组格式
    $pages=$data['cursor']['pages'];//获取当前文章的评论总页数

//用户评论审核状态判断开始    
    $i=1;//评论初始页数 第1页
    while($i<=$pages){//页数最大值为上面获取到的总页数
        $all[$i]=$url."&page=".$i;//当前文章所有多说评论的每一页网址
        $strall = file_get_contents($all[$i]);
        $dataall = json_decode($strall,true);//取当前文章多说所有评论的内容

        foreach($dataall as $k => $v){
            if(is_array($v)){
                foreach($v as $k1 => $v1){
                    if($v1['author_id'] == $user_id){
                        $zhuangtai=$v1['status'];//获取当前多说登录用户在本文的评论内容的审核状态
                        break;
                    }
                }
            }    
        }
        if($zhuangtai=="approved"){
            break;//如果在第1页评论中,用户有通过审核的评论则停止判断
        }else{
            $i++;//如果第1页没有,则页数加1,再判断第2页,依次循环到评论最后一页
        }
    }
//用户评论审核状态判断结束

//获取多说 待审核 评论内容 开始
    $pendingurl="http://$short_name.duoshuo.com/api/posts/list.json?status=pending";//获取当前站点的所有待审核评论的接口(这是我自己抓的,多说官方未公开待审核接口)
    $pendingstr = file_get_contents($pendingurl);//获取待审核状态涉及到的所有内容,id、评论内容等等
    $pendingdata = json_decode($pendingstr,true);
    foreach($pendingdata as $pendingk => $pendingv){
        if(is_array($pendingv)){
            foreach($pendingv as $pendingk1 => $pendingv1){
                if(isset($pendingv1['author_id']) && $pendingv1['author_id'] == $user_id){
                    $pendingzhuangtai=$pendingv1['status'];
                    break;
                }
            }
        }    
    }
//获取多说 待审核 评论内容 结束
    if($user_id=="5034959"){//请将5034959换为您自己的多说id,获取方法见代码下方说明(2)
        $stats = 'show';//如果是站长直接显示
    }elseif($zhuangtai=="approved"&$user_id!="0"){//approved表示多说评论审核已通过,并且多说ID不为0,也就是必须为登录用户,而非游客状态
        $stats = 'show';//评论审核通过则显示
    }elseif($pendingzhuangtai=="pending"){//pending表示多说评论待审核
        $stats = 'pending';//此处用来切换提示信息,如果为pending待审核则提示信息为 已评论待审核 提示内容见下方,如果不需要审核,回复直接可见,将 pending 改为 show 即可!
    }elseif($user_id=="0"){//加强游客判断,如果用户ID为0,也就是未登录
        $stats = 'hide';//则隐藏
    }else{
        $stats = 'hide';//其他状态则不显示隐藏内容
    }

//多说部分结束

    if($stats == 'pending'){//如果已经评论则提示此消息
        $hide_notice = '<p style="text-align:center;border:1px dashed #FF9A9A;padding:8px;margin:10px auto;color:#FF6666;">温馨提示:您已<a class="scroll_b" title="评论本文" style="cursor: pointer;">评论本文</a>,请耐心等待管理员审核,审核通过后<a href="javascript:window.location.reload();" title="刷新">刷新本页</a>才能查看。</p>';
    }else{//否则提示此消息
/***** ↓↓↓ 20150513 ↓↓↓ *****/
//更新了提示信息
        $hide_notice = '<p style="text-align:center;border:1px dashed #FF9A9A;padding:8px;margin:10px auto;color:#FF6666;">温馨提示:此处内容需要<a class="scroll_b" title="评论本文" style="cursor: pointer;">评论本文</a>并通过审核后,<a href="javascript:window.location.reload();" title="刷新">刷新本页</a>才能查看,所以请勿使用垃圾评论!<br>如果您曾经回复过本文,请直接点击<a href="javascript:window.location.reload();" title="刷新">刷新本页</a>!<br><span style="font-weight: bold; color: #FF0004;">游客回复后依然不可见!</span></p>';
/***** ↑↑↑ 20150513 ↑↑↑ *****/
    }

    if($stats == 'show'){//如果$stats='show'则显示隐藏内容
        $content = str_replace($hide_words[0], $hide_words[0], $content);  
    }else{//否则将隐藏的内容替换为相应的提示信息
        $content = str_replace($hide_words[0], $hide_notice, $content);  
    }
}
    return $content;
}
add_filter('the_content', 'reply');

function hide($atts, $content=null, $code="") {
    $return = '<div class="showhide"><h4>本文隐藏的内容</h4>';
    $return .= $content;
    $return .= '</div>';
    return $return;
}
add_shortcode('hide' , 'hide' );
//回复可见结束

四、CSS代码

/*回复可见开始*/
.showhide{overflow:hidden;border:1px dashed #FF9A9A;margin:8px 0;padding:10px;zoom:1;}.showhide h4{margin-bottom:10px;color:#F66;font-size:12px;text-align:center;}
.tip{text-align:center!important;border:1px dashed #FF9A9A;padding:8px;margin:10px auto;color:#FF6666;}
/*回复可见结束*/

到此多说回复可见就修改完成了!

【说明】

(1)$short_name获取方法:登录多说官网http://duoshuo.com,点击右上角后台管理,点击需要修改的对应的网站,看到地址栏网址形如:http://ssk.duoshuo.com/admin/,则您的$short_name为.duoshuo前面的字符,我的就是ssk,所以:$short_name="ssk";

(2)获取多说id请点击下方您对本文回复内容前的头像即可看到本站的跳转提示页面,然后复制网址形如:

https://ssk.wiki/redirect.php?type=unknow&url=http://ssk.duoshuo.com/user-url/?user_id=5034959
user_id=后面的数字就是您的多说id!

(3)代码中//后面的部分为说明可删除

(4)使用方法:

【hide】这里放需要隐藏的内容,记得要把【】换为[]【/hide】

(5)如果您使用了supercache等缓存插件,请记得将有回复可见的文章设置为:禁止缓存

(6)如果您使用本教程后,未回复依然可以看到应隐藏的内容,请将//print_r($hide_words);前面的//去掉,然后刷新文章,本功能可以看到是否已经匹配到应该隐藏的内容,如果未匹配到,现初步判断为您当前使用的主题所造成的,请联系您的主题作者帮忙查看!如果您知道具体原因,也请留言告知!

想要实现多说回复可见的童鞋们快来回复吧~~

最后修改:2020 年 03 月 24 日 03 : 05 PM
如果觉得我的文章对你有用,请随意赞赏