Contact Form by WPForms – Drag & Drop Form Builder for WordPress - Version 1.2.7

Version Description

  • Added: Store intial plugin activation date
  • Added: Duplicate form submit protection
  • Fixed: Strip slashes from entry data before processing
Download this release

Release Info

Developer jaredatch
Plugin Icon 128x128 Contact Form by WPForms – Drag & Drop Form Builder for WordPress
Version 1.2.7
Comparing to
See all releases

Code changes from version 1.2.6 to 1.2.7

assets/css/admin-builder-fields.css CHANGED
@@ -16,6 +16,10 @@
16
  display: table;
17
  }
18
 
 
 
 
 
19
 
20
  /* Sidebar
21
  -------------------------------------------------------------- */
@@ -462,9 +466,6 @@
462
  font-weight: 400;
463
  }
464
 
465
- #wpforms-panel-fields .wpforms-field-option-address .format-selected-us .wpforms-field-option-row-country,
466
- #wpforms-panel-fields .wpforms-field-option-address .format-selected-us .wpforms-field-option-row-region,
467
- #wpforms-panel-fields .wpforms-field-option-address .format-selected-international .wpforms-field-option-row-state,
468
  #wpforms-panel-fields .wpforms-field-option-name .format-selected-simple .wpforms-field-option-row-first,
469
  #wpforms-panel-fields .wpforms-field-option-name .format-selected-simple .wpforms-field-option-row-middle,
470
  #wpforms-panel-fields .wpforms-field-option-name .format-selected-simple .wpforms-field-option-row-last,
@@ -529,6 +530,10 @@
529
  position: relative;
530
  }
531
 
 
 
 
 
532
  #wpforms-panel-fields .wpforms-field .wpforms-field-delete {
533
  color: #d22222;
534
  position: absolute;
@@ -800,22 +805,19 @@
800
  }
801
 
802
  /* Address field */
803
- #wpforms-panel-fields .wpforms-field-address.size-small .format-selected {
804
  width: 25%;
805
  }
806
 
807
- #wpforms-panel-fields .wpforms-field-address.size-medium .format-selected,
808
- #wpforms-panel-fields .wpforms-field-address .format-selected {
809
  width: 65%;
810
  }
811
 
812
- #wpforms-panel-fields .wpforms-field-address.size-large .format-selected {
813
  width: 100%;
814
  }
815
 
816
- #wpforms-panel-fields .wpforms-field-address .format-selected-international .us-only,
817
- #wpforms-panel-fields .wpforms-field-address .format-selected-us .international-only,
818
- #wpforms-panel-fields .wpforms-field-address .format-selected-us .wpforms-country,
819
  #wpforms-panel-fields .wpforms-field-address .wpforms-hide{
820
  display: none;
821
  }
16
  display: table;
17
  }
18
 
19
+ #wpforms-hidden {
20
+ display: none;
21
+ }
22
+
23
 
24
  /* Sidebar
25
  -------------------------------------------------------------- */
466
  font-weight: 400;
467
  }
468
 
 
 
 
469
  #wpforms-panel-fields .wpforms-field-option-name .format-selected-simple .wpforms-field-option-row-first,
470
  #wpforms-panel-fields .wpforms-field-option-name .format-selected-simple .wpforms-field-option-row-middle,
471
  #wpforms-panel-fields .wpforms-field-option-name .format-selected-simple .wpforms-field-option-row-last,
530
  position: relative;
531
  }
532
 
533
+ #wpforms-panel-fields .wpforms-field .wpforms-field-row:last-of-type {
534
+ margin: 0;
535
+ }
536
+
537
  #wpforms-panel-fields .wpforms-field .wpforms-field-delete {
538
  color: #d22222;
539
  position: absolute;
805
  }
806
 
807
  /* Address field */
808
+ #wpforms-panel-fields .wpforms-field-address.size-small .wpforms-address-scheme {
809
  width: 25%;
810
  }
811
 
812
+ #wpforms-panel-fields .wpforms-field-address.size-medium .wpforms-address-scheme,
813
+ #wpforms-panel-fields .wpforms-field-address .wpforms-address-scheme {
814
  width: 65%;
815
  }
816
 
817
+ #wpforms-panel-fields .wpforms-field-address.size-large .wpforms-address-scheme {
818
  width: 100%;
819
  }
820
 
 
 
 
821
  #wpforms-panel-fields .wpforms-field-address .wpforms-hide{
822
  display: none;
823
  }
assets/js/admin-builder.js CHANGED
@@ -616,7 +616,7 @@
616
  });
617
 
618
  // Display toggle for Address field hide address line 2 option
619
- $(document).on('change', '.wpforms-field-option-address .format-selected input.hide', function(e) {
620
  var $this = $(this),
621
  id = $this.parent().parent().data('field-id'),
622
  subfield = $this.parent().parent().data('subfield');
@@ -673,7 +673,7 @@
673
  $('#wpforms-field-'+id).toggleClass('sublabel_hide');
674
  });
675
 
676
- // Real-time updates for Name field "Format" option
677
  $(document).on('change', '.wpforms-field-option-row-format select', function(e) {
678
  var $this = $(this),
679
  value = $this.val(),
@@ -682,8 +682,23 @@
682
  $('#wpforms-field-option-'+id).find('.format-selected').removeClass().addClass('format-selected format-selected-'+value);
683
  })
684
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
685
  // Real-time updates for Address, Date/Time, and Name "Placeholder" field options
686
- $(document).on('input', '.wpforms-field-option .format-selected input.placeholder', function(e) {
687
  var $this = $(this),
688
  value = $this.val(),
689
  id = $this.parent().parent().data('field-id'),
@@ -735,11 +750,9 @@
735
  $(document).on('change', '.wpforms-field-option-row-nav_align select', function(e) {
736
  var $this = $(this),
737
  value = $this.val();
738
-
739
  if (!value) {
740
  value = 'center';
741
  }
742
-
743
  $('.wpforms-pagebreak-buttons').removeClass('wpforms-pagebreak-buttons-center wpforms-pagebreak-buttons-left wpforms-pagebreak-buttons-right wpforms-pagebreak-buttons-split').addClass('wpforms-pagebreak-buttons-'+value);
744
  });
745
 
@@ -762,10 +775,19 @@
762
 
763
  // Real-time updates for Single Item field "Item Price" option
764
  $(document).on('input', '.wpforms-field-option-row-price input', function(e) {
765
- var $this = $(this),
766
- value = $this.val(),
767
- id = $this.parent().data('field-id');
768
- $('#wpforms-field-'+id).find('.price').text(value);
 
 
 
 
 
 
 
 
 
769
  });
770
 
771
  // Real-time updates for payment CC icons
@@ -773,7 +795,6 @@
773
  var $this = $(this),
774
  card = $this.data('card')
775
  id = $this.parent().data('field-id');
776
- console.log( card + ' - ' + id );
777
  $('#wpforms-field-'+id).find('img.icon-'+card).toggleClass('card_hide');
778
  });
779
 
616
  });
617
 
618
  // Display toggle for Address field hide address line 2 option
619
+ $(document).on('change', '.wpforms-field-option-address input.hide', function(e) {
620
  var $this = $(this),
621
  id = $this.parent().parent().data('field-id'),
622
  subfield = $this.parent().parent().data('subfield');
673
  $('#wpforms-field-'+id).toggleClass('sublabel_hide');
674
  });
675
 
676
+ // Real-time updates for Date/Time and Name "Format" option
677
  $(document).on('change', '.wpforms-field-option-row-format select', function(e) {
678
  var $this = $(this),
679
  value = $this.val(),
682
  $('#wpforms-field-option-'+id).find('.format-selected').removeClass().addClass('format-selected format-selected-'+value);
683
  })
684
 
685
+ // Real-time updates specific for Address "Scheme" option
686
+ $(document).on('change', '.wpforms-field-option-row-scheme select', function(e) {
687
+ var $this = $(this),
688
+ value = $this.val(),
689
+ id = $this.parent().data('field-id');
690
+ $('#wpforms-field-'+id).find('.wpforms-address-scheme').addClass('wpforms-hide');
691
+ $('#wpforms-field-'+id).find('.wpforms-address-scheme-'+value).removeClass('wpforms-hide');
692
+
693
+ if ( $('#wpforms-field-'+id).find('.wpforms-address-scheme-'+value+' .wpforms-country' ).children().length == 0 ) {
694
+ $('#wpforms-field-option-'+id).find('.wpforms-field-option-row-country').addClass('wpforms-hidden');
695
+ } else {
696
+ $('#wpforms-field-option-'+id).find('.wpforms-field-option-row-country').removeClass('wpforms-hidden');
697
+ }
698
+ })
699
+
700
  // Real-time updates for Address, Date/Time, and Name "Placeholder" field options
701
+ $(document).on('input', '.wpforms-field-option .format-selected input.placeholder, .wpforms-field-option-address input.placeholder', function(e) {
702
  var $this = $(this),
703
  value = $this.val(),
704
  id = $this.parent().parent().data('field-id'),
750
  $(document).on('change', '.wpforms-field-option-row-nav_align select', function(e) {
751
  var $this = $(this),
752
  value = $this.val();
 
753
  if (!value) {
754
  value = 'center';
755
  }
 
756
  $('.wpforms-pagebreak-buttons').removeClass('wpforms-pagebreak-buttons-center wpforms-pagebreak-buttons-left wpforms-pagebreak-buttons-right wpforms-pagebreak-buttons-split').addClass('wpforms-pagebreak-buttons-'+value);
757
  });
758
 
775
 
776
  // Real-time updates for Single Item field "Item Price" option
777
  $(document).on('input', '.wpforms-field-option-row-price input', function(e) {
778
+ var $this = $(this),
779
+ value = $this.val(),
780
+ id = $this.parent().data('field-id'),
781
+ sanitized = wpf.amountSanitize(value),
782
+ formatted = wpf.amountFormat(sanitized),
783
+ singleItem;
784
+ if ( wpforms_builder.currency_symbol_pos == 'right' ) {
785
+ singleItem = formatted+' '+wpforms_builder.currency_symbol;
786
+ } else {
787
+ singleItem = wpforms_builder.currency_symbol+' '+formatted;
788
+ }
789
+ $('#wpforms-field-'+id).find('.primary-input').val(formatted);
790
+ $('#wpforms-field-'+id).find('.price').text(singleItem);
791
  });
792
 
793
  // Real-time updates for payment CC icons
795
  var $this = $(this),
796
  card = $this.data('card')
797
  id = $this.parent().data('field-id');
 
798
  $('#wpforms-field-'+id).find('img.icon-'+card).toggleClass('card_hide');
799
  });
800
 
assets/js/wpforms.js CHANGED
@@ -112,6 +112,14 @@
112
  } else {
113
  error.insertAfter(element);
114
  }
 
 
 
 
 
 
 
 
115
  }
116
  }
117
  }
112
  } else {
113
  error.insertAfter(element);
114
  }
115
+ },
116
+ submitHandler: function(form) {
117
+ var $submit = $(form).find('.wpforms-submit'),
118
+ altText = $submit.data('alt-text');
119
+ if (altText) {
120
+ $submit.text(altText).prop('disabled', true);
121
+ }
122
+ form.submit();
123
  }
124
  }
125
  }
includes/admin/builder/panels/class-settings.php CHANGED
@@ -124,6 +124,14 @@ class WPForms_Builder_Panel_Settings extends WPForms_Builder_Panel {
124
  __( 'Submit Button Text', 'wpforms' ),
125
  array( 'default' => __( 'Submit', 'wpforms' ) )
126
  );
 
 
 
 
 
 
 
 
127
  wpforms_panel_field(
128
  'text',
129
  'settings',
124
  __( 'Submit Button Text', 'wpforms' ),
125
  array( 'default' => __( 'Submit', 'wpforms' ) )
126
  );
127
+ wpforms_panel_field(
128
+ 'text',
129
+ 'settings',
130
+ 'submit_text_processing',
131
+ $this->form_data,
132
+ __( 'Submit Button Processing Text', 'wpforms' ),
133
+ array( 'tooltip' => __( 'Enter the submit button text you would like the button display while the form submit is processing.', 'wpforms' ) )
134
+ );
135
  wpforms_panel_field(
136
  'text',
137
  'settings',
includes/class-frontend.php CHANGED
@@ -573,9 +573,15 @@ class WPForms_Frontend {
573
 
574
  $settings = $form_data['settings'];
575
  $submit = apply_filters( 'wpforms_field_submit' , esc_html( $settings['submit_text'] ), $form_data );
 
576
  $submit_classes = array();
577
  $visible = wpforms_has_pagebreak( $form_data ) ? 'style="display:none;"' : '';
578
 
 
 
 
 
 
579
  // Check user defined submit button classes
580
  if ( !empty( $settings['submit_class'] ) ) {
581
  $user_classes = explode( ' ', str_replace('.', '', $settings['submit_class'] ) );
@@ -609,7 +615,13 @@ class WPForms_Frontend {
609
 
610
  echo '<input type="hidden" name="wpforms[id]" value="' . $form->ID . '">';
611
 
612
- echo '<button type="submit" name="wpforms[submit]" class="wpforms-submit ' . implode( ' ', $submit_classes ) . '" id="wpforms-submit-' . $form->ID . '" value="wpforms-submit">' . $submit . '</button>';
 
 
 
 
 
 
613
 
614
  echo '</div>';
615
  }
@@ -743,7 +755,7 @@ class WPForms_Frontend {
743
  endif;
744
 
745
  // Load jquery input mask library - https://github.com/RobinHerbots/jquery.inputmask
746
- if ( $this->assets_global() || true == wpforms_has_field_type( 'phone', $this->forms, true ) ) :
747
  wp_enqueue_script(
748
  'wpforms-maskedinput',
749
  WPFORMS_PLUGIN_URL . 'assets/js/jquery.inputmask.bundle.min.js',
573
 
574
  $settings = $form_data['settings'];
575
  $submit = apply_filters( 'wpforms_field_submit' , esc_html( $settings['submit_text'] ), $form_data );
576
+ $submit_process = '';
577
  $submit_classes = array();
578
  $visible = wpforms_has_pagebreak( $form_data ) ? 'style="display:none;"' : '';
579
 
580
+ // Check for submit button alt-text
581
+ if ( !empty( $settings['submit_text_processing'] ) ) {
582
+ $submit_process = 'data-alt-text="' . esc_attr( $settings['submit_text_processing'] ) .'"';
583
+ }
584
+
585
  // Check user defined submit button classes
586
  if ( !empty( $settings['submit_class'] ) ) {
587
  $user_classes = explode( ' ', str_replace('.', '', $settings['submit_class'] ) );
615
 
616
  echo '<input type="hidden" name="wpforms[id]" value="' . $form->ID . '">';
617
 
618
+ printf(
619
+ '<button type="submit" name="wpforms[submit]" class="wpforms-submit %s" id="wpforms-submit-%d" value="wpforms-submit" %s>%s</button>',
620
+ implode( ' ', $submit_classes ),
621
+ $form->ID,
622
+ $submit_process,
623
+ $submit
624
+ );
625
 
626
  echo '</div>';
627
  }
755
  endif;
756
 
757
  // Load jquery input mask library - https://github.com/RobinHerbots/jquery.inputmask
758
+ if ( $this->assets_global() || true == wpforms_has_field_type( array( 'phone', 'address' ), $this->forms, true ) ) :
759
  wp_enqueue_script(
760
  'wpforms-maskedinput',
761
  WPFORMS_PLUGIN_URL . 'assets/js/jquery.inputmask.bundle.min.js',
includes/class-install.php CHANGED
@@ -37,7 +37,15 @@ class WPForms_Install {
37
  do_action( 'wpforms_install' );
38
 
39
  // Set current version, to be referenced in future updates
40
- update_option( 'wpforms_version', WPFORMS_VERSION );
 
 
 
 
 
 
 
 
41
 
42
  // Abort so we only set the transient for single site installs
43
  if ( is_network_admin() || isset( $_GET['activate-multi'] ) ) {
37
  do_action( 'wpforms_install' );
38
 
39
  // Set current version, to be referenced in future updates
40
+ update_option( 'wpforms_version', WPFORMS_VERSION );
41
+
42
+ // Store the date when the initial activation was performed
43
+ $type = class_exists( 'WPForms_Lite' ) ? 'lite' : 'pro';
44
+ $activated = get_option( 'wpforms_activated', array() );
45
+ if ( empty( $activated[$type] ) ) {
46
+ $activated[$type] = time();
47
+ update_option( 'wpforms_activated', $activated );
48
+ }
49
 
50
  // Abort so we only set the transient for single site installs
51
  if ( is_network_admin() || isset( $_GET['activate-multi'] ) ) {
includes/class-process.php CHANGED
@@ -56,7 +56,7 @@ class WPForms_Process {
56
  }
57
 
58
  if ( !empty( $_POST['wpforms']['id'] ) ) {
59
- $this->process( $_POST['wpforms'] );
60
  }
61
  }
62
 
56
  }
57
 
58
  if ( !empty( $_POST['wpforms']['id'] ) ) {
59
+ $this->process( stripslashes_deep( $_POST['wpforms'] ) );
60
  }
61
  }
62
 
includes/templates/class-blank.php CHANGED
@@ -29,6 +29,7 @@ class WPForms_Template_Blank extends WPForms_Template {
29
  'settings' => array(
30
  'honeypot' => '1',
31
  'confirmation_message_scroll' => '1',
 
32
  ),
33
  'meta' => array(
34
  'template' => $this->slug,
29
  'settings' => array(
30
  'honeypot' => '1',
31
  'confirmation_message_scroll' => '1',
32
+ 'submit_text_processing' => __( 'Sending...', 'wpforms' ),
33
  ),
34
  'meta' => array(
35
  'template' => $this->slug,
includes/templates/class-contact.php CHANGED
@@ -60,6 +60,7 @@ class WPForms_Template_Contact extends WPForms_Template {
60
  ),
61
  'honeypot' => '1',
62
  'confirmation_message_scroll' => '1',
 
63
  ),
64
  'meta' => array(
65
  'template' => $this->slug,
60
  ),
61
  'honeypot' => '1',
62
  'confirmation_message_scroll' => '1',
63
+ 'submit_text_processing' => __( 'Sending...', 'wpforms' ),
64
  ),
65
  'meta' => array(
66
  'template' => $this->slug,
includes/templates/class-suggestion.php CHANGED
@@ -85,6 +85,7 @@ class WPForms_Template_Suggestion extends WPForms_Template {
85
  ),
86
  'honeypot' => '1',
87
  'confirmation_message_scroll' => '1',
 
88
  ),
89
  'meta' => array(
90
  'template' => $this->slug,
85
  ),
86
  'honeypot' => '1',
87
  'confirmation_message_scroll' => '1',
88
+ 'submit_text_processing' => __( 'Sending...', 'wpforms' ),
89
  ),
90
  'meta' => array(
91
  'template' => $this->slug,
lite/includes/admin/class-settings.php CHANGED
@@ -412,7 +412,19 @@ class WPForms_Settings {
412
 
413
  $return = '### Begin System Info ###' . "\n\n";
414
 
415
- // Start with the basics...
 
 
 
 
 
 
 
 
 
 
 
 
416
  $return .= '-- Site Info' . "\n\n";
417
  $return .= 'Site URL: ' . site_url() . "\n";
418
  $return .= 'Home URL: ' . home_url() . "\n";
412
 
413
  $return = '### Begin System Info ###' . "\n\n";
414
 
415
+ // WPForms info
416
+ $activated = get_option( 'wpforms_activated', array() );
417
+ $return .= '-- WPForms Info' . "\n\n";
418
+ if ( !empty( $activated['pro'] ) ) {
419
+ $date = $activated['pro'] + ( get_option( 'gmt_offset' ) * 3600 );
420
+ $return .= 'Pro: ' . date_i18n( __( 'M j, Y @ g:ia' ), $date ) . "\n";
421
+ }
422
+ if ( !empty( $activated['lite'] ) ) {
423
+ $date = $activated['lite'] + ( get_option( 'gmt_offset' ) * 3600 );
424
+ $return .= 'Lite: ' . date_i18n( __( 'M j, Y @ g:ia' ), $date ) . "\n";
425
+ }
426
+
427
+ // Now the basics...
428
  $return .= '-- Site Info' . "\n\n";
429
  $return .= 'Site URL: ' . site_url() . "\n";
430
  $return .= 'Home URL: ' . home_url() . "\n";
lite/wpforms-lite.php CHANGED
@@ -572,6 +572,14 @@ class WPForms_Lite {
572
  </div>
573
  <div class="wpforms-addon-action"><a href="<?php echo $upgrade; ?>" target="_blank">Upgrade Now</a></div>
574
  </div>
 
 
 
 
 
 
 
 
575
  <div style="clear:both"></div>
576
  </div>
577
  <?php
572
  </div>
573
  <div class="wpforms-addon-action"><a href="<?php echo $upgrade; ?>" target="_blank">Upgrade Now</a></div>
574
  </div>
575
+ <div class="wpforms-addon-item wpforms-addon-status-upgrade wpforms-second">
576
+ <div class="wpforms-addon-image"><img src="https://wpforms.com/images/addon-icon-zapier.png"></div>
577
+ <div class="wpforms-addon-text">
578
+ <h4>Zapier Addon</h4>
579
+ <p class="desc">WPForms Zapier addon allows you to connect your forms with over 500+ web applications using Zapier.</p>
580
+ </div>
581
+ <div class="wpforms-addon-action"><a href="<?php echo $upgrade; ?>" target="_blank">Upgrade Now</a></div>
582
+ </div>
583
  <div style="clear:both"></div>
584
  </div>
585
  <?php
readme.txt CHANGED
@@ -163,6 +163,11 @@ Syed Balkhi
163
 
164
  == Changelog ==
165
 
 
 
 
 
 
166
  = 1.2.6 =
167
  - Added: Miscellaneous internal improvements
168
  - Fixed: Incorrectly named variables in the front-end javascript preventing features from properly being extendable
163
 
164
  == Changelog ==
165
 
166
+ = 1.2.7 =
167
+ - Added: Store intial plugin activation date
168
+ - Added: Duplicate form submit protection
169
+ - Fixed: Strip slashes from entry data before processing
170
+
171
  = 1.2.6 =
172
  - Added: Miscellaneous internal improvements
173
  - Fixed: Incorrectly named variables in the front-end javascript preventing features from properly being extendable
wpforms.php CHANGED
@@ -5,7 +5,7 @@
5
  * Description: Beginner friendly WordPress contact form plugin. Use our Drag & Drop form builder to create your WordPress forms.
6
  * Author: WPForms
7
  * Author URI: https://wpforms.com
8
- * Version: 1.2.6
9
  * Text Domain: wpforms
10
  * Domain Path: languages
11
  *
@@ -81,7 +81,7 @@ final class WPForms {
81
  * @since 1.0.0
82
  * @var sting
83
  */
84
- public $version = '1.2.6';
85
 
86
  /**
87
  * The form data handler instance.
5
  * Description: Beginner friendly WordPress contact form plugin. Use our Drag & Drop form builder to create your WordPress forms.
6
  * Author: WPForms
7
  * Author URI: https://wpforms.com
8
+ * Version: 1.2.7
9
  * Text Domain: wpforms
10
  * Domain Path: languages
11
  *
81
  * @since 1.0.0
82
  * @var sting
83
  */
84
+ public $version = '1.2.7';
85
 
86
  /**
87
  * The form data handler instance.