在网上的某个地方,我看到一个网站有一个基本的博客文章"赞"脚本。
我正在尝试复制它,我只是有点困惑。这是我的前端代码
Javascript,需要jquery
jQuery(document).ready(function() {
function my_reloadLikes(who) {
var text = jQuery("#" + who).html();
var patt= /('d)+/;
var num = patt.exec(text);
num[0]++;
text = text.replace(patt,num[0]);
jQuery("#" + who).html('<span class="count">' + text + '</span>');
} //reloadLikes
function my_likeInit() {
jQuery(".likeThis").click(function() {
var classes = jQuery(this).attr("class");
classes = classes.split(" ");
if(classes[1] == "active") {
return false;
}
var classes = jQuery(this).addClass("active");
var id = jQuery(this).attr("id");
id = id.split("like-");
jQuery.ajax({
type: "POST",
url: "index.php",
data: "likepost=" + id[1],
success: my_reloadLikes("like-" + id[1])
});
return false;
});
}
my_likeInit();
});
HTML
.like-count .icon {
background-position: 0 -19px;
width: 13px;
height: 11px;
float: left;
margin: 4px 5px 0 0;
}
.like-count a:hover .icon,
.like-count a.active .icon { background-position: -15px -19px; }
.like-count,
.edit-post,
.comment-count {
float: right;
margin: 0 0 0 10px;
}
<li class="like-count">
<a href="#" class="likeThis active" id="like-356">
<span class="count"><span class="icon"></span>
<span class="count">397</span></span>
</a>
</li>
以下是我迄今为止收集到的。。。
my_likeInit((函数
- 将单击事件添加到.likeThis类
- 将likeThis类保存到变量
- 拆分的值。like如果有"空格,则它正在检查查看是否有"活动"类附加到它
- 如果找到.active,它就会死亡,因为它已经被投票/点赞for
- 如果没有,它会将.active类添加到.likeThis
- 然后它得到id=like-123数字
- 将其拆分并剪切"赞"部分,得到数字
- 以"likepost=NUMBERHERE"的形式将id号发送到PHP脚本
- AJAX请求成功后,它将运行my_reloadLikes((函数,传入值"like NUMBERHERE">
my_reloadLikes((函数
- 我不会深入研究,但你可以看到,它通过ID号和添加号码,然后更新页面上的号码
当我运行firebug时,在Net/XHR下,我得到了这个,
请求标头POST: likepost=811
//在这种情况下,我点击了对id 811的投票w3tc_referrer=http%3A%2F%2Ftest.testdomain.com%2F%3Ftheme%3Dtest; 795=795; 835=835; 832=832
这是正在设置的某种cookie,似乎可以保存我投票/喜欢的所有东西的id。
响应标头Set-Cookie 811=811; expires=Sat, 13-Jan-2807 11:04:20 GMT; path=/
在这里,我可以看到id确实被保存到了cookie中。对我来说,这看起来像是它自己的cookie,但上面显示了cookie中的多个值,所以它们只是附加到末尾吗?我上面投票的所有ID都在同一个页面上,可能是每页1个cookie,希望每个网站只有1个。。。
就我而言,我基本上已经分析了代码,我完全理解了上面的一切,现在在后端,这将是我无法想象的,我需要的帮助
好的,当一个页面加载时,我会从MySQL数据库中填充类似的计数,我知道如何为这个脚本添加值和获取值。饼干部分是我有点困惑的地方。
我刚刚做了另一个测试,我现在看到脚本确实将每个投票保存到一个单独的cookie中,所以如果我对100个项目进行投票,我有100个该网站的cookie,这似乎不对吗?
有更好的方法吗?Cookie会识别我是否已经投票,并阻止我再次投票,直到我的Cookie被清除。这将出现在wordpress博客上,因此用户不会登录,因此除了cookie和/或IP地址之外,没有太多选项。
问题
- 有没有更好的方法来跟踪我投票/喜欢的项目,而不是每个项目的cookie
- 一些用于检查cookie的示例PHP代码,这样我就可以向已经投票的项目添加一个"活动"类(取决于他们是否有cookie(
- 在wordpress博客上,我如何发布到index.php?likepost=1234还是我更适合发布到另一个URI页面,手动进行DB连接,而不是使用wordpress的东西
=========谢谢你对饼干问题的任何见解,我意识到我有点漫无边际。
是的,一定要在数据库中执行此操作。正如我之前所说的,cookie可以被修改,这真的会打乱你的逻辑。创建一个简单的数据库表:
-------------------------------
| likes |
-------------------------------
| like_id | post_id | user_id |
-------------------------------
在like_id
上创建主键(自动递增(,这样就可以轻松地删除行。然后在post_id, user_id
上创建一个UNIQUE
索引,这将有助于数据并发,因为用户不可能在数据库级别多次喜欢同一篇文章。
但是,如果您愿意,可以省略like_id
。这不是必要的,完全取决于你的喜好。
现在,您可以查询出所需的任何信息。比如说,一个帖子的点赞数量:
SELECT COUNT( *) FROM likes WHERE post_id = $post_id
或者确定用户是否喜欢这篇文章:
SELECT like_id FROM likes WHERE post_id = $post_id AND user_id = $user_id
解决您的其他问题:
- 正如我前面所说,序列化是将多个条目存储在一个实体中的一种常见且非常好的做法。本质上,您是在保存对象(或数组(的状态,以便以后可以恢复它。然而,如果您使用DB,则不需要序列化JS数组/对象,但了解它很有用
- 根据数据库中的查询添加活动类,请参见上文
- 肯定是POST到index.php?likepost=1234。这为WordPress为您提供的应用程序维护了一个单一的入口点。这样做的好处是显而易见的——让WordPress设置你与数据库的连接,并为你提供所需的所有功能,而不是重新发明轮子