Skip to content

Instantly share code, notes, and snippets.

@spivurno
Created August 31, 2013 16:32
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save spivurno/6399284 to your computer and use it in GitHub Desktop.
Save spivurno/6399284 to your computer and use it in GitHub Desktop.
MOD: Better Limit Submissions Per Time Period by User or IP (without hiding form & spanning limit across a group of forms)
<?php
/**
* MOD: Better Limit Submissions Per Time Period by User or IP (without hiding form & spanning limit across a group of forms)
*
* Based On: http://gravitywiz.com/2012/05/12/limit-ip-to-one-submission-per-time-period
* Video: http://screencast.com/t/I11vWq02Qswn
*
* Note: This mod does not require the original snippet. Most of the parameters still function the same as the snippet it
* is based on. The only exception is the 'form_id' parameter which now accepts an array of form IDs rather than a single
* form ID.
*
* // span the limit across forms 1, 2, and 3
* 'form_id' => array( 1, 2, 3 )
*
* // span the limit across ALL forms EXCEPT forms 2 and 4
* 'form_id' => array( -2, -4 )
*
*/
class GWSubmissionLimit_YvesSandyck {
function __construct( $args ) {
$this->_args = wp_parse_args( $args, array(
'form_id' => false,
'limit' => 1,
'time_period' => 60 * 60 * 24, // must be provided in seconds: 60 seconds in a minute, 60 minutes in an hour, 24 hours in a day
'limit_message' => __('Sorry, you have reached the submission limit for this form.'),
'limit_by' => 'ip' // also accepts "user_id"
));
if( is_array( $args['form_id'] ) ) {
$form_ids = $args['form_id'];
$all_forms = wp_list_pluck( GFFormsModel::get_forms( true ), 'id' );
// check if array is a list of excepted form IDs or included form IDs, will be negative if excepted
if( $form_ids[0] < 0 ) {
$form_ids = array_map( 'abs', $form_ids );
$filtered_form_ids = array();
foreach( $all_forms as $form_id ) {
if( ! in_array( $form_id, $form_ids ) )
$filtered_form_ids[] = $form_id;
}
$this->_args['form_id'] = $filtered_form_ids;
}
} else {
$this->_args['form_id'] = array( $args['form_id'] );
}
add_filter( 'gform_pre_render', array( $this, 'pre_render' ) );
}
function pre_render( $form ) {
// skip forms that are not registered with this snippet
if( ! in_array( $form['id'], $this->_args['form_id'] ) )
return $form;
if( ! $this->is_limit_reached( $form['id'] ) )
return $form;
$submission_info = rgar( GFFormDisplay::$submission, $form['id'] );
if( ! $submission_info || ! rgar( $submission_info, 'is_valid' ) )
add_filter( 'gform_get_form_filter', array( $this, 'display_limit_message' ) );
return $form;
}
public function display_limit_message( $form_string ) {
remove_filter( 'gform_get_form_filter', array( $this, 'display_limit_message' ) );
return '<div class="limit-message">' . $this->_args['limit_message'] . '</div>' . $form_string;
}
public function is_limit_reached($form_id) {
global $wpdb;
$limit_by = is_array($this->_args['limit_by']) ? $this->_args['limit_by'] : array($this->_args['limit_by']);
$where = array();
foreach($limit_by as $limiter) {
switch($limiter) {
case 'user_id':
$where[] = $wpdb->prepare('created_by = %s', get_current_user_id());
break;
case 'embed_url':
$where[] = $wpdb->prepare('source_url = %s', RGFormsModel::get_current_page_url());
break;
default:
$where[] = $wpdb->prepare('ip = %s', RGFormsModel::get_ip());
}
}
if( count( $this->_args['form_id'] ) <= 1 ) {
$where[] = $wpdb->prepare('form_id = %d', $this->_args['form_id'][0] );
} else {
$form_ids_str = '"' . implode( '", "', $this->_args['form_id'] ) . '"';
$where[] = "form_id IN( $form_ids_str )";
}
$where[] = $wpdb->prepare('date_created BETWEEN DATE_SUB(utc_timestamp(), INTERVAL %d SECOND) AND utc_timestamp()', $this->_args['time_period']);
$where = implode(' AND ', $where);
$sql = "SELECT count(id)
FROM {$wpdb->prefix}rg_lead
WHERE $where";
$entry_count = $wpdb->get_var($sql);
return $entry_count >= $this->_args['limit'];
}
}
new GWSubmissionLimit_YvesSandyck( array(
'form_id' => array( -242, -282, -117 ),
'limit' => 1,
'time_period' => 60 * 60 * 24 * 1,
'limit_message' => 'You are all maxed out! Try again in a couple days.',
'limit_by' => 'user_id',
) );
@haleeben
Copy link

haleeben commented Jun 4, 2014

I'm so glad I found this gist, thank you.

@haleeben
Copy link

haleeben commented Jun 4, 2014

I noticed that if the user submits one form then they are locked out from all forms.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment