• wordpress自定义评论模板
  • 雪峰 发表于 2016年8月9日 标签:
  • 虽说网站也没啥人,但是总觉得没有评论功能是不完整的。而且,wordpress自带的评论功能也不是很满意,在文章中使用自带的评论功能勉强还可以,毕竟需求不是很大。之所以想改造一下评论模板的结构,是因为想在说说下方直接进行评论,而关键的函数就是wordpress自带的comment_form()这个比较强大的模板函数。但是由于说说页面以及wordpress本身的特点和我本身的需求,造成了一些麻烦。

    1.

    comment_form()是用于单个文章(single)或页面(page),而说说表面上看起来是一条条简短的文字形成的展示,实际上却是自定义类型的文章,只是没有相应的single页面(当然也可以有,但是个人没那个需求),因此实际上是把多个single的内容简化凑在了一个页面进行展示,而且每条说说下面必然有一个回复框,因此造成了一个页面同时出现了多个comment_form。

    2.

    由于comment_form并非刻意让我们完全自定义form表单的结构,只是进行了一些局部的修改,因此页面中出现多个comment_form时,就会有多个相同的id出现,因此无法正常使用wordpress其自带的replytocom参数进行回复。

    3.

    由于使用wordpress自带的回复链接会进行跳转,会造成一些麻烦。就拿我的需求来说:我本身希望评论框正常情况下是隐藏的(display为none),点击评论才会出现,而进行跳转后,由于是新页面所以评论框被隐藏,而且同一页面有多条说说,因此该情况十分不友好。解决办法有两个,一个就是ajax,一个就是利用js动态改变form参数,而不是直接利用跳转页面获取新的comment_form。

    综上,由于我个人的需求以及对wordpress的comment_form结构的观察,特别是type为hidden的那些隐藏的input字段,找到了参数的变化规律。可以先看一下表单的结构:

    
    <form action="http://localhost/wp-comments-post.php" method="post" id="my_shuoshuo_comment" class="comment-form">
    <p class="logged-in-as"><a href="http://localhost/wp-admin/profile.php" aria-label="已登入为雪峰。编辑您的个人资料。">已登入为雪峰</a>。<a href="http://localhost/wp-login.php?action=logout&amp;redirect_to=http%3A%2F%2Flocalhost%2Farchives%2Fshuo%2F483&amp;_wpnonce=e304ead111">登出?</a></p><p class="comment-form-comment"><textarea id="shuo_comment" name="comment" aria-required="true"></textarea></p><input name="redirect_to" type="hidden" value="http://localhost/shuo&quot;"><p class="form-submit"><input name="submit" type="submit" id="my_shuoshuo_submit" class="submit" value="发表评论"> <input type="hidden" name="comment_post_ID" value="483" id="comment_post_ID">
    <input type="hidden" name="comment_parent" id="comment_parent" value="0">
    </p><input type="hidden" id="_wp_unfiltered_html_comment_disabled" name="_wp_unfiltered_html_comment" value="3d728d7e68"><script>(function(){if(window===window.parent){document.getElementById('_wp_unfiltered_html_comment_disabled').name='_wp_unfiltered_html_comment';}})();</script>
    </form>
    
    

    只需要仔细观察那些hidden的input字段所代表的意义即可,可以看出它们的id名称对应着一条comment的数据库字段。其实,如果不是点击回复其他人,这些代码根本不需要改变,主要是因为对其他人进行回复时才会进行跳转,而且所带的replytocom参数正是所进行回复评论的comment_ID,因此改变的参数只有一个,即comment_parent,只需对其进行相应修改即可轻松实现无跳转回复。

    嘛,虽然看似很简单,这也是我折腾了一会才弄出来的,不容易啊

    接下来就看看效果图吧:

    Baidu IME_2016-8-9_14-17-51

    后期还想加个表情功能,嗯,有空再折腾。

    可能会遇到的问题:

    即使有评论也不展示,只出现评论框:在这种自定义文章中,即使开启了允许评论而且该文章中有评论,使用get_comments()也不会也内容出现,解决的办法是在上面开启全局变量,设置参数开启:

    
    global $withcomments;//强制开启评论显示
    $withcomments = 1;
    if ( comments_open() || get_comments_number() ) {
    
    //代码
    
    }
    
    

    PS:获取单条评论信息时,无法用get_comments(ID=xxx)进行获取,只能使用get_comment(ID)进行获取相应内容,这也是小坑,问题解决办法来源:Get comment content by comment ID

    发表评论