PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.7.2
Independent Analytics – WordPress Analytics Plugin v2.7.2
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 2 years ago Submission.php 2 years ago Submission_Listener.php 2 years ago
Form.php
159 lines
1 <?php
2
3 namespace IAWP\Form_Submissions;
4
5 use IAWP\Illuminate_Builder;
6 use IAWP\Query;
7 /**
8 * Form tracking requires dynamic columns. If you have 2 forms, there will be 6 new columns. 2 for
9 * a summary and 2 per form. This class makes it easy to get all the forms a given site has, while
10 * caching the result, so it doesn't need to re-fetch from the database.
11 * @internal
12 */
13 class Form
14 {
15 private $id;
16 private $title;
17 private $plugin_id;
18 private static $forms = null;
19 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']]];
20 /**
21 * @var array An key(plugin_id) value(bool) pair of plugin IDs
22 */
23 private static $has_any_tracked_submissions_cache = [];
24 private function __construct(int $id, string $title, int $plugin_id)
25 {
26 $this->id = $id;
27 $this->title = $title;
28 $this->plugin_id = $plugin_id;
29 }
30 public function id() : int
31 {
32 return $this->id;
33 }
34 public function title() : string
35 {
36 return $this->title;
37 }
38 public function icon() : string
39 {
40 $lowercase = \strtolower($this->plugin_name());
41 $hyphenated = \str_replace(' ', '_', $lowercase);
42 return $hyphenated;
43 }
44 public function plugin_name() : string
45 {
46 return \IAWP\Form_Submissions\Form::find_plugin_by_id($this->plugin_id)['name'];
47 }
48 public function is_plugin_active() : bool
49 {
50 return self::static_is_plugin_active($this->plugin_id);
51 }
52 public function submissions_column() : string
53 {
54 return "form_submissions_for_{$this->id}";
55 }
56 public function conversion_rate_column() : string
57 {
58 return "form_conversion_rate_for_{$this->id}";
59 }
60 public static function has_active_form_plugin() : bool
61 {
62 return \is_array(self::get_first_active_form_plugin());
63 }
64 public static function get_first_active_form_plugin_name() : ?string
65 {
66 $active_plugin = self::get_first_active_form_plugin();
67 return \is_array($active_plugin) ? $active_plugin['name'] : null;
68 }
69 public static function find_form_by_column_name(string $column_name) : ?\IAWP\Form_Submissions\Form
70 {
71 $id = \intval(\preg_match('/(\\d+)\\z/', $column_name));
72 $forms = self::get_forms();
73 foreach ($forms as $form) {
74 if ($id === $form->id()) {
75 return $form;
76 }
77 }
78 return null;
79 }
80 /**
81 * @return Form[]
82 */
83 public static function get_forms() : array
84 {
85 if (\is_array(self::$forms)) {
86 return self::$forms;
87 }
88 $forms_table = Query::get_table_name(Query::FORMS);
89 $query = Illuminate_Builder::get_builder()->select(['form_id', 'cached_form_title', 'plugin_id'])->from($forms_table);
90 $forms = \array_filter(\array_map(function ($form) {
91 if (\is_null(self::find_plugin_by_id($form->plugin_id))) {
92 return null;
93 }
94 return new self($form->form_id, $form->cached_form_title, $form->plugin_id);
95 }, $query->get()->all()));
96 \usort($forms, function (\IAWP\Form_Submissions\Form $a, \IAWP\Form_Submissions\Form $b) {
97 // First level sort by plugin name
98 $plugin_name_comparison = \strcmp($a->plugin_name(), $b->plugin_name());
99 // If types are equal, sort by 'name'
100 if ($plugin_name_comparison === 0) {
101 return \strcmp($a->title(), $b->title());
102 }
103 return $plugin_name_comparison;
104 });
105 self::$forms = $forms;
106 return self::$forms;
107 }
108 private static function has_any_tracked_submissions(int $plugin_id) : bool
109 {
110 if (\array_key_exists($plugin_id, self::$has_any_tracked_submissions_cache)) {
111 return self::$has_any_tracked_submissions_cache[$plugin_id];
112 }
113 $forms_table = Query::get_table_name(Query::FORMS);
114 $form_submissions_table = Query::get_table_name(Query::FORM_SUBMISSIONS);
115 $has_submissions = Illuminate_Builder::get_builder()->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();
116 self::$has_any_tracked_submissions_cache[$plugin_id] = $has_submissions;
117 return $has_submissions;
118 }
119 private static function get_first_active_form_plugin() : ?array
120 {
121 foreach (\IAWP\Form_Submissions\Form::$plugins as $plugin) {
122 if (self::static_is_plugin_active($plugin['id'])) {
123 return $plugin;
124 }
125 }
126 return null;
127 }
128 private static function static_is_plugin_active(int $plugin_id) : bool
129 {
130 $active_plugins = \get_option('active_plugins');
131 $plugin = \IAWP\Form_Submissions\Form::find_plugin_by_id($plugin_id);
132 if (!\array_key_exists('plugin_slugs', $plugin) && !\array_key_exists('theme', $plugin)) {
133 return self::has_any_tracked_submissions($plugin_id);
134 }
135 if (\array_key_exists('theme', $plugin)) {
136 if (\get_template() === $plugin['theme']) {
137 return \true;
138 }
139 }
140 if (\array_key_exists('plugin_slugs', $plugin)) {
141 foreach ($plugin['plugin_slugs'] as $slug) {
142 if (\in_array($slug, $active_plugins)) {
143 return \true;
144 }
145 }
146 }
147 return \false;
148 }
149 private static function find_plugin_by_id(int $id) : ?array
150 {
151 foreach (self::$plugins as $plugin) {
152 if ($plugin['id'] === $id) {
153 return $plugin;
154 }
155 }
156 return null;
157 }
158 }
159