前言
众所周知,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)
其它
- 评论点赞的开发也与此类似。
- 转载地址:https://www.misterma.com/archives/880
本文经授权后发布,本文观点不代表立场