PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.11.3
Independent Analytics – WordPress Analytics Plugin v2.11.3
2.15.5 2.15.4 2.15.3 2.15.2 2.15.1 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 1 year ago
Form.php
199 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 = [
22 ['id' => 1, 'name' => 'Fluent Forms', 'plugin_slugs' => ['fluentform/fluentform.php']],
23 ['id' => 2, 'name' => 'WPForms', 'plugin_slugs' => ['wpforms-lite/wpforms.php', 'wpforms/wpforms.php']],
24 ['id' => 3, 'name' => 'Contact Form 7', 'plugin_slugs' => ['contact-form-7/wp-contact-form-7.php']],
25 ['id' => 4, 'name' => 'Gravity Forms', 'plugin_slugs' => ['gravityforms/gravityforms.php']],
26 ['id' => 5, 'name' => 'Ninja Forms', 'plugin_slugs' => ['ninja-forms/ninja-forms.php']],
27 ['id' => 6, 'name' => 'MailOptin', 'plugin_slugs' => ['mailoptin/mailoptin.php']],
28 ['id' => 7, 'name' => 'Convert Pro', 'plugin_slugs' => ['convertpro/convertpro.php']],
29 ['id' => 8, 'name' => 'Elementor Pro', 'plugin_slugs' => ['elementor-pro/elementor-pro.php']],
30 ['id' => 9, 'name' => 'JetFormBuilder', 'plugin_slugs' => ['jetformbuilder/jet-form-builder.php']],
31 ['id' => 10, 'name' => 'Formidable Forms', 'plugin_slugs' => ['formidable/formidable.php']],
32 ['id' => 11, 'name' => 'WS Form', 'plugin_slugs' => ['ws-form/ws-form.php', 'ws-form-pro/ws-form.php']],
33 ['id' => 12, 'name' => 'Amelia', 'plugin_slugs' => ['ameliabooking/ameliabooking.php']],
34 ['id' => 13, 'name' => 'Bricks Builder', 'theme' => 'bricks'],
35 ['id' => 14, 'name' => 'ARForms', 'plugin_slugs' => ['arforms-form-builder/arforms-form-builder.php']],
36 ['id' => 15, 'name' => 'Custom form submissions'],
37 ['id' => 16, 'name' => 'Bit Form', 'plugin_slugs' => ['bit-form/bitforms.php']],
38 ['id' => 17, 'name' => 'Forminator', 'plugin_slugs' => ['forminator/forminator.php']],
39 ['id' => 18, 'name' => 'Hustle', 'plugin_slugs' => ['wordpress-popup/popover.php', 'hustle/opt-in.php']],
40 ['id' => 19, 'name' => 'Avada', 'plugin_slugs' => ['fusion-builder/fusion-builder.php', 'fusion-core/fusion-core.php']],
41 ['id' => 20, 'name' => 'WP Store Locator', 'plugin_slugs' => ['wp-store-locator/wp-store-locator.php']],
42 // [
43 // 'id' => 21,
44 // 'name' => 'Thrive Leads',
45 // 'plugin_slugs' => ['thrive-leads/thrive-leads.php'],
46 // ],
47 ['id' => 22, 'name' => 'SureForms', 'plugin_slugs' => ['sureforms/sureforms.php']],
48 ['id' => 23, 'name' => 'Kali Forms', 'plugin_slugs' => ['kali-forms/kali-forms.php']],
49 ['id' => 24, 'name' => 'Divi', 'theme' => 'Divi'],
50 ['id' => 25, 'name' => 'MailPoet', 'plugin_slugs' => ['mailpoet/mailpoet.php']],
51 ];
52 /**
53 * @var array A key/value pair (plugin_id/bool) of plugin IDs
54 */
55 private static $has_any_tracked_submissions_cache = [];
56 private function __construct(int $id, string $title, int $plugin_id)
57 {
58 $this->id = $id;
59 $this->title = $title;
60 $this->plugin_id = $plugin_id;
61 }
62 public function id() : int
63 {
64 return $this->id;
65 }
66 public function title() : string
67 {
68 return $this->title;
69 }
70 public function icon() : string
71 {
72 $lowercase = \strtolower($this->plugin_name());
73 $hyphenated = \str_replace(' ', '_', $lowercase);
74 return $hyphenated;
75 }
76 public function plugin_name() : string
77 {
78 return \IAWP\Form_Submissions\Form::find_plugin_by_id($this->plugin_id)['name'];
79 }
80 public function is_plugin_active() : bool
81 {
82 return self::static_is_plugin_active($this->plugin_id);
83 }
84 public function submissions_column() : string
85 {
86 return "form_submissions_for_{$this->id}";
87 }
88 public function conversion_rate_column() : string
89 {
90 return "form_conversion_rate_for_{$this->id}";
91 }
92 public static function has_active_form_plugin() : bool
93 {
94 return \is_array(self::get_first_active_form_plugin());
95 }
96 public static function get_first_active_form_plugin_name() : ?string
97 {
98 $active_plugin = self::get_first_active_form_plugin();
99 return \is_array($active_plugin) ? $active_plugin['name'] : null;
100 }
101 public static function find_form_by_column_name(string $column_name) : ?\IAWP\Form_Submissions\Form
102 {
103 $id = \intval(\preg_match('/(\\d+)\\z/', $column_name));
104 $forms = self::get_forms();
105 foreach ($forms as $form) {
106 if ($id === $form->id()) {
107 return $form;
108 }
109 }
110 return null;
111 }
112 /**
113 * @return Form[]
114 */
115 public static function get_forms() : array
116 {
117 if (\is_array(self::$forms)) {
118 return self::$forms;
119 }
120 $forms_table = Query::get_table_name(Query::FORMS);
121 $query = Illuminate_Builder::new()->select(['form_id', 'cached_form_title', 'plugin_id'])->from($forms_table);
122 $forms = \array_filter(\array_map(function ($form) {
123 if (\is_null(self::find_plugin_by_id($form->plugin_id))) {
124 return null;
125 }
126 return new self($form->form_id, $form->cached_form_title, $form->plugin_id);
127 }, $query->get()->all()));
128 \usort($forms, function (\IAWP\Form_Submissions\Form $a, \IAWP\Form_Submissions\Form $b) {
129 // First level sort by plugin name
130 $plugin_name_comparison = \strcmp($a->plugin_name(), $b->plugin_name());
131 // If types are equal, sort by 'name'
132 if ($plugin_name_comparison === 0) {
133 return \strcmp($a->title(), $b->title());
134 }
135 return $plugin_name_comparison;
136 });
137 self::$forms = $forms;
138 return self::$forms;
139 }
140 private static function has_any_tracked_submissions(int $plugin_id) : bool
141 {
142 if (\array_key_exists($plugin_id, self::$has_any_tracked_submissions_cache)) {
143 return self::$has_any_tracked_submissions_cache[$plugin_id];
144 }
145 $forms_table = Query::get_table_name(Query::FORMS);
146 $form_submissions_table = Query::get_table_name(Query::FORM_SUBMISSIONS);
147 $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();
148 self::$has_any_tracked_submissions_cache[$plugin_id] = $has_submissions;
149 return $has_submissions;
150 }
151 private static function get_first_active_form_plugin() : ?array
152 {
153 foreach (\IAWP\Form_Submissions\Form::$plugins as $plugin) {
154 if (self::static_is_plugin_active($plugin['id'])) {
155 return $plugin;
156 }
157 }
158 return null;
159 }
160 private static function static_is_plugin_active(int $plugin_id) : bool
161 {
162 if (\array_key_exists($plugin_id, self::$is_plugin_active_cache)) {
163 return self::$is_plugin_active_cache[$plugin_id];
164 }
165 $plugin = \IAWP\Form_Submissions\Form::find_plugin_by_id($plugin_id);
166 if (!\array_key_exists('plugin_slugs', $plugin) && !\array_key_exists('theme', $plugin)) {
167 if (self::has_any_tracked_submissions($plugin_id)) {
168 self::$is_plugin_active_cache[$plugin_id] = \true;
169 return \true;
170 }
171 }
172 if (\array_key_exists('theme', $plugin)) {
173 if (\strtolower(\get_template()) === \strtolower($plugin['theme'])) {
174 self::$is_plugin_active_cache[$plugin_id] = \true;
175 return \true;
176 }
177 }
178 if (\array_key_exists('plugin_slugs', $plugin)) {
179 foreach ($plugin['plugin_slugs'] as $slug) {
180 if (\is_plugin_active($slug)) {
181 self::$is_plugin_active_cache[$plugin_id] = \true;
182 return \true;
183 }
184 }
185 }
186 self::$is_plugin_active_cache[$plugin_id] = \false;
187 return \false;
188 }
189 private static function find_plugin_by_id(int $id) : ?array
190 {
191 foreach (self::$plugins as $plugin) {
192 if ($plugin['id'] === $id) {
193 return $plugin;
194 }
195 }
196 return null;
197 }
198 }
199