wordpress 限制搜索频次

/ 0评 / 0

这段代码在之前的基础上增加了对用户角色的判断,如果用户角色包含管理员角色,则不进行搜索频次限制。这样,管理员用户不会受到搜索频次限制的限制,而其他登录用户和未登录用户仍然会受到搜索频次限制的限制。请注意,在 WordPress 中,管理员角色通常具有最高权限,因此在设置搜索频次限制时,应慎重考虑管理员用户的特殊情况,以确保管理员用户能够正常使用搜索功能。

function limit_search_frequency() {
// 设置限制的搜索频次
$search_frequency = 10; // 每分钟允许的搜索请求次数
// 检查用户角色
$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();
// 如果没有 cookie 数据,则创建一个新的
if (empty($cookie_data)) {
$cookie_data = array(
'timestamp' => $current_time,
'count' => 1
);
setcookie($cookie_name, json_encode($cookie_data), $current_time + 60, '/');
} else {
// 如果存在 cookie 数据,则更新时间戳和搜索请求次数
$timestamp = $cookie_data['timestamp'];
$count = $cookie_data['count'];
// 如果当前时间戳与上次搜索的时间戳之差大于60秒,则重置搜索请求次数为1,并更新时间戳
if (($current_time - $timestamp) > 60) {
$count = 1;
$timestamp = $current_time;
} else {
// 否则,递增搜索请求次数
$count++;
}
// 更新 cookie 数据
$cookie_data = array(
'timestamp' => $timestamp,
'count' => $count
);
setcookie($cookie_name, json_encode($cookie_data), $current_time + 60, '/');
}
// 如果搜索请求次数超过限制,则显示错误信息并阻止搜索请求
if ($count > $search_frequency) {
wp_die('搜索频次过高,请稍后再试。');
}
}
add_action('pre_get_posts', 'limit_search_frequency');