网站最近经常负载特别高,看了下日志同一时间大量搜索访问记录,大家知道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单位时间段或者单关键词就要自行修改下。
用了之后对于系统负载有一定缓解,但是也不能彻底解决恶意搜索的问题。













