如何缓存基于$_GET的帖子?选项名称太长?选项/瞬变

时间:2013-09-19 作者:Doug Cassidy

我设置了一个相当昂贵的搜索功能,我想根据$\\u get字符串缓存结果,如:?search_type=product&relation=or&date=all&s=tagsearch&merchcat=cotton&brand=brandx&color=blue&etc=morestuff

因此,我试图缓存我得到的帖子数组:

if (false === ( $products = get_transient($name) ) ) {
    $products = getproducts();
    set_transient($name, $products, 60*60*12);
}
对于这个暂时的名字,我一直在尝试

$name= base64_encode(serialize($_GET));
但是,我遇到了选项名被截断、可能被编码、删减等问题。

你将如何着手解决这个问题?

1 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

查看database description for that table.

Field           Type        
option_name     varchar(64)      
option_value    longtext                  
键最多64个字符。值为longtext,应该超出您的需要。

要让缓存工作,您需要密钥的唯一值,但它不必可读。我的建议是把GET 一串它应该是唯一的,并且不能超过64个字符。

而不是这样:$name= base64_encode(serialize($_GET));

尝试以下操作:$name= wp_hash($_GET);

使用示例进行概念验证GET 上面的字符串:

$str = \'?search_type=product&relation=or&date=all&s=tagsearch&merchcat=cotton&brand=brandx&color=blue&etc=morestuff\';
var_dump(base64_encode(serialize($str)));
// vs
var_dump(wp_hash($str));
根据以下讨论进行编辑(感谢@G-M):

中参数的顺序GET 字符串可能会影响哈希值。安全的做法是规范化数组。以下操作应做到这一点:

$str = $_GET;
ksort($str);
$str = add_query_arg($str,\'\');
$str = wp_hash($str);
var_dump($str);
所有参数都被保留,即使是空的参数,这似乎是OP想要的,尽管我个人认为运行数组array_filter 删除空值实际上可以提供更好的缓存。

$str = $_GET;
$str = array_filter($str);
ksort($str);
$str = add_query_arg($str,\'\');
var_dump(wp_hash($str));
未尝试数据验证/清理。

当您将该键保存到数据库时,我还建议您预先添加一个字符串以使其可识别,例如$str = \'my_plugin_slug\'.$str 保存之前。

结束

相关推荐

Options page for widget

我开始开发一个只需要几个选项的插件。但随着时间的推移,设置的数量不断增加,我想将其中的大部分移动到一个单独的页面。我已经看过很多关于选项页面和小部件的教程,但我找不到一个解释如何为特定小部件创建选项页面的教程。如何做到这一点?我打算只保留几个会影响单个实例的设置,其余的将是全局设置,并在选项页面上。