PluginProbe
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder / 51.1.86
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder v51.1.86
51.1.86 51.1.84 51.1.85 51.1.83 51.1.82 51.1.81 51.1.79 51.1.78 51.1.77 51.1.76 51.1.74 51.1.75 51.1.65 51.1.64 51.1.63 trunk 51.1.14 51.1.2 51.1.35 51.1.36 51.1.37 51.1.38 51.1.39 51.1.44 51.1.45 All 40 releases
← All changes | includes/widgets/Form_Builder/helpers/View_Submissions_Pro.php +491 -0 51.1.2 → 51.1.86 View file →
@@ -1,0 +1,491 @@
1 +<?php
2 +
3 +namespace King_Addons;
4 +
5 +use WP_Query;
6 +
7 +if (!defined('ABSPATH')) {
8 + exit;
9 +}
10 +
11 +class View_Submissions_Pro
12 +{
13 + public function __construct()
14 + {
15 +
16 +
17 + add_action('admin_enqueue_scripts', [$this, 'enqueue_submissions_script']);
18 + add_action('init', [$this, 'register_post_type_king_addons_submissions']);
19 + add_action('in_admin_header', [$this, 'renderAdminCustomHeader']);
20 +
21 + add_filter('manage_king-addons-fb-sub_posts_columns', [$this, 'king_addons_submissions_custom_columns']);
22 + add_action('manage_king-addons-fb-sub_posts_custom_column', [$this, 'king_addons_submissions_custom_column_content'], 10, 2);
23 + add_filter('manage_edit-king-addons-fb-sub_sortable_columns', [$this, 'king_addons_submissions_sortable_columns']);
24 +
25 + add_action('wp_ajax_king_addons_submissions_update_read_status', [$this, 'king_addons_submissions_update_read_status']);
26 + add_action('current_screen', [$this, 'king_addons_submissions_mark_as_read']);
27 + add_filter('post_row_actions', [$this, 'king_addons_submissions_row_actions'], 10, 2);
28 + add_action('current_screen', [$this, 'king_addons_submissions_remove_bulk_edit_filter']);
29 +
30 + add_action('admin_enqueue_scripts', array($this, 'enqueueScripts'));
31 +
32 +
33 + }
34 +
35 + public static function enqueueScripts(): void
36 + {
37 + $screen = get_current_screen();
38 + if ($screen->id === 'edit-king-addons-fb-sub') {
39 + wp_enqueue_style('king-addons-fb-sub-style', KING_ADDONS_URL . 'includes/widgets/Form_Builder/admin.css', '', KING_ADDONS_VERSION);
40 + }
41 + }
42 +
43 + public function renderAdminCustomHeader()
44 + {
45 + $current_screen = get_current_screen()->id;
46 + if ($current_screen !== 'edit-king-addons-fb-sub') {
47 + return;
48 + }
49 +
50 + ?>
51 + <div class="king-addons-pb-settings-page-header">
52 + <h1><?php esc_html_e('Form Builder Submissions', 'king-addons'); ?></h1>
53 + <p>
54 + <?php esc_html_e('Submitted data from the Form Builder element will be displayed on this page', 'king-addons'); ?>
55 + </p>
56 + <?php if (!king_addons_freemius()->can_use_premium_code__premium_only()): ?>
57 + <div class="king-addons-pb-preview-buttons">
58 + <div class="kng-promo-btn-wrap">
59 + <a href="https://kingaddons.com/pricing/?utm_source=king-addons-fb-submissions-page" target="_blank">
60 + <div class="kng-promo-btn-txt">
61 + <?php esc_html_e('Unlock Premium Features & 650+ Templates Today!', 'king-addons'); ?>
62 + </div>
63 + <img width="16px"
64 + src="<?php echo esc_url(KING_ADDONS_URL) . 'includes/admin/img/share-v2.svg'; ?>"
65 + alt="<?php echo esc_html__('Open link in the new tab', 'king-addons'); ?>">
66 + </a>
67 + </div>
68 + </div>
69 + <?php endif; ?>
70 + </div>
71 + <?php
72 + }
73 +
74 + public function enqueue_submissions_script($hook)
75 + {
76 +
77 + $post_type = 'king-addons-fb-sub';
78 +
79 +
80 + if ($hook == 'post.php' || $hook == 'post-new.php' || $hook == 'edit.php') {
81 + global $post;
82 +
83 +
84 + if (isset($post) && $post->post_type === $post_type) {
85 + $form_page_id = absint(get_post_meta($post->ID, 'king_addons_form_page_id', true));
86 +
87 + // Check if Pro constants are defined before using them
88 + if (defined('KING_ADDONS_PRO_URL') && defined('KING_ADDONS_PRO_VERSION')) {
89 + wp_enqueue_style('king-addons-form-builder-submissions-css', KING_ADDONS_PRO_URL . 'assets/css/king-addons-submissions.css', [], KING_ADDONS_VERSION);
90 + wp_enqueue_script('king-addons-form-builder-submissions-js', KING_ADDONS_PRO_URL . 'assets/js/king-addons-submissions.js', ['jquery'], KING_ADDONS_VERSION);
91 + } else {
92 + wp_enqueue_style('king-addons-form-builder-submissions-css', KING_ADDONS_URL . 'includes/widgets/Form_Builder/assets/css/king-addons-submissions.css', [], KING_ADDONS_VERSION);
93 + wp_enqueue_script('king-addons-form-builder-submissions-js', KING_ADDONS_URL . 'includes/widgets/Form_Builder/assets/js/king-addons-submissions.js', ['jquery'], KING_ADDONS_VERSION);
94 + }
95 +
96 + wp_localize_script(
97 + 'king-addons-form-builder-submissions-js',
98 + 'KingAddonsSubmissions',
99 + [
100 + 'ajaxurl' => esc_url_raw(admin_url('admin-ajax.php')),
101 + 'resturl' => esc_url_raw(get_rest_url() . 'king-addons/v1'),
102 + 'nonce' => wp_create_nonce('king-addons-submissions-js'),
103 + 'form_name' => sanitize_text_field(get_post_meta($post->ID, 'king_addons_form_name', true)),
104 + 'form_id' => sanitize_key(get_post_meta($post->ID, 'king_addons_form_id', true)),
105 + 'form_page' => sanitize_text_field(get_post_meta($post->ID, 'king_addons_form_page', true)),
106 + 'form_page_id' => $form_page_id,
107 + 'form_page_url' => $form_page_id ? esc_url_raw(get_permalink($form_page_id)) : '',
108 + 'form_page_editor' => $form_page_id ? esc_url_raw(admin_url('post.php?post=' . $form_page_id . '&action=elementor')) : '',
109 + 'form_agent' => sanitize_textarea_field(get_post_meta($post->ID, 'king_addons_user_agent', true)),
110 + 'agent_ip' => sanitize_text_field(get_post_meta($post->ID, 'king_addons_user_ip', true)),
111 + 'post_created' => date('F j, Y g:i a', strtotime($post->post_date)),
112 + 'post_updated' => date('F j, Y g:i a', strtotime($post->post_modified)),
113 + ]
114 + );
115 + }
116 + }
117 + }
118 +
119 +
120 + public function king_addons_submissions_meta_box()
121 + {
122 + $args = new WP_Query([
123 + 'post_type' => 'king-addons-fb-sub'
124 + ]);
125 + foreach ($args as $arg) {
126 +
127 + add_meta_box(
128 + 'king_addons_submission_fields',
129 + 'King Addons Submissions',
130 + [$this, 'king_addons_meta_box_callback'],
131 + 'king-addons-fb-sub',
132 + 'normal',
133 + 'default'
134 + );
135 + }
136 + }
137 +
138 +
139 + public function king_addons_meta_box_callback($post, $metabox)
140 + {
141 + echo '<button class="king-addons-edit-submissions button button-primary">' . esc_html__('Edit', 'king-addons') . '</button>';
142 + $this->render_payment_block($post);
143 + foreach (get_post_meta($post->ID) as $key => $value) {
144 +
145 + $exclude = [
146 + 'king_addons_form_id', 'king_addons_form_name', 'king_addons_form_page', 'king_addons_form_page_id',
147 + 'king_addons_user_agent', 'king_addons_user_ip', 'king_addons_submission_read_status',
148 + '_edit_lock', '_edit_last',
149 + 'king_addons_payment_status', 'king_addons_payment_provider', 'king_addons_payment_txn_id',
150 + 'king_addons_payment_amount', 'king_addons_payment_currency', 'king_addons_payment_time',
151 + 'king_addons_payment_events', 'king_addons_paypal_order_id', 'king_addons_stripe_session_id',
152 + 'king_addons_payment_expected_amount', 'king_addons_payment_expected_currency',
153 + ];
154 +
155 + if (in_array($key, $exclude)) {
156 + continue;
157 + }
158 +
159 + echo '<div class="king-addons-submissions-wrap">';
160 + $meta_value = $value[0];
161 +
162 + if (is_serialized($meta_value)) {
163 + $unserialized = maybe_unserialize($meta_value);
164 + if (is_array($unserialized)) {
165 + $value = $unserialized;
166 + } else {
167 + $value = [$meta_value];
168 + }
169 + }
170 +
171 + $prefix = "form_field-";
172 + $key_title = !empty($value[2]) ? esc_html($value[2]) : esc_html(ucfirst(str_replace($prefix, "", $key)));
173 +
174 + if (str_contains($key, '_action_')) {
175 + $prefix = '_action_king_addons_form_builder_';
176 + $label = ucfirst(substr($key, strpos($key, $prefix) + strlen($prefix)));
177 + echo '<label>' . esc_html($label) . '</label>';
178 + $status = isset($value['status']) ? sanitize_html_class($value['status']) : '';
179 + $message = isset($value['message']) ? esc_html(ucfirst($value['message'])) : '';
180 + echo '<p class="notice notice-' . esc_attr($status) . '">' . $message . '</p>';
181 + } elseif (isset($value[0]) && 'file' === $value[0]) {
182 + echo '<label for="' . esc_attr($key) . '">' . $key_title . ' </label>';
183 + if (is_array($value[1])) {
184 + foreach ($value[1] as $index => $file) {
185 + $file_url = esc_url($file);
186 + echo '<a id="' . esc_attr($key . '_' . $index) . '" target="_blank" href="' . $file_url . '">' . $file_url . '</a>';
187 + }
188 + }
189 + } elseif (isset($value[0]) && 'textarea' === $value[0]) {
190 + echo '<label for="' . esc_attr($key) . '">' . $key_title . ' </label>';
191 + $text_value = isset($value[1]) ? esc_textarea($value[1]) : '';
192 + echo '<textarea id="' . esc_attr($key) . '">' . $text_value . '</textarea>';
193 + } elseif (isset($value[0]) && ('radio' === $value[0] || 'checkbox' === $value[0])) {
194 + echo '<label for="' . esc_attr($key) . '" class="' . esc_attr($key) . '">' . $key_title . ' </label>';
195 + if (is_array($value[1])) {
196 + foreach ($value[1] as $index => $item) {
197 + $checked = (!empty($item[1]) && 'true' === $item[1]) ? 'checked' : '';
198 + $input_value = isset($item[0]) ? esc_attr($item[0]) : '';
199 + $input_name = isset($item[2]) ? esc_attr($item[2]) : '';
200 + $input_id = isset($item[3]) ? esc_attr($item[3]) : esc_attr($key . '_' . $index);
201 + echo '<input class="king-addons-inline" type="' . esc_attr($value[0]) . '" name="' . $input_name . '" id="' . $input_id . '" value="' . $input_value . '" ' . $checked . '>';
202 + echo '<label class="king-addons-inline" for="' . $input_name . '">' . esc_html($item[0] ?? '') . ' </label>';
203 + }
204 + }
205 + } elseif (isset($value[0]) && 'select' === $value[0]) {
206 + $select_value = $value[1];
207 + if (is_array($select_value)) {
208 + $select_value = implode(",", $select_value);
209 + }
210 + echo '<label for="' . esc_attr($key) . '">' . $key_title . ' </label>';
211 + echo '<input type="text" id="' . esc_attr($key) . '" value="' . esc_attr($select_value) . '">';
212 + } else {
213 + $type_attr = !empty($value[0]) ? $value[0] : 'text';
214 + $input_val = isset($value[1]) ? $value[1] : (isset($value[0]) ? $value[0] : '');
215 + echo '<label for="' . esc_attr($key) . '">' . $key_title . ' </label>';
216 + echo '<input type="' . esc_attr($type_attr) . '" id="' . esc_attr($key) . '" value="' . esc_attr($input_val) . '">';
217 + }
218 + echo '</div>';
219 + }
220 +
221 +
222 + }
223 +
224 + /**
225 + * Payment status block on the submission card.
226 + *
227 + * @param \WP_Post $post Submission.
228 + *
229 + * @return void
230 + */
231 + private function render_payment_block($post): void
232 + {
233 + $status = sanitize_key((string) get_post_meta($post->ID, 'king_addons_payment_status', true));
234 + if ('' === $status) {
235 + return;
236 + }
237 +
238 + $provider = sanitize_key((string) get_post_meta($post->ID, 'king_addons_payment_provider', true));
239 + $txn = sanitize_text_field((string) get_post_meta($post->ID, 'king_addons_payment_txn_id', true));
240 + $amount = get_post_meta($post->ID, 'king_addons_payment_amount', true);
241 + $currency = sanitize_text_field((string) get_post_meta($post->ID, 'king_addons_payment_currency', true));
242 + $time = absint(get_post_meta($post->ID, 'king_addons_payment_time', true));
243 +
244 + echo '<div class="king-addons-submissions-wrap">';
245 + echo '<label>' . esc_html__('Payment', 'king-addons') . '</label>';
246 + echo '<p>';
247 + echo esc_html($status);
248 + if ('' !== $provider) {
249 + echo ' · ' . esc_html($provider);
250 + }
251 + if ('' !== (string) $amount) {
252 + echo ' · ' . esc_html((string) $amount . ' ' . $currency);
253 + }
254 + if ('' !== $txn) {
255 + echo ' · ' . esc_html($txn);
256 + }
257 + if ($time) {
258 + echo ' · ' . esc_html(date_i18n(get_option('date_format') . ' ' . get_option('time_format'), $time));
259 + }
260 + echo '</p>';
261 + echo '</div>';
262 + }
263 +
264 + public function register_post_type_king_addons_submissions()
265 + {
266 + $labels = [
267 + 'name' => esc_html__('Form Submissions', 'king-addons'),
268 + 'singular_name' => esc_html__('Submission', 'king-addons'),
269 + 'edit_item' => esc_html__('Edit Submission', 'king-addons'),
270 + 'view_item' => esc_html__('View Submission', 'king-addons'),
271 + 'all_items' => esc_html__('Form Submissions', 'king-addons'),
272 + 'search_items' => esc_html__('Search Submissions', 'king-addons'),
273 + 'parent_item_colon' => esc_html__('Parent Submissions:', 'king-addons'),
274 + 'not_found' => esc_html__('No Submissions found.', 'king-addons'),
275 + 'not_found_in_trash' => esc_html__('No Submissions found in Trash.', 'king-addons'),
276 + ];
277 +
278 + $args = [
279 + 'labels' => $labels,
280 + 'public' => true,
281 + 'show_ui' => true,
282 +// 'show_in_menu' => 'king-addons',
283 + 'show_in_menu' => false,
284 + 'rewrite' => ['slug' => 'king-addons-fb-sub'],
285 + 'supports' => [],
286 + 'register_meta_box_cb' => [$this, 'king_addons_submissions_meta_box']
287 + ];
288 + register_post_type('king-addons-fb-sub', $args);
289 + // Remove Title and Editor fields for submissions
290 + remove_post_type_support('king-addons-fb-sub', 'title');
291 + remove_post_type_support('king-addons-fb-sub', 'editor');
292 + }
293 +
294 + public function king_addons_submissions_custom_columns($columns)
295 + {
296 +
297 + unset($columns['title']);
298 + unset($columns['author']);
299 + unset($columns['categories']);
300 + unset($columns['date']);
301 +
302 +
303 + $columns['main'] = __('Main', 'king-addons');
304 + $columns['action_status'] = __('Action Status', 'king-addons');
305 + $columns['payment'] = __('Payment', 'king-addons');
306 + $columns['form_id'] = __('Form', 'king-addons');
307 + $columns['page'] = __('Page', 'king-addons');
308 + $columns['post_id'] = __('ID', 'king-addons');
309 + $columns['read_status'] = __('Read Status');
310 + $columns['date'] = __('Date', 'king-addons');
311 +
312 + return $columns;
313 + }
314 +
315 + public function king_addons_submissions_sortable_columns($columns)
316 + {
317 + $columns['read_status'] = 'read_status';
318 + return $columns;
319 + }
320 +
321 + public function king_addons_submissions_custom_column_content($column, $post_id)
322 + {
323 + $submission = get_post($post_id);
324 + $submission_meta = get_post_meta($post_id);
325 + $action_status = 'success';
326 + $main_key = '';
327 +
328 + foreach ($submission_meta as $key => $value) {
329 + if (str_contains($key, 'form_field-email')) {
330 + $main_key = $key;
331 + }
332 +
333 + if (str_contains($key, '_action_')) {
334 + if (str_contains($value[0], 'error')) {
335 + $action_status = 'error';
336 + }
337 + }
338 + }
339 +
340 + switch ($column) {
341 + case 'main':
342 + $main_value = '';
343 + if ($main_key !== '') {
344 + $main_meta = get_post_meta($post_id, $main_key, true);
345 + $main_value = is_array($main_meta) && isset($main_meta[1]) ? $main_meta[1] : $main_meta;
346 + }
347 +
348 + echo sprintf(
349 + '<a href="%s" title="%s">%s</a>',
350 + esc_url(admin_url('post.php?post=' . $post_id . '&action=edit')),
351 + esc_attr__('View', 'king-addons'),
352 + esc_html($main_value)
353 + );
354 + break;
355 +
356 + case 'action_status':
357 +
358 + echo esc_html($action_status);
359 + break;
360 +
361 + case 'payment':
362 + $pay_status = sanitize_key((string) get_post_meta($post_id, 'king_addons_payment_status', true));
363 + if ('' === $pay_status) {
364 + echo '&mdash;';
365 + break;
366 + }
367 + $pay_amount = get_post_meta($post_id, 'king_addons_payment_amount', true);
368 + $pay_currency = sanitize_text_field((string) get_post_meta($post_id, 'king_addons_payment_currency', true));
369 + echo esc_html($pay_status);
370 + if ('' !== (string) $pay_amount) {
371 + echo ' ' . esc_html((string) $pay_amount . ' ' . $pay_currency);
372 + }
373 + break;
374 +
375 + case 'form_id':
376 + $form_page_id = absint(get_post_meta($post_id, 'king_addons_form_page_id', true));
377 + $form_name = sanitize_text_field(get_post_meta($post_id, 'king_addons_form_name', true));
378 + echo '<a href="' . esc_url($form_page_id ? admin_url('post.php?post=' . $form_page_id . '&action=elementor') : '#') . '" target="_blank" rel="noopener noreferrer">';
379 + echo esc_html($form_name);
380 + echo '</a>';
381 + break;
382 +
383 + case 'page':
384 + $form_page_id = absint(get_post_meta($post_id, 'king_addons_form_page_id', true));
385 + $form_page = sanitize_text_field(get_post_meta($post_id, 'king_addons_form_page', true));
386 + echo '<a href="' . esc_url($form_page_id ? get_permalink($form_page_id) : '#') . '" target="_blank" rel="noopener noreferrer">';
387 + echo esc_html($form_page);
388 + echo '</a>';
389 + break;
390 +
391 + case 'post_id':
392 +
393 + echo esc_html(absint($submission->ID));
394 + break;
395 +
396 + case 'read_status':
397 + $read_status = get_post_meta($post_id, 'king_addons_submission_read_status', true);
398 +
399 + if ($read_status == '1') {
400 + echo '<span class="king-addons-button king-addons-submission-read">' . esc_html__('Read', 'king-addons') . '</span>';
401 + } else {
402 + echo '<span class="king-addons-button king-addons-submission-unread">' . esc_html__('Unread', 'king-addons') . '</span>';
403 + }
404 + break;
405 +
406 + case 'custom_date':
407 + echo esc_html((string) get_post_meta($post_id, 'custom_date_key', true));
408 + break;
409 + }
410 + }
411 +
412 + public function king_addons_submissions_update_read_status()
413 + {
414 + if (!isset($_POST['post_id']) || !isset($_POST['read_status']) || !wp_verify_nonce($_POST['nonce'], 'king-addons-submissions-js')) {
415 + wp_send_json_error('Invalid request');
416 + }
417 +
418 + $post_id = intval($_POST['post_id']);
419 + $read_status = $_POST['read_status'] === '1' ? '1' : '0';
420 +
421 + if (!current_user_can('edit_post', $post_id)) {
422 + wp_send_json_error('Insufficient permissions');
423 + }
424 +
425 + update_post_meta($post_id, 'king_addons_submission_read_status', $read_status);
426 +
427 + wp_send_json_success();
428 + }
429 +
430 + public function king_addons_submissions_mark_as_read($screen)
431 + {
432 + if (is_admin()) {
433 + $screen = get_current_screen();
434 +
435 +
436 + if ($screen && $screen->base == 'post' && $screen->post_type == 'king-addons-fb-sub') {
437 + if (isset($_GET['post']) && !empty($_GET['post'])) {
438 + $post_id = intval($_GET['post']);
439 + $post = get_post($post_id);
440 +
441 + if (!$post || !current_user_can('edit_post', $post_id)) {
442 + return;
443 + }
444 +
445 + update_post_meta($post_id, 'king_addons_submission_read_status', '1');
446 + }
447 + }
448 + }
449 + }
450 +
451 + public function king_addons_submissions_row_actions($actions, $post)
452 + {
453 +
454 + if ($post->post_type === 'king-addons-fb-sub') {
455 +
456 + unset($actions['edit']);
457 + unset($actions['inline hide-if-no-js']);
458 +
459 +
460 + $actions['view'] = sprintf(
461 + '<a href="%s" title="%s">%s</a>',
462 + esc_url(admin_url('post.php?post=' . $post->ID . '&action=edit')),
463 + __('View', 'king-addons'),
464 + __('View', 'king-addons')
465 + );
466 + }
467 +
468 + return $actions;
469 + }
470 +
471 + public function king_addons_submissions_remove_bulk_edit($actions)
472 + {
473 +
474 + unset($actions['edit']);
475 + return $actions;
476 + }
477 +
478 + public function king_addons_submissions_remove_bulk_edit_filter()
479 + {
480 + $screen = get_current_screen();
481 +
482 +
483 + if ($screen->id === 'edit-king-addons-fb-sub') {
484 +
485 + add_filter('bulk_actions-' . $screen->id, [$this, 'king_addons_submissions_remove_bulk_edit']);
486 + }
487 + }
488 +
489 +}
490 +
491 +new View_Submissions_Pro();