PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.12.2
Independent Analytics – WordPress Analytics Plugin v2.12.2
2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / IAWP / Form_Submissions / Form.php
independent-analytics / IAWP / Form_Submissions Last commit date
Form.php 1 year ago Submission.php 1 year ago Submission_Listener.php 11 months ago
Form.php
169 lines
1 <?php
2
3 namespace IAWP\Form_Submissions;
4
5 use IAWP\Illuminate_Builder;
6 use IAWP\Query;
7 use IAWP\Utils\Plugin;
8 /**
9 * Form tracking requires dynamic columns. If you have 2 forms, there will be 6 new columns. 2 for
10 * a summary and 2 per form. This class makes it easy to get all the forms a given site has, while
11 * caching the result, so it doesn't need to re-fetch from the database.
12 * @internal
13 */
14 class Form
15 {
16 private $id;
17 private $title;
18 private $plugin_id;
19 private static $forms = null;
20 private static $is_plugin_active_cache = [];
21 private static $plugins = [['id' => 1, 'name' => 'Fluent Forms', 'plugin_slugs' => ['fluentform/fluentform.php']], ['id' => 2, 'name' => 'WPForms', 'plugin_slugs' => ['wpforms-lite/wpforms.php', 'wpforms/wpforms.php']], ['id' => 3, 'name' => 'Contact Form 7', 'plugin_slugs' => ['contact-form-7/wp-contact-form-7.php']], ['id' => 4, 'name' => 'Gravity Forms', 'plugin_slugs' => ['gravityforms/gravityforms.php']], ['id' => 5, 'name' => 'Ninja Forms', 'plugin_slugs' => ['ninja-forms/ninja-forms.php']], ['id' => 6, 'name' => 'MailOptin', 'plugin_slugs' => ['mailoptin/mailoptin.php']], ['id' => 7, 'name' => 'Convert Pro', 'plugin_slugs' => ['convertpro/convertpro.php']], ['id' => 8, 'name' => 'Elementor Pro', 'plugin_slugs' => ['elementor-pro/elementor-pro.php']], ['id' => 9, 'name' => 'JetFormBuilder', 'plugin_slugs' => ['jetformbuilder/jet-form-builder.php']], ['id' => 10, 'name' => 'Formidable Forms', 'plugin_slugs' => ['formidable/formidable.php']], ['id' => 11, 'name' => 'WS Form', 'plugin_slugs' => ['ws-form/ws-form.php', 'ws-form-pro/ws-form.php']], ['id' => 12, 'name' => 'Amelia', 'plugin_slugs' => ['ameliabooking/ameliabooking.php']], ['id' => 13, 'name' => 'Bricks Builder', 'theme' => 'bricks'], ['id' => 14, 'name' => 'ARForms', 'plugin_slugs' => ['arforms-form-builder/arforms-form-builder.php']], ['id' => 15, 'name' => 'Custom form submissions'], ['id' => 16, 'name' => 'Bit Form', 'plugin_slugs' => ['bit-form/bitforms.php']], ['id' => 17, 'name' => 'Forminator', 'plugin_slugs' => ['forminator/forminator.php']], ['id' => 18, 'name' => 'Hustle', 'plugin_slugs' => ['wordpress-popup/popover.php', 'hustle/opt-in.php']], ['id' => 19, 'name' => 'Avada', 'plugin_slugs' => ['fusion-builder/fusion-builder.php', 'fusion-core/fusion-core.php']], ['id' => 20, 'name' => 'WP Store Locator', 'plugin_slugs' => ['wp-store-locator/wp-store-locator.php']], ['id' => 21, 'name' => 'Thrive Leads', 'plugin_slugs' => ['thrive-leads/thrive-leads.php']], ['id' => 22, 'name' => 'SureForms', 'plugin_slugs' => ['sureforms/sureforms.php']], ['id' => 23, 'name' => 'Kali Forms', 'plugin_slugs' => ['kali-forms/kali-forms.php']], ['id' => 24, 'name' => 'Divi', 'theme' => 'Divi'], ['id' => 25, 'name' => 'MailPoet', 'plugin_slugs' => ['mailpoet/mailpoet.php']]];
22 /**
23 * @var array A key/value pair (plugin_id/bool) of plugin IDs
24 */
25 private static $has_any_tracked_submissions_cache = [];
26 private function __construct(int $id, string $title, int $plugin_id)
27 {
28 $this->id = $id;
29 $this->title = $title;
30 $this->plugin_id = $plugin_id;
31 }
32 public function id() : int
33 {
34 return $this->id;
35 }
36 public function title() : string
37 {
38 return $this->title;
39 }
40 public function icon() : string
41 {
42 $lowercase = \strtolower($this->plugin_name());
43 $hyphenated = \str_replace(' ', '_', $lowercase);
44 return $hyphenated;
45 }
46 public function plugin_name() : string
47 {
48 return \IAWP\Form_Submissions\Form::find_plugin_by_id($this->plugin_id)['name'];
49 }
50 public function is_plugin_active() : bool
51 {
52 return self::static_is_plugin_active($this->plugin_id);
53 }
54 public function submissions_column() : string
55 {
56 return "form_submissions_for_{$this->id}";
57 }
58 public function conversion_rate_column() : string
59 {
60 return "form_conversion_rate_for_{$this->id}";
61 }
62 public static function has_active_form_plugin() : bool
63 {
64 return \is_array(self::get_first_active_form_plugin());
65 }
66 public static function get_first_active_form_plugin_name() : ?string
67 {
68 $active_plugin = self::get_first_active_form_plugin();
69 return \is_array($active_plugin) ? $active_plugin['name'] : null;
70 }
71 public static function find_form_by_column_name(string $column_name) : ?\IAWP\Form_Submissions\Form
72 {
73 $id = \intval(\preg_match('/(\\d+)\\z/', $column_name));
74 $forms = self::get_forms();
75 foreach ($forms as $form) {
76 if ($id === $form->id()) {
77 return $form;
78 }
79 }
80 return null;
81 }
82 /**
83 * @return Form[]
84 */
85 public static function get_forms() : array
86 {
87 if (\is_array(self::$forms)) {
88 return self::$forms;
89 }
90 $forms_table = Query::get_table_name(Query::FORMS);
91 $query = Illuminate_Builder::new()->select(['form_id', 'cached_form_title', 'plugin_id'])->from($forms_table);
92 $forms = \array_filter(\array_map(function ($form) {
93 if (\is_null(self::find_plugin_by_id($form->plugin_id))) {
94 return null;
95 }
96 return new self($form->form_id, $form->cached_form_title, $form->plugin_id);
97 }, $query->get()->all()));
98 \usort($forms, function (\IAWP\Form_Submissions\Form $a, \IAWP\Form_Submissions\Form $b) {
99 // First level sort by plugin name
100 $plugin_name_comparison = \strcmp($a->plugin_name(), $b->plugin_name());
101 // If types are equal, sort by 'name'
102 if ($plugin_name_comparison === 0) {
103 return \strcmp($a->title(), $b->title());
104 }
105 return $plugin_name_comparison;
106 });
107 self::$forms = $forms;
108 return self::$forms;
109 }
110 private static function has_any_tracked_submissions(int $plugin_id) : bool
111 {
112 if (\array_key_exists($plugin_id, self::$has_any_tracked_submissions_cache)) {
113 return self::$has_any_tracked_submissions_cache[$plugin_id];
114 }
115 $forms_table = Query::get_table_name(Query::FORMS);
116 $form_submissions_table = Query::get_table_name(Query::FORM_SUBMISSIONS);
117 $has_submissions = Illuminate_Builder::new()->from($forms_table, 'forms')->join("{$form_submissions_table} AS form_submissions", 'forms.form_id', '=', 'form_submissions.form_id')->where('forms.plugin_id', '=', $plugin_id)->exists();
118 self::$has_any_tracked_submissions_cache[$plugin_id] = $has_submissions;
119 return $has_submissions;
120 }
121 private static function get_first_active_form_plugin() : ?array
122 {
123 foreach (\IAWP\Form_Submissions\Form::$plugins as $plugin) {
124 if (self::static_is_plugin_active($plugin['id'])) {
125 return $plugin;
126 }
127 }
128 return null;
129 }
130 private static function static_is_plugin_active(int $plugin_id) : bool
131 {
132 if (\array_key_exists($plugin_id, self::$is_plugin_active_cache)) {
133 return self::$is_plugin_active_cache[$plugin_id];
134 }
135 $plugin = \IAWP\Form_Submissions\Form::find_plugin_by_id($plugin_id);
136 if (!\array_key_exists('plugin_slugs', $plugin) && !\array_key_exists('theme', $plugin)) {
137 if (self::has_any_tracked_submissions($plugin_id)) {
138 self::$is_plugin_active_cache[$plugin_id] = \true;
139 return \true;
140 }
141 }
142 if (\array_key_exists('theme', $plugin)) {
143 if (\strtolower(\get_template()) === \strtolower($plugin['theme'])) {
144 self::$is_plugin_active_cache[$plugin_id] = \true;
145 return \true;
146 }
147 }
148 if (\array_key_exists('plugin_slugs', $plugin)) {
149 foreach ($plugin['plugin_slugs'] as $slug) {
150 if (\is_plugin_active($slug)) {
151 self::$is_plugin_active_cache[$plugin_id] = \true;
152 return \true;
153 }
154 }
155 }
156 self::$is_plugin_active_cache[$plugin_id] = \false;
157 return \false;
158 }
159 private static function find_plugin_by_id(int $id) : ?array
160 {
161 foreach (self::$plugins as $plugin) {
162 if ($plugin['id'] === $id) {
163 return $plugin;
164 }
165 }
166 return null;
167 }
168 }
169