网站最近经常负载特别高,看了下日志同一时间大量搜索访问记录,大家知道WordPress搜索每次都要查询数据库,这样直接导致负载飙升,访问非常卡,所以有必要对搜索频率进行限制下,网上找了一些放上去各种不理想,也不想用插件,所以让AI帮忙写了下,记录下来方便下次自己翻出来看。
直接将以下代码放到WordPress主题的functions.php文件中即可:
// 限制搜索频率:1 分钟内最多 10 次搜索请求,前端搜索页面生效,管理员不受限制
function limit_search_frequency() {
// 仅在前端搜索页面生效
if (!is_search() || is_admin()) {
return; // 如果不是搜索页面或是管理员后台,直接跳过
}
// 检查用户是否是管理员
if (current_user_can('administrator')) {
return; // 如果是管理员,跳过限制
}
// 全局搜索请求计数器
$transient_name = 'search_request_count'; // 用于存储请求计数的临时缓存名称
$max_requests = 10; // 1 分钟内最多允许的搜索次数
$time_window = 60; // 限制时间窗口(单位:秒)
// 获取当前时间戳
$current_time = time();
// 获取当前存储的搜索请求时间数据
$request_times = get_transient($transient_name);
// 如果没有数据,则初始化为一个空数组
if ($request_times === false) {
$request_times = array();
}
// 清除超时的请求
$request_times = array_filter($request_times, function ($timestamp) use ($current_time, $time_window) {
return $timestamp > $current_time - $time_window; // 只保留 1 分钟内的请求
});
// 如果 1 分钟内请求次数已经超过限制,阻止搜索
if (count($request_times) >= $max_requests) {
wp_die('您的搜索过于频繁,请稍后再试');
}
// 记录当前请求时间
$request_times[] = $current_time;
// 更新搜索请求的临时缓存(使用 Transient 存储 1 分钟内的请求)
set_transient($transient_name, $request_times, $time_window);
}
// 在执行搜索之前进行检查
add_action('pre_get_posts', 'limit_search_frequency');
注意:因为日志里IP非常多所以我这个代码是全站共享次数,有些人遇到的可能是要限制单IP单位时间段或者单关键词就要自行修改下。
用了之后对于系统负载有一定缓解,但是也不能彻底解决恶意搜索的问题。











![[黑五]vmiss:全场VPS/独立服务器7折起,美国/韩国/日本/香港VPS年付106元起,可选CN2 GIA/AS9929/CMIN2线路-赵容部落](https://www.zrblog.net/wp-content/uploads/2022/05/vmiss.png)
![[黑五]HostDare低至3.5折+双倍内存+双倍流量,洛杉矶VPS年付9.1美元起,可选AMD EPYC,可选CN2 GIA+AS9929+CMIN2线路-赵容部落](https://www.zrblog.net/wp-content/uploads/2016/06/hostdare.png)
![[黑五]Lightlayer:圣何塞独立服务器秒杀$14/月起,洛杉矶/香港/马尼拉/新加坡/台湾VPS年付5折$12.49/年起-赵容部落](https://www.zrblog.net/wp-content/uploads/2024/05/lightlayer.png)
