The check_comment_flood WordPress PHP action allows you to check for comment flooding before a comment is marked approved.
Usage
add_action('check_comment_flood', 'your_custom_function', 10, 4); function your_custom_function($comment_author_ip, $comment_author_email, $comment_date_gmt, $wp_error) { // Your custom code here return $comment_author_ip; }
Parameters
$comment_author_ip
(string): Comment author’s IP address.$comment_author_email
(string): Comment author’s email.$comment_date_gmt
(string): GMT date the comment was posted.$wp_error
(bool): Whether to return a WP_Error object instead of executingwp_die()
ordie()
if a comment flood is occurring.
More information
See WordPress Developer Resources: check_comment_flood
Examples
Limit comments per minute from the same IP
This example limits the number of comments per minute from the same IP address to prevent flooding.
add_action('check_comment_flood', 'limit_comments_per_minute', 10, 4); function limit_comments_per_minute($comment_author_ip, $comment_author_email, $comment_date_gmt, $wp_error) { // Set the time limit and maximum comments allowed $time_limit = 60; // in seconds $max_comments = 5; // Get recent comments from the same IP $comments = get_comments(array( 'author_ip' => $comment_author_ip, 'date_query' => array( 'after' => "{$time_limit} seconds ago", ), )); // Check if the number of comments exceeds the limit if (count($comments) >= $max_comments) { if ($wp_error) { return new WP_Error('comment_flood', 'Too many comments in a short period. Please try again later.'); } else { wp_die('Too many comments in a short period. Please try again later.'); } } return $comment_author_ip; }
Block comments from specific IP addresses
This example blocks comments from specific IP addresses.
add_action('check_comment_flood', 'block_specific_ips', 10, 4); function block_specific_ips($comment_author_ip, $comment_author_email, $comment_date_gmt, $wp_error) { // List of blocked IP addresses $blocked_ips = array('123.45.67.89', '987.65.43.21'); // Check if the author IP is in the blocked list if (in_array($comment_author_ip, $blocked_ips)) { if ($wp_error) { return new WP_Error('blocked_ip', 'Your IP address is not allowed to post comments.'); } else { wp_die('Your IP address is not allowed to post comments.'); } } return $comment_author_ip; }
Block comments with specific email domains
This example blocks comments from specific email domains.
add_action('check_comment_flood', 'block_specific_email_domains', 10, 4); function block_specific_email_domains($comment_author_ip, $comment_author_email, $comment_date_gmt, $wp_error) { // List of blocked email domains $blocked_domains = array('example.com', 'baddomain.com'); // Check if the author email domain is in the blocked list $email_domain = substr(strrchr($comment_author_email, "@"), 1); if (in_array($_email_domain, $blocked_domains)) { if ($wp_error) { return new WP_Error('blocked_email_domain', 'Your email domain is not allowed to post comments.'); } else { wp_die('Your email domain is not allowed to post comments.'); } } return $comment_author_ip; }
Limit comments per day from the same email address
This example limits the number of comments per day from the same email address to prevent flooding.
add_action('check_comment_flood', 'limit_comments_per_day_from_email', 10, 4); function limit_comments_per_day_from_email($comment_author_ip, $comment_author_email, $comment_date_gmt, $wp_error) { // Set the time limit and maximum comments allowed $max_comments = 10; // Get recent comments from the same email address $comments = get_comments(array( 'author_email' => $comment_author_email, 'date_query' => array( 'after' => '1 day ago', ), )); // Check if the number of comments exceeds the limit if (count($comments) >= $max_comments) { if ($wp_error) { return new WP_Error('comment_flood', 'Too many comments in a short period. Please try again later.'); } else { wp_die('Too many comments in a short period. Please try again later.'); } } return $comment_author_ip; }
Require a minimum time between comments from the same user
This example requires a minimum time between comments from the same user.
add_action('check_comment_flood', 'minimum_time_between_comments', 10, 4); function minimum_time_between_comments($comment_author_ip, $comment_author_email, $comment_date_gmt, $wp_error) { // Set the minimum time between comments (in seconds) $min_time = 60; // Get the latest comment from the same user $latest_comment = get_comments(array( 'author_email' => $comment_author_email, 'number' => 1, 'orderby' => 'comment_date_gmt', 'order' => 'DESC', )); if ($latest_comment) { $time_since_last_comment = strtotime($comment_date_gmt) - strtotime($latest_comment[0]->comment_date_gmt); // Check if the time since the last comment is less than the minimum time if ($time_since_last_comment < $min_time) { if ($wp_error) { return new WP_Error('comment_flood', 'Please wait before posting another comment.'); } else { wp_die('Please wait before posting another comment.'); } } } return $comment_author_ip; }