我已经用WP Super Cache,W3 Total Cache和Comet Cache测试了我的方法。 。在研究此问题时,我为自己详细介绍的一个就是WP Super Cache(以下简称“ WPSC”),因此我将其作为主要示例。
BACKGROUND
当WP标准注释线程设置为允许访问者发表评论时,将为非注册用户并登录并已登录的任何评论者设置评论cookie。评论特权需要进一步检查。在我认为是最常见的配置中,评论者只需提供姓名和电子邮件地址。它们存储在两个浏览器cookie中,通常是
comment_author_ . COOKIEHASH
和comment_author_email_ . COOKIEHASH
。 COOKIEHASH
是根据用户选项定义的。 如果设置为将新生成的文件传递给“已知用户”,则WPSC会根据以下检查来确定是否提供缓存文件:登录的用户会获得新文件,访问者也会获得新文件。 “谁可以发表评论。”后者主要由
comment_author_
cookie在浏览器中的存在来标识,而COOKIEHASH
并不是为特定用户专门或唯一标识的(通常但并非始终是站点选项中记录的“ siteurl”的MD5编码版本)。 wp-cache-phase1.php LL371-383中的WPSC代码的关键部分似乎是使用RegEx模式来获取字符串,并循环通过cookie:
$regex = "/^wp-postpass|^comment_author_";
if ( defined( 'LOGGED_IN_COOKIE' ) )
$regex .= "|^" . preg_quote( constant( 'LOGGED_IN_COOKIE' ) );
else
$regex .= "|^wordpress_logged_in_";
$regex .= "/";
while ($key = key($_COOKIE)) {
if ( preg_match( $regex, $key ) ) {
wp_cache_debug( "wp_cache_get_cookies_values: $regex Cookie detected: $key", 5 );
$string .= $_COOKIE[ $key ] . ",";
}
next($_COOKIE);
}
现在,如果我严格使用PHP,可以重新生成或挂钩WP核心功能,并通过注释模板获得正常的
comment_author_ . COOKIEHASH
设置,但是我正在使用jQuery Cookie插件在jQuery中工作。但是,如您所见,如果您查看RegEx,则WPSC函数并不关心COOKIEHASH
:如果遇到comment_author_
,则可以满足要求。 我的临时解决方案
$.cookie( 'comment_author_proxyhash', 'proxy_author', { path: '/' } );
对于那些不熟悉jQuery Cookie的人:上面的方法设置了一个简单的会话cookie,其键=
comment_author_proxyhash
和value = proxy_author
,对整个网站都有好处。 (此外,对于那些使用jQuery Cookie和WP的用户,除了将熟悉的jQuery $
替换为WP jQuery
之外,我还已经设置了$.cookie.raw = true;
。)我将行添加到了jQuery脚本以及voila!,WPSC,W3 Total Cache和Comet Cache的行为均与我希望的一样。使用脚本并重新加载后,将获得新页面。如果我碰巧提出了一个真实的评论,则设置了正常的
comment_author_
和comment_author_email_
cookie,并且共存似乎没有任何问题。 也许一个缺陷是,只要用户保持会话打开,“ proxyhash” cookie就会随用户一起旅行,但这并不会给我带来重大问题-甚至值得警告。我当然从来没有听说过有人抱怨其中一种普通的Cookie发生了这种事情。
但是也许我缺少了一些东西,如果有可能会发现很多我的祸患我的教育也是如此。或者,也许我有一种相对简单的最佳实践方法来复制jQuery中的
COOKIEHASH
,还涵盖了替代用例...或通过其他方式达到相同的最终效果-其他诱骗缓存插件以处理访客作为评论者... 如果没有,是否有充分的理由不将其或其附近的东西通过插件插入宇宙?
#1 楼
您的带有comment_author_proxyhash cookie的解决方案在技术上当然可以正常工作-我知道的所有缓存插件都不会分析哈希值,并且只会基于comment_author_ * cookie的存在而停止传递缓存的内容。问题在这里是该页面缓存功能是网站真正需要的功能,而页面缓存的配置恰恰是因为裸露的WordPress性能不足,甚至无法在高峰时间使服务器崩溃。这取决于网站内容的性质,但网站所有者有时无法支付通过PHP / WP代码处理所有内容所需的硬件。
换句话说,必须尽可能多地从页面缓存提供流量。
从实践中,我可能会告诉我们,我们经常必须标识并禁用执行缓存异常的插件。
当然,这并非总是可行的,但请尽可能尝试使用缓存的页面。例如,您可以隐藏带有您要通过javascript忽略的注释的
div
标签,或对整个注释块进行ajax-ify修饰。由于您的自定义逻辑原因。因此最好使用唯一的cookie并使其成为缓存异常信号。W3 Total Cache为此提供了“拒绝cookie”选项,但列表中没有其他插件,因此您需要像建议的黑客。
评论
谢谢!您提出了许多有效的问题,但是我要说的是,这段代码的本质是将参与注释线程的任何访问者都视为足以将某人“忽略”或“静音”的访问者视为“已知用户/评论员。”如果网站无法处理此类参与,那么它也可能无法处理标准的WordPress评论模板(和评论社区)!
– CK MacLeod
18年1月28日在2:21
认为您就在这里,但是当然不能肯定您的用户如何使用它。顺便说一下,许多高流量网站正好将其评论处理工作转移到单独的请求甚至第三方服务上,目的是为了在以后快速显示文章内容并延迟加载动态评论内容。将其作为可能的插件其他版本的主题:)
– WowPress.host
18年1月29日在14:16
评论
为一个经过充分研究和记录的问题提供支持。但是,我觉得这个问题的性质可能会使它更多地用于讨论,而不是一个明确的答案(离题:主要基于观点)。我认为FWIW在这里没有任何问题-最终,您只是设置了一个没有个人数据的通用Cookie。非常感谢您的投入。对于上述讨论,我将不胜感激,并将以下任何内容标记为好答案:a)指出了这种“通用cookie”方法的问题,b)提供了实现相同效果的替代方法,或c)提供了有用的方法深入了解与“已知用户”相关的基本技术问题。
请注意,您可以使用wp_localize_script将cookie哈希传递给Javascript,以便可以使用“本地” cookie代替proxyhash。否则,这是一个非常有趣的问题,并且您的解决方案似乎很可靠,尽管cookie +缓存总是非常复杂,很难说这是“正确的”解决方案还是遗漏了什么。伟大的研究!
有趣的问题-我对此一无所知,这会给您带来麻烦,但是我能问您为什么要以这种方式绕过缓存吗?为用户提供这种能力有点打败了拥有整个页面缓存的目的。此外,当可以通过简单地将任何查询参数附加到URL,例如,通过普通的缓存配置获得相同的结果时,额外的cookie会增加请求的大小(尽管最小)。 mysite.com?只是我的$ 0.02 ...
ssnepenthe:也许我应该解释一下:我写这个问题时正在开发的插件-wordpress.org/plugins/commenter-ignore-button-使用jQuery允许访问者“忽略”选定的评论者。初始操作将CSS格式应用于注释线程,然后依靠cookie存储该名称及其存在,以在随后的刷新中复制效果(通过PHP),直到cookie过期。在页面的缓存版本中,效果不会被注册。因此,是的,这是一种有意本地化缓存清除的形式。