PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / trunk
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More vtrunk
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
← All changes | classes/models/FrmInbox.php +69 -26 6.25 → trunk View file →
@@ -9,10 +9,16 @@
9 9 class FrmInbox extends FrmFormApi {
10 10
11 11 protected $cache_key;
12 12
13 + /**
14 + * @var string
15 + */
13 16 private $option = 'frm_inbox';
14 17
18 + /**
19 + * @var array|false
20 + */
15 21 private static $messages = false;
16 22
17 23 /**
18 24 * @var array
@@ -47,15 +53,19 @@
47 53
48 54 /**
49 55 * @since 4.05
50 56 *
51 - * @param array|false $filter
57 + * @param false|string $filter
58 + *
59 + * @return array
52 60 */
53 61 public function get_messages( $filter = false ) {
54 62 $messages = self::$messages;
63 +
55 64 if ( $filter === 'filter' ) {
56 65 $this->filter_messages( $messages );
57 66 }
67 +
58 68 return $messages;
59 69 }
60 70
61 71 /**
@@ -64,8 +74,9 @@
64 74 * @return void
65 75 */
66 76 public function set_messages() {
67 77 self::$messages = get_option( $this->option );
78 +
68 79 if ( ! is_array( self::$messages ) ) {
69 80 self::$messages = array();
70 81 }
71 82
@@ -83,9 +94,10 @@
83 94 * @return void
84 95 */
85 96 private function add_api_messages() {
86 97 $api = $this->get_api_info();
87 - if ( empty( $api ) ) {
98 +
99 + if ( ! $api ) {
88 100 return;
89 101 }
90 102
91 103 foreach ( $api as $message ) {
@@ -99,10 +111,10 @@
99 111 * @return void
100 112 */
101 113 public function add_message( $message ) {
102 114 if ( ! is_array( $message ) || ! isset( $message['key'] ) ) {
103 - // if the API response is invalid, $message may not be an array.
104 - // if there are no messages from the API, it is returning a "No Entries Found" item with no key, so check for a key as well.
115 + // If the API response is invalid, $message may not be an array.
116 + // If there are no messages from the API, it is returning a "No Entries Found" item with no key, so check for a key as well.
105 117 return;
106 118 }
107 119
108 120 if ( isset( self::$messages[ $message['key'] ] ) && ! isset( $message['force'] ) ) {
@@ -155,16 +167,19 @@
155 167 * @return void
156 168 */
157 169 private function clean_messages() {
158 170 $removed = false;
171 +
159 172 foreach ( self::$messages as $t => $message ) {
160 173 $read = ! empty( $message['read'] ) && isset( $message['read'][ get_current_user_id() ] ) && $message['read'][ get_current_user_id() ] < strtotime( '-1 month' );
161 - $dismissed = ! empty( $message['dismissed'] ) && isset( $message['dismissed'][ get_current_user_id() ] ) && $message['dismissed'][ get_current_user_id() ] < strtotime( '-1 week' );
174 + $dismissed = ! empty( $message['dismissed'] ) && isset( $message['dismissed'][ get_current_user_id() ] ) && $message['dismissed'][ get_current_user_id() ] < strtotime( '-1 week' ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
162 175
163 - if ( $read || $dismissed || ! $this->within_valid_timeframe( $message ) ) {
164 - unset( self::$messages[ $t ] );
165 - $removed = true;
176 + if ( ! $read && ! $dismissed && $this->within_valid_timeframe( $message ) ) {
177 + continue;
166 178 }
179 +
180 + unset( self::$messages[ $t ] );
181 + $removed = true;
167 182 }
168 183
169 184 if ( $removed ) {
170 185 $this->update_list();
@@ -173,20 +188,24 @@
173 188
174 189 /**
175 190 * @param array $messages
176 191 * @param string $type
192 + *
177 193 * @return void
178 194 */
179 195 public function filter_messages( &$messages, $type = 'unread' ) {
180 196 $user_id = get_current_user_id();
197 +
181 198 foreach ( $messages as $k => $message ) {
182 199 $dismissed = isset( $message['dismissed'] ) && isset( $message['dismissed'][ $user_id ] );
183 - if ( empty( $k ) || ! $this->within_valid_timeframe( $message ) || ( $type === 'dismissed' ) !== $dismissed ) {
200 +
201 + if ( ! $k || ! $this->within_valid_timeframe( $message ) || ( $type === 'dismissed' ) !== $dismissed ) {
184 202 unset( $messages[ $k ] );
185 203 } elseif ( ! $this->is_for_user( $message ) ) {
186 204 unset( $messages[ $k ] );
187 205 }
188 206 }
207 +
189 208 $messages = apply_filters( 'frm_filter_inbox', $messages );
190 209 }
191 210
192 211 /**
@@ -194,8 +213,9 @@
194 213 *
195 214 * @since 6.25
196 215 *
197 216 * @param array $message
217 + *
198 218 * @return bool
199 219 */
200 220 private function within_valid_timeframe( $message ) {
201 221 return $this->has_started( $message ) && ! $this->is_expired( $message );
@@ -206,16 +226,13 @@
206 226 *
207 227 * @since 6.25
208 228 *
209 229 * @param array $message
230 + *
210 231 * @return bool
211 232 */
212 233 private function has_started( $message ) {
213 - if ( empty( $message['starts'] ) ) {
214 - return true;
215 - }
216 -
217 - return $message['starts'] <= time();
234 + return ! empty( $message['starts'] ) ? $message['starts'] <= time() : true;
218 235 }
219 236
220 237 /**
221 238 * @param array $message
@@ -229,8 +246,9 @@
229 246 /**
230 247 * Show different messages for different accounts.
231 248 *
232 249 * @param array $message
250 + *
233 251 * @return bool
234 252 */
235 253 private function is_for_user( $message ) {
236 254 if ( FrmApiHelper::is_for_user( $message ) ) {
@@ -272,16 +290,20 @@
272 290 /**
273 291 * @since 4.05.02
274 292 *
275 293 * @param string $key
294 + *
276 295 * @return void
277 296 */
278 297 public function mark_unread( $key ) {
279 298 $is_read = isset( self::$messages[ $key ] ) && isset( self::$messages[ $key ]['read'] ) && isset( self::$messages[ $key ]['read'][ get_current_user_id() ] );
280 - if ( $is_read ) {
281 - unset( self::$messages[ $key ]['read'][ get_current_user_id() ] );
282 - $this->update_list();
299 +
300 + if ( ! $is_read ) {
301 + return;
283 302 }
303 +
304 + unset( self::$messages[ $key ]['read'][ get_current_user_id() ] );
305 + $this->update_list();
284 306 }
285 307
286 308 /**
287 309 * @param string $key
@@ -312,8 +334,9 @@
312 334 * @return void
313 335 */
314 336 private function dismiss_all() {
315 337 $user_id = get_current_user_id();
338 +
316 339 foreach ( self::$messages as $key => $message ) {
317 340 if ( ! isset( $message['dismissed'] ) ) {
318 341 self::$messages[ $key ]['dismissed'] = array();
319 342 }
@@ -324,16 +347,21 @@
324 347 }
325 348 $this->update_list();
326 349 }
327 350
351 + /**
352 + * @return array
353 + */
328 354 public function unread() {
329 355 $messages = $this->get_messages( 'filter' );
330 356 $user_id = get_current_user_id();
357 +
331 358 foreach ( $messages as $t => $message ) {
332 359 if ( isset( $message['read'] ) && isset( $message['read'][ $user_id ] ) ) {
333 360 unset( $messages[ $t ] );
334 361 }
335 362 }
363 +
336 364 return $messages;
337 365 }
338 366
339 367 /**
@@ -339,12 +367,14 @@
339 367 /**
340 368 * @since 6.8.4 The $filtered parameter was added.
341 369 *
342 370 * @param bool $filtered
371 + *
343 372 * @return string
344 373 */
345 374 public function unread_html( $filtered = true ) {
346 375 $count = count( $this->unread() );
376 +
347 377 if ( ! $count ) {
348 378 return '';
349 379 }
350 380
@@ -365,15 +395,18 @@
365 395 /**
366 396 * @since 4.05.02
367 397 *
368 398 * @param string $key
399 + *
369 400 * @return void
370 401 */
371 402 public function remove( $key ) {
372 - if ( isset( self::$messages[ $key ] ) ) {
373 - unset( self::$messages[ $key ] );
374 - $this->update_list();
403 + if ( ! isset( self::$messages[ $key ] ) ) {
404 + return;
375 405 }
406 +
407 + unset( self::$messages[ $key ] );
408 + $this->update_list();
376 409 }
377 410
378 411 /**
379 412 * @return void
@@ -378,9 +411,9 @@
378 411 /**
379 412 * @return void
380 413 */
381 414 private function update_list() {
382 - update_option( $this->option, self::$messages, 'no' );
415 + update_option( $this->option, self::$messages, false );
383 416 }
384 417
385 418 /**
386 419 * Show a banner message if one is available.
@@ -387,11 +420,12 @@
387 420 *
388 421 * @return bool True if a banner is available and shown.
389 422 */
390 423 public static function maybe_show_banner() {
391 - if ( empty( self::$banner_messages ) ) {
424 + if ( ! self::$banner_messages ) {
392 425 return false;
393 426 }
427 +
394 428 $message = end( self::$banner_messages );
395 429 $cta = self::get_prepared_banner_cta( $message['cta'] );
396 430
397 431 require FrmAppHelper::plugin_path() . '/classes/views/inbox/banner.php';
@@ -403,8 +437,9 @@
403 437 *
404 438 * @since 6.8.4
405 439 *
406 440 * @param string $cta
441 + *
407 442 * @return string
408 443 */
409 444 private static function get_prepared_banner_cta( $cta ) {
410 445 $cta = str_replace( 'button-secondary', 'button-primary', $cta );
@@ -413,25 +448,28 @@
413 448 /**
414 449 * Replace a single href attribute in the CTA.
415 450 *
416 451 * @param array $matches The regex results for a single match.
452 + *
417 453 * @return string
418 454 */
419 455 function ( $matches ) {
420 - $url = $matches[2];
421 - $parts = parse_url( $url );
456 + $url = $matches[2];
422 457
423 458 if ( '#' === $url ) {
424 459 return 'href="#"';
425 460 }
426 461
462 + $parts = parse_url( $url );
427 463 $query = array();
464 +
428 465 if ( isset( $parts['query'] ) ) {
429 466 parse_str( $parts['query'], $query );
430 467 }
468 +
431 469 $query['utm_medium'] = 'banner';
432 470 $parts['query'] = http_build_query( $query );
433 - return 'href="' . $parts['scheme'] . '://' . $parts['host'] . $parts['path'] . '?' . $parts['query'] . '"';
471 + return 'href="' . esc_url( $parts['scheme'] . '://' . $parts['host'] . $parts['path'] . '?' . $parts['query'] ) . '"';
434 472 },
435 473 $cta
436 474 );
437 475 }
@@ -440,10 +478,11 @@
440 478 * @return void
441 479 */
442 480 public static function maybe_disable_screen_options() {
443 481 self::$banner_messages = self::get_banner_messages();
482 +
444 483 if ( self::$banner_messages ) {
445 - // disable screen options tab when displaying banner messages because it gets in the way of the banner.
484 + // Disable screen options tab when displaying banner messages because it gets in the way of the banner.
446 485 add_filter( 'screen_options_show_screen', '__return_false' );
447 486 }
448 487 }
449 488
@@ -472,8 +511,9 @@
472 511 *
473 512 * @since 6.8.4
474 513 *
475 514 * @param string $key The key we are checking for (ie. banner or slidein).
515 + *
476 516 * @return array
477 517 */
478 518 private static function get_messages_with_key( $key ) {
479 519 $inbox = new self();
@@ -504,8 +544,9 @@
504 544 * @return array|false
505 545 */
506 546 public static function get_inbox_slide_in_value_for_js() {
507 547 $messages = self::get_slidein_messages();
548 +
508 549 if ( ! $messages ) {
509 550 return false;
510 551 }
511 552
@@ -554,12 +595,14 @@
554 595 */
555 596 public static function check_for_error() {
556 597 $inbox = new self();
557 598 $messages = $inbox->get_messages( 'filter' );
599 +
558 600 foreach ( $messages as $message ) {
559 601 if ( is_array( $message ) && isset( $message['type'] ) && 'error' === $message['type'] ) {
560 602 return $message;
561 603 }
562 604 }
605 +
563 606 return false;
564 607 }
565 608 }