对于WordPress大家都懂,每次都要查询数据库,如果一旦量大的话,非常卡。网上也有不少关于限制WordPress默认搜索的插件,比如search Limiter & Blocker插件,但是只是功能较为简单一点,而且对于搬主题不喜欢使用插件的人来说,能不使用插件就不使用插件。这里搬主题就分享一下免插件限制WordPress搜索频次图文教程。
话不多说,直接上代码:
/* 免插件限制WordPress搜索频次代码修复版
更多教程:https://www.banzhuti.com
限制WordPress的搜索频次开始 */
function limit_search_frequency() {
// 设置限制的搜索频次
$search_frequency = 25; // 每分钟允许的搜索请求次数
// 检查用户角色
$user = wp_get_current_user();
$user_roles = $user->roles;
// 如果用户角色包含管理员角色,则不进行频次限制
if (in_array('administrator', $user_roles)) {
return;
}
// 获取当前时间戳
$current_time = time();
// 获取存储搜索请求次数和时间戳的cookie键名
$cookie_name = 'search_frequency';
$cookie_data = isset($_COOKIE[$cookie_name]) ? json_decode(stripslashes($_COOKIE[$cookie_name]), true) : array();
// 初始化$count变量
$count = isset($cookie_data['count']) ? (int)$cookie_data['count'] : 0;
// 如果没有cookie数据,则创建一个新的
if (empty($cookie_data)) {
$cookie_data = array(
'timestamp' => $current_time,
'count' => 1
);
setcookie($cookie_name, json_encode($cookie_data), $current_time + 3600, '/'); // 设置为1小时后过期
} else {
// 如果存在cookie数据,则更新时间戳和搜索请求次数
$timestamp = $cookie_data['timestamp'];
// 如果当前时间戳与上次搜索的时间戳之差大于60秒,则重置搜索请求次数为1,并更新时间戳
if (($current_time - $timestamp) > 60) {
$count = 1;
} else {
// 否则,递增搜索请求次数
$count++;
}
// 更新cookie数据
$cookie_data = array(
'timestamp' => $current_time,
'count' => $count
);
setcookie($cookie_name, json_encode($cookie_data), $current_time + 3600, '/'); // 更新cookie的过期时间
}
// 如果搜索请求次数超过限制,则显示错误信息并阻止搜索请求
if ($count > $search_frequency) {
wp_die('搜索频率超过每分钟 ' . $search_frequency . ' 次,限制访问 60 秒,请稍后再试...多次提醒后会封禁 IP!');
}
}
// 将函数绑定到pre_get_posts钩子
add_action('pre_get_posts', 'limit_search_frequency');
/* 限制的搜索频次结束*/
把以上代码放到WordPress主题的functions.php即可。网上虽然也放出类似的代码,但是有部分报错,包括没有定义数值导致PHP报错等,搬主题已经对代码进行了修复。
以上代码超出限制后就反馈500网页,然后提示上述的字眼。
一般限制每分钟限制20-40左右即可,根据自己的实际需要进行调整。
注意:虽然是以搜索为要求,但是实际上涉及到页面的访问都会受牵连,所以最终的数值自己多试几次再进行调整。
评论前必须登录!
立即登录 注册