Popups by OptinMonster – Best WordPress Lead Generation Plugin - Version 1.3.3

Version Description

  • Fixed an issue that prevented campaigns from showing on some custom taxononmy terms.
  • Performance improvements when retrieving, and determining when to display, campaigns.
  • All URLs updated to use HTTPS.
  • Updated notifications.
Download this release

Release Info

Developer griffinjt
Plugin Icon 128x128 Popups by OptinMonster – Best WordPress Lead Generation Plugin
Version 1.3.3
Comparing to
See all releases

Code changes from version 1.3.2 to 1.3.3

OMAPI/Content.php CHANGED
@@ -394,7 +394,7 @@ class OMAPI_Content {
394
  public function migrate() {
395
  ?>
396
  <p><?php _e( 'Your campaigns created within WordPress using the original OptinMonster plugin can be recreated manually in your OptinMonster account.', 'optin-monster-api' ); ?></p>
397
- <p><a href="http://optinmonster.com/docs/old-wordpress-customers-migrating-to-the-new-optinmonster-app/"><?php _e( 'Read the full post about the changes.')?></a></p>
398
  <?php
399
  }
400
 
394
  public function migrate() {
395
  ?>
396
  <p><?php _e( 'Your campaigns created within WordPress using the original OptinMonster plugin can be recreated manually in your OptinMonster account.', 'optin-monster-api' ); ?></p>
397
+ <p><a href="https://optinmonster.com/docs/old-wordpress-customers-migrating-to-the-new-optinmonster-app/"><?php _e( 'Read the full post about the changes.')?></a></p>
398
  <?php
399
  }
400
 
OMAPI/Menu.php CHANGED
@@ -303,7 +303,7 @@ class OMAPI_Menu {
303
  $plugins = get_plugins();
304
  $active_plugins = get_option( 'active_plugins', array() );
305
  $used_plugins = "\n";
306
- $api_ping = wp_remote_request( 'http://api.optinmonster.com/v1/ping' );
307
  foreach ( $plugins as $plugin_path => $plugin ) {
308
  if ( ! in_array( $plugin_path, $active_plugins ) ) {
309
  continue;
@@ -1159,7 +1159,7 @@ class OMAPI_Menu {
1159
  $field ='';
1160
 
1161
  $field .= '<div class="omapi-support-links ' . $setting . '"><h3>' . $title . '</h3><ul>';
1162
- $field .= '<li><a target="_blank" href="' . esc_url( 'http://optinmonster.com/docs/' ) . '">'. __('Documentation','optin-monster-api') . '</a></li>';
1163
  $field .= '<li><a target="_blank" href="' . esc_url( 'https://wordpress.org/plugins/optinmonster/changelog/' ) . '">'. __('Changelog','optin-monster-api') . '</a></li>';
1164
  $field .= '<li><a target="_blank" href="' . esc_url( 'https://app.optinmonster.com/account/support/' ) . '">'. __('Create a Support Ticket','optin-monster-api') . '</a></li>';
1165
  $field .= '</ul></div>';
@@ -1431,7 +1431,7 @@ class OMAPI_Menu {
1431
 
1432
  // Return the sas link if we have a sas ID
1433
  if ( ! empty( $omSasId ) ) {
1434
- return 'http://www.shareasale.com/r.cfm?u='
1435
  . urlencode( trim( $omSasId ) )
1436
  . '&b=601672&m=49337&afftrack=&urllink=optinmonster.com';
1437
  }
@@ -1475,7 +1475,7 @@ class OMAPI_Menu {
1475
 
1476
  // Return the trial link if we have a trial ID
1477
  if ( ! empty( $omTrialId ) ) {
1478
- return 'http://www.shareasale.com/r.cfm?u='
1479
  . urlencode( trim( $omTrialId ) )
1480
  . '&b=601672&m=49337&afftrack=&urllink=optinmonster.com%2Ffree-trial%2F%3Fid%3D' . urlencode( trim( $omTrialId ) );
1481
  }
303
  $plugins = get_plugins();
304
  $active_plugins = get_option( 'active_plugins', array() );
305
  $used_plugins = "\n";
306
+ $api_ping = wp_remote_request( 'https://api.optinmonster.com/v1/ping' );
307
  foreach ( $plugins as $plugin_path => $plugin ) {
308
  if ( ! in_array( $plugin_path, $active_plugins ) ) {
309
  continue;
1159
  $field ='';
1160
 
1161
  $field .= '<div class="omapi-support-links ' . $setting . '"><h3>' . $title . '</h3><ul>';
1162
+ $field .= '<li><a target="_blank" href="' . esc_url( 'https://optinmonster.com/docs/' ) . '">'. __('Documentation','optin-monster-api') . '</a></li>';
1163
  $field .= '<li><a target="_blank" href="' . esc_url( 'https://wordpress.org/plugins/optinmonster/changelog/' ) . '">'. __('Changelog','optin-monster-api') . '</a></li>';
1164
  $field .= '<li><a target="_blank" href="' . esc_url( 'https://app.optinmonster.com/account/support/' ) . '">'. __('Create a Support Ticket','optin-monster-api') . '</a></li>';
1165
  $field .= '</ul></div>';
1431
 
1432
  // Return the sas link if we have a sas ID
1433
  if ( ! empty( $omSasId ) ) {
1434
+ return 'https://www.shareasale.com/r.cfm?u='
1435
  . urlencode( trim( $omSasId ) )
1436
  . '&b=601672&m=49337&afftrack=&urllink=optinmonster.com';
1437
  }
1475
 
1476
  // Return the trial link if we have a trial ID
1477
  if ( ! empty( $omTrialId ) ) {
1478
+ return 'https://www.shareasale.com/r.cfm?u='
1479
  . urlencode( trim( $omTrialId ) )
1480
  . '&b=601672&m=49337&afftrack=&urllink=optinmonster.com%2Ffree-trial%2F%3Fid%3D' . urlencode( trim( $omTrialId ) );
1481
  }
OMAPI/Migration.php DELETED
@@ -1,415 +0,0 @@
1
- <?php
2
- /**
3
- * Migration class.
4
- *
5
- * @since 1.0.0
6
- *
7
- * @package OMAPI
8
- * @author Thomas Griffin
9
- */
10
- class OMAPI_Migration {
11
-
12
- /**
13
- * Path to the file.
14
- *
15
- * @since 1.0.0
16
- *
17
- * @var string
18
- */
19
- public $file = __FILE__;
20
-
21
- /**
22
- * Holds the base class object.
23
- *
24
- * @since 1.0.0
25
- *
26
- * @var OMAPI
27
- */
28
- public $base;
29
-
30
- /**
31
- * The API class
32
- *
33
- * @since 1.0.0
34
- *
35
- * @var OMAPI_Api
36
- */
37
- private $api;
38
-
39
- /**
40
- * Class constructor.
41
- *
42
- * @since 1.0.0
43
- */
44
- public function __construct( OMAPI_Api $api ) {
45
-
46
- $this->base = OMAPI::get_instance();
47
- $this->api = $api;
48
- $this->data = $this->gather_data();
49
-
50
- }
51
-
52
- /**
53
- * Collects all of the data necessary to migrate
54
- *
55
- * @since 1.0.0
56
- *
57
- * @return array
58
- */
59
- protected function gather_data() {
60
-
61
- $data = array();
62
-
63
- // Get site info
64
- $data['site'] = $this->get_site();
65
-
66
- // Get optins
67
- $data['optins'] = $this->get_optins();
68
-
69
- // Get integrations
70
- $data['integrations'] = $this->get_integrations();
71
-
72
- return $data;
73
-
74
- }
75
-
76
- /**
77
- * Collects the site information and global settings
78
- *
79
- * @since 1.0.0
80
- *
81
- * @return array
82
- */
83
- protected function get_site() {
84
-
85
- $site = array();
86
-
87
- // Get site name
88
- $site['name'] = get_bloginfo( 'name' );
89
-
90
- // Get site url
91
- $site['url'] = site_url();
92
-
93
- $site_options = get_option( 'optin_monster' );
94
-
95
- // Return early if options were not found
96
- if ( ! $site_options ) {
97
- return $site;
98
- }
99
-
100
- // Setup site options
101
- $site['global_cookie'] = isset( $site_options['cookie'] ) ? $site_options['cookie'] : 0;
102
- $site['affiliate_link'] = isset( $site_options['affiliate_link'] ) ? $site_options['affiliate_link'] : '';
103
- $site['affiliate_link_position'] = isset( $site_options['affiliate_link_position'] ) ? $site_options['affiliate_link_position'] : 'under';
104
-
105
- return $this->escape_values( $site );
106
-
107
- }
108
-
109
- /**
110
- * Collects all of the optins.
111
- *
112
- * Parent optins then split tests to ensure split tests
113
- * can be assigned to an existing parent during migration.
114
- *
115
- * @since 1.0.0
116
- *
117
- * @return array
118
- */
119
- protected function get_optins() {
120
-
121
- // Get all the optins
122
- $args = array(
123
- 'post_type' => 'optin',
124
- 'post_status' => 'publish',
125
- 'no_found_rows' => true,
126
- 'cache_results' => false,
127
- 'nopaging' => true,
128
- 'meta_query' => array(
129
- array(
130
- 'key' => '_om_is_clone',
131
- 'compare' => 'NOT EXISTS',
132
- 'value' => '',
133
- )
134
- ),
135
- );
136
- $optins = get_posts( $args );
137
-
138
- // Return early if we don't find any optins
139
- if ( empty( $optins ) ) {
140
- return false;
141
- }
142
-
143
- // Get the split tests
144
- foreach ( $optins as $optin ) {
145
- $splits = $this->get_split_tests( $optin->ID );
146
-
147
- if ( $splits ) {
148
- foreach ( $splits as $split ) {
149
- $optins[] = $split;
150
- }
151
- }
152
- }
153
-
154
- $migration_data = get_option( '_om_migration_data', array( 'migrated_optins' => array() ) );
155
- foreach ( $optins as $key => $optin ) {
156
- // Unset the optin if it has already been migrated
157
- if ( in_array( $optin->ID, $migration_data['migrated_optins'] ) ) {
158
- unset($optins[$key] );
159
- continue;
160
- }
161
-
162
- // Add all of the meta info as WP_Post properties to simplify migration
163
- $optin->split_note = get_post_meta( $optin->ID, '_om_split_notes', true );
164
- $optin->has_clone = get_post_meta( $optin->ID, '_om_has_clone' );
165
- $optin->is_clone = get_post_meta( $optin->ID, '_om_is_clone', true );
166
- $optin->meta = get_post_meta( $optin->ID, '_om_meta' );
167
-
168
- // Add the image as a property if needed
169
- $image_id = get_post_meta( $optin->ID, '_thumbnail_id', true );
170
- if ( $image_id ) {
171
- $image = wp_get_attachment_metadata( $image_id );
172
- $optin->image = array();
173
- $optin->image['filename'] = basename( $image['file'] );
174
- $optin->image['alt'] = get_post_meta( $image_id, '_wp_attachment_image_alt', true );
175
-
176
- $file = file_get_contents( WP_CONTENT_DIR . '/uploads/' . $image['file'] );
177
- $optin->image['data'] = base64_encode( $file );
178
- }
179
- }
180
-
181
- // Return all the data
182
- return $this->escape_values( $optins );
183
-
184
- }
185
-
186
- /**
187
- * Pulls the integration info
188
- *
189
- * @since 1.0.0
190
- *
191
- * @return bool|array
192
- */
193
- protected function get_integrations() {
194
-
195
- $providers = get_option( 'optin_monster_providers' );
196
-
197
- if ( ! $providers ) {
198
- return array();
199
- }
200
-
201
- return $this->escape_values( $providers );
202
-
203
- }
204
-
205
- /**
206
- * Runs the migration through OMAPI_Api
207
- *
208
- * @since 1.0.0
209
- *
210
- * @return bool
211
- */
212
- public function run() {
213
-
214
- $this->api->set_additional_data( $this->data );
215
- $response = $this->api->request();
216
-
217
- if ( is_wp_error( $response ) ) {
218
- return false;
219
- }
220
-
221
- $migration_data = get_option( '_om_migration_data', array( 'migrated_optins' => array() ) );
222
- $migration_data['errors'] = false;
223
- if ( property_exists( $response, 'imported_optins' ) ) {
224
- $migration_data['migrated_optins'] = array_merge( $migration_data['migrated_optins'], $response->imported_optins );
225
- }
226
-
227
- if ( property_exists( $response, 'integrations' ) ) {
228
- $migration_data['integrations'] = $response->integrations;
229
- }
230
-
231
- if ( property_exists( $response, 'site' ) ) {
232
- $migration_data['site'] = $response->site;
233
- }
234
-
235
- if ( property_exists( $response, 'errors' ) ) {
236
- foreach ( $response->errors as $error ) {
237
- $migration_data['errors'][] = $error;
238
- }
239
- }
240
-
241
- if ( property_exists( $response, 'new_optins' ) && $response->new_optins ) {
242
- foreach ( $response->new_optins as $slug => $optin ) {
243
- // Maybe update an optin rather than add a new one.
244
- $local = $this->base->get_optin_by_slug( $slug );
245
- $data = array();
246
- if ( $local ) {
247
- $data['ID'] = $local->ID;
248
- $data['post_title'] = $optin->title;
249
- $data['post_content'] = $optin->output;
250
- $data['post_status'] = 'publish';
251
- wp_update_post( $data );
252
- update_post_meta( $local->ID, '_omapi_type', $optin->type );
253
- update_post_meta( $local->ID, '_omapi_ids', $optin->ids );
254
- $post_id = $local->ID;
255
- } else {
256
- $data['post_name'] = $slug;
257
- $data['post_title'] = $optin->title;
258
- $data['post_excerpt'] = $optin->id;
259
- $data['post_content'] = $optin->output;
260
- $data['post_status'] = 'publish';
261
- $data['post_type'] = 'omapi';
262
- $post_id = wp_insert_post( $data );
263
- update_post_meta( $post_id, '_omapi_type', $optin->type );
264
- update_post_meta( $post_id, '_omapi_ids', $optin->ids );
265
- }
266
-
267
- // Now that the data has been saved, let's now try to grab meta from the previous optin for output settings.
268
- $prev_optin = get_posts(
269
- array(
270
- 'post_type' => 'optin',
271
- 'posts_per_page' => 1,
272
- 'no_found_rows' => true,
273
- 'cache_results' => false,
274
- 'name' => $slug
275
- )
276
- );
277
- if ( empty( $prev_optin ) ) {
278
- continue;
279
- }
280
-
281
- // Now grab all the meta for the optin.
282
- $prev_optin = $prev_optin[0];
283
- $meta = get_post_meta( $prev_optin->ID, '_om_meta', true );
284
- $test = get_post_meta( $prev_optin->ID, '_om_test_mode', true );
285
- $fields = $this->base->output->fields;
286
-
287
- // Get all the new fields available and store the data.
288
- foreach ( $fields as $field ) {
289
- $value = false;
290
- switch ( $field ) {
291
- case 'enabled' :
292
- $value = false; // Make sure the optins are disabled by default when being added back.
293
- break;
294
- case 'global' :
295
- $value = isset( $meta['display']['global'] ) && $meta['display']['global'] ? true : false;
296
- break;
297
- case 'automatic' :
298
- $value = isset( $meta['display']['automatic'] ) && $meta['display']['automatic'] ? true : false;
299
- break;
300
- case 'users' :
301
- $value = isset( $meta['logged_in'] ) && $meta['logged_in'] ? 'out' : 'all';
302
- break;
303
- case 'never' :
304
- $value = ! empty( $meta['display']['never'] ) ? $meta['display']['never'] : array();
305
- break;
306
- case 'only' :
307
- $value = ! empty( $meta['display']['exclusive'] ) ? $meta['display']['exclusive'] : array();
308
- break;
309
- case 'categories' :
310
- $value = ! empty( $meta['display']['categories'] ) ? $meta['display']['categories'] : array();
311
- break;
312
- case 'show' :
313
- $value = ! empty( $meta['display']['show'] ) ? $meta['display']['show'] : array();
314
- break;
315
- case 'test' :
316
- $value = $test ? true : false;
317
- break;
318
- case 'shortcode' :
319
- $value = false;
320
- break;
321
- case 'mailpoet' :
322
- $provider = isset( $meta['email']['provider'] ) ? $meta['email']['provider'] : 'none';
323
- $value = 'mailpoet' == $provider ? true : false;
324
-
325
- // If true, we need to set the MailPoet list as well.
326
- if ( $value ) {
327
- $list = isset( $meta['email']['list_id'] ) ? $meta['email']['list_id'] : false;
328
- if ( $list ) {
329
- update_post_meta( $post_id, '_omapi_mailpoet_list', $list );
330
- }
331
- }
332
- break;
333
- case 'type' :
334
- case 'ids' :
335
- $value = get_post_meta( $post_id, '_omapi_' . $field, true );
336
- break;
337
- }
338
- update_post_meta( $post_id, '_omapi_' . $field, $value );
339
- }
340
- }
341
- }
342
-
343
- update_option( '_om_migration_data', $migration_data );
344
- return true;
345
-
346
- }
347
-
348
- /**
349
- * Pulls all split tests for a given optin
350
- *
351
- * @since 1.0.0
352
- *
353
- * @param $id
354
- * @return array|bool
355
- */
356
- private function get_split_tests( $id ) {
357
- $optin = get_post( $id );
358
- if ( ! $optin ) {
359
- return false;
360
- }
361
- $clones = get_post_meta( $optin->ID, '_om_has_clone', true );
362
- if ( empty( $clones ) ) {
363
- return false;
364
- }
365
- // Return the split test objects.
366
- $objects = array();
367
- foreach ( $clones as $clone ) {
368
- $objects[] = get_post( $clone );
369
- }
370
-
371
- return $objects;
372
- }
373
-
374
- /**
375
- * Escapes all HTML in an optin to prevent insertion errors.
376
- *
377
- * @since 1.0.0
378
- *
379
- * @param array $data Array of data to escape.
380
- * @return array $new_data Sanitized array of data.
381
- */
382
- private function escape_values( $data = array() ) {
383
-
384
- $new_data = array();
385
- foreach ( $data as $key => $value ) {
386
- if ( is_array( $value ) ) {
387
- if ( is_array( $data ) ) {
388
- unset( $data[ $key ] );
389
- } else {
390
- unset( $data->{$key} );
391
- }
392
- $new_data[ $key ] = $this->escape_values( $value );
393
- } else if ( is_object( $value ) ) {
394
- if ( is_array( $data ) ) {
395
- unset( $data[ $key ] );
396
- } else {
397
- unset( $data->{$key} );
398
- }
399
- $new_data[ $key ] = (object) $this->escape_values( $value );
400
- } else {
401
- $new_val = is_string( $value ) ? esc_html( $value ) : $value;
402
- $new_data[ $key ] = $new_val;
403
- if ( is_array( $data ) ) {
404
- unset( $data[ $key ] );
405
- } else {
406
- unset( $data->{$key} );
407
- }
408
- }
409
- }
410
-
411
- return $new_data;
412
-
413
- }
414
-
415
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
OMAPI/Output.php CHANGED
@@ -136,7 +136,7 @@ class OMAPI_Output {
136
  public function set() {
137
 
138
  self::$instance = $this;
139
- $this->base = OMAPI::get_instance();
140
  $this->fields = apply_filters( 'optin_monster_api_output_fields', $this->fields );
141
 
142
  }
@@ -163,7 +163,7 @@ class OMAPI_Output {
163
  *
164
  * @since 1.0.0
165
  *
166
- * @param string $tag The HTML script output.
167
  * @param string $handle The script handle to target.
168
  * @return string $tag Amended HTML script with our ID attribute appended.
169
  */
@@ -304,7 +304,7 @@ class OMAPI_Output {
304
  }
305
  }
306
  $optins = $this->base->get_optins();
307
- $fields = array();
308
 
309
  // If no optins are found, return early.
310
  if ( ! $optins ) {
@@ -425,12 +425,13 @@ class OMAPI_Output {
425
  }
426
  }
427
 
428
- $taxonomies = get_taxonomies( array( 'public' => true, '_builtin' => false ) );
429
- $taxonomies['post_tag'] = 'post_tag';
430
- $taxonomies['post_format'] = 'post_format';
431
- $taxonomies = wp_get_object_terms( $post_id, $taxonomies, array( 'fields' => 'ids' ) );
432
  foreach ( $fields['taxonomies'] as $taxonomy => $taxonomy_id ) {
433
- $tax_ids = explode(',', $taxonomy_id[0] );
 
 
 
 
 
434
  foreach ( $tax_ids as $tax_id ) {
435
  if ( $post_id && $tax_id && has_term( $tax_id, $taxonomy, $post_id ) ) {
436
  $content .= $html;
@@ -786,21 +787,15 @@ class OMAPI_Output {
786
  }
787
  }
788
 
789
- $taxonomies = get_taxonomies( array( 'public' => true, '_builtin' => false ) );
790
- $taxonomies['post_tag'] = 'post_tag';
791
- $taxonomies['post_format'] = 'post_format';
792
- $taxonomies = wp_get_object_terms( $post_id, $taxonomies, array( 'fields' => 'ids' ) );
793
  foreach ( $fields['taxonomies'] as $taxonomy => $taxonomy_id ) {
794
- $tax_ids = explode(',', $taxonomy_id[0] );
795
- foreach ( $tax_ids as $tax_id ) {
796
- if ( $post_id && $tax_id && has_term( $tax_id, $taxonomy, $post_id ) ) {
797
- $init[ $optin->post_name ] = $html;
798
- $this->set_slug( $optin );
799
- continue 2;
800
- }
801
  }
 
802
  foreach ( $tax_ids as $tax_id ) {
803
- if ( is_tag($tax_id) ) {
804
  $init[ $optin->post_name ] = $html;
805
  $this->set_slug( $optin );
806
  continue 2;
136
  public function set() {
137
 
138
  self::$instance = $this;
139
+ $this->base = OMAPI::get_instance();
140
  $this->fields = apply_filters( 'optin_monster_api_output_fields', $this->fields );
141
 
142
  }
163
  *
164
  * @since 1.0.0
165
  *
166
+ * @param string $tag The HTML script output.
167
  * @param string $handle The script handle to target.
168
  * @return string $tag Amended HTML script with our ID attribute appended.
169
  */
304
  }
305
  }
306
  $optins = $this->base->get_optins();
307
+ $fields = array();
308
 
309
  // If no optins are found, return early.
310
  if ( ! $optins ) {
425
  }
426
  }
427
 
 
 
 
 
428
  foreach ( $fields['taxonomies'] as $taxonomy => $taxonomy_id ) {
429
+ if ( 'post_tag' === $taxonomy ) {
430
+ $tax_ids = wp_parse_id_list( $taxonomy_id[0] );
431
+ } else {
432
+ $tax_ids = wp_parse_id_list( $taxonomy_id );
433
+ }
434
+
435
  foreach ( $tax_ids as $tax_id ) {
436
  if ( $post_id && $tax_id && has_term( $tax_id, $taxonomy, $post_id ) ) {
437
  $content .= $html;
787
  }
788
  }
789
 
 
 
 
 
790
  foreach ( $fields['taxonomies'] as $taxonomy => $taxonomy_id ) {
791
+ if ( 'post_tag' === $taxonomy ) {
792
+ $tax_ids = wp_parse_id_list( $taxonomy_id[0] );
793
+ } else {
794
+ $tax_ids = wp_parse_id_list( $taxonomy_id );
 
 
 
795
  }
796
+
797
  foreach ( $tax_ids as $tax_id ) {
798
+ if ( $post_id && $tax_id && ( has_term( $tax_id, $taxonomy, $post_id ) || is_tag( $tax_id ) ) ) {
799
  $init[ $optin->post_name ] = $html;
800
  $this->set_slug( $optin );
801
  continue 2;
OMAPI/Welcome.php CHANGED
@@ -401,7 +401,7 @@ class OMAPI_Welcome {
401
  public function footer( $text ) {
402
 
403
  $new_text = sprintf( __( 'Thank you for using <a href="%1$s" target="_blank">OptinMonster</a>!', 'optin-monster-api' ),
404
- 'http://optinmonster.com'
405
  );
406
  return str_replace( '</span>', '', $text ) . ' | ' . $new_text . '</span>';
407
 
401
  public function footer( $text ) {
402
 
403
  $new_text = sprintf( __( 'Thank you for using <a href="%1$s" target="_blank">OptinMonster</a>!', 'optin-monster-api' ),
404
+ 'https://optinmonster.com'
405
  );
406
  return str_replace( '</span>', '', $text ) . ' | ' . $new_text . '</span>';
407
 
assets/js/clipboard.min.js CHANGED
File without changes
assets/js/jspdf.min.js CHANGED
File without changes
includes/class-am-notification.php CHANGED
@@ -41,24 +41,6 @@ if ( ! class_exists( 'AM_Notification' ) ) {
41
  */
42
  public $plugin_version;
43
 
44
- /**
45
- * The list of installed plugins.
46
- *
47
- * @since 1.0.0
48
- *
49
- * @var array
50
- */
51
- public $plugin_list = array();
52
-
53
- /**
54
- * The list of installed themes.
55
- *
56
- * @since 1.0.0
57
- *
58
- * @var string
59
- */
60
- public $theme_list = array();
61
-
62
  /**
63
  * Flag if a notice has been registered.
64
  *
@@ -123,9 +105,7 @@ if ( ! class_exists( 'AM_Notification' ) ) {
123
  'body' => array(
124
  'slug' => $this->plugin,
125
  'version' => $this->plugin_version,
126
- 'last_notification' => $notification_id,
127
- 'plugins' => $this->get_plugins_list(),
128
- 'themes' => $this->get_themes_list(),
129
  ),
130
  ) ) );
131
 
@@ -158,8 +138,6 @@ if ( ! class_exists( 'AM_Notification' ) ) {
158
  update_post_meta( $new_notification_id, 'type', sanitize_text_field( trim( $data->type ) ) );
159
  update_post_meta( $new_notification_id, 'dismissable', (bool) $data->dismissible ? 1 : 0 );
160
  update_post_meta( $new_notification_id, 'location', function_exists( 'wp_json_encode' ) ? wp_json_encode( $data->location ) : json_encode( $data->location ) );
161
- update_post_meta( $new_notification_id, 'plugins', function_exists( 'wp_json_encode' ) ? wp_json_encode( $data->plugins ) : json_encode( $data->plugins ) );
162
- update_post_meta( $new_notification_id, 'theme', sanitize_text_field( trim( $data->theme ) ) );
163
  update_post_meta( $new_notification_id, 'version', sanitize_text_field( trim( $data->version ) ) );
164
  update_post_meta( $new_notification_id, 'viewed', 0 );
165
  update_post_meta( $new_notification_id, 'expiration', $data->expiration ? absint( $data->expiration ) : false );
@@ -196,62 +174,6 @@ if ( ! class_exists( 'AM_Notification' ) ) {
196
  );
197
  }
198
 
199
- /**
200
- * Retrieve a list of plugins that are currently installed.
201
- *
202
- * @since 1.0.0
203
- *
204
- * @return array An array of plugins that are currently installed.
205
- */
206
- public function get_plugins_list() {
207
- if ( ! empty( $this->plugin_list ) ) {
208
- return $this->plugin_list;
209
- }
210
-
211
- if ( ! function_exists( 'get_plugins' ) ) {
212
- require_once ABSPATH . 'wp-admin/includes/plugin.php';
213
- }
214
-
215
- $plugins = get_plugins();
216
-
217
- foreach ( $plugins as $slug => $plugin ) {
218
- $this->plugin_list[ $slug ] = array(
219
- 'slug' => $slug,
220
- 'name' => $plugin['Name'],
221
- 'version' => $plugin['Version'],
222
- 'active' => is_plugin_active( $slug ),
223
- );
224
- }
225
-
226
- return $this->plugin_list;
227
- }
228
-
229
- /**
230
- * Retrieve a list of themes that are currently installed.
231
- *
232
- * @since 1.0.0
233
- *
234
- * @return array An array of themes that are currently installed.
235
- */
236
- public function get_themes_list() {
237
- if ( ! empty( $this->theme_list ) ) {
238
- return $this->theme_list;
239
- }
240
-
241
- $themes = wp_get_themes();
242
-
243
- foreach ( $themes as $slug => $theme ) {
244
- $this->theme_list[ $slug ] = array(
245
- 'slug' => $slug,
246
- 'name' => $theme->Name,
247
- 'version' => $theme->Version,
248
- 'active' => (string) wp_get_theme() === $theme->Name,
249
- );
250
- }
251
-
252
- return $this->theme_list;
253
- }
254
-
255
  /**
256
  * Display any notifications that should be displayed.
257
  *
@@ -425,26 +347,6 @@ if ( ! class_exists( 'AM_Notification' ) ) {
425
  $key = MONSTERINSIGHTS_LICENSE_KEY;
426
  }
427
  break;
428
- case 'sol' :
429
- $option = get_option( 'soliloquy' );
430
- $key = is_array( $option ) && isset( $option['key'] ) ? $option['key'] : '';
431
- $level = is_array( $option ) && isset( $option['type'] ) ? $option['type'] : '';
432
-
433
- // Possibly check for a constant.
434
- if ( empty( $key ) && defined( 'SOLILOQUY_LICENSE_KEY' ) ) {
435
- $key = SOLILOQUY_LICENSE_KEY;
436
- }
437
- break;
438
- case 'envira' :
439
- $option = get_option( 'envira_gallery' );
440
- $key = is_array( $option ) && isset( $option['key'] ) ? $option['key'] : '';
441
- $level = is_array( $option ) && isset( $option['type'] ) ? $option['type'] : '';
442
-
443
- // Possibly check for a constant.
444
- if ( empty( $key ) && defined( 'ENVIRA_LICENSE_KEY' ) ) {
445
- $key = ENVIRA_LICENSE_KEY;
446
- }
447
- break;
448
  case 'om' :
449
  $option = get_option( 'optin_monster_api' );
450
  $key = is_array( $option ) && isset( $option['api']['apikey'] ) ? $option['api']['apikey'] : '';
41
  */
42
  public $plugin_version;
43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  /**
45
  * Flag if a notice has been registered.
46
  *
105
  'body' => array(
106
  'slug' => $this->plugin,
107
  'version' => $this->plugin_version,
108
+ 'last_notification' => $notification_id
 
 
109
  ),
110
  ) ) );
111
 
138
  update_post_meta( $new_notification_id, 'type', sanitize_text_field( trim( $data->type ) ) );
139
  update_post_meta( $new_notification_id, 'dismissable', (bool) $data->dismissible ? 1 : 0 );
140
  update_post_meta( $new_notification_id, 'location', function_exists( 'wp_json_encode' ) ? wp_json_encode( $data->location ) : json_encode( $data->location ) );
 
 
141
  update_post_meta( $new_notification_id, 'version', sanitize_text_field( trim( $data->version ) ) );
142
  update_post_meta( $new_notification_id, 'viewed', 0 );
143
  update_post_meta( $new_notification_id, 'expiration', $data->expiration ? absint( $data->expiration ) : false );
174
  );
175
  }
176
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
177
  /**
178
  * Display any notifications that should be displayed.
179
  *
347
  $key = MONSTERINSIGHTS_LICENSE_KEY;
348
  }
349
  break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
350
  case 'om' :
351
  $option = get_option( 'optin_monster_api' );
352
  $key = is_array( $option ) && isset( $option['api']['apikey'] ) ? $option['api']['apikey'] : '';
optin-monster-wp-api.php CHANGED
@@ -1,11 +1,11 @@
1
  <?php
2
  /**
3
  * Plugin Name: OptinMonster API
4
- * Plugin URI: http://optinmonster.com
5
  * Description: OptinMonster API plugin to connect your WordPress site to your OptinMonster account.
6
- * Author: OptinMonster Team
7
- * Author URI: https://optinmonster.com
8
- * Version: 1.3.2
9
  * Text Domain: optin-monster-api
10
  * Domain Path: languages
11
  *
@@ -20,7 +20,7 @@
20
  * GNU General Public License for more details.
21
  *
22
  * You should have received a copy of the GNU General Public License
23
- * along with OptinMonster. If not, see <http://www.gnu.org/licenses/>.
24
  */
25
 
26
  // Exit if accessed directly.
@@ -60,7 +60,7 @@ class OMAPI {
60
  *
61
  * @var string
62
  */
63
- public $version = '1.3.2';
64
 
65
  /**
66
  * The name of the plugin.
@@ -142,7 +142,7 @@ class OMAPI {
142
  public function init() {
143
 
144
  // Define necessary plugin constants.
145
- define( 'OPTINMONSTER_API', '//a.optnmstr.com/app/js/api.min.js' );
146
 
147
  // Load our global option.
148
  $this->load_option();
@@ -261,20 +261,21 @@ class OMAPI {
261
  wp_parse_args(
262
  $args,
263
  array(
264
- 'post_type' => 'omapi',
265
- 'no_found_rows' => true,
266
- 'cache_results' => false,
267
- 'nopaging' => true
 
268
  )
269
  )
270
  );
 
271
  if ( empty( $optins ) ) {
272
  return false;
273
  }
274
 
275
  // Return the optin data.
276
  return $optins;
277
-
278
  }
279
 
280
  /**
1
  <?php
2
  /**
3
  * Plugin Name: OptinMonster API
4
+ * Plugin URI: https://optinmonster.com
5
  * Description: OptinMonster API plugin to connect your WordPress site to your OptinMonster account.
6
+ * Author: OptinMonster Team
7
+ * Author URI: https://optinmonster.com
8
+ * Version: 1.3.3
9
  * Text Domain: optin-monster-api
10
  * Domain Path: languages
11
  *
20
  * GNU General Public License for more details.
21
  *
22
  * You should have received a copy of the GNU General Public License
23
+ * along with OptinMonster. If not, see <https://www.gnu.org/licenses/>.
24
  */
25
 
26
  // Exit if accessed directly.
60
  *
61
  * @var string
62
  */
63
+ public $version = '1.3.3';
64
 
65
  /**
66
  * The name of the plugin.
142
  public function init() {
143
 
144
  // Define necessary plugin constants.
145
+ define( 'OPTINMONSTER_API', 'https://a.optnmstr.com/app/js/api.min.js' );
146
 
147
  // Load our global option.
148
  $this->load_option();
261
  wp_parse_args(
262
  $args,
263
  array(
264
+ 'no_found_rows' => true,
265
+ 'nopaging' => true,
266
+ 'post_type' => 'omapi',
267
+ 'posts_per_page' => -1,
268
+ 'update_post_term_cache' => false,
269
  )
270
  )
271
  );
272
+
273
  if ( empty( $optins ) ) {
274
  return false;
275
  }
276
 
277
  // Return the optin data.
278
  return $optins;
 
279
  }
280
 
281
  /**
readme.txt CHANGED
@@ -2,8 +2,9 @@
2
  Contributors: optinmonster, griffinjt, smub
3
  Tags: wordpress popup, popup, lightbox popup, mailchimp, aweber, campaign monitor, constant contact, exit-intent, madmimi, infusionsoft, getresponse, hubspot, marketo, activecampaign, pardot, totalsend, emma, icontact, mailerlite, mailpoet, google analytics, pop over, optin forms, email list, subscribers, wordpress popup form, lightbox, wordpress popups, popups, lightbox popups, optin form, wordpress optin form, sidebar optin form, sidebar optin, sidebar form, wordpress overlay popup, wordpress popup plugin, popup plugin, wordpress lightbox optin, wordpress lightbox optin form, after post optin form, wordpress after post optin form, after post optin form plugin, lightbox popup plugin, wordpress popup solution, exit intent, exit-intent, optinmonster, optin monster, optin-monster, mobile popup, mobile popups, mobile optin forms, mobile optins, lightbox optins, wordpress mobile popup, wordpress mobile popups, wordpress mobile optin forms, wordpress lightbox optins, lead gen, lead generation, wordpress lead generation, lead generation wordpress, wordpress lead gen, fullscreen, welcome gate, interstitial
4
  Requires at least: 3.5.1
5
- Tested up to: 4.8
6
- Stable tag: 1.3.2
 
7
  License: GNU General Public License v2.0 or later
8
 
9
  OptinMonster helps you grow your email list by converting visitors into subscribers and customers. Get more email subscribers now!
@@ -11,10 +12,10 @@ OptinMonster helps you grow your email list by converting visitors into subscrib
11
  == Description ==
12
 
13
  = WordPress Popup Plugin =
14
- Did you know that over 70% of website visitors who leave your website will never return? Why? Because most people find your blog, read, and leave (that's just a natural pattern). Wouldn't it be nice if you can convert some of those people to subscribe to your blog? That's where <a href="http://optinmonster.com" rel="friend" title="OptinMonster">OptinMonster</a> can help. OptinMonster helps you grow your email list and get more subscribers with popup and other types of high converting optin forms.
15
 
16
  > <strong>OptinMonster App</strong><br>
17
- > OptinMonster is a standalone application that integrates with all web platforms including WordPress. You must have an OptinMonster account in order to take advantage of this plugin. <a href="http://optinmonster.com/pricing/" rel="friend" title="OptinMonster Plans">Click here to create your account.</a>
18
 
19
  OptinMonster comes with an easy to use form builder that allows you to create beautiful optin forms that are proven to convert. You can create various type of campaigns including WordPress popup forms, floating header and footer bars, slide-ins also known as scroll triggered boxes, sidebar forms, after post forms, in-line forms, mobile-specific forms, welcome gates and more.
20
 
@@ -23,7 +24,7 @@ Using OptinMonster forms combined with our exit-intent technology, page-level ta
23
  Let's take a look at how OptinMonster can help you get more email subscribers.
24
 
25
  > <strong>OptinMonster App</strong><br>
26
- > OptinMonster is a standalone application that integrates with all web platforms including WordPress. You must have an OptinMonster account in order to take advantage of this plugin. <a href="http://optinmonster.com/pricing/" rel="friend" title="OptinMonster Plans">Click here to create your account.</a>
27
 
28
  = OptinMonster Builder + Optin Forms Templates =
29
 
@@ -43,7 +44,7 @@ You can also use custom HTML forms as well as use shortcodes to add other form p
43
 
44
  = Powerful Exit-Intent&reg; Technology =
45
 
46
- OptinMonster is among the pioneers of <a href="http://optinmonster.com/features/exit-intent/" rel="friend" title="Exit-Intent Technology">exit-intent technology</a>. It helps you track user's mouse behavior and prompt them with a targeted message at the precise moment they are about to leave.
47
 
48
  This allows you to re-engage the visitor and encourage them to subscribe. Exit-intent is proven to increase conversions.
49
 
@@ -60,7 +61,7 @@ Have you ever wondered what if you created a highly targeted message based on th
60
 
61
  Well, we have tested it, and it works wonders. We liked the results so much that we built-it into OptinMonster.
62
 
63
- OptinMonster's <a href="http://optinmonster.com/features/page-level-targeting/" rel="friend" title="Page Level Targeting">page level targeting module</a> allows you to display unique offers and campaigns based on visitor's location and interaction on your website.
64
 
65
  This allows you to segment your email list and group your subscribers based on their interest and interaction with your website. Segmentation allows you to send relevant emails to your subscribers which results in higher open rates, higher click through rate, increased sales, greater revenue, greater customer retention, and lower unsubscribe rate.
66
 
@@ -73,7 +74,7 @@ Read how this helped one of our users:
73
 
74
  A/B testing is one of the most desired features, but normally it is extremely hard to setup for beginners. Well, we changed that.
75
 
76
- OptinMonster's easy <a href="http://optinmonster.com/features/easy-ab-split-testing/" rel="friend" title="A/B split testing">A/B split testing</a> module helps you eliminate the guess work and make data-driven decisions on what works best.
77
 
78
  You can try different content, headlines, layouts, styles, and opt-in triggers, to see what converts best.
79
 
@@ -82,11 +83,11 @@ You can try different content, headlines, layouts, styles, and opt-in triggers,
82
 
83
  = Detailed Conversion Analytics =
84
 
85
- Most people don't know what to do with analytics because they don't understand them. OptinMonster's <a href="http://optinmonster.com/features/conversion-analytics/" rel="friend" title="conversion analytics">conversion analytics</a> is easy to understand and give you the stats that matter, so you can take action to improve your lead-generation strategy.
86
 
87
  = MonsterLinks&trade; - 2 Step Opt-in Technology =
88
 
89
- <a href="http://optinmonster.com/features/monsterlinks/" rel="friend" title="MonsterLinks">MonsterLinks</a> allow you to turn any link or image into a 2-step opt-in process which is proven to boost conversions by as much as 785%. Marketers use it to offer content upgrades and then use OptinMonster's success redirect feature for lead-magnet delivery.
90
 
91
  = Full Features List =
92
 
@@ -106,7 +107,7 @@ Most people don't know what to do with analytics because they don't understand t
106
  * Canvas popup forms - use Canvas to add facebook like box, WooCommerce products, or anything else that you like.
107
  * MonsterEffects&trade; technology for eye-catching popup animations.
108
  * Success messages and redirects
109
- * Easy integration with over 19 different email marketing service providers
110
 
111
 
112
  = Credits =
@@ -117,7 +118,6 @@ This plugin is created by <a href="https://thomasgriffin.io" rel="friend" title=
117
 
118
  If you like this plugin, then consider checking out our other projects:
119
 
120
- * <a href="http://enviragallery.com/" rel="friend" title="Envira Gallery">Envira Gallery</a> - Responsive WordPress Gallery Plugin
121
  * <a href="https://wpforms.com/" rel="friend" title="WPForms">WPForms</a> - Best WordPress Contact Form Plugin
122
  * <a href="https://www.monsterinsights.com/" rel="friend" title="MonsterInsights">MonsterInsights</a> - Best Google Analytics Plugin for WordPress
123
 
@@ -125,7 +125,7 @@ Visit WPBeginner to learn from our <a href="http://www.wpbeginner.com/category/w
125
 
126
  = Press & Brand Assets =
127
 
128
- If you are interested in writing about OptinMonster, then we have have prepared a <a href="http://optinmonster.com/press/" rel="friend" title="OptinMonster Press Page">Press & Brand Assets page</a> where you can download our logo, screenshots, and other relevant assets.
129
 
130
  When mentioning OptinMonster please know that OptinMonster is one word with a Capital O and M.
131
 
@@ -144,14 +144,14 @@ OptinMonster® and Exit-Intent® are registered trademarks of Retyp, LLC.
144
 
145
  = I downloaded this plugin but don't have an OptinMonster account. How can I get one? =
146
 
147
- You can sign up for an OptinMonster account by <a href="http://optinmonster.com/pricing/" rel="friend" title="OptinMonster Plans and Pricing">visiting our Pricing page</a> and choosing the account that best suits your needs.
148
 
149
  == Screenshots ==
150
 
151
 
152
  == Notes ==
153
 
154
- OptinMonster is the <a href="http://optinmonster.com" rel="friend" title="OptinMonster">best WordPress lead generation and WordPress popup plugin solution</a> on the market. No other WordPress popup plugin or WordPress optin form solution compares to OptinMonster and features it offers.
155
 
156
  = Testimonial =
157
 
@@ -160,8 +160,14 @@ OptinMonster is the <a href="http://optinmonster.com" rel="friend" title="OptinM
160
 
161
  == Changelog ==
162
 
 
 
 
 
 
 
163
  = 1.3.2 =
164
- * Fixed issue where campaigns of an "advanced age" may not work with MailPoet.
165
 
166
  = 1.3.1 =
167
  * Fixed missing files in WordPress.org repository.
2
  Contributors: optinmonster, griffinjt, smub
3
  Tags: wordpress popup, popup, lightbox popup, mailchimp, aweber, campaign monitor, constant contact, exit-intent, madmimi, infusionsoft, getresponse, hubspot, marketo, activecampaign, pardot, totalsend, emma, icontact, mailerlite, mailpoet, google analytics, pop over, optin forms, email list, subscribers, wordpress popup form, lightbox, wordpress popups, popups, lightbox popups, optin form, wordpress optin form, sidebar optin form, sidebar optin, sidebar form, wordpress overlay popup, wordpress popup plugin, popup plugin, wordpress lightbox optin, wordpress lightbox optin form, after post optin form, wordpress after post optin form, after post optin form plugin, lightbox popup plugin, wordpress popup solution, exit intent, exit-intent, optinmonster, optin monster, optin-monster, mobile popup, mobile popups, mobile optin forms, mobile optins, lightbox optins, wordpress mobile popup, wordpress mobile popups, wordpress mobile optin forms, wordpress lightbox optins, lead gen, lead generation, wordpress lead generation, lead generation wordpress, wordpress lead gen, fullscreen, welcome gate, interstitial
4
  Requires at least: 3.5.1
5
+ Tested up to: 4.9.2
6
+ Requires PHP: 5.2.4
7
+ Stable tag: 1.3.3
8
  License: GNU General Public License v2.0 or later
9
 
10
  OptinMonster helps you grow your email list by converting visitors into subscribers and customers. Get more email subscribers now!
12
  == Description ==
13
 
14
  = WordPress Popup Plugin =
15
+ Did you know that over 70% of website visitors who leave your website will never return? Why? Because most people find your blog, read, and leave (that's just a natural pattern). Wouldn't it be nice if you can convert some of those people to subscribe to your blog? That's where <a href="https://optinmonster.com" rel="friend" title="OptinMonster">OptinMonster</a> can help. OptinMonster helps you grow your email list and get more subscribers with popup and other types of high converting optin forms.
16
 
17
  > <strong>OptinMonster App</strong><br>
18
+ > OptinMonster is a standalone application that integrates with all web platforms including WordPress. You must have an OptinMonster account in order to take advantage of this plugin. <a href="https://optinmonster.com/pricing/" rel="friend" title="OptinMonster Plans">Click here to create your account.</a>
19
 
20
  OptinMonster comes with an easy to use form builder that allows you to create beautiful optin forms that are proven to convert. You can create various type of campaigns including WordPress popup forms, floating header and footer bars, slide-ins also known as scroll triggered boxes, sidebar forms, after post forms, in-line forms, mobile-specific forms, welcome gates and more.
21
 
24
  Let's take a look at how OptinMonster can help you get more email subscribers.
25
 
26
  > <strong>OptinMonster App</strong><br>
27
+ > OptinMonster is a standalone application that integrates with all web platforms including WordPress. You must have an OptinMonster account in order to take advantage of this plugin. <a href="https://optinmonster.com/pricing/" rel="friend" title="OptinMonster Plans">Click here to create your account.</a>
28
 
29
  = OptinMonster Builder + Optin Forms Templates =
30
 
44
 
45
  = Powerful Exit-Intent&reg; Technology =
46
 
47
+ OptinMonster is among the pioneers of <a href="https://optinmonster.com/features/exit-intent/" rel="friend" title="Exit-Intent Technology">exit-intent technology</a>. It helps you track user's mouse behavior and prompt them with a targeted message at the precise moment they are about to leave.
48
 
49
  This allows you to re-engage the visitor and encourage them to subscribe. Exit-intent is proven to increase conversions.
50
 
61
 
62
  Well, we have tested it, and it works wonders. We liked the results so much that we built-it into OptinMonster.
63
 
64
+ OptinMonster's <a href="https://optinmonster.com/features/page-level-targeting/" rel="friend" title="Page Level Targeting">page level targeting module</a> allows you to display unique offers and campaigns based on visitor's location and interaction on your website.
65
 
66
  This allows you to segment your email list and group your subscribers based on their interest and interaction with your website. Segmentation allows you to send relevant emails to your subscribers which results in higher open rates, higher click through rate, increased sales, greater revenue, greater customer retention, and lower unsubscribe rate.
67
 
74
 
75
  A/B testing is one of the most desired features, but normally it is extremely hard to setup for beginners. Well, we changed that.
76
 
77
+ OptinMonster's easy <a href="https://optinmonster.com/features/easy-ab-split-testing/" rel="friend" title="A/B split testing">A/B split testing</a> module helps you eliminate the guess work and make data-driven decisions on what works best.
78
 
79
  You can try different content, headlines, layouts, styles, and opt-in triggers, to see what converts best.
80
 
83
 
84
  = Detailed Conversion Analytics =
85
 
86
+ Most people don't know what to do with analytics because they don't understand them. OptinMonster's <a href="https://optinmonster.com/features/conversion-analytics/" rel="friend" title="conversion analytics">conversion analytics</a> is easy to understand and give you the stats that matter, so you can take action to improve your lead-generation strategy.
87
 
88
  = MonsterLinks&trade; - 2 Step Opt-in Technology =
89
 
90
+ <a href="https://optinmonster.com/features/monsterlinks/" rel="friend" title="MonsterLinks">MonsterLinks</a> allow you to turn any link or image into a 2-step opt-in process which is proven to boost conversions by as much as 785%. Marketers use it to offer content upgrades and then use OptinMonster's success redirect feature for lead-magnet delivery.
91
 
92
  = Full Features List =
93
 
107
  * Canvas popup forms - use Canvas to add facebook like box, WooCommerce products, or anything else that you like.
108
  * MonsterEffects&trade; technology for eye-catching popup animations.
109
  * Success messages and redirects
110
+ * Easy integration with over 25 different email marketing service providers
111
 
112
 
113
  = Credits =
118
 
119
  If you like this plugin, then consider checking out our other projects:
120
 
 
121
  * <a href="https://wpforms.com/" rel="friend" title="WPForms">WPForms</a> - Best WordPress Contact Form Plugin
122
  * <a href="https://www.monsterinsights.com/" rel="friend" title="MonsterInsights">MonsterInsights</a> - Best Google Analytics Plugin for WordPress
123
 
125
 
126
  = Press & Brand Assets =
127
 
128
+ If you are interested in writing about OptinMonster, then we have have prepared a <a href="https://optinmonster.com/press/" rel="friend" title="OptinMonster Press Page">Press & Brand Assets page</a> where you can download our logo, screenshots, and other relevant assets.
129
 
130
  When mentioning OptinMonster please know that OptinMonster is one word with a Capital O and M.
131
 
144
 
145
  = I downloaded this plugin but don't have an OptinMonster account. How can I get one? =
146
 
147
+ You can sign up for an OptinMonster account by <a href="https://optinmonster.com/pricing/" rel="friend" title="OptinMonster Plans and Pricing">visiting our Pricing page</a> and choosing the account that best suits your needs.
148
 
149
  == Screenshots ==
150
 
151
 
152
  == Notes ==
153
 
154
+ OptinMonster is the <a href="https://optinmonster.com" rel="friend" title="OptinMonster">best WordPress lead generation and WordPress popup plugin solution</a> on the market. No other WordPress popup plugin or WordPress optin form solution compares to OptinMonster and features it offers.
155
 
156
  = Testimonial =
157
 
160
 
161
  == Changelog ==
162
 
163
+ = 1.3.3 =
164
+ * Fixed an issue that prevented campaigns from showing on some custom taxononmy terms.
165
+ * Performance improvements when retrieving, and determining when to display, campaigns.
166
+ * All URLs updated to use HTTPS.
167
+ * Updated notifications.
168
+
169
  = 1.3.2 =
170
+ * Fixed issue where campaigns of an "advanced age" may not work in the plugin.
171
 
172
  = 1.3.1 =
173
  * Fixed missing files in WordPress.org repository.