Contact Form & SMTP Plugin for WordPress by PirateForms - Version 2.4.1

Version Description

  • 2018-05-07
Download this release

Release Info

Developer codeinwp
Plugin Icon 128x128 Contact Form & SMTP Plugin for WordPress by PirateForms
Version 2.4.1
Comparing to
See all releases

Code changes from version 2.4.0 to 2.4.1

CHANGELOG.md CHANGED
@@ -1,4 +1,8 @@
1
 
 
 
 
 
2
  ### v2.4.0 - 2018-04-02
3
  **Changes:**
4
  * Improves compatibility with various themes.
1
 
2
+ ### v2.4.1 - 2018-05-07
3
+ **Changes:**
4
+ * GDPR compliance
5
+
6
  ### v2.4.0 - 2018-04-02
7
  **Changes:**
8
  * Improves compatibility with various themes.
admin/class-pirateforms-admin.php CHANGED
@@ -63,15 +63,16 @@ class PirateForms_Admin {
63
  public function enqueue_styles_and_scripts() {
64
  global $pagenow;
65
 
66
- if ( ! empty( $pagenow ) && ( $pagenow == 'options-general.php' || $pagenow == 'admin.php' )
67
- && isset( $_GET['page'] ) && $_GET['page'] == 'pirateforms-admin'
68
- ) {
69
  wp_enqueue_style( 'pirateforms_admin_styles', PIRATEFORMS_URL . 'admin/css/wp-admin.css', array(), $this->version );
70
  wp_enqueue_script( 'pirateforms_scripts_admin', PIRATEFORMS_URL . 'admin/js/scripts-admin.js', array( 'jquery', 'jquery-ui-tooltip' ), $this->version );
71
  wp_localize_script(
72
  'pirateforms_scripts_admin', 'cwp_top_ajaxload', array(
73
  'ajaxurl' => admin_url( 'admin-ajax.php' ),
74
  'nonce' => wp_create_nonce( PIRATEFORMS_SLUG ),
 
75
  'i10n' => array(
76
  'recaptcha' => __( 'Please specify the Site Key and Secret Key.', 'pirate-forms' ),
77
  ),
@@ -303,17 +304,18 @@ class PirateForms_Admin {
303
  'value' => __( 'Store submissions in the database', 'pirate-forms' ),
304
  'html' => '<span class="dashicons dashicons-editor-help"></span>',
305
  'desc' => array(
306
- 'value' => __( 'Should the submissions be stored in the admin area? If chosen, contact form submissions will be saved under "All Entries" on the left (appears after this option is activated).', 'pirate-forms' ),
307
  'class' => 'pirate_forms_option_description',
308
  ),
309
  ),
310
- 'default' => 'yes',
311
  'value' => PirateForms_Util::get_option( 'pirateformsopt_store' ),
312
  'wrap' => array(
313
  'type' => 'div',
314
  'class' => 'pirate-forms-grouped',
315
  ),
316
  'options' => array( 'yes' => __( 'Yes', 'pirate-forms' ) ),
 
317
  ),
318
  array(
319
  'id' => 'pirateformsopt_nonce',
@@ -512,6 +514,23 @@ class PirateForms_Admin {
512
  'req' => __( 'Required', 'pirate-forms' ),
513
  ),
514
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
515
  /* Recaptcha */
516
  array(
517
  'id' => 'pirateformsopt_recaptcha_field',
@@ -634,6 +653,24 @@ class PirateForms_Admin {
634
  'class' => 'pirate-forms-grouped',
635
  ),
636
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
637
  array(
638
  'id' => 'pirateformsopt_email_content',
639
  'type' => 'wysiwyg',
@@ -724,6 +761,19 @@ class PirateForms_Admin {
724
  'class' => 'pirate-forms-grouped',
725
  ),
726
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
727
  array(
728
  'id' => 'pirateformsopt_label_submit',
729
  'type' => 'text',
@@ -1030,6 +1080,48 @@ class PirateForms_Admin {
1030
  return $options;
1031
  }
1032
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1033
  /**
1034
  * Hook into the sent result.
1035
  */
63
  public function enqueue_styles_and_scripts() {
64
  global $pagenow;
65
 
66
+ $allowed = array( 'options-general.php', 'admin.php', 'edit.php', 'post.php' );
67
+
68
+ if ( ( ! empty( $pagenow ) && in_array( $pagenow, $allowed ) ) || ( isset( $_GET['page'] ) && $_GET['page'] == 'pirateforms-admin' ) ) {
69
  wp_enqueue_style( 'pirateforms_admin_styles', PIRATEFORMS_URL . 'admin/css/wp-admin.css', array(), $this->version );
70
  wp_enqueue_script( 'pirateforms_scripts_admin', PIRATEFORMS_URL . 'admin/js/scripts-admin.js', array( 'jquery', 'jquery-ui-tooltip' ), $this->version );
71
  wp_localize_script(
72
  'pirateforms_scripts_admin', 'cwp_top_ajaxload', array(
73
  'ajaxurl' => admin_url( 'admin-ajax.php' ),
74
  'nonce' => wp_create_nonce( PIRATEFORMS_SLUG ),
75
+ 'slug' => PIRATEFORMS_SLUG,
76
  'i10n' => array(
77
  'recaptcha' => __( 'Please specify the Site Key and Secret Key.', 'pirate-forms' ),
78
  ),
304
  'value' => __( 'Store submissions in the database', 'pirate-forms' ),
305
  'html' => '<span class="dashicons dashicons-editor-help"></span>',
306
  'desc' => array(
307
+ 'value' => sprintf( '%s<br>%s', __( 'Should the submissions be stored in the admin area? If chosen, contact form submissions will be saved under "All Entries" on the left (appears after this option is activated).', 'pirate-forms' ), __( 'According to GDPR we recommend you to ask for consent in order to store user data', 'pirate-forms' ) ),
308
  'class' => 'pirate_forms_option_description',
309
  ),
310
  ),
311
+ 'default' => 'no',
312
  'value' => PirateForms_Util::get_option( 'pirateformsopt_store' ),
313
  'wrap' => array(
314
  'type' => 'div',
315
  'class' => 'pirate-forms-grouped',
316
  ),
317
  'options' => array( 'yes' => __( 'Yes', 'pirate-forms' ) ),
318
+ 'title' => __( 'According to GDPR, we recommend you to ask for consent in order to store user data.', 'pirate-forms' ),
319
  ),
320
  array(
321
  'id' => 'pirateformsopt_nonce',
514
  'req' => __( 'Required', 'pirate-forms' ),
515
  ),
516
  ),
517
+ array(
518
+ 'id' => 'pirateformsopt_checkbox_field',
519
+ 'type' => 'select',
520
+ 'label' => array(
521
+ 'value' => __( 'Checkbox', 'pirate-forms' ),
522
+ ),
523
+ 'value' => PirateForms_Util::get_option( 'pirateformsopt_checkbox_field' ),
524
+ 'wrap' => array(
525
+ 'type' => 'div',
526
+ 'class' => 'pirate-forms-grouped pirateformsopt_checkbox',
527
+ ),
528
+ 'options' => array(
529
+ '' => __( 'Do not display', 'pirate-forms' ),
530
+ 'yes' => __( 'Display but not required', 'pirate-forms' ),
531
+ 'req' => __( 'Required', 'pirate-forms' ),
532
+ ),
533
+ ),
534
  /* Recaptcha */
535
  array(
536
  'id' => 'pirateformsopt_recaptcha_field',
653
  'class' => 'pirate-forms-grouped',
654
  ),
655
  ),
656
+ array(
657
+ 'id' => 'pirateformsopt_label_checkbox',
658
+ 'type' => 'wysiwyg',
659
+ 'label' => array(
660
+ 'value' => __( 'Checkbox', 'pirate-forms' ),
661
+ ),
662
+ 'value' => PirateForms_Util::get_option( 'pirateformsopt_label_checkbox' ),
663
+ 'wrap' => array(
664
+ 'type' => 'div',
665
+ 'class' => 'pirate-forms-grouped',
666
+ ),
667
+ 'wysiwyg' => array(
668
+ 'editor_class' => 'pirate-forms-wysiwyg',
669
+ 'quicktags' => false,
670
+ 'teeny' => true,
671
+ 'media_buttons' => false,
672
+ ),
673
+ ),
674
  array(
675
  'id' => 'pirateformsopt_email_content',
676
  'type' => 'wysiwyg',
761
  'class' => 'pirate-forms-grouped',
762
  ),
763
  ),
764
+ array(
765
+ 'id' => 'pirateformsopt_label_err_no_checkbox',
766
+ 'type' => 'text',
767
+ 'label' => array(
768
+ 'value' => __( 'Checkbox is not checked', 'pirate-forms' ),
769
+ ),
770
+ 'default' => __( 'Please select the checkbox', 'pirate-forms' ),
771
+ 'value' => PirateForms_Util::get_option( 'pirateformsopt_label_err_no_checkbox' ),
772
+ 'wrap' => array(
773
+ 'type' => 'div',
774
+ 'class' => 'pirate-forms-grouped',
775
+ ),
776
+ ),
777
  array(
778
  'id' => 'pirateformsopt_label_submit',
779
  'type' => 'text',
1080
  return $options;
1081
  }
1082
 
1083
+ /**
1084
+ * Show admin notices.
1085
+ */
1086
+ public function admin_notices() {
1087
+ $screen = get_current_screen();
1088
+ if ( empty( $screen ) ) {
1089
+ return;
1090
+ }
1091
+ if ( ! isset( $screen->base ) ) {
1092
+ return;
1093
+ }
1094
+
1095
+ if ( ! in_array( $screen->id, array( 'toplevel_page_pirateforms-admin' ) ) ) {
1096
+ return;
1097
+ }
1098
+
1099
+ $options = PirateForms_Util::get_option();
1100
+
1101
+ // check if store submissions is enabled without having a checkbox.
1102
+ if ( 'yes' !== $options['pirateformsopt_store'] ) {
1103
+ return;
1104
+ }
1105
+
1106
+ if ( empty( $options['pirateformsopt_checkbox_field'] ) && false === ( $x = get_transient( 'pirate_forms_gdpr_notice0' ) ) ) {
1107
+ echo sprintf( '<div data-dismissible="0" class="notice notice-warning pirateforms-notice pirateforms-notice-checkbox pirateforms-notice-gdpr is-dismissible"><p><strong>%s</strong></p></div>', __( 'According to GDPR we recommend you to ask for consent in order to store user data', 'pirate-forms' ) );
1108
+ }
1109
+ }
1110
+
1111
+ /**
1112
+ * Generic ajax handler.
1113
+ */
1114
+ public function ajax() {
1115
+ check_ajax_referer( PIRATEFORMS_SLUG, 'security' );
1116
+
1117
+ switch ( $_POST['_action'] ) {
1118
+ case 'dismiss-notice':
1119
+ set_transient( 'pirate_forms_gdpr_notice' . $_POST['id'], 'yes' );
1120
+ break;
1121
+ }
1122
+ wp_die();
1123
+ }
1124
+
1125
  /**
1126
  * Hook into the sent result.
1127
  */
admin/js/scripts-admin.js CHANGED
@@ -148,4 +148,17 @@ function initAll(){
148
  });
149
  }
150
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
151
  }
148
  });
149
  }
150
  });
151
+
152
+ jQuery('.pirateforms-notice-gdpr.is-dismissible').on('click', '.notice-dismiss', function(){
153
+ jQuery.ajax({
154
+ url : cwp_top_ajaxload.ajaxurl,
155
+ type : 'POST',
156
+ data : {
157
+ id : jQuery(this).parent().attr('data-dismissible'),
158
+ _action : 'dismiss-notice',
159
+ security : cwp_top_ajaxload.nonce,
160
+ action : cwp_top_ajaxload.slug
161
+ }
162
+ });
163
+ });
164
  }
includes/class-pirateforms-html.php CHANGED
@@ -124,6 +124,10 @@ class PirateForms_HTML {
124
  $html .= ' disabled';
125
  }
126
 
 
 
 
 
127
  return $html;
128
  }
129
 
@@ -368,7 +372,8 @@ class PirateForms_HTML {
368
  }
369
  foreach ( $args['options'] as $key => $val ) {
370
  $extra = isset( $args['value'] ) && $key == $args['value'] ? 'checked' : '';
371
- $html .= '<input type="checkbox" ' . $extra . ' ' . $this->get_common( $args ) . ' value="' . esc_attr( $key ) . '"><label for="' . esc_attr( $args['id'] ) . '" class="pf-checkbox-label"><span>' . esc_attr( $val ) . '</span></label>';
 
372
  }
373
  }
374
  return $this->get_wrap( $args, $html );
124
  $html .= ' disabled';
125
  }
126
 
127
+ if ( isset( $args['title'] ) && ! empty( $args['title'] ) ) {
128
+ $html .= ' title="' . esc_attr( $args['title'] ) . '"';
129
+ }
130
+
131
  return $html;
132
  }
133
 
372
  }
373
  foreach ( $args['options'] as $key => $val ) {
374
  $extra = isset( $args['value'] ) && $key == $args['value'] ? 'checked' : '';
375
+ // DO NOT escape $val because it can also have HTML markup.
376
+ $html .= '<input type="checkbox" ' . $extra . ' ' . $this->get_common( $args ) . ' value="' . esc_attr( $key ) . '"><label for="' . esc_attr( $args['id'] ) . '" class="pf-checkbox-label"><span>' . $val . '</span></label>';
377
  }
378
  }
379
  return $this->get_wrap( $args, $html );
includes/class-pirateforms.php CHANGED
@@ -69,7 +69,7 @@ class PirateForms {
69
  public function __construct() {
70
 
71
  $this->plugin_name = 'pirateforms';
72
- $this->version = '2.4.0';
73
 
74
  $this->load_dependencies();
75
  $this->set_locale();
@@ -149,9 +149,11 @@ class PirateForms {
149
  $this->loader->add_filter( 'plugin_action_links_' . PIRATEFORMS_BASENAME, $plugin_admin, 'add_settings_link' );
150
  $this->loader->add_action( 'wp_ajax_pirate_forms_save', $plugin_admin, 'save_callback' );
151
  $this->loader->add_action( 'wp_ajax_pirate_forms_test', $plugin_admin, 'test_email' );
 
152
  $this->loader->add_action( 'pirate_forms_load_sidebar', $plugin_admin, 'load_sidebar' );
153
  $this->loader->add_action( 'pirate_forms_load_sidebar_theme', $plugin_admin, 'load_sidebar_theme' );
154
  $this->loader->add_action( 'pirate_forms_load_sidebar_subscribe', $plugin_admin, 'load_sidebar_subscribe' );
 
155
 
156
  // this informs the pro whether the lite will implement the custom spam checkbox or not.
157
  add_filter( 'pirate_forms_support_custom_spam', '__return_true' );
69
  public function __construct() {
70
 
71
  $this->plugin_name = 'pirateforms';
72
+ $this->version = '2.4.1';
73
 
74
  $this->load_dependencies();
75
  $this->set_locale();
149
  $this->loader->add_filter( 'plugin_action_links_' . PIRATEFORMS_BASENAME, $plugin_admin, 'add_settings_link' );
150
  $this->loader->add_action( 'wp_ajax_pirate_forms_save', $plugin_admin, 'save_callback' );
151
  $this->loader->add_action( 'wp_ajax_pirate_forms_test', $plugin_admin, 'test_email' );
152
+ $this->loader->add_action( 'wp_ajax_' . PIRATEFORMS_SLUG, $plugin_admin, 'ajax' );
153
  $this->loader->add_action( 'pirate_forms_load_sidebar', $plugin_admin, 'load_sidebar' );
154
  $this->loader->add_action( 'pirate_forms_load_sidebar_theme', $plugin_admin, 'load_sidebar_theme' );
155
  $this->loader->add_action( 'pirate_forms_load_sidebar_subscribe', $plugin_admin, 'load_sidebar_subscribe' );
156
+ $this->loader->add_action( 'admin_notices', $plugin_admin, 'admin_notices' );
157
 
158
  // this informs the pro whether the lite will implement the custom spam checkbox or not.
159
  add_filter( 'pirate_forms_support_custom_spam', '__return_true' );
pirate-forms.php CHANGED
@@ -16,7 +16,7 @@
16
  * Plugin Name: Free & Simple Contact Form Plugin - Pirateforms
17
  * Plugin URI: http://themeisle.com/plugins/pirate-forms/
18
  * Description: Easily creates a nice looking, simple contact form on your WP site.
19
- * Version: 2.4.0
20
  * Author: Themeisle
21
  * Author URI: http://themeisle.com
22
  * Text Domain: pirate-forms
@@ -36,7 +36,7 @@ if ( ! defined( 'WPINC' ) ) {
36
  define( 'PIRATEFORMS_NAME', 'Pirate Forms' );
37
  define( 'PIRATEFORMS_SLUG', 'pirate-forms' );
38
  define( 'PIRATEFORMS_USELL_LINK', 'https://themeisle.com/plugins/pirate-forms-extended/' );
39
- define( 'PIRATE_FORMS_VERSION', '2.4.0' );
40
  define( 'PIRATEFORMS_DIR', trailingslashit( plugin_dir_path( __FILE__ ) ) );
41
  define( 'PIRATEFORMS_URL', plugin_dir_url( __FILE__ ) );
42
  define( 'PIRATEFORMS_BASENAME', plugin_basename( __FILE__ ) );
16
  * Plugin Name: Free & Simple Contact Form Plugin - Pirateforms
17
  * Plugin URI: http://themeisle.com/plugins/pirate-forms/
18
  * Description: Easily creates a nice looking, simple contact form on your WP site.
19
+ * Version: 2.4.1
20
  * Author: Themeisle
21
  * Author URI: http://themeisle.com
22
  * Text Domain: pirate-forms
36
  define( 'PIRATEFORMS_NAME', 'Pirate Forms' );
37
  define( 'PIRATEFORMS_SLUG', 'pirate-forms' );
38
  define( 'PIRATEFORMS_USELL_LINK', 'https://themeisle.com/plugins/pirate-forms-extended/' );
39
+ define( 'PIRATE_FORMS_VERSION', '2.4.1' );
40
  define( 'PIRATEFORMS_DIR', trailingslashit( plugin_dir_path( __FILE__ ) ) );
41
  define( 'PIRATEFORMS_URL', plugin_dir_url( __FILE__ ) );
42
  define( 'PIRATEFORMS_BASENAME', plugin_basename( __FILE__ ) );
public/class-pirateforms-public.php CHANGED
@@ -341,7 +341,7 @@ class PirateForms_Public {
341
  $field = $pirate_forms_options['pirateformsopt_attachment_field'];
342
 
343
  /**
344
- ****** Message field */
345
  if ( ! empty( $field ) && 'no' !== $field ) :
346
  $required = $field === 'req' ? true : false;
347
  $wrap_classes = array( 'col-xs-12 form_field_wrap contact_attachment_wrap' );
@@ -361,6 +361,38 @@ class PirateForms_Public {
361
  ),
362
  );
363
  endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
364
  /**
365
  ******* ReCaptcha */
366
  if ( ! empty( $pirate_forms_options['pirateformsopt_recaptcha_secretkey'] ) && ! empty( $pirate_forms_options['pirateformsopt_recaptcha_sitekey'] ) && ! empty( $pirate_forms_options['pirateformsopt_recaptcha_field'] ) && ( 'yes' === $pirate_forms_options['pirateformsopt_recaptcha_field'] ) ) :
@@ -482,6 +514,10 @@ class PirateForms_Public {
482
  echo $form_builder->attachment;
483
  }
484
 
 
 
 
 
485
  echo '<div class="pirate-forms-footer">';
486
 
487
  if ( isset( $form_builder->captcha ) ) {
341
  $field = $pirate_forms_options['pirateformsopt_attachment_field'];
342
 
343
  /**
344
+ ****** Attachment field */
345
  if ( ! empty( $field ) && 'no' !== $field ) :
346
  $required = $field === 'req' ? true : false;
347
  $wrap_classes = array( 'col-xs-12 form_field_wrap contact_attachment_wrap' );
361
  ),
362
  );
363
  endif;
364
+
365
+ if ( array_key_exists( 'pirateformsopt_checkbox_field', $pirate_forms_options ) ) {
366
+ $field = $pirate_forms_options['pirateformsopt_checkbox_field'];
367
+ $label = $pirate_forms_options['pirateformsopt_label_checkbox'];
368
+
369
+ /**
370
+ ****** checkbox field */
371
+ if ( ! empty( $field ) && ! empty( $label ) ) :
372
+ $required = $field === 'req' ? true : false;
373
+ $wrap_classes = array( 'col-xs-12 form_field_wrap contact_checkbox_wrap ' );
374
+ // If this field was submitted with invalid data
375
+ if ( isset( $_SESSION[ $error_key ]['contact-checkbox'] ) ) {
376
+ $wrap_classes[] = 'error';
377
+ }
378
+ $elements[] = array(
379
+ 'required' => $required,
380
+ 'required_msg' => $pirate_forms_options['pirateformsopt_label_err_no_checkbox'],
381
+ 'type' => 'checkbox',
382
+ 'class' => 'form-control',
383
+ 'id' => 'pirate-forms-contact-checkbox',
384
+ 'wrap' => array(
385
+ 'type' => 'div',
386
+ 'class' => implode( ' ', apply_filters( 'pirateform_wrap_classes_checkbox', $wrap_classes ) ),
387
+ ),
388
+ 'value' => isset( $_REQUEST['pirate-forms-contact-checkbox'] ) ? $_REQUEST['pirate-forms-contact-checkbox'] : '',
389
+ 'options' => array(
390
+ 'yes' => stripslashes( $label ),
391
+ ),
392
+ );
393
+ endif;
394
+ }
395
+
396
  /**
397
  ******* ReCaptcha */
398
  if ( ! empty( $pirate_forms_options['pirateformsopt_recaptcha_secretkey'] ) && ! empty( $pirate_forms_options['pirateformsopt_recaptcha_sitekey'] ) && ! empty( $pirate_forms_options['pirateformsopt_recaptcha_field'] ) && ( 'yes' === $pirate_forms_options['pirateformsopt_recaptcha_field'] ) ) :
514
  echo $form_builder->attachment;
515
  }
516
 
517
+ if ( isset( $form_builder->contact_checkbox ) ) {
518
+ echo $form_builder->contact_checkbox;
519
+ }
520
+
521
  echo '<div class="pirate-forms-footer">';
522
 
523
  if ( isset( $form_builder->captcha ) ) {
public/css/front.css CHANGED
@@ -1,5 +1,5 @@
1
  /*
2
- Version: 2.4.0
3
  */
4
  .pirate_forms_wrap .form_field_wrap,
5
  .widget .pirate_forms_wrap .form_field_wrap {
1
  /*
2
+ Version: 2.4.1
3
  */
4
  .pirate_forms_wrap .form_field_wrap,
5
  .widget .pirate_forms_wrap .form_field_wrap {
readme.md CHANGED
@@ -89,6 +89,7 @@ This plugin started as a fork of https://wordpress.org/plugins/proper-contact-fo
89
 
90
 
91
 
 
92
  ### How I can get support for this contact form plugin ? ###
93
 
94
  You can learn more about PirateForms and ask for help by <a href="https://themeisle.com/contact/" >visiting ThemeIsle website</a>.
@@ -239,6 +240,12 @@ You can follow the full documentation [here](http://docs.themeisle.com/article/4
239
  = How to set a success page on successful form submission =
240
  [https://docs.themeisle.com/article/836-how-to-set-a-success-page-on-successful-form-submission](https://docs.themeisle.com/article/836-how-to-set-a-success-page-on-successful-form-submission)
241
 
 
 
 
 
 
 
242
  == Installation ==
243
 
244
  Activating the Pirate Contact Form plugin is just like any other plugin. If you've uploaded the plugin package to your server already, skip to step 5 below:
@@ -260,6 +267,11 @@ Activating the Pirate Contact Form plugin is just like any other plugin. If you'
260
  4. Screenshot 4. Enabling SMTP
261
 
262
  ## Changelog ##
 
 
 
 
 
263
  ### 2.4.0 - 2018-04-02 ###
264
 
265
  * Improves compatibility with various themes.
89
 
90
 
91
 
92
+
93
  ### How I can get support for this contact form plugin ? ###
94
 
95
  You can learn more about PirateForms and ask for help by <a href="https://themeisle.com/contact/" >visiting ThemeIsle website</a>.
240
  = How to set a success page on successful form submission =
241
  [https://docs.themeisle.com/article/836-how-to-set-a-success-page-on-successful-form-submission](https://docs.themeisle.com/article/836-how-to-set-a-success-page-on-successful-form-submission)
242
 
243
+ = Pirate Forms: How to change the default subject of email admin receives =
244
+ [https://docs.themeisle.com/article/838-pirate-forms-how-to-change-the-default-subject-of-email-admin-receives](https://docs.themeisle.com/article/838-pirate-forms-how-to-change-the-default-subject-of-email-admin-receives)
245
+
246
+ = How to send a copy of the sent email to the sender. =
247
+ [https://docs.themeisle.com/article/837-how-to-send-a-copy-of-the-sent-email-to-the-sender](https://docs.themeisle.com/article/837-how-to-send-a-copy-of-the-sent-email-to-the-sender)
248
+
249
  == Installation ==
250
 
251
  Activating the Pirate Contact Form plugin is just like any other plugin. If you've uploaded the plugin package to your server already, skip to step 5 below:
267
  4. Screenshot 4. Enabling SMTP
268
 
269
  ## Changelog ##
270
+ ### 2.4.1 - 2018-05-07 ###
271
+
272
+ * GDPR compliance
273
+
274
+
275
  ### 2.4.0 - 2018-04-02 ###
276
 
277
  * Improves compatibility with various themes.
readme.txt CHANGED
@@ -90,6 +90,7 @@ This plugin started as a fork of https://wordpress.org/plugins/proper-contact-fo
90
 
91
 
92
 
 
93
  = How I can get support for this contact form plugin ? =
94
 
95
  You can learn more about PirateForms and ask for help by <a href="https://themeisle.com/contact/" >visiting ThemeIsle website</a>.
@@ -246,6 +247,12 @@ You can follow the full documentation [here](http://docs.themeisle.com/article/4
246
  = How to send a copy of the sent email to the sender. =
247
  [https://docs.themeisle.com/article/837-how-to-send-a-copy-of-the-sent-email-to-the-sender](https://docs.themeisle.com/article/837-how-to-send-a-copy-of-the-sent-email-to-the-sender)
248
 
 
 
 
 
 
 
249
  == Installation ==
250
 
251
  Activating the Pirate Contact Form plugin is just like any other plugin. If you've uploaded the plugin package to your server already, skip to step 5 below:
@@ -267,6 +274,11 @@ Activating the Pirate Contact Form plugin is just like any other plugin. If you'
267
  4. Screenshot 4. Enabling SMTP
268
 
269
  == Changelog ==
 
 
 
 
 
270
  = 2.4.0 - 2018-04-02 =
271
 
272
  * Improves compatibility with various themes.
90
 
91
 
92
 
93
+
94
  = How I can get support for this contact form plugin ? =
95
 
96
  You can learn more about PirateForms and ask for help by <a href="https://themeisle.com/contact/" >visiting ThemeIsle website</a>.
247
  = How to send a copy of the sent email to the sender. =
248
  [https://docs.themeisle.com/article/837-how-to-send-a-copy-of-the-sent-email-to-the-sender](https://docs.themeisle.com/article/837-how-to-send-a-copy-of-the-sent-email-to-the-sender)
249
 
250
+ = How to add a multiple choice field in a form =
251
+ [https://docs.themeisle.com/article/866-how-to-add-a-multiple-choice-field-in-a-form](https://docs.themeisle.com/article/866-how-to-add-a-multiple-choice-field-in-a-form)
252
+
253
+ = How to add a select field in a form =
254
+ [https://docs.themeisle.com/article/867-how-to-add-a-select-field-in-a-form](https://docs.themeisle.com/article/867-how-to-add-a-select-field-in-a-form)
255
+
256
  == Installation ==
257
 
258
  Activating the Pirate Contact Form plugin is just like any other plugin. If you've uploaded the plugin package to your server already, skip to step 5 below:
274
  4. Screenshot 4. Enabling SMTP
275
 
276
  == Changelog ==
277
+ = 2.4.1 - 2018-05-07 =
278
+
279
+ * GDPR compliance
280
+
281
+
282
  = 2.4.0 - 2018-04-02 =
283
 
284
  * Improves compatibility with various themes.
themeisle-hash.json CHANGED
@@ -1 +1 @@
1
- {"index.php":"39ab8276fb0e4bd3fcab3270822c5977","pirate-forms.php":"a54feda2a51796a966f1fac4a878c3f8","uninstall.php":"9d936442a63521d971a6dbc28df9c0d1"}
1
+ {"index.php":"39ab8276fb0e4bd3fcab3270822c5977","pirate-forms.php":"f6b937e432f5487e646b905f2d07f780","uninstall.php":"9d936442a63521d971a6dbc28df9c0d1"}
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
- return ComposerAutoloaderInit63fd87a388ea28e12ff6d1ed77ff179e::getLoader();
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInita5db61f3dfc499606d73fc8e303bc781::getLoader();
vendor/autoload_52.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once dirname(__FILE__) . '/composer'.'/autoload_real_52.php';
6
 
7
- return ComposerAutoloaderInit31b0a0f66e362c1e2219d071f45cca61::getLoader();
4
 
5
  require_once dirname(__FILE__) . '/composer'.'/autoload_real_52.php';
6
 
7
+ return ComposerAutoloaderInit48f2620de42f666b4c12b0ca3903f134::getLoader();
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-deactivate.php CHANGED
@@ -515,12 +515,12 @@ if ( ! class_exists( 'ThemeIsle_SDK_Feedback_Deactivate' ) ) :
515
  return '<div id="' . $this->product->get_key() . '">'
516
  . '<ul class="ti-list">' . $list . '</ul>'
517
  . '<div class="actions">'
518
- . get_submit_button(
519
- $button_submit, 'secondary', $this->product->get_key() . 'ti-deactivate-yes', false, array(
520
- 'data-after-text' => $button_submit,
521
- 'disabled' => true,
522
- )
523
- )
524
  . get_submit_button( $button_cancel, 'primary', $this->product->get_key() . 'ti-deactivate-no', false )
525
  . '</div></div>';
526
  }
515
  return '<div id="' . $this->product->get_key() . '">'
516
  . '<ul class="ti-list">' . $list . '</ul>'
517
  . '<div class="actions">'
518
+ . get_submit_button(
519
+ $button_submit, 'secondary', $this->product->get_key() . 'ti-deactivate-yes', false, array(
520
+ 'data-after-text' => $button_submit,
521
+ 'disabled' => true,
522
+ )
523
+ )
524
  . get_submit_button( $button_cancel, 'primary', $this->product->get_key() . 'ti-deactivate-no', false )
525
  . '</div></div>';
526
  }
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-logger.php CHANGED
@@ -170,16 +170,16 @@ if ( ! class_exists( 'ThemeIsle_SDK_Logger' ) ) :
170
  return '<div >'
171
  . '<p>' . $heading . '</p>'
172
  . '<div class="actions">'
173
- . get_submit_button(
174
- $button_submit, 'primary ' . $this->product->get_key() . '-ti-logger', $this->product->get_key() . 'ti-logger-yes', false, array(
175
- 'data-ti-log-enable' => 1,
176
- )
177
- )
178
- . get_submit_button(
179
- $button_cancel, 'secondary ' . $this->product->get_key() . '-ti-logger', $this->product->get_key() . 'ti-logger-no', false, array(
180
- 'data-ti-log-enable' => 0,
181
- )
182
- )
183
  . '</div></div>';
184
  }
185
 
170
  return '<div >'
171
  . '<p>' . $heading . '</p>'
172
  . '<div class="actions">'
173
+ . get_submit_button(
174
+ $button_submit, 'primary ' . $this->product->get_key() . '-ti-logger', $this->product->get_key() . 'ti-logger-yes', false, array(
175
+ 'data-ti-log-enable' => 1,
176
+ )
177
+ )
178
+ . get_submit_button(
179
+ $button_cancel, 'secondary ' . $this->product->get_key() . '-ti-logger', $this->product->get_key() . 'ti-logger-no', false, array(
180
+ 'data-ti-log-enable' => 0,
181
+ )
182
+ )
183
  . '</div></div>';
184
  }
185
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-product.php CHANGED
@@ -60,11 +60,38 @@ if ( ! class_exists( 'ThemeIsle_SDK_Product' ) ) :
60
  /**
61
  * @var array $allowed_authors The allowed authors.
62
  */
63
- private $allowed_authors = array( 'proteusthemes.com', 'anarieldesign.com', 'prothemedesign.com', 'cssigniter.com' );
 
 
 
 
 
64
  /**
65
  * @var array $allowed_external_products The allowed external_products.
66
  */
67
- private $allowed_products = array( 'zermatt', 'neto', 'olsen', 'benson', 'romero', 'carmack', 'puzzle', 'broadsheet', 'girlywp', 'veggie', 'zeko', 'maishawp', 'didi', 'liber', 'medicpress-pt', 'adrenaline-pt', 'consultpress-pt', 'legalpress-pt', 'gympress-pt', 'readable-pt', 'bolts-pt' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  /**
69
  * @var bool $requires_license Either user needs to activate it with license.
70
  */
@@ -285,6 +312,52 @@ if ( ! class_exists( 'ThemeIsle_SDK_Product' ) ) :
285
  return $versions;
286
  }
287
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
288
  /**
289
  * Return theme versions.
290
  *
@@ -322,20 +395,20 @@ if ( ! class_exists( 'ThemeIsle_SDK_Product' ) ) :
322
  * @return array Array of versions.
323
  */
324
  private function get_api_versions() {
325
- if ( ! $this->is_wordpress_available() ) {
326
- return array();
327
- }
328
 
329
  $cache_key = $this->get_key() . '_' . preg_replace( '/[^0-9a-zA-Z ]/m', '', $this->version ) . 'versions';
330
  $cache_versions = get_transient( $this->get_key() . '_' . preg_replace( '/[^0-9a-zA-Z ]/m', '', $this->version ) . 'versions' );
331
  if ( false == $cache_versions ) {
332
  $versions = array();
333
- if ( $this->get_type() === 'plugin' ) {
334
- $versions = $this->get_plugin_versions();
335
- }
336
-
337
- if ( $this->get_type() === 'theme' ) {
338
- $versions = $this->get_theme_versions();
 
 
 
339
  }
340
  set_transient( $cache_key, $versions, MONTH_IN_SECONDS );
341
  } else {
60
  /**
61
  * @var array $allowed_authors The allowed authors.
62
  */
63
+ private $allowed_authors = array(
64
+ 'proteusthemes.com',
65
+ 'anarieldesign.com',
66
+ 'prothemedesign.com',
67
+ 'cssigniter.com',
68
+ );
69
  /**
70
  * @var array $allowed_external_products The allowed external_products.
71
  */
72
+ private $allowed_products = array(
73
+ 'zermatt',
74
+ 'neto',
75
+ 'olsen',
76
+ 'benson',
77
+ 'romero',
78
+ 'carmack',
79
+ 'puzzle',
80
+ 'broadsheet',
81
+ 'girlywp',
82
+ 'veggie',
83
+ 'zeko',
84
+ 'maishawp',
85
+ 'didi',
86
+ 'liber',
87
+ 'medicpress-pt',
88
+ 'adrenaline-pt',
89
+ 'consultpress-pt',
90
+ 'legalpress-pt',
91
+ 'gympress-pt',
92
+ 'readable-pt',
93
+ 'bolts-pt',
94
+ );
95
  /**
96
  * @var bool $requires_license Either user needs to activate it with license.
97
  */
312
  return $versions;
313
  }
314
 
315
+ /**
316
+ * @return string Return license key, if available.
317
+ */
318
+ private function get_license() {
319
+ $license_data = get_option( $this->get_key() . '_license_data', '' );
320
+
321
+ if ( empty( $license_data ) ) {
322
+ return '';
323
+ }
324
+ if ( ! isset( $license_data->key ) ) {
325
+ return '';
326
+ }
327
+
328
+ return $license_data->key;
329
+ }
330
+
331
+ /**
332
+ * @return array Array of available versions.
333
+ */
334
+ private function get_pro_versions() {
335
+ $license = $this->get_license();
336
+ $store_url = trailingslashit( $this->store_url );
337
+ $url = sprintf( '%s?edd_action=get_versions&name=%s&url=%s&license=%s', $store_url, urlencode( $this->get_name() ), urlencode( get_site_url() ), $license );
338
+ $response = wp_remote_get( $url );
339
+ if ( is_wp_error( $response ) ) {
340
+ return array();
341
+ }
342
+ $response = wp_remote_retrieve_body( $response );
343
+ $response = json_decode( $response );
344
+ if ( ! is_object( $response ) ) {
345
+ return array();
346
+ }
347
+ if ( ! isset( $response->versions ) ) {
348
+ return array();
349
+ }
350
+ $versions = array();
351
+ foreach ( $response->versions as $key => $version ) {
352
+ $versions[] = array(
353
+ 'version' => $version->version,
354
+ 'url' => $version->file,
355
+ );
356
+ }
357
+
358
+ return $versions;
359
+ }
360
+
361
  /**
362
  * Return theme versions.
363
  *
395
  * @return array Array of versions.
396
  */
397
  private function get_api_versions() {
 
 
 
398
 
399
  $cache_key = $this->get_key() . '_' . preg_replace( '/[^0-9a-zA-Z ]/m', '', $this->version ) . 'versions';
400
  $cache_versions = get_transient( $this->get_key() . '_' . preg_replace( '/[^0-9a-zA-Z ]/m', '', $this->version ) . 'versions' );
401
  if ( false == $cache_versions ) {
402
  $versions = array();
403
+ if ( ! $this->is_wordpress_available() ) {
404
+ $versions = $this->get_pro_versions();
405
+ } else {
406
+ if ( $this->get_type() === 'plugin' ) {
407
+ $versions = $this->get_plugin_versions();
408
+ }
409
+ if ( $this->get_type() === 'theme' ) {
410
+ $versions = $this->get_theme_versions();
411
+ }
412
  }
413
  set_transient( $cache_key, $versions, MONTH_IN_SECONDS );
414
  } else {
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-widget-dashboard-blog.php CHANGED
@@ -110,142 +110,156 @@ if ( ! class_exists( 'ThemeIsle_SDK_Widget_Dashboard_Blog' ) ) :
110
  $this->setup_feeds();
111
  ?>
112
  <style type="text/css">
113
- #themeisle ul {
114
- margin-bottom: 0px;
115
- }
116
-
117
  #themeisle ul li.ti-dw-recommend-item {
118
-
119
  padding-left: 7px;
120
  border-top: 1px solid #eee;
121
-
122
  margin-bottom: 0px;
123
  padding-top: 6px;
124
  }
125
-
126
  #themeisle h2.hndle {
127
- background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAYAAABWk2cPAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALfSURBVEhL7VW/ayJBFL7/5ZqziBzIcSCHxUE4hAiCgnAQsBASOAikEAIeCAaCiJAyIBICQURYwoJoEUmxa6MWioWxURu30mq77b57s86acX+oOQhp8sFjdmbfzrfve2/efMI74IP0VTB0gz/th/8iNbQxOt0eOmoN6WgAn78cwJeoYcLf78KrSPVneU3isEQZoz0D3pt03jhDrDTERJXxWM3A5yAOIPmgce/t2IvUGFzjkDa+7C5RTx0gWbxG0v8bBXUG3fLReigk4rh55gtbsAfpGDfhVTS+VA19bYbH7BkqU/56AzNU7nrYpbI7qfbEcxfBkSOHJGO27Vk0htqEYoXvARdS+tsEJyAJY1GRkOxnGTdq2zuaRZOkJ1Wi1+h7ODlJB/l1kYRKZVyKhMwoSmUw5M4uWMhIcl9f1l1qB2m/aMkZQIE2d5BeDTGiSD0VfC4jZPmSKiO+LMJGuoRE1bkiOIW00CAdW3NuxzLmxhD1hyHmug7dbBRD9KdLc4dR6Zfgn0ffXN2EjVSMLIcOrWxuwiyyPhYGI7X0m/agqPeIib5+yit/LWILKYuUlrTa5kbMwjko7J0AXc1RLZwifRF58Us1YXMzYSMV5WQ5ZWsG5VnYaG1BxM7zKBRzOAkHac460gxK9sUnVBqbu9rhKCS9lRaq1/poCeUq7tL6uPnjSLeoBRo9/KXjslqP4Na1gbiQssiULK9gP+VVqPnFQMblnwi+WmTfIji5amLES1mn/mz9yCFVuddZdiFlIJlTK+JtH2/AaPMogzipzrZ+4yQ1qCL1JSaNDL6bf81y1aOb5R6Vhow6G1tPNK9Borl0R2NLRiEaxNEF9Wa3yrHBSarTbeHot7ySqVmYR4AucDYuaJyzkfptZ0e/FeGa03m3jOQPizCAo0QG9W2ktL5HgGt45JRgaBh1x9R1WHY0KCTnLZOW5Kw0miuZq01ITGa6Z18Db9I3xAfpm+IdSIF/du91gSA2+I8AAAAASUVORK5CYII=');
128
  background-repeat: no-repeat;
129
- background-position: 90% 50%;
130
- background-size: 29px;
131
  }
132
-
133
- .ti-dw-feed-item {
 
 
 
 
 
 
 
134
  display: flex;
135
  align-items: center;
 
 
 
 
136
  }
137
-
138
- .ti-dw-feed-item a {
139
- float: left;
140
- width: 89.9%;
141
  }
142
-
143
- .ti-dw-feed-item .ti-dw-day-container {
144
- width: 100%;
145
- letter-spacing: 3px;
146
- display: block;
147
  }
148
-
149
  .ti-dw-feed-item .ti-dw-month-container {
150
-
151
- width: 100%;
152
- display: block;
153
- font-weight: 600;
154
- padding: 0px;
155
- margin-top: -6px;
156
  text-transform: uppercase;
157
  font-size: 10px;
158
  letter-spacing: 1px;
 
159
  }
160
-
161
  .ti-dw-feed-item .ti-dw-date-container {
162
- float: left;
163
- min-height: 30px;
164
- margin-right: 0.1%;
165
- width: 10%;
 
166
  text-align: center;
 
 
 
 
 
 
 
 
 
 
 
 
 
167
  }
168
-
169
  .ti-dw-recommend-item span {
170
  color: #72777c;
171
  }
172
-
173
  .ti-dw-powered-by {
174
- font-style: italic;
175
- text-align: right;
176
- margin-top:3px;
 
 
 
 
177
  }
178
 
 
179
  </style>
180
- <ul>
181
  <?php
182
  foreach ( $this->items as $item ) {
183
  ?>
184
- <li class="ti-dw-feed-item"><span class="ti-dw-date-container"><span
185
- class="ti-dw-day-container"><?php echo date( 'd', $item['date'] ); ?></span> <span
186
- class="ti-dw-month-container"><?php echo substr( date( 'M', $item['date'] ), 0, 3 ); ?></span></span><a
187
- href="
188
- <?php
189
- echo add_query_arg(
190
- array(
191
- 'utm_campaign' => 'feed',
192
- 'utm_medium' => 'dashboard_widget',
193
- ), $item['link']
194
- );
195
- ?>
196
- " target="_blank"><?php echo $item['title']; ?></a>
197
- <div class="clear"></div>
 
198
  </li>
199
  <?php
200
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
201
 
202
- $recommend = apply_filters( 'themeisle_sdk_recommend_plugin_or_theme', array() );
203
- if ( is_array( $recommend ) && ! empty( $recommend ) ) {
204
 
205
- $type = $recommend['type'];
206
- if ( ( $type == 'theme' && current_user_can( 'install_themes' ) ) || ( $type == 'plugin' && current_user_can( 'install_plugins' ) ) ) {
207
- add_thickbox();
208
  $url = add_query_arg(
209
  array(
210
- 'theme' => $recommend['slug'],
211
- ), network_admin_url( 'theme-install.php' )
 
212
  );
213
-
214
- if ( 'plugin' === $type ) {
215
-
216
- $url = add_query_arg(
217
- array(
218
- 'tab' => 'plugin-information',
219
- 'plugin' => $recommend['slug'],
220
- ), network_admin_url( 'plugin-install.php' )
221
- );
222
- }
223
- ?>
224
- <li class="ti-dw-recommend-item ">
225
  <span class="ti-dw-recommend"><?php echo apply_filters( 'themeisle_sdk_dashboard_popular_label', sprintf( 'Popular %s', ucwords( $type ) ) ); ?>
226
  : </span>
227
- <?php
228
- echo trim(
229
- str_replace(
230
- array(
231
- 'lite',
232
- 'Lite',
233
- ), '', $recommend['name']
234
- )
235
- );
236
- ?>
237
- (<a class="thickbox open-plugin-details-modal"
238
- href="<?php echo $url . '&TB_iframe=true&width=600&height=500'; ?>"><?php echo apply_filters( 'themeisle_sdk_dashboard_install_label', 'Install' ); ?></a>)
239
- </li>
240
- <li class="ti-dw-powered-by">
241
- Powered by <?php echo esc_attr( $this->product->get_friendly_name() ); ?>
242
- </li>
243
-
244
  <?php
245
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
246
  }
247
- ?>
248
- </ul>
249
 
250
  <?php
251
 
110
  $this->setup_feeds();
111
  ?>
112
  <style type="text/css">
 
 
 
 
113
  #themeisle ul li.ti-dw-recommend-item {
 
114
  padding-left: 7px;
115
  border-top: 1px solid #eee;
 
116
  margin-bottom: 0px;
117
  padding-top: 6px;
118
  }
 
119
  #themeisle h2.hndle {
120
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA3Ny4xMiA3Ny4xMiI+PHRpdGxlPkFzc2V0IDM8L3RpdGxlPjxwYXRoIGQ9Ik03NS43Niw0Ny42cS0xLjUsNi40Ni00LjA3LDkuMjZBMzYuMjIsMzYuMjIsMCwwLDEsNjMuMjYsNjNhNTEsNTEsMCwwLDEtOS43OSw0LjZoLS4xNXY0LjgyQTQuNjYsNC42NiwwLDAsMSw1Miw3NS43Niw0LjA3LDQuMDcsMCwwLDEsNDksNzcuMTJhNCw0LDAsMCwxLTIuMTgtLjYxQTQuOTQsNC45NCwwLDAsMSw0NS4xOSw3NWE0LjQyLDQuNDIsMCwwLDEtNy41NCwwLDQuOTQsNC45NCwwLDAsMS0xLjU4LDEuNSwzLjc1LDMuNzUsMCwwLDEtMiwuNjFBNC4yNyw0LjI3LDAsMCwxLDMwLjI3LDc1YTQuOTQsNC45NCwwLDAsMS0xLjU4LDEuNSw0LDQsMCwwLDEtMi4xOC42MSwzLjkzLDMuOTMsMCwwLDEtMy4xNi0xLjQzLDUuMyw1LjMsMCwwLDEtMS4yMS0zLjU0LDEzLjgxLDEzLjgxLDAsMCwxLTguNTgsMywxMy4yMywxMy4yMywwLDAsMS05LTMuNDdBMTguMjEsMTguMjEsMCwwLDAsOSw3MC43OWExNC4yNiwxNC4yNiwwLDAsMS03LjgzLTUuNDIsMTYuMTIsMTYuMTIsMCwwLDAsNS4xOS4wNywxMi44OSwxMi44OSwwLDAsMCw0LjktMS43M1EzLjE1LDU1LjQzLDEuMDUsNTAuNDZhMTgsMTgsMCwwLDEtMS02LjkzQTQwLDQwLDAsMCwxLDEuMjEsMzQsMjYuNTksMjYuNTksMCwwLDEsNS4yNywyNC4xUTguNDQsMTkuNDMsMTMsMTkuNDNhMy40MSwzLjQxLDAsMCwxLDMuNDcsMi4yNmMuNi0uOCwxLjItMS41NiwxLjgxLTIuMjZsLjQ1LS40NS43NS0uNzUsMS4wNS0xLjgxYTM1LjIsMzUuMiwwLDAsMSwyLjExLTMuMzIsMjguNTcsMjguNTcsMCwwLDEsOS4xMi03LjY4QTIzLjQsMjMuNCwwLDAsMSw0Mi45MywyLjU2YTIyLjIyLDIyLjIyLDAsMCwxLDIuNzEuMTVBOC4xNiw4LjE2LDAsMCwxLDUxLjgxLDAsOC42OSw4LjY5LDAsMCwxLDU4LDIuNDFhMS41MSwxLjUxLDAsMCwxLC4xNS42OGMwLC4yNS0uNTUuOTMtMS42NiwybC0uMy4zYTkuNjksOS42OSwwLDAsMSwxLjU4LjgzYy41NS4zNS44My42NS44My45YTEuNjIsMS42MiwwLDAsMS0uNiwxbC0uMTUuMTVxNi43OCw2LDguNTgsMTYuMjdBMy4zLDMuMywwLDAsMSw2OSwyMy4zNWE2LjQ4LDYuNDgsMCwwLDEsNC4yMiwyLjFxMy45MiwzLjMyLDMuOTIsMTEuOUE0Mi4wNSw0Mi4wNSwwLDAsMSw3NS43Niw0Ny42Wk01My42Miw1NC4wN2EyNCwyNCwwLDAsMS0xNCw0LjUyQTIxLjQxLDIxLjQxLDAsMCwxLDI3LDU0LjY3LDI0LjI4LDI0LjI4LDAsMCwxLDE4LjUzLDQ1YTI5LDI5LDAsMCwxLTMtMTMsMzEuNzgsMzEuNzgsMCwwLDEsLjkxLTcuNTNBMzIuMTcsMzIuMTcsMCwwLDAsMTEuOSw0MS4yN2EzMy41LDMzLjUsMCwwLDAsMi43OSwxMy40LDI5LjEsMjkuMSwwLDAsMCw3LjksMTAuODUsNC42OCw0LjY4LDAsMCwxLDEuNjYtMS44OCw0LjE3LDQuMTcsMCwwLDEsNC40NC0uMDgsNC41LDQuNSwwLDAsMSwxLjU4LDEuNjZBNC4yLDQuMiwwLDAsMSwzNCw2M2EzLjgzLDMuODMsMCwwLDEsMiwuNiw0LjUsNC41LDAsMCwxLDEuNTgsMS42Niw0LjI3LDQuMjcsMCwwLDEsNy41NCwwLDQuNSw0LjUsMCwwLDEsMS41OC0xLjY2LDQuMTcsNC4xNywwLDAsMSw0LjQ0LjA4LDMuODYsMy44NiwwLDAsMSwxLjUxLDEuNzMsMzAuMTcsMzAuMTcsMCwwLDAsNy42OC05Ljk0LDMxLjE4LDMxLjE4LDAsMCwwLDMuMTYtMTIuMzVBMjguMzksMjguMzksMCwwLDEsNTMuNjIsNTQuMDdaTTI4Ljc3LDY1LjM3YTMuMSwzLjEsMCwwLDAtNC4zNywwLDMuMDYsMy4wNiwwLDAsMC0uOSwyLjI2djQuODJhMy4zMiwzLjMyLDAsMCwwLC45LDIuMzMsMi45MywyLjkzLDAsMCwwLDQuMzcsMCwzLjMyLDMuMzIsMCwwLDAsLjktMi4zM1Y2Ny42M0EzLjA2LDMuMDYsMCwwLDAsMjguNzcsNjUuMzdabS45LTQ4YTQuMjQsNC4yNCwwLDAsMCwzLjQ3LDEuNzMsNC40NSw0LjQ1LDAsMCwwLDMuNTQtMS43Myw2LDYsMCwwLDAsMS40My0zLjkyLDUuNyw1LjcsMCwwLDAtMS40My0zLjg0QTQuNTMsNC41MywwLDAsMCwzMy4xNCw4YTQuMzEsNC4zMSwwLDAsMC0zLjQ3LDEuNjYsNS43OSw1Ljc5LDAsMCwwLTEuMzUsMy43N0E2LjMzLDYuMzMsMCwwLDAsMjkuNjcsMTcuNFptNi40OCw0OGEzLjEsMy4xLDAsMCwwLTQuMzcsMCwzLjA2LDMuMDYsMCwwLDAtLjksMi4yNnY0LjgyYTMuMzIsMy4zMiwwLDAsMCwuOSwyLjMzLDIuOTMsMi45MywwLDAsMCw0LjM3LDAsMy4zMiwzLjMyLDAsMCwwLC45LTIuMzNWNjcuNjNBMy4wNiwzLjA2LDAsMCwwLDM2LjE1LDY1LjM3Wm0tNC4wNy01NC4zYTIuMzcsMi4zNywwLDAsMSwyLTEsMi4xNywyLjE3LDAsMCwxLDEuODgsMSw0LjEsNC4xLDAsMCwxLDAsNC41MiwyLjE3LDIuMTcsMCwwLDEtMS44OCwxLDIuMzcsMi4zNywwLDAsMS0yLTEsMy43MiwzLjcyLDAsMCwxLS43NS0yLjM0QTMuNDksMy40OSwwLDAsMSwzMi4wOCwxMS4wN1ptNSw5LjQxYTIwLjYxLDIwLjYxLDAsMCwwLTMuNTQsMTIuMjgsMTcuMTUsMTcuMTUsMCwwLDAsNC4wNywxMSwxMi40MywxMi40MywwLDAsMCw5Ljg3LDQuNDUsMTUuMywxNS4zLDAsMCwwLDktMywxMywxMywwLDAsMCwuNi0zLjMycTAtMy4zMi0zLjE2LTMuMzFhOC41OCw4LjU4LDAsMCwwLTIsLjNxLTcuODMsMS41LTExLjU5LS4zLTQuNTMtMi4xMi00LjUyLTkuMzRBMzcuOTIsMzcuOTIsMCwwLDEsMzcuMDUsMjAuNDhaTTYxLjQ1LDE3QTEyLjg0LDEyLjg0LDAsMCwwLDUxLjIxLDEyLjJhMTUuMTEsMTUuMTEsMCwwLDAtNi40LDEuNDMsMTcuODMsMTcuODMsMCwwLDAtNS41LDRxLTYuMTgsMjAuNjQsNi4xOCwyMC42NEEyNC43NSwyNC43NSwwLDAsMCw0OSwzNy44MWEzOC45MiwzOC45MiwwLDAsMSw0LjgyLS40NmMxLjgxLDAsMy4wNi40NiwzLjc3LDEuMzZxMS4zNSwxLjUuNzUsNS4xMmEyMS43MiwyMS43MiwwLDAsMCw1LTcuMTVBMjEuMzgsMjEuMzgsMCwwLDAsNjUuMDcsMjgsMTcuNDQsMTcuNDQsMCwwLDAsNjEuNDUsMTdaTTQzLjYsNjUuMzdhMi43MiwyLjcyLDAsMCwwLTIuMS0uOSwzLDMsMCwwLDAtMi4xOS45LDMuMDYsMy4wNiwwLDAsMC0uOSwyLjI2djQuODJhMy4zMiwzLjMyLDAsMCwwLC45LDIuMzMsMi44NCwyLjg0LDAsMCwwLDIuMTksMSwyLjYxLDIuNjEsMCwwLDAsMi4xLTEsMy40NSwzLjQ1LDAsMCwwLC44My0yLjMzVjY3LjYzQTMuMTcsMy4xNywwLDAsMCw0My42LDY1LjM3Wm03LjQ2LDBhMywzLDAsMCwwLTIuMTgtLjksMi43MywyLjczLDAsMCwwLTIuMTEuOSwzLjE3LDMuMTcsMCwwLDAtLjgzLDIuMjZ2NC44MmEzLjQ1LDMuNDUsMCwwLDAsLjgzLDIuMzMsMi42MSwyLjYxLDAsMCwwLDIuMTEsMSwyLjgzLDIuODMsMCwwLDAsMi4xOC0xLDMuMzIsMy4zMiwwLDAsMCwuOS0yLjMzVjY3LjYzQTMuMDYsMy4wNiwwLDAsMCw1MS4wNiw2NS4zN1oiLz48L3N2Zz4=');
121
  background-repeat: no-repeat;
122
+ background-position: 92% 50%;
123
+ background-size: 30px;
124
  }
125
+ #themeisle .inside {
126
+ padding: 0;
127
+ }
128
+ .ti-feed-list {
129
+ padding: 0 12px 5px;
130
+ margin-bottom: 10px;
131
+ border-bottom: 1px solid #eee;
132
+ }
133
+ .ti-dw-feed-item a {
134
  display: flex;
135
  align-items: center;
136
+ margin-bottom: 5px;
137
+ padding: 5px;
138
+ transition: .2s ease;
139
+ border-radius: 3px;
140
  }
141
+ .ti-dw-feed-item a:hover {
142
+ background-color: #f8f8f8;
 
 
143
  }
144
+ .ti-dw-feed-item a:hover .ti-dw-date-container {
145
+ opacity: .9;
 
 
 
146
  }
 
147
  .ti-dw-feed-item .ti-dw-month-container {
148
+ margin-top: -5px;
 
 
 
 
 
149
  text-transform: uppercase;
150
  font-size: 10px;
151
  letter-spacing: 1px;
152
+ font-weight: 700;
153
  }
 
154
  .ti-dw-feed-item .ti-dw-date-container {
155
+ border-radius: 3px;
156
+ transition: .2s ease;
157
+ min-height: 35px;
158
+ margin-right: 5px;
159
+ min-width: 35px;
160
  text-align: center;
161
+ border: 1px solid #2a6f97;
162
+ color: #fff;
163
+ background: #2ea2cc;
164
+ display: flex;
165
+ flex-direction: column;
166
+ justify-content: center;
167
+ }
168
+ .ti-dw-footer {
169
+ padding: 0 12px 5px;
170
+ text-align: center;
171
+ }
172
+ .ti-dw-recommend-item {
173
+ display: block;
174
  }
 
175
  .ti-dw-recommend-item span {
176
  color: #72777c;
177
  }
 
178
  .ti-dw-powered-by {
179
+ font-size: 11px;
180
+ margin-top: 3px;
181
+ display: block;
182
+ color: #72777c;
183
+ }
184
+ .ti-dw-powered-by span {
185
+ font-weight: 600;
186
  }
187
 
188
+
189
  </style>
190
+ <ul class="ti-feed-list">
191
  <?php
192
  foreach ( $this->items as $item ) {
193
  ?>
194
+ <li class="ti-dw-feed-item">
195
+ <a href="
196
+ <?php
197
+ echo add_query_arg(
198
+ array(
199
+ 'utm_campaign' => 'feed',
200
+ 'utm_medium' => 'dashboard_widget',
201
+ ), $item['link']
202
+ );
203
+ ?>
204
+ " target="_blank">
205
+ <span class="ti-dw-date-container"><span
206
+ class="ti-dw-day-container"><?php echo date( 'd', $item['date'] ); ?></span> <span
207
+ class="ti-dw-month-container"><?php echo substr( date( 'M', $item['date'] ), 0, 3 ); ?></span></span><?php echo $item['title']; ?>
208
+ </a>
209
  </li>
210
  <?php
211
  }
212
+ ?>
213
+ </ul>
214
+ <?php
215
+ $recommend = apply_filters( 'themeisle_sdk_recommend_plugin_or_theme', array() );
216
+ if ( is_array( $recommend ) && ! empty( $recommend ) ) {
217
+
218
+ $type = $recommend['type'];
219
+ if ( ( $type == 'theme' && current_user_can( 'install_themes' ) ) || ( $type == 'plugin' && current_user_can( 'install_plugins' ) ) ) {
220
+ add_thickbox();
221
+ $url = add_query_arg(
222
+ array(
223
+ 'theme' => $recommend['slug'],
224
+ ), network_admin_url( 'theme-install.php' )
225
+ );
226
 
227
+ if ( 'plugin' === $type ) {
 
228
 
 
 
 
229
  $url = add_query_arg(
230
  array(
231
+ 'tab' => 'plugin-information',
232
+ 'plugin' => $recommend['slug'],
233
+ ), network_admin_url( 'plugin-install.php' )
234
  );
235
+ }
236
+ ?>
237
+ <div class="ti-dw-footer">
238
+ <span class="ti-dw-recommend-item ">
 
 
 
 
 
 
 
 
239
  <span class="ti-dw-recommend"><?php echo apply_filters( 'themeisle_sdk_dashboard_popular_label', sprintf( 'Popular %s', ucwords( $type ) ) ); ?>
240
  : </span>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
241
  <?php
242
+ echo trim(
243
+ str_replace(
244
+ array(
245
+ 'lite',
246
+ 'Lite',
247
+ ), '', $recommend['name']
248
+ )
249
+ );
250
+ ?>
251
+ (<a class="thickbox open-plugin-details-modal"
252
+ href="<?php echo $url . '&TB_iframe=true&width=600&height=500'; ?>"><?php echo apply_filters( 'themeisle_sdk_dashboard_install_label', 'Install' ); ?></a>)
253
+ </span>
254
+ <span class="ti-dw-powered-by">
255
+ Powered by <span><?php echo esc_attr( $this->product->get_friendly_name() ); ?></span>
256
+ </span>
257
+ </div>
258
+
259
+ <?php
260
  }
261
+ }
262
+ ?>
263
 
264
  <?php
265
 
vendor/codeinwp/themeisle-sdk/load.php CHANGED
@@ -11,7 +11,7 @@
11
  */
12
 
13
  // Current SDK version and path.
14
- $themeisle_sdk_version = '2.1.2';
15
  $themeisle_sdk_path = dirname( __FILE__ );
16
 
17
  global $themeisle_sdk_max_version;
11
  */
12
 
13
  // Current SDK version and path.
14
+ $themeisle_sdk_version = '2.2.3';
15
  $themeisle_sdk_path = dirname( __FILE__ );
16
 
17
  global $themeisle_sdk_max_version;
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit63fd87a388ea28e12ff6d1ed77ff179e
6
  {
7
  private static $loader;
8
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInit63fd87a388ea28e12ff6d1ed77ff179e
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit63fd87a388ea28e12ff6d1ed77ff179e', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit63fd87a388ea28e12ff6d1ed77ff179e', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
@@ -42,14 +42,14 @@ class ComposerAutoloaderInit63fd87a388ea28e12ff6d1ed77ff179e
42
 
43
  $includeFiles = require __DIR__ . '/autoload_files.php';
44
  foreach ($includeFiles as $fileIdentifier => $file) {
45
- composerRequire63fd87a388ea28e12ff6d1ed77ff179e($fileIdentifier, $file);
46
  }
47
 
48
  return $loader;
49
  }
50
  }
51
 
52
- function composerRequire63fd87a388ea28e12ff6d1ed77ff179e($fileIdentifier, $file)
53
  {
54
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
55
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInita5db61f3dfc499606d73fc8e303bc781
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInita5db61f3dfc499606d73fc8e303bc781', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInita5db61f3dfc499606d73fc8e303bc781', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
42
 
43
  $includeFiles = require __DIR__ . '/autoload_files.php';
44
  foreach ($includeFiles as $fileIdentifier => $file) {
45
+ composerRequirea5db61f3dfc499606d73fc8e303bc781($fileIdentifier, $file);
46
  }
47
 
48
  return $loader;
49
  }
50
  }
51
 
52
+ function composerRequirea5db61f3dfc499606d73fc8e303bc781($fileIdentifier, $file)
53
  {
54
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
55
  require $file;
vendor/composer/autoload_real_52.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real_52.php generated by xrstf/composer-php52
4
 
5
- class ComposerAutoloaderInit31b0a0f66e362c1e2219d071f45cca61 {
6
  private static $loader;
7
 
8
  public static function loadClassLoader($class) {
@@ -19,9 +19,9 @@ class ComposerAutoloaderInit31b0a0f66e362c1e2219d071f45cca61 {
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit31b0a0f66e362c1e2219d071f45cca61', 'loadClassLoader'), true /*, true */);
23
  self::$loader = $loader = new xrstf_Composer52_ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit31b0a0f66e362c1e2219d071f45cca61', 'loadClassLoader'));
25
 
26
  $vendorDir = dirname(dirname(__FILE__));
27
  $baseDir = dirname($vendorDir);
2
 
3
  // autoload_real_52.php generated by xrstf/composer-php52
4
 
5
+ class ComposerAutoloaderInit48f2620de42f666b4c12b0ca3903f134 {
6
  private static $loader;
7
 
8
  public static function loadClassLoader($class) {
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit48f2620de42f666b4c12b0ca3903f134', 'loadClassLoader'), true /*, true */);
23
  self::$loader = $loader = new xrstf_Composer52_ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit48f2620de42f666b4c12b0ca3903f134', 'loadClassLoader'));
25
 
26
  $vendorDir = dirname(dirname(__FILE__));
27
  $baseDir = dirname($vendorDir);
vendor/composer/installed.json CHANGED
@@ -6,15 +6,15 @@
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/Codeinwp/themeisle-sdk.git",
9
- "reference": "18bcad4b82796f4b6996dea42832ce3518924f25"
10
  },
11
  "dist": {
12
  "type": "zip",
13
- "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/18bcad4b82796f4b6996dea42832ce3518924f25",
14
- "reference": "18bcad4b82796f4b6996dea42832ce3518924f25",
15
  "shasum": ""
16
  },
17
- "time": "2018-03-19 21:12:50",
18
  "type": "library",
19
  "installation-source": "dist",
20
  "autoload": {
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/Codeinwp/themeisle-sdk.git",
9
+ "reference": "ae7fce00ef4fdec1b3f5b918ee0b5e9fe18d588f"
10
  },
11
  "dist": {
12
  "type": "zip",
13
+ "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/ae7fce00ef4fdec1b3f5b918ee0b5e9fe18d588f",
14
+ "reference": "ae7fce00ef4fdec1b3f5b918ee0b5e9fe18d588f",
15
  "shasum": ""
16
  },
17
+ "time": "2018-04-30 11:29:58",
18
  "type": "library",
19
  "installation-source": "dist",
20
  "autoload": {