wordpress启用cdn后,在缓存过期之前由于不再请求源站,所以对日志页面的访问不会再增加日志的浏览量。为了解决这个问题,可以通过ajax异步的方式刷新日志的浏览量。

原理:第一次访问某日志时,通过ajax请求服务器,给相应的日志浏览量+1,然后通过js更改页面显示的阅读量,同时将浏览记录写入cookie。后续访问同一日志时,直接从数据库读取最新访问量并显示。

代码分两部分,js部分实现异步请求并刷新阅读量,php部分修改数据库。

js部分:


<!--?php if(is_singular()){ //仅在日志页显示js代码     ?-->
<script>
$(document).ready(function(){
    $.post("<?php echo home_url('/post-view.php')?>",
      {
        id: <?php echo $post->ID; ?>
        },
      function(data,status){
        views = $.parseJSON(data).views;
        //你的阅读量所在的位置。
        $('.entry-content').find('.views').html('<i class="fa fa-eye"></i>'+ views + '次');
      });
}); 
</script>     
    <!--?php } ?-->

以上代码加入到wordpress主题的footer页面。

然后在wordpress根目录新建post-view.php文件,内容如下:


require_once('wp-load.php');
$id = (int)sanitize_text_field($_POST['id']);
$views = $wpdb->get_row("SELECT meta_value FROM $wpdb->postmeta WHERE post_id = $id and meta_key = 'views'");
$views = intval($views->meta_value);
$cookieName = 'post_views_list';
$id_arr = explode(',',urldecode($_COOKIE[$cookieName]));
if(!in_array($id,$id_arr)){
    $views = $views +1;
    $wpdb->update( $wpdb->postmeta, array( 'meta_value' => $views ), array( 'post_id' => $id, 'meta_key' => 'views' ) );
    array_push($id_arr,$id);
    //设置cookie过期的时间,这里设定的市10天。
    setcookie($cookieName,implode(',',$id_arr),time()+3600 * 24 * 10);
}
echo "{"views":". $views. ","id":" . $id ."}";

最后,很重要的异步,刷新cdn缓存,使页面加入的js代码生效即可。