PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.8.4
Independent Analytics – WordPress Analytics Plugin v2.8.4
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
159 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 $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']]];
21 /**
22 * @var array An key(plugin_id) value(bool) pair of plugin IDs
23 */
24 private static $has_any_tracked_submissions_cache = [];
25 private function __construct(int $id, string $title, int $plugin_id)
26 {
27 $this->id = $id;
28 $this->title = $title;
29 $this->plugin_id = $plugin_id;
30 }
31 public function id() : int
32 {
33 return $this->id;
34 }
35 public function title() : string
36 {
37 return $this->title;
38 }
39 public function icon() : string
40 {
41 $lowercase = \strtolower($this->plugin_name());
42 $hyphenated = \str_replace(' ', '_', $lowercase);
43 return $hyphenated;
44 }
45 public function plugin_name() : string
46 {
47 return \IAWP\Form_Submissions\Form::find_plugin_by_id($this->plugin_id)['name'];
48 }
49 public function is_plugin_active() : bool
50 {
51 return self::static_is_plugin_active($this->plugin_id);
52 }
53 public function submissions_column() : string
54 {
55 return "form_submissions_for_{$this->id}";
56 }
57 public function conversion_rate_column() : string
58 {
59 return "form_conversion_rate_for_{$this->id}";
60 }
61 public static function has_active_form_plugin() : bool
62 {
63 return \is_array(self::get_first_active_form_plugin());
64 }
65 public static function get_first_active_form_plugin_name() : ?string
66 {
67 $active_plugin = self::get_first_active_form_plugin();
68 return \is_array($active_plugin) ? $active_plugin['name'] : null;
69 }
70 public static function find_form_by_column_name(string $column_name) : ?\IAWP\Form_Submissions\Form
71 {
72 $id = \intval(\preg_match('/(\\d+)\\z/', $column_name));
73 $forms = self::get_forms();
74 foreach ($forms as $form) {
75 if ($id === $form->id()) {
76 return $form;
77 }
78 }
79 return null;
80 }
81 /**
82 * @return Form[]
83 */
84 public static function get_forms() : array
85 {
86 if (\is_array(self::$forms)) {
87 return self::$forms;
88 }
89 $forms_table = Query::get_table_name(Query::FORMS);
90 $query = Illuminate_Builder::get_builder()->select(['form_id', 'cached_form_title', 'plugin_id'])->from($forms_table);
91 $forms = \array_filter(\array_map(function ($form) {
92 if (\is_null(self::find_plugin_by_id($form->plugin_id))) {
93 return null;
94 }
95 return new self($form->form_id, $form->cached_form_title, $form->plugin_id);
96 }, $query->get()->all()));
97 \usort($forms, function (\IAWP\Form_Submissions\Form $a, \IAWP\Form_Submissions\Form $b) {
98 // First level sort by plugin name
99 $plugin_name_comparison = \strcmp($a->plugin_name(), $b->plugin_name());
100 // If types are equal, sort by 'name'
101 if ($plugin_name_comparison === 0) {
102 return \strcmp($a->title(), $b->title());
103 }
104 return $plugin_name_comparison;
105 });
106 self::$forms = $forms;
107 return self::$forms;
108 }
109 private static function has_any_tracked_submissions(int $plugin_id) : bool
110 {
111 if (\array_key_exists($plugin_id, self::$has_any_tracked_submissions_cache)) {
112 return self::$has_any_tracked_submissions_cache[$plugin_id];
113 }
114 $forms_table = Query::get_table_name(Query::FORMS);
115 $form_submissions_table = Query::get_table_name(Query::FORM_SUBMISSIONS);
116 $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();
117 self::$has_any_tracked_submissions_cache[$plugin_id] = $has_submissions;
118 return $has_submissions;
119 }
120 private static function get_first_active_form_plugin() : ?array
121 {
122 foreach (\IAWP\Form_Submissions\Form::$plugins as $plugin) {
123 if (self::static_is_plugin_active($plugin['id'])) {
124 return $plugin;
125 }
126 }
127 return null;
128 }
129 private static function static_is_plugin_active(int $plugin_id) : bool
130 {
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 (\is_plugin_active($slug)) {
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