PluginProbe
Double Opt-In for Contact Form 7 – Secure, GDPR-Compliant Email Verification / 3.0.3
Double Opt-In for Contact Form 7 – Secure, GDPR-Compliant Email Verification v3.0.3
5.6.0 5.5.0 5.4.0 5.3.2 5.3.1 5.1.6 5.1.5 trunk 2.1.5 2.11 2.12 2.13 2.15 3.0.0 3.0.1 3.0.2 3.0.3 3.0.5 3.0.51 3.0.60 3.0.61 3.0.62 3.0.70 3.0.71 3.0.72 All 35 releases
double-opt-in / core / OptIn.class.php

OptIn.class.php in Double Opt-In for Contact Form 7 – Secure, GDPR-Compliant Email Verification 3.0.3, at core/OptIn.class.php

1,259 lines 29.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace forge12\contactform7\CF7DoubleOptIn {
4 if ( ! defined( 'ABSPATH' ) ) {
5 exit;
6 }
7
8 /**
9 * Class Frontend
10 * Responsible to handle the frontend of the Double OptIn
11 *
12 * @package forge12\contactform7\CF7DoubleOptIn
13 */
14 class OptIn {
15 /**
16 * Stores the DB ID for the entry
17 *
18 * @var int
19 */
20 private $id = 0;
21
22 /**
23 * Stores the ID of the contact form 7 form.
24 *
25 * @var int
26 */
27 private $cf_form_id = 0;
28 /**
29 * Stores if the optin has been confirmed (1) or not (0)
30 *
31 * @var int
32 */
33 private $doubleoptin = 0;
34 /**
35 * Stores the content of the contact form 7 form content as a serialized string.
36 *
37 * @var string
38 */
39 private $content = "";
40 /**
41 * Stores the unique hash used to identify the opt-ins
42 *
43 * @var string
44 */
45 private $hash = "";
46 /**
47 * Stores the timestamp the opt-in mail has been sent to the user.
48 *
49 * @var string
50 */
51 private $createtime = "";
52 /**
53 * Stores the timestamp the opt-in has been confirmed by the user.
54 */
55 private $updatetime = "";
56 /**
57 * Stores the timestamp the opt-out has been confirmed by the user.
58 */
59 private $optouttime = "";
60 /**
61 * IP Address used to trigger the opt-in mail.
62 *
63 * @var string
64 */
65 private $ipaddr_register = "";
66 /**
67 * IP Address used to confirm the opt-in mail.
68 */
69 private $ipaddr_confirmation = "";
70 /**
71 * IP Address used to output.
72 */
73 private $ipaddr_optout = "";
74 /**
75 * Stores the files used within this form as a serialized string.
76 */
77 private $files = "";
78 /**
79 * Store the Category ID
80 */
81 private $category = 0;
82 /**
83 * Stores the form as html
84 */
85 private $form = '';
86 /**
87 * Stores the Mail send for the optin
88 *
89 * @var string
90 */
91 private $mail_optin = '';
92 /**
93 * Stores the E-Mail
94 *
95 * @var string
96 */
97 private $email = '';
98
99 /**
100 * The constructor
101 */
102 public function __construct( array $properties ) {
103 foreach ( $properties as $name => $value ) {
104 if ( isset( $this->{$name} ) ) {
105 $this->{$name} = $value;
106 }
107 }
108 }
109
110 /**
111 * @param int $cf_form_id
112 */
113 public function set_cf_form_id( $cf_form_id ) {
114 $this->cf_form_id = (int) $cf_form_id;
115 }
116
117 /**
118 * @return int
119 */
120 public function get_cf_form_id() {
121 return $this->cf_form_id;
122 }
123
124 /**
125 * Return the ID of the Optin
126 *
127 * @return int
128 */
129 public function get_id() {
130 return $this->id;
131 }
132
133 /**
134 * Return the hash of the optin.
135 *
136 * @return string
137 */
138 public function get_hash() {
139 return $this->hash;
140 }
141
142 /**
143 * Return true|false depending on confirm status
144 *
145 * @return bool
146 */
147 public function is_confirmed() {
148 return (bool) $this->get_doubleoptin();
149 }
150
151 /**
152 * Return true|false wether the form has been confirmed or not.
153 *
154 * @return bool
155 */
156 public function is_optout() {
157 if ( true != $this->get_doubleoptin() && ! empty( $this->get_ipaddr_optout() ) && ! empty( $this->get_optouttime() ) ) {
158 return true;
159 }
160
161 return false;
162 }
163
164 /**
165 * update the optin value
166 *
167 * @param int $confirmed
168 */
169 public function set_doubleoptin( $confirmed ) {
170 $this->doubleoptin = (int) $confirmed;
171 }
172
173 /**
174 * Return the optin value for the form.
175 *
176 * @return int
177 */
178 public function get_doubleoptin() {
179 return $this->doubleoptin;
180 }
181
182 /**
183 * @param string $timestamp
184 */
185 public function set_createtime( $timestamp ) {
186 $this->createtime = $timestamp;
187 }
188
189 /**
190 * Return the Date how long the opt in will be valid
191 *
192 * @return string
193 */
194 public function get_valid_until() {
195 $settings = CF7DoubleOptIn::getInstance()->getSettings();
196
197 $createtime = $this->get_createtime();
198 $dt = new \DateTime();
199 $dt->setTimestamp( $createtime );
200
201 if ( $this->is_confirmed() ) {
202 $month = (int) $settings['delete'];
203 $period = $settings['delete_period'];
204 } else {
205 $month = (int) $settings['delete_unconfirmed'];
206 $period = $settings['delete_unconfirmed_period'];
207 }
208
209 $dt->modify( '+' . (int) $month . ' ' . $period );
210 $dt->modify( '+1 day' );
211
212 return $dt->format( 'd.m.Y' );
213 }
214
215 /**
216 * Return a timestamp
217 *
218 * @param string $view Select how to return the content. raw is the stored db value. use formatted to return a
219 * formatted string.
220 *
221 * @return string
222 */
223 public function get_createtime( $view = "raw" ) {
224 if ( $view != "raw" ) {
225 if ( ! is_numeric( $this->createtime ) ) {
226 $date = date( 'd.m.Y', strtotime( $this->createtime ) );
227 $time = date( 'H:i:s', strtotime( $this->createtime ) );
228 } else {
229 $date = date( 'd.m.Y', $this->createtime );
230 $time = date( 'H:i:s', $this->createtime );
231 }
232
233 return $date . ' ' . __( '/', 'double-opt-in' ) . ' ' . $time;
234 } else {
235 return $this->createtime;
236 }
237 }
238
239 /**
240 * @param string $timestamp
241 */
242 public function set_updatetime( $timestamp ) {
243 $this->updatetime = $timestamp;
244 }
245
246 /**
247 * Return a timestamp
248 *
249 * @param string $view Select how to return the content. raw is the stored db value. use formatted to return a
250 * formatted string.
251 *
252 * @return string
253 */
254 public function get_updatetime( $view = 'raw' ) {
255 if ( $view != "raw" ) {
256 if ( ! is_numeric( $this->updatetime ) ) {
257 $date = date( 'd.m.Y', strtotime( $this->updatetime ) );
258 $time = date( 'H:i:s', strtotime( $this->updatetime ) );
259 } else {
260 $date = date( 'd.m.Y', $this->updatetime );
261 $time = date( 'H:i:s', $this->updatetime );
262 }
263
264 return $date . ' ' . __( '/', 'double-opt-in' ) . ' ' . $time;
265 } else {
266 return $this->updatetime;
267 }
268 }
269
270 /**
271 * @param string $timestamp
272 */
273 public function set_optouttime( $timestamp ) {
274 $this->optouttime = $timestamp;
275 }
276
277 /**
278 * Return a timestamp
279 *
280 * @param string $view Select how to return the content. raw is the stored db value. use formatted to return a
281 * formatted string.
282 *
283 * @return string
284 */
285 public function get_optouttime( $view = 'raw' ) {
286 if ( $view != "raw" ) {
287 if ( ! is_numeric( $this->optouttime ) ) {
288 $date = date( 'd.m.Y', strtotime( $this->optouttime ) );
289 $time = date( 'H:i:s', strtotime( $this->optouttime ) );
290 } else {
291 $date = date( 'd.m.Y', $this->optouttime );
292 $time = date( 'H:i:s', $this->optouttime );
293 }
294
295 return $date . ' ' . __( '/', 'f12-cf7-doubleoptin' ) . ' ' . $time;
296 } else {
297 return $this->optouttime;
298 }
299 }
300
301 /**
302 * @param string $ip_addr
303 */
304 public function set_ipaddr_optout( $ip_addr ) {
305 $this->ipaddr_optout = $ip_addr;
306 }
307
308 /**
309 * @return string
310 */
311 public function get_ipaddr_optout() {
312 return $this->ipaddr_optout;
313 }
314
315 /**
316 * @param string $ip_addr
317 */
318 public function set_ipaddr_register( $ip_addr ) {
319 $this->ipaddr_register = $ip_addr;
320 }
321
322 /**
323 * @return string
324 */
325 public function get_ipaddr_register() {
326 return $this->ipaddr_register;
327 }
328
329 /**
330 * @param string $ip_addr
331 */
332 public function set_ipaddr_confirmation( $ip_addr ) {
333 $this->ipaddr_confirmation = $ip_addr;
334 }
335
336 /**
337 * @return string
338 */
339 public function get_ipaddr_confirmation() {
340 return $this->ipaddr_confirmation;
341 }
342
343 /**
344 * Return a serialized string
345 *
346 * @return mixed
347 */
348 public function get_content() {
349 return $this->content;
350 }
351
352 /**
353 * @param string - a serialized string
354 */
355 public function set_content( $content ) {
356 $this->content = $content;
357 }
358
359 /**
360 * @param string - a serialized string
361 */
362 public function set_files( $files ) {
363 $this->files = $files;
364 }
365
366 /**
367 * @return string use maybe_unserialize to deserialize the string
368 */
369 public function get_files() {
370 return $this->files;
371 }
372
373 /**
374 * Return the assigned Category ID
375 *
376 * @return int
377 */
378 public function get_category() {
379 if ( ! is_numeric( $this->category ) ) {
380 return 0;
381 }
382
383 return $this->category;
384 }
385
386 /**
387 * Assign a ID to the category
388 *
389 * @param int $id
390 *
391 * @return void
392 */
393 public function set_category( $id ) {
394 $this->category = $id;
395 }
396
397 /**
398 * Check if the given Opt In was created by Contact Form 7
399 *
400 * @return bool
401 */
402 public function isTypeCF7() {
403 $form_id = $this->get_cf_form_id();
404 $form = get_post( $form_id );
405
406 if ( 'wpcf7_contact_form' === $form->post_type ) {
407 return true;
408 }
409
410 return false;
411 }
412
413 /**
414 * Check if the given Opt In was created by Elementor
415 *
416 * @return bool
417 */
418 public function isTypeElementor() {
419 if ( ! class_exists( 'ElementorPro\Plugin' ) ) {
420 return false;
421 }
422
423 $page_id = $this->get_cf_form_id();
424
425 $post = get_post( $page_id );
426
427 // skip if post not existing anymore
428 if ( null === $post ) {
429 return false;
430 }
431
432 // skip if page is not build with elementor
433 if ( ! \Elementor\Plugin::$instance->documents->get( $page_id )->is_built_with_elementor() ) {
434 return false;
435 }
436
437 // Load the page's data
438 $document = \Elementor\Plugin::$instance->documents->get( $page_id );
439
440 // Skip if document not exist
441 if ( ! $document ) {
442 return false;
443 }
444
445 // Loop through the elements
446 $elements_data = $document->get_elements_data();
447
448 $content = maybe_unserialize( $this->get_content() );
449
450 // skip if form id not available
451 if ( ! isset( $content['form_id'] ) ) {
452 return false;
453 }
454
455 $form_id = $content['form_id'];
456
457 // Find the Form Element
458 foreach ( $elements_data as $element ) {
459 if ( isset( $element['elements'] ) ) {
460 foreach ( $element['elements'] as $el ) {
461 if ( $form_id !== $el['id'] || 'form' !== $el['widgetType'] ) {
462 continue;
463 }
464
465 return true;
466 }
467 return true;
468 }
469
470 // Check if this is the form widget
471 if ( isset( $element['widgetType'] ) && isset( $element['id'] ) && $element['widgetType'] === 'form' && $element['id'] === $form_id ) {
472 // Return the form settings
473 return true;
474 }
475 }
476 return false;
477 }
478
479 /**
480 * Check if the given Opt In was created by Avada
481 *
482 * @return bool|void
483 */
484 public function isTypeAvada() {
485 $form_id = $this->get_cf_form_id();
486 $form = get_post( $form_id );
487
488 if ( 'fusion_form' === $form->post_type ) {
489 return true;
490 }
491
492 return false;
493 }
494
495 /**
496 * Check if the Opt In was created by 'cf7' or 'avada'.
497 *
498 * @param string $type use either 'cf7' or 'avada'
499 *
500 * @return bool
501 */
502 public function isType( $type ) {
503 if ( $type == 'cf7' ) {
504 return $this->isTypeCF7();
505 } elseif ( $type == 'elementor' ) {
506 return $this->isTypeElementor();
507 } else {
508 return $this->isTypeAvada();
509 }
510 }
511
512 /**
513 * Load an OptIn by the given hash code. Returns either an Object of Type OptIn or null if not found.
514 *
515 * @param string $hash
516 *
517 * @return OptIn|null
518 */
519 public static function get_by_hash( string $hash ) {
520 global $wpdb;
521 $table = $wpdb->prefix . 'f12_cf7_doubleoptin';
522
523 if ( null == $wpdb ) {
524 return null;
525 }
526
527 $row = $wpdb->get_row( 'SELECT * FROM ' . $table . ' WHERE hash="' . $hash . '"', ARRAY_A );
528
529 if ( null == $row ) {
530 return null;
531 }
532
533 return new OptIn( $row );
534 }
535
536 /**
537 * Get number of optins for the given post.
538 *
539 * @param $post_id
540 *
541 * @return int
542 */
543 public static function get_count( $post_id ) {
544 global $wpdb;
545
546 if ( ! $wpdb ) {
547 return 0;
548 }
549
550 $tableName = $wpdb->prefix . 'f12_cf7_doubleoptin';
551 $result = $wpdb->get_results( $wpdb->prepare( 'SELECT count(*) AS counter FROM ' . $tableName . ' WHERE cf_form_id=%d ', $post_id ) );
552
553 if ( is_array( $result ) ) {
554 return $result[0]->counter;
555 }
556
557 return 0;
558 }
559
560 /**
561 * Return a list of opt ins stored in the database.
562 *
563 * @param int $category_id
564 *
565 * @param array $atts array (
566 * 'perPage' => 10, // Posts per page
567 * 'page' => 0, // Current page
568 * 'order' => DESC, // Order (ASC/DESC)
569 * );
570 *
571 * @param null $numberOfPages - Stores the number of pages found if limited
572 *
573 * @return array
574 */
575 public static function get_list_by_category_id( $category_id, $atts = array(), &$numberOfPages = null ) {
576 global $wpdb;
577
578 $attr = array(
579 'perPage' => 10,
580 'page' => 1,
581 'order' => 'DESC',
582 'keyword' => ''
583 );
584
585 /**
586 * Parameter
587 */
588 foreach ( $atts as $key => $value ) {
589 if ( isset( $attr[ $key ] ) ) {
590 $attr[ $key ] = $atts[ $key ];
591 }
592 }
593
594 /*
595 * Update keyword
596 */
597 $where = '';
598 if ( ! empty( $attr['keyword'] ) ) {
599 $where = ' AND content LIKE "%%' . $attr['keyword'] . '%%"';
600 }
601
602
603 $tableName = $wpdb->prefix . 'f12_cf7_doubleoptin';
604 $pageNum = (int) $attr['page'] - 1;
605
606 if ( $numberOfPages !== null ) {
607 $result = $wpdb->get_results( $wpdb->prepare( 'SELECT count(*) AS counter FROM ' . $tableName . ' WHERE category=%d ' . $where, $category_id ) );
608
609 $itemCounter = 0;
610
611 if ( is_array( $result ) ) {
612 $itemCounter = $result[0]->counter;
613 }
614
615 $numberOfPages = 0;
616
617 if ( $itemCounter != 0 ) {
618 $numberOfPages = ceil( $itemCounter / (int) $attr['perPage'] );
619 }
620 }
621
622 $list = array();
623
624 if ( $numberOfPages == 0 ) {
625 return $list;
626 }
627
628 $offset = $pageNum * (int) $attr['perPage'];
629
630 $rows = $wpdb->get_results( $wpdb->prepare( 'SELECT * FROM ' . $tableName . ' WHERE category=%d ' . $where . ' ORDER BY ID ' . $attr['order'] . ' LIMIT ' . $attr['perPage'] . ' OFFSET %d', $category_id, $offset ), ARRAY_A );
631
632 foreach ( $rows as $row ) {
633 $list[] = new OptIn( $row );
634 }
635
636 return $list;
637 }
638
639 /**
640 * Return a list of opt ins stored in the database.
641 *
642 * @param string $email
643 * @param int $confirmed Either recieve confirmed or unconfirmed only
644 *
645 * @return array
646 */
647 public static function get_list_by_email( $email ) {
648 global $wpdb;
649
650 $tableName = $wpdb->prefix . 'f12_cf7_doubleoptin';
651
652 $list = array();
653
654 $rows = $wpdb->get_results( $wpdb->prepare( 'SELECT * FROM ' . $tableName . ' WHERE email=%s', $email ), ARRAY_A );
655
656 foreach ( $rows as $row ) {
657 $list[] = new OptIn( $row );
658 }
659
660 return $list;
661 }
662
663 /**
664 * Return a list of opt ins stored in the database.
665 *
666 * @param $atts array (
667 * 'perPage' => 10, // Posts per page
668 * 'page' => 0, // Current page
669 * 'order' => DESC, // Order (ASC/DESC)
670 * );
671 *
672 * @param null $numberOfPages - Stores the number of pages found if limited
673 *
674 * @return array
675 */
676 public static function get_list( $atts = array(), &$numberOfPages = null ) {
677 global $wpdb;
678
679 $attr = array(
680 'perPage' => 10,
681 'page' => 1,
682 'order' => 'DESC',
683 'keyword' => '',
684 'cf_form_id' => '',
685 );
686
687 /*
688 * Update atts
689 */
690 foreach ( $atts as $key => $value ) {
691 if ( isset( $attr[ $key ] ) ) {
692 $attr[ $key ] = $atts[ $key ];
693 }
694 }
695
696 /*
697 * Update WHERE for Query
698 */
699 $where = '';
700 $where_condition = [];
701
702 /*
703 * Add Keyword
704 */
705 if ( ! empty( $attr['keyword'] ) ) {
706 $where_condition[] = 'content LIKE "%%' . $attr['keyword'] . '%%"';
707 }
708
709 /*
710 * Add Form ID
711 */
712 if ( ! empty( $attr['cf_form_id'] ) ) {
713 $where_condition[] = 'cf_form_id="' . $attr['cf_form_id'] . '"';
714 }
715
716 /*
717 * build where string
718 */
719 if ( ! empty( $where_condition ) ) {
720 $where = ' WHERE ' . implode( ' AND ', $where_condition );
721 }
722
723 /*
724 * set table
725 */
726 $tableName = $wpdb->prefix . 'f12_cf7_doubleoptin';
727 $pageNum = (int) $attr['page'] - 1;
728
729 if ( $numberOfPages !== null ) {
730 $result = $wpdb->get_results( 'SELECT count(*) as counter FROM ' . $tableName . $where );
731
732 $itemCounter = 0;
733
734 if ( is_array( $result ) ) {
735 $itemCounter = $result[0]->counter;
736 }
737
738 $numberOfPages = 0;
739
740 if ( $itemCounter != 0 ) {
741 $numberOfPages = ceil( $itemCounter / (int) $attr['perPage'] );
742 }
743 }
744
745 $list = array();
746
747 if ( $numberOfPages == 0 ) {
748 return $list;
749 }
750
751 $offset = $pageNum * (int) $attr['perPage'];
752
753 $rows = $wpdb->get_results( $wpdb->prepare( 'SELECT * FROM ' . $tableName . $where . ' ORDER BY ID ' . $attr['order'] . ' LIMIT ' . $attr['perPage'] . ' OFFSET % d', $offset ), ARRAY_A );
754
755 foreach ( $rows as $row ) {
756 $list[] = new OptIn( $row );
757 }
758
759 return $list;
760 }
761
762 /**
763 * This will update all categories from A to B, e.g.: All Opt-Ins with id 1 to category id 2.
764 *
765 * @param int $from_id The origin Category ID
766 * @param int $to_id The new Category ID
767 *
768 * @return bool|int|\mysqli_result|resource|null Return the number of rows affected by the query.
769 */
770 public static function bulk_update_category( $from_id, $to_id ) {
771 global $wpdb;
772 $table = $wpdb->prefix . 'f12_cf7_doubleoptin';
773
774 return $wpdb->query( $wpdb->prepare( 'UPDATE ' . $table . ' SET category =%d WHERE category =%d', $to_id, $from_id ) );
775 }
776
777 /**
778 * Update the category of the given opt in id.
779 *
780 * @param int $optin_id The ID of the OptIn
781 * @param int $category_id The ID of the Category
782 *
783 * @return bool|int|\mysqli_result|resource|null
784 */
785 public static function update_category_by_id( $optin_id, $category_id ) {
786 global $wpdb;
787 $table = $wpdb->prefix . 'f12_cf7_doubleoptin';
788
789 return $wpdb->query( $wpdb->prepare( 'UPDATE ' . $table . ' SET category =%d WHERE id =%d', $category_id, $optin_id ) );
790 }
791
792 /**
793 * Update or create the given Object
794 */
795 public function save() {
796 global $wpdb;
797 $table = $wpdb->prefix . 'f12_cf7_doubleoptin';
798
799 if ( ! empty( $this->get_hash() ) ) {
800 return $wpdb->update( $table, array(
801 'doubleoptin' => $this->get_doubleoptin(),
802 'createtime' => $this->get_createtime(),
803 'updatetime' => $this->get_updatetime(),
804 'ipaddr_confirmation' => $this->get_ipaddr_confirmation(),
805 'ipaddr_register' => $this->get_ipaddr_register(),
806 'cf_form_id' => $this->get_cf_form_id(),
807 'content' => $this->get_content(),
808 'files' => $this->get_files(),
809 'category' => $this->get_category(),
810 'optouttime' => $this->get_optouttime(),
811 'ipaddr_optout' => $this->get_ipaddr_optout(),
812 'mail_optin' => $this->get_mail_optin(),
813 ), array(
814 'hash' => $this->get_hash()
815 ) );
816 } else {
817 $result = $wpdb->insert( $table, array(
818 'cf_form_id' => $this->get_cf_form_id(),
819 'doubleoptin' => $this->get_doubleoptin(),
820 'createtime' => $this->get_createtime(),
821 'updatetime' => $this->get_updatetime(),
822 'ipaddr_confirmation' => $this->get_ipaddr_confirmation(),
823 'ipaddr_register' => $this->get_ipaddr_register(),
824 'content' => $this->get_content(),
825 'files' => $this->get_files(),
826 'category' => $this->get_category(),
827 'form' => $this->get_form(),
828 'mail_optin' => $this->get_mail_optin(),
829 'email' => $this->get_email()
830 ) );
831
832 if ( $result > 0 ) {
833 $this->id = $wpdb->insert_id;
834
835 return $this->createHash();
836 }
837 }
838
839 return false;
840 }
841
842 /**
843 * Creates a unique hash code and adds it to the current OptIn Object
844 */
845 private function createHash() {
846 global $wpdb;
847
848 if ( null == $wpdb ) {
849 return false;
850 }
851
852 $table = $wpdb->prefix . 'f12_cf7_doubleoptin';
853
854 // add the hash to the element
855
856 $this->hash = base64_encode( $this->get_createtime() . $this->get_id() . $this->get_cf_form_id() );
857
858 return $wpdb->update( $table, array(
859 'hash' => $this->hash,
860 ), array(
861 'id' => $this->get_id()
862 ) );
863 }
864
865 /**
866 * Return the Form
867 *
868 * @return string
869 */
870 public function get_form() {
871 return $this->form;
872 }
873
874 /**
875 * Returns the Name of the form if available
876 *
877 * @return string The name of the Form
878 * @since 2.4.0
879 */
880 public function get_form_name() {
881 $post = get_post( $this->get_cf_form_id() );
882
883 if ( null === $post ) {
884 return __( 'Deleted', 'double-opt-in' );
885 }
886
887 return $post->post_title;
888 }
889
890 /**
891 * Returns the URL to the form depending on the Form Type.
892 *
893 * @return string The Backend URL to the Form, empty if the post is not found.
894 * @since 2.4.0
895 *
896 */
897 public function get_form_link() {
898 if ( $this->isTypeElementor() ) {
899 return get_edit_post_link( $this->get_cf_form_id() );
900 } elseif ( $this->isTypeAvada() ) {
901 return get_edit_post_link( $this->get_cf_form_id() );
902 } elseif ( $this->isTypeCF7() ) {
903 $post = get_post( $this->get_cf_form_id() );
904
905 if ( ! $post ) {
906 return '';
907 }
908
909 return admin_url( 'admin.php?page=wpcf7&post=' . esc_attr( $this->get_cf_form_id() ) . '&action=edit' );
910 }
911
912 return '';
913 }
914
915
916 /**
917 * Retrieves the form settings.
918 *
919 * If the form is created using Elementor, retrieves the settings using the `get_settings_by_elementor()`
920 * method.
921 *
922 * @return array The form settings.
923 * @since 2.4.0
924 *
925 */
926 public function get_form_settings() {
927 if ( $this->isTypeElementor() ) {
928 return $this->get_settings_by_elementor();
929 } else if ( $this->isTypeCF7() ) {
930 return $this->get_settings_by_cf7();
931 } else if ( $this->isTypeAvada() ) {
932 return $this->get_settings_by_avada();
933 }
934
935 return [];
936 }
937
938 /**
939 * Retrieves the settings of a specific element using avada.
940 *
941 * @return array
942 * @since 2.4.0
943 *
944 * @see OptIn::maybe_normalize_settings() for details
945 */
946 private function get_settings_by_avada() {
947
948 $form_id = $this->get_cf_form_id();
949
950 $settings = CF7DoubleOptIn::getInstance()->getParameter( $form_id );
951
952 return $this->maybe_normalize_settings( $settings );
953 }
954
955 /**
956 * Retrieves the settings of a specific element using cf7.
957 *
958 * @return array
959 * @since 2.4.0
960 *
961 * @see OptIn::maybe_normalize_settings() for details
962 */
963 private function get_settings_by_cf7() {
964 $form_id = $this->get_cf_form_id();
965
966 $settings = get_post_meta( $form_id, 'f12-cf7-doubleoptin', true );
967
968 if ( null == $settings || ! is_array( $settings ) ) {
969 return [];
970 }
971
972 $settings = $this->maybe_normalize_settings( $settings );
973
974 return $settings;
975 }
976
977 /**
978 * Retrieves the settings of a specific element using Elementor.
979 *
980 * @return array
981 * @since 2.4.0
982 *
983 * @see OptIn::maybe_normalize_settings() for details
984 */
985 private function get_settings_by_elementor() {
986 $page_id = $this->get_cf_form_id();
987
988 $post = get_post( $page_id );
989
990 // skip if post not existing anymore
991 if ( null === $post ) {
992 return [];
993 }
994
995 // skip if page is not build with elementor
996 if ( ! \Elementor\Plugin::$instance->documents->get( $page_id )->is_built_with_elementor() ) {
997 return [];
998 }
999
1000 // Load the page's data
1001 $document = \Elementor\Plugin::$instance->documents->get( $page_id );
1002
1003 // Skip if document not exist
1004 if ( ! $document ) {
1005 return [];
1006 }
1007
1008 // Loop through the elements
1009 $elements_data = $document->get_elements_data();
1010
1011 $content = maybe_unserialize( $this->get_content() );
1012
1013 // skip if form id not available
1014 if ( ! isset( $content['form_id'] ) ) {
1015 return [];
1016 }
1017
1018 $form_id = $content['form_id'];
1019
1020 $form_element = null;
1021
1022 // Find the Form Element
1023 foreach ( $elements_data as $element ) {
1024 if ( isset( $element['elements'] ) ) {
1025 foreach ( $element['elements'] as $el ) {
1026 if ( $form_id !== $el['id'] || 'form' !== $el['widgetType'] ) {
1027 continue;
1028 }
1029
1030 $form_element = $el;
1031 }
1032 }
1033
1034 // Check if this is the form widget
1035 if ( isset( $element['widgetType'] ) && isset( $element['id'] ) && $element['widgetType'] === 'form' && $element['id'] === $form_id ) {
1036 // Return the form settings
1037 $form_element = $element;
1038 }
1039 }
1040
1041 // skip if form element not found on the page anymore
1042 if ( $form_element == null || ! isset( $form_element['settings'] ) ) {
1043 return [];
1044 }
1045
1046 // Normalize Settings
1047 return $this->maybe_normalize_settings( $form_element['settings'] );
1048 }
1049
1050 /**
1051 * Normalizes the settings by converting the value of the settings
1052 *
1053 * @param array $settings The settings array to be normalized.
1054 * @formatter:off
1055 *
1056 * @return array {
1057 * The settings of the element if found or an empty array if nothing was found.
1058 * @type string $doi_email_to
1059 * @type string $doi_email_subject
1060 * @type string $doi_email_content
1061 * @type string $doi_email_from
1062 * @type string $doi_email_from_name
1063 * @type string $doi_email_template
1064 * @type string $doi_email_body
1065 * }
1066 *
1067 * @formatter:on
1068 */
1069 private function maybe_normalize_settings( $settings ) {
1070 if ( isset( $settings['sender'] ) ) {
1071 $settings['doi_email_from'] = $settings['sender'];
1072 }
1073
1074 if ( isset( $settings['sender_name'] ) ) {
1075 $settings['doi_email_from_name'] = $settings['sender_name'];
1076 }
1077
1078 if ( isset( $settings['subject'] ) ) {
1079 $settings['doi_email_subject'] = $settings['subject'];
1080 }
1081
1082 if ( isset( $settings['recipient'] ) ) {
1083 $settings['doi_email_to'] = $settings['recipient'];
1084 }
1085
1086 if ( isset( $settings['template'] ) ) {
1087 $settings['doi_email_template'] = $settings['template'];
1088 }
1089
1090 if ( isset( $settings['body'] ) ) {
1091 $settings['doi_email_body'] = $settings['body'];
1092 }
1093
1094 /**
1095 * Normalize the settings between the different form plugins
1096 *
1097 * @formatter:off
1098 *
1099 * @param array {
1100 * @type string $doi_email_to
1101 * @type string $doi_email_subject
1102 * @type string $doi_email_content
1103 * @type string $doi_email_from
1104 * @type string $doi_email_from_name
1105 * @type string $doi_email_template
1106 * @type string $doi_email_body
1107 * }
1108 *
1109 * @formatter:on
1110 *
1111 * @since 3.0.0
1112 */
1113 return apply_filters( 'f12_cf7_doubleoption_normalize_settings', $settings );
1114 }
1115
1116 /**
1117 * Set the Form as HTML
1118 *
1119 * @param string $form
1120 *
1121 * @return void
1122 */
1123 public function set_form( $form ) {
1124 $this->form = $form;
1125 }
1126
1127 /**
1128 * Return the Form
1129 *
1130 * @return string
1131 */
1132 public function get_mail_optin() {
1133 return $this->mail_optin;
1134 }
1135
1136 /**
1137 * Return the E-mail
1138 *
1139 * @return string
1140 */
1141 public function get_email() {
1142 return $this->email;
1143 }
1144
1145 /**
1146 * Store the email
1147 *
1148 * @param string $email
1149 *
1150 * @return void
1151 */
1152 public function set_email( $email ) {
1153 $this->email = $email;
1154 }
1155
1156 /**
1157 * Set the Form as HTML
1158 *
1159 * @param string $form
1160 *
1161 * @return void
1162 */
1163 public function set_mail_optin( $mail_html ) {
1164 $this->mail_optin = $mail_html;
1165 }
1166
1167 /**
1168 * Return the link to the detail view
1169 *
1170 * @return string
1171 */
1172 public function get_link_ui() {
1173 return admin_url( 'admin.php?page=f12-cf7-doubleoptin_optin_view&hash=' . $this->get_hash() );
1174 }
1175
1176 /**
1177 * Return the link to delete
1178 *
1179 * @return string
1180 */
1181 public function get_link_delete() {
1182 return admin_url( 'admin.php?page=f12-cf7-doubleoptin&option=delete&hash=' . $this->get_hash() );
1183 }
1184
1185 /**
1186 * Return the link to the export
1187 *
1188 * @return string
1189 */
1190 public function get_link_export() {
1191 return admin_url( 'admin.php?page=f12-cf7-doubleoptin&export=csv&id=' . $this->get_id() );
1192 }
1193
1194 /**
1195 * Return the link to the export
1196 *
1197 * @return string
1198 */
1199 public function get_link_export_v2() {
1200 return admin_url( 'admin.php?page=f12-cf7-doubleoptin&export=csv_v2&id=' . $this->get_id() );
1201 }
1202
1203 /**
1204 * Return the link to the optin
1205 *
1206 * @return string
1207 */
1208 public function get_link_optin( $parameter = array() ) {
1209 if ( $this->get_cf_form_id() == 0 ) {
1210 return get_home_url() . '?optin=' . $this->get_hash();
1211 }
1212
1213 $parameter = array_merge( CF7DoubleOptIn::getInstance()->getParameter( $this->get_cf_form_id() ), $parameter );
1214
1215 $page_id = $parameter['page'] ?? - 1;
1216
1217 if ( $page_id == - 1 || ! $page_id || $page_id == 0 ) {
1218 $link = get_home_url() . '?optin=' . $this->get_hash();
1219 } else {
1220
1221 $link = get_permalink( $page_id );
1222
1223 if ( strpos( $link, "?" ) !== false ) {
1224 $link .= '&optin=' . $this->get_hash();
1225 } else {
1226 $link .= '?optin=' . $this->get_hash();
1227 }
1228 }
1229
1230 return $link;
1231 }
1232
1233 /**
1234 * Return the link to the optout
1235 *
1236 * @return string
1237 */
1238 public function get_link_optout() {
1239 $settings = CF7DoubleOptIn::getInstance()->getSettings();
1240
1241 if ( ! isset( $settings['optout_page'] ) || $settings['optout_page'] == 0 ) {
1242 return get_home_url() . '?optout=' . $this->get_hash();
1243 } else {
1244 $url = get_permalink( $settings['optout_page'] );
1245
1246 if ( str_contains( $url, '?' ) ) {
1247 // If '?' exists in the URL, it means there are already parameters, so append with '&'
1248 $url .= '&optout=' . $this->get_hash();
1249 } else {
1250 // Else, there are no parameters yet, so append with '?'
1251 $url .= '?optout=' . $this->get_hash();
1252 }
1253
1254 return $url;
1255
1256 }
1257 }
1258 }
1259 }