目的:进一步动静分离
方式:使用wordpress基础查询函数
理想效果:平滑改动,不改变现有的评论结构
思考
  • 现有的评论加载方式是通过在wordpress主循环中调用comments_template(),进而调用comments.php模板来实现的
  • 通过admin-ajax.php可以很好的利用wordpress固有的函数
过程

直接添加没有效果
观察comments_template()函数源码

global $wp_query, $withcomments, $post, $wpdb, $id, $comment, $user_login, $user_ID, $user_identity, $overridden_cpage;

发现它需要获得上面的全局变量。

通过删除实验,发现必须要$GLOBALS['wp_query']$GLOBALS['post'] $GLOBALS['comments']这三个变量,其它可以忽略。

通过在主循环(任何位置)使用var_dump打印出这三个数组及其类型,分析结构发现WP_Query()为主数组,包含所有信息,通过wordpress文档,使用

$wp_query = new WP_Query('p='. $id)

创造$GLOBALS['wp_query'];结果发现于主循环中的调用结果不一致,少了$post$comments
通过对wordpress文档的阅读,发现衍生类WP_Comment_Query()和函数get_post($id)
构造如下:

$GLOBALS['post'] = get_post($id);
$GLOBALS['comments'] = new WP_Comment_Query('post_id='. $id);

整个代码大致如下:

function comment(){
  define('SHORTINIT', true);
  $wp_query = new WP_Query('p='. $id);  //p只能查询文章,查询页面需要用page_id
  if ( $wp_query->have_posts() ) : $wp_query->the_post();
    $GLOBALS['wp_query'] = $wp_query;
    $GLOBALS['post'] = get_post($id);
    $GLOBALS['comments'] = new WP_Comment_Query('post_id='. $id);
comments_template();
    endif;
    die();
}
add_action('wp_ajax_comment', 'comment');
add_action('wp_ajax_nopriv_comment', 'comment');

然后重新设计comments.php和single.php
最后通过js加载:

0!=$("#comments-jp").length&&$(function(){var a=$("input[name='comment_post_ID']").val();$.get("/wp-admin/admin-ajax.php?action=comment&id="+a,function(a){document.getElementById("comments-jp").innerHTML=a})});

为了安全,我一般不用ajax提交信息,仅仅是get数据

本文仍有不完善的地方,仅提供思路

更新于:2017-12-16