香港/韩国云服务器、独立服务器租用

WordPress限制搜索频率教程(免插件)

自营机房/高防服务器/高防VPS/美国高防/洛杉矶VPS/洛杉矶高防服务器

网站最近经常负载特别高,看了下日志同一时间大量搜索访问记录,大家知道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单位时间段或者单关键词就要自行修改下。

用了之后对于系统负载有一定缓解,但是也不能彻底解决恶意搜索的问题。

本站QQ群:683851361,联系我:zrblog@qq.com

分享到
便宜VPS/10美元VPS/洛杉矶、圣何塞等多个机房