站点图标 西部盒子博客

关于在WordPress的hook钩子中写入cookies或session的坑

《关于在Wordpress的hook钩子中写入cookies或session的坑》

通常我们在PHP开发过程中遇到有交互环节,通常会使用cookies或者session来记录一些用户变量。

同时我们在做wordpress开发时,程序本身给我们提供了很多的hook(钩子),用来在特定的环节执行相关的代码。

 

一句话总结

wp_head钩子不支持写入session和cookies,init钩子支持写入,但不能获取到wp_query的内容,wp钩子可剪得两者!

这里通过一个示例来说一下在使用wp_head钩子想要写入cookies或者session的坑。

具体需求是这样的:

我们在做一个文章浏览次数统计的时候,默认情况是用户每刷新一次页面就增加一次访问量;代码如下:
[crayon-67418df4d05c9577178410/]
可以看到我们使用的钩子是wp_head,这个时候,用户每刷新一次都能增加一次访问量,即使是同一个用户!

下面的需求是同一个用户无论刷新多少次都只记录一次访问量:

我们思路是,在访问量增加后使用SESSION或者COOKIES 来记录用户已经访问过该篇文章了;代码如下:
[crayon-67418df4d05d5534538196/]
以上的代码看似没有问题,但在实际的测试中,cookies并没有写入,我们再测试session,同样没有写入,我们又测试了直接在functions.php内放入写入cookies和session的代码,结果是写入成功了的,

这时我们得出的结论是wp_head钩子是不能写cookies和session的。

我们查看了wordpress官方给出的文档:

大致意思是,写入cookies的代码是挂在 init的钩子中的,而读取是放到wp_head钩子中的。

这时,我们立马把wp_head换成了init,新的问题出现了:

使用init钩子时,is_single()函数无效,同时也没有$post全局变量;

通过查阅wordpress的hook文档,找到了可以解决问题的钩子: wp

这个钩子是在主查询生成后执行的,所以这里可以写入cookies和session,也可以判断是否为文章页。问题终于得到解决。

 

 

退出移动版