通常我们在PHP开发过程中遇到有交互环节,通常会使用cookies或者session来记录一些用户变量。
同时我们在做wordpress开发时,程序本身给我们提供了很多的hook(钩子),用来在特定的环节执行相关的代码。
一句话总结
这里通过一个示例来说一下在使用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,也可以判断是否为文章页。问题终于得到解决。