Gravity Forms – ‘Please enter a valid Website URL’ validation error when value missing protocol HTTP HTTPS FTP

Problem

By default, ‘website’ fields in Gravity Forms will display a validation error message if the user enters an address that is missing the protocol – HTTP, HTTPS, FTP.

There is good reason for this, the protocol needs to be known so the value can become a clickable link where the entry is displayed – and it is difficult to assume that the protocol will be one.

There is another limitation to the ‘website’ field – if the user provides an invalid URL (that includes a valid protocol) – for example http://google.google the field will validate – resulting in bad information provided in the entry.

 GravityForms-WebsiteFieldHTTP1

Solution

The code below solves these issue by:

  1. if the value does not include a protocol – assume it is http:// and automatically add it to the value
  2. check the URL and display an error message if it does not link to a valid page (either does not load or loads a 404 error page).

If the URL does not link to a valid page, a custom error message which reads ‘There was an error loading the website address – check the link and try again.’ is displayed.

GravityForms-WebsiteFieldHTTP2

To install the code either add it to your theme’s functions.php file, below the opening <?php line or create your own custom functions plugin and add it there.

add_filter( 'gform_pre_render', 'itsg_check_website_field_value' );
add_filter( 'gform_pre_validation', 'itsg_check_website_field_value' );
function itsg_check_website_field_value( $form ) {
    foreach ( $form['fields'] as &$field ) {  // for all form fields
        if ( 'website' == $field['type'] || ( isset( $field['inputType'] ) && 'website' == $field['inputType']) ) {  // select the fields that are 'website' type
            $value = RGFormsModel::get_field_value($field);  // get the value of the field
            if (! empty($value) ) { // if value not empty
                $field_id = $field['id'];  // get the field id
                $form_id = $form['id'];  // get the form id
                if (! preg_match("~^(?:f|ht)tps?://~i", $value) ) {  // if value does not start with ftp:// http:// or https://
                    $value = "http://" . $value;  // add http:// to start of value
                }
                $check_value = get_headers($value);  // load url and get headers
                if( $check_value == FALSE  ||  strpos($check_value[0], '404') == TRUE ) {  // if header returned was an error or contained a 404 response code
                    add_filter( 'gform_field_validation_'.$form_id.'_'.$field_id, 'itsg_url_not_valid', 10, 4 ); // set the field as not valid
                } 
                $_POST['input_' . $field_id] = $value; // update post with new value
            }
        }
    }
    return $form;
}

function itsg_url_not_valid( $result, $value, $form, $field ) {
    $result['is_valid'] = false;  // set the field as not valid
    $result['message'] = 'there was an error loading the website address - check the link and try again.'; // custom error message when URL did not load
    return $result; 
}