首页 > 分享发现 > wordpress 评论加载过程分析

wordpress 评论加载过程分析

之前说过 wordpress 的评论排序改造过程,可以看这里:自定义函数实现:wordpress 显示最新评论,且最近一页评论占满

这里主要是记录下 wordpress 评论的加载过程,这里我们以某篇日志下的评论为例子。

首先一篇日志模板中,在需要评论加载的地方,一般会出现如下代码:


if ( comments_open() || get_comments_number() ) ://如果评论开放,且有评论的话就继续加载评论模板

 comments_template(); //从这里开始进入 comments_template() 加载过程

endif;

 

comments_template()执行简介

comments_template 函数位于 wp-includes\comment-template.php 下,官网关于这个函数的描述链接:comments_template

这个函数里有两个可选参数 $file 和 $separate_comments。执行的时候首先会初始化一些全局变量以及一个 $comment_args 局部变量,

//$comments_args 举例,主要是含有一些辅助后期用来数据库查询的条件,例如排列顺序,是否启用嵌套,每页评论数等等
‌array (
  'orderby' => 'comment_date_gmt',
  'order' => 'ASC',
  'status' => 'approve',
  'post_id' => 20,
  'no_found_rows' => false,
  'update_comment_meta_cache' => false,
  'hierarchical' => 'threaded',
  'include_unapproved' => 
  array (
    0 => 'mainadd2@gmail.com',
  ),
  'number' => 7,
  'offset' => 23.0,
)

 

这个局部变量会被用于生成一个  $comment_query 实例。在被使用之前,wordpress 给我们预留了一个 过滤器的位置用来修改这个变量,之前有日志提到利用函数修改评论的排列顺序,就是利用这里的这个 filters(过滤器) 来达到目的地。

 

使用上面例子中的查询条件,我们能够得到一个含有 7 条评论的 $comment_query 实例,即 ‌‌count($comment_query->comments) 为 7。每条评论就是一个对象。包含了评论id,评论内容等内容。这时候查出来的 comments 如果内部存在 父子关系,需要经过一个 flat 过程,就是把子级和父级评论都放到同一级别下,组成一个comments_flat 数组。处理过的这个数组被交给一个 $wp_query -> comments全局对象。

 

在上面介绍comments_template() 的时候有提到有个 $file 变量,这个变量值是 '/comments.php' ,表示一个 comments.php文件。如果不传参覆盖这个值得话,这个文件就是位于我们主题文件夹下的名为 comments.php 的文件,接下来就要进入这个文件的执行过程。

 

comments.php

这里就是生成整个评论区的模板,根据评论是否开放,评论开放有几条等一系列条件生成对应的页面模板。

按照例子中的假设,我们有一个含有多条评论的日志,走到这里当模板判断含有评论且评论开放的话会加载一个 wp_list_comments() 函数,用来对每条评论进行单独处理生成页面结构。这个函数的官网介绍:wp_list_comments

 

wp_list_comments()执行简介

利用这个函数来处理之前我们得到的 $wp_query -> comments 评论数组里的每个评论对象。

按照官网介绍,这个函数接受两个可选参数 $args 和 $comments。其中 $args 如下:

//定义了一些用于生成评论模板的参数。
array(
  'walker'            => null,
  'max_depth'         => '',
  'style'             => 'ul',
  'callback'          => null,
  'end-callback'      => null,
  'type'              => 'all',
  'page'              => '',
  'per_page'          => '',
  'avatar_size'       => 32,
  'reverse_top_level' => null,
  'reverse_children'  => '',
  'format'            => current_theme_supports( 'html5', 'comment-list' ) ? 'html5' : 'xhtml',
  'short_ping'        => false,
  'echo'              => true,
);

使用这里一些参数和之前得到的 $wp_query -> comments,用来生成单条评论样式。
其中的那个 walker,会生成一个 Walker 实例,然后使用其中的 paged_walk 方法来处理传入的评论对象。在处理过程中会使用到 之前 wp_list_comment函数参数里的 callback 回调函数来渲染单条评论的 html 样式。一条条评论渲染完就是我们最后看到的那个评论列表啦。

留言板 当前主题:0

留言审核后可见.

相关杂记
快递查询插件--快递管家(支持国际件,自动提醒)

双十一到了,剁手族们的购物车内肯定囤积了很多的待购商品,可以想象之后快递员又有的忙了。这里放出一个自制的浏览器插件

阅读更多>>
javascript 里的 new 操作和继承(全记录)

主要是记录下 js 里关于 new 和 继承的细节,因为网上的资料都比较分散,这里汇总下,并且加上了思考的过程。

阅读更多>>
使用CDN来加载js等文件

博客里常常会带有一些代码演示的内容,这时候就希望代码里的关键词能够高亮显示。

阅读更多>>
DOS快餐店连载系列下载

这是很早之前《电脑爱好者》杂志上连载的内容,一共12期,主要是以小故事的形式讲解了 windows 下命令行工具的使用。例如批量重命名,循环等。

阅读更多>>
ionic3 自定义图标文件(亲测可用)

首先准备好用来做图标的 svg 文件,你可以自己用 ai 画或者去网上下载就行啦,如下图所示:

阅读更多>>