推荐教程

为Typecho主题增加点赞功能

前言

众所周知,Typecho默认是没有提供点赞相关的API的,想要实现点赞功能需要自己开发或者用别人完善好的主题。以下即为Typecho点赞功能的相关开发。

函数的编写

  • 在Typecho的functions.php中可以定义函数,实现数据库相关操作。这里使用两个函数:agreeNum函数用来获取点赞数量; agree函数用来点赞。

agreeNum函数:

function agreeNum($cid) {
    $db = Typecho_Db::get();
    $prefix = $db->getPrefix();
    
    //  判断点赞数量字段是否存在
    if (!array_key_exists('agree', $db->fetchRow($db->select()->from('table.contents')))) {
        //  在文章表中创建一个字段用来存储点赞数量
        $db->query('ALTER TABLE `' . $prefix . 'contents` ADD `agree` INT(10) NOT NULL DEFAULT 0;');
    }

    //  查询出点赞数量
    $agree = $db->fetchRow($db->select('table.contents.agree')->from('table.contents')->where('cid = ?', $cid));
    //  获取记录点赞的 Cookie
    $AgreeRecording = Typecho_Cookie::get('typechoAgreeRecording');
    //  判断记录点赞的 Cookie 是否存在
    if (empty($AgreeRecording)) {
        //  如果不存在就写入 Cookie
        Typecho_Cookie::set('typechoAgreeRecording', json_encode(array(0)));
    }

    //  返回
    return array(
        //  点赞数量
        'agree' => $agree['agree'],
        //  文章是否点赞过
        'recording' => in_array($cid, json_decode(Typecho_Cookie::get('typechoAgreeRecording')))?true:false
    );
}
//agreeNum函数调用的时候需要传入一个参数cid,其cid就是Typecho程序的文章ID。

agree函数:

function agree($cid) {
    $db = Typecho_Db::get();
    //  根据文章的 `cid` 查询出点赞数量
    $agree = $db->fetchRow($db->select('table.contents.agree')->from('table.contents')->where('cid = ?', $cid));

    //  获取点赞记录的 Cookie
    $agreeRecording = Typecho_Cookie::get('typechoAgreeRecording');
    //  判断 Cookie 是否存在
    if (empty($agreeRecording)) {
        //  如果 cookie 不存在就创建 cookie
        Typecho_Cookie::set('typechoAgreeRecording', json_encode(array($cid)));
    }else {
        //  把 Cookie 的 JSON 字符串转换为 PHP 对象
        $agreeRecording = json_decode($agreeRecording);
        //  判断文章是否点赞过
        if (in_array($cid, $agreeRecording)) {
            //  如果当前文章的 cid 在 cookie 中就返回文章的赞数,不再往下执行
            return $agree['agree'];
        }
        //  添加点赞文章的 cid
        array_push($agreeRecording, $cid);
        //  保存 Cookie
        Typecho_Cookie::set('typechoAgreeRecording', json_encode($agreeRecording));
    }

    //  更新点赞字段,让点赞字段 +1
    $db->query($db->update('table.contents')->rows(array('agree' => (int)$agree['agree'] + 1))->where('cid = ?', $cid));
    //  查询出点赞数量
    $agree = $db->fetchRow($db->select('table.contents.agree')->from('table.contents')->where('cid = ?', $cid));
    //  返回点赞数量
    return $agree['agree'];
}
/*点赞记录的Cookie是一个JSON 字符串,需要读取或更改的时候就需要转换为PHP对象,更改完成后需要转换为JSON字符串写入 Cookie。
点赞记录的Cookie中保存着文章的cid,每次点赞文章的cid就会被加到Cookie中。如果要判断文章是否点赞过就可以判断文章的 cid是否存在。*/

PS:函数的说明看注释即可明白。

文章页相关

  • 在Typecho的post.php文件中可以输出文件,可以实现处理点赞和展示点赞数量的开发工作。

点赞部分的处理:

//  判断是否是点赞的 POST 请求
if (isset($_POST['agree'])) {
    //  判断 POST 请求中的 cid 是否是本篇文章的 cid
    if ($_POST['agree'] == $this->cid) {
        //  调用点赞函数,传入文章的 cid,然后通过 exit 输出点赞数量
        exit(agree($this->cid));
    }
    //  如果点赞的文章 cid 不是本篇文章的 cid 就输出 error 不再往下执行
    exit('error');
}

将点赞部分的处理放到post.php的顶部,即HTML代码的前面。
点赞数量是显示在点赞按钮中的,下面是显示输出点赞数量和点赞按钮。

获取点赞数量:

<?php $agree = $this->hidden?array('agree' => 0, 'recording' => true):agreeNum($this->cid); ?>

点赞按钮:

<button <?php echo $agree['recording']?'disabled':''; ?> type="button" id="agree" data-cid="<?php echo $this->cid; ?>" data-url="<?php $this->permalink(); ?>">
  <span>赞</span>
  <span class="agree-num"><?php echo $agree['agree']; ?></span>
</button>

PS:data-cid存储文章的cid,JS发送AJAX请求的时候会用到,data-url文章的URL,发送AJAX请求的URL。如果文章被点赞过PHP就会输出disabled来禁用按钮。

JavaScript实现点赞

点赞代码:

//  点赞按钮点击
$('#agree-btn').on('click', function () {
  $('#agree-btn').get(0).disabled = true;  //  禁用点赞按钮
  //  发送 AJAX 请求
  $.ajax({
    //  请求方式 post
    type: 'post',
    //  url 获取点赞按钮的自定义 url 属性
    url: $('#agree-btn').attr('data-url'),
    //  发送的数据 cid,直接获取点赞按钮的 cid 属性
    data: 'agree=' + $('#agree-btn').attr('data-cid'),
    async: true,
    timeout: 30000,
    cache: false,
    //  请求成功的函数
    success: function (data) {
      var re = /\d/;  //  匹配数字的正则表达式
      //  匹配数字
      if (re.test(data)) {
        //  把点赞按钮中的点赞数量设置为传回的点赞数量
        $('#agree-btn .agree-num').html(data);
      }
    },
    error: function () {
      //  如果请求出错就恢复点赞按钮
      $('#agree-btn').get(0).disabled = false;
    },
  });
});

PS:点赞后的文章的点赞按钮会被禁用,只有当点赞记录的Cookie到期或清除后才能再次点赞。(JS部分需要依赖jQuery)

其它

本文经授权后发布,本文观点不代表立场,转载请联系原作者。
-- 展开阅读全文 --
胡萝卜周博客停止运营——苏州思杰马克丁软件有限公司的又一次“胜利”
« 上一篇 08-09
Telegram本地消息防撤回插件:Telegram-Anti-Revoke
下一篇 » 08-12

发表评论

本站已开启评论审核,请规范您的言行,点击查看垃圾评论类型