返回列表 发布新帖
查看: 190|回复: 0

[代码技巧] wordpress搜索频率限制

[复制链接]
SunJu_FaceMall
社区贡献

315

主题

190

回帖

1万

积分

等级头衔
Icon组别 : 管理员
Icon等级 :

积分成就
   钻石 : 524 颗
   贡献 : 1849 点
   金币 : 12 枚
Icon在线时间 : 1298 小时
Icon注册时间 : 2024-11-22
Icon最后登录 : 2025-12-12

荣誉勋章

会员LV.1会员LV.2会员LV.3会员LV.4会员LV.5会员LV.6会员LV.7会员LV.8会员LV.9会员LV.10

风云·优秀版主

飞流名人堂成员

1

实名认证 手机认证 vip vip-year FLLTCN发表于 2025-8-27 11:04:23 来自手机端 | 查看全部 |阅读模式 北京

资源无需等待,交易就趁现在,全面资源整合网络大咖云集,让你轻松玩转互联网!

您需要 登录 才可以下载或查看,没有账号?立即注册

×
可设置几分钟(可以自己改代码为秒)内搜索几次时,自动封禁某IP的搜索功能多少秒,建议与封禁时间与时间窗口时长一致
避免WordPress搜索功能被刷,导致服务器CPU使用率和负载状态100%爆满
以下代码放入主题函数function.php中,子比放入func.php中
  1. class WXS_SearchFrequencyLimit {
  2.     // 配置参数可根据需要修改
  3.     private $search_limit_count = 3; // 允许的最大搜索次数
  4.     private $time_window_in_minutes = 1; // 时间窗口(分钟)
  5.     private $block_time_in_seconds = 10; // 超过限制后封禁时间(秒)
  6.     private $block_message = '您的搜索频率过高,请在 %d 秒后再试。'; // 封禁提示消息

  7.     public function __construct() {
  8.         add_filter( 'pre_get_posts', array( $this, 'check_search_limit' ) );
  9.         if ( ! is_admin() ) {
  10.             add_action( 'wp_loaded', array( $this, 'check_block_status_on_any_page' ) );
  11.         }
  12.     }

  13.     private function get_visitor_ip() {
  14.         if ( ! empty( $_SERVER['HTTP_CLIENT_IP'] ) ) {
  15.             $ip = $_SERVER['HTTP_CLIENT_IP'];
  16.         } elseif ( ! empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
  17.             $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  18.         } else {
  19.             $ip = $_SERVER['REMOTE_ADDR'];
  20.         }
  21.         return sanitize_text_field( $ip );
  22.     }

  23.     private function set_block_cache($key, $expiration) {
  24.         $expire_time = time() + $expiration;
  25.         wp_cache_set($key, $expire_time, 'search_limit', $expiration);
  26.     }
  27.    
  28.     private function get_remaining_block_time($key) {
  29.         $expire_time = wp_cache_get($key, 'search_limit');
  30.         if ($expire_time === false) {
  31.             return 0;
  32.         }
  33.         $remaining = $expire_time - time();
  34.         return $remaining > 0 ? $remaining : 0;
  35.     }
  36.     public function check_block_status_on_any_page() {
  37.         $visitor_ip = $this->get_visitor_ip();
  38.         $cache_key = 'search_block_' . $visitor_ip;
  39.         $remaining_time = $this->get_remaining_block_time($cache_key);
  40.         if ($remaining_time > 0 && !is_search()) {
  41.             $message = sprintf($this->block_message, $remaining_time);
  42.             add_action('wp_body_open', function() use ($message) {
  43.                 echo '<div style="background-color: #fff3cd; color: #856404; padding: 15px; text-align: center; border: 1px solid #ffeeba; margin-bottom: 20px;">';
  44.                 echo esc_html($message);
  45.                 echo '</div>';
  46.             });
  47.         }
  48.     }

  49.     public function check_search_limit($query) {
  50.         if (!is_admin() && $query->is_search && $query->is_main_query()) {
  51.             $visitor_ip = $this->get_visitor_ip();
  52.             $limit = $this->search_limit_count;
  53.             $window_seconds = $this->time_window_in_minutes * 60;
  54.             $block_time = $this->block_time_in_seconds;
  55.             $cache_key = 'search_block_' . $visitor_ip;
  56.             $records_key = 'search_records_' . $visitor_ip;
  57.             $remaining_time = $this->get_remaining_block_time($cache_key);
  58.             if ($remaining_time > 0) {
  59.                 wp_die(
  60.                     sprintf($this->block_message, $remaining_time),
  61.                     '搜索频率限制', //标题
  62.                     array('response' => 429)
  63.                 );
  64.             }

  65.             $search_records = wp_cache_get($records_key, 'search_limit', false, $found);
  66.             if (!$found) {
  67.                 $search_records = array();
  68.             }
  69.             $current_time = time();

  70.             $search_records = array_filter($search_records, function($timestamp) use ($current_time, $window_seconds) {
  71.                 return $current_time - $timestamp < $window_seconds;
  72.             });

  73.             if (count($search_records) >= $limit) {
  74.                 $this->set_block_cache($cache_key, $block_time);
  75.                 wp_cache_delete($records_key, 'search_limit');
  76.                
  77.                 wp_die(
  78.                     sprintf($this->block_message, $block_time),
  79.                     '搜索频率限制',
  80.                     array('response' => 429)
  81.                 );
  82.             } else {
  83.                 $search_records[] = $current_time;
  84.                 wp_cache_set($records_key, $search_records, 'search_limit', $window_seconds);
  85.             }
  86.         }

  87.         return $query;
  88.     }
  89. }
  90. new WXS_SearchFrequencyLimit();
复制代码

其次,你可以使用WAF对/?s=限制
路虽远,行则将至;事虽难,做则必成。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

飞流广播+ 发布

系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
10-30 17:02
系统消息:柒沐已经连续答对10道难题,逆天学霸谁与争锋?!#每日答题#
10-09 09:07
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
09-24 09:00
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
09-11 11:40
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
09-02 09:17
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
08-27 08:56
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
08-20 15:12
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
08-03 10:22
系统消息:柒沐已经连续答对10道难题,逆天学霸谁与争锋?!#每日答题#
06-30 08:57
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
06-18 09:14
系统消息:清风网络已经连续答对10道难题,逆天学霸谁与争锋?!#每日答题#
04-11 09:40
系统消息:清风网络已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
04-10 09:31
系统消息:IXM77777已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
04-09 13:44
系统消息:清风网络已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
04-09 09:22
系统消息:柒沐已经连续答对10道难题,逆天学霸谁与争锋?!#每日答题#
04-09 08:52
系统消息:清风网络已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
04-08 09:24
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
04-07 09:02
系统消息:柒沐已经连续答对10道难题,逆天学霸谁与争锋?!#每日答题#
02-27 09:35
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
02-26 09:06
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
02-25 08:49
站内通告

提供资源交易、信息共享、靓号交流、技术变现、学习问答、兴趣娱乐等全面服务。

1.丰富功能系统,扩展社区特色玩法,打造最好的互联网聚集圈子。

2.准确信息真实交易,安全快捷又方便,让虚拟交易面对面。

3. 天上不会掉馅饼,话术骗术迷人心,切勿脱离平台线下交易,被骗与平台无关!

4. 欺诈骗钱,违规违法将视情受到警告&禁言&封号甚至检举至👮🏻‍♀️处理!

官方Q群:123129钉推群:BAYR2383 站长QQ:3220000000

投诉/建议/商务合作联系

fl@fllt.cn

严禁私下交易,被骗与本站无关。
违反交易细则,取证立查严惩。
  • 钉钉新帖推送群
  • 官方交流QQ群
  • 站长唯一微信号

👮曝光Ta|🧿小黑屋|📴手机页|飞流网 ( 渝ICP备2025054677号-1|电信增值许可 渝B2-20250789 )|网站地图

GMT+8, 2025-12-14 06:03 , Processed in 0.076079 second(s), 56 queries, MemCached On , Gzip On.

Based on XJ-TX X3.5 Licensed

飞流论坛 HanAnalytics icp Astro vhAstro-Theme

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表