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 +154 -78 51.1.38 → 51.1.86 View file →
@@ -55,9 +55,9 @@
55 55 </p>
56 56 <?php if (!king_addons_freemius()->can_use_premium_code__premium_only()): ?>
57 57 <div class="king-addons-pb-preview-buttons">
58 58 <div class="kng-promo-btn-wrap">
59 - <a href="https://kingaddons.com/pricing/?rel=king-addons-fb-submissions-page" target="_blank">
59 + <a href="https://kingaddons.com/pricing/?utm_source=king-addons-fb-submissions-page" target="_blank">
60 60 <div class="kng-promo-btn-txt">
61 61 <?php esc_html_e('Unlock Premium Features & 650+ Templates Today!', 'king-addons'); ?>
62 62 </div>
63 63 <img width="16px"
@@ -81,8 +81,9 @@
81 81 global $post;
82 82
83 83
84 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));
85 86
86 87 // Check if Pro constants are defined before using them
87 88 if (defined('KING_ADDONS_PRO_URL') && defined('KING_ADDONS_PRO_VERSION')) {
88 89 wp_enqueue_style('king-addons-form-builder-submissions-css', KING_ADDONS_PRO_URL . 'assets/css/king-addons-submissions.css', [], KING_ADDONS_VERSION);
@@ -95,19 +96,19 @@
95 96 wp_localize_script(
96 97 'king-addons-form-builder-submissions-js',
97 98 'KingAddonsSubmissions',
98 99 [
99 - 'ajaxurl' => admin_url('admin-ajax.php'),
100 - 'resturl' => get_rest_url() . 'king-addons/v1',
100 + 'ajaxurl' => esc_url_raw(admin_url('admin-ajax.php')),
101 + 'resturl' => esc_url_raw(get_rest_url() . 'king-addons/v1'),
101 102 'nonce' => wp_create_nonce('king-addons-submissions-js'),
102 - 'form_name' => get_post_meta($post->ID, 'king_addons_form_name', true),
103 - 'form_id' => get_post_meta($post->ID, 'king_addons_form_id', true),
104 - 'form_page' => get_post_meta($post->ID, 'king_addons_form_page', true),
105 - 'form_page_id' => get_post_meta($post->ID, 'king_addons_form_page_id', true),
106 - 'form_page_url' => get_permalink(get_post_meta($post->ID, 'king_addons_form_page_id', true)),
107 - 'form_page_editor' => admin_url('post.php?post=' . get_post_meta($post->ID, 'king_addons_form_page_id', true) . '&action=elementor'),
108 - 'form_agent' => get_post_meta($post->ID, 'king_addons_user_agent', true),
109 - 'agent_ip' => get_post_meta($post->ID, 'king_addons_user_ip', true),
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)),
110 111 'post_created' => date('F j, Y g:i a', strtotime($post->post_date)),
111 112 'post_updated' => date('F j, Y g:i a', strtotime($post->post_modified)),
112 113 ]
113 114 );
@@ -137,11 +138,20 @@
137 138
138 139 public function king_addons_meta_box_callback($post, $metabox)
139 140 {
140 141 echo '<button class="king-addons-edit-submissions button button-primary">' . esc_html__('Edit', 'king-addons') . '</button>';
142 + $this->render_payment_block($post);
141 143 foreach (get_post_meta($post->ID) as $key => $value) {
142 144
143 - $exclude = ['king_addons_form_id', 'king_addons_form_name', 'king_addons_form_page', 'king_addons_form_page_id', 'king_addons_user_agent', 'king_addons_user_ip', 'king_addons_submission_read_status', '_edit_lock', '_edit_last'];
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 + ];
144 154
145 155 if (in_array($key, $exclude)) {
146 156 continue;
147 157 }
@@ -146,70 +156,65 @@
146 156 continue;
147 157 }
148 158
149 159 echo '<div class="king-addons-submissions-wrap">';
150 - if (is_serialized($value[0])) {
160 + $meta_value = $value[0];
151 161
152 -
153 - if ($value[0]) {
154 - // Security fix: Use safe unserialize with validation
155 - $unserialized = @unserialize($value[0]);
156 - if ($unserialized !== false && is_array($unserialized)) {
157 - $value = $unserialized;
158 - } else {
159 - $value = $value[0]; // Fallback to original string if unserialize fails
160 - }
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];
161 168 }
169 + }
162 170
163 - $prefix = "form_field-";
164 - $key_title = !empty($value[2]) ? $value[2] : ucfirst(str_replace($prefix, "", $key));
171 + $prefix = "form_field-";
172 + $key_title = !empty($value[2]) ? esc_html($value[2]) : esc_html(ucfirst(str_replace($prefix, "", $key)));
165 173
166 - if (str_contains($key, '_action_')) {
167 - $prefix = '_action_king_addons_form_builder_';
168 - $label = ucfirst(substr($key, strpos($key, $prefix) + strlen($prefix)));
169 - echo '<label>' . $label . '</label>';
170 - echo '<p class="notice notice-' . $value['status'] . '">' . ucfirst($value['message']) . '</p>';
171 - } elseif ('file' == $value[0]) {
172 - echo '<label for="' . $key . '">' . $key_title . ' </label>';
173 - if (is_array($value[1])) {
174 - foreach ($value[1] as $index => $file) {
175 - echo '<a id="' . $key . '_' . $index . '" target="_blank" href="' . $file . '">' . $file . '</a>';
176 - }
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>';
177 187 }
178 - } elseif ('textarea' == $value[0]) {
179 - echo '<label for="' . $key . '">' . $key_title . ' </label>';
180 - echo '<textarea id="' . $key . '">' . $value[1] . '</textarea>';
181 - } else {
182 - if ($value[0] === 'radio' || $value[0] === 'checkbox') {
183 - echo '<label for="' . $key . '" class="' . $key . '">' . $key_title . ' </label>';
184 - foreach ($value[1] as $index => $item) {
185 - $checked = $item[1] == 'true' ? 'checked' : '';
186 - echo '<input class="king-addons-inline" type="' . $value[0] . '" name="' . $item[2] . '" id="' . $item[3] . '" value="' . $item[0] . '" ' . $checked . '>';
187 - echo '<label class="king-addons-inline" for="' . $item[2] . '">' . $item[0] . ' </label>';
188 - }
189 - } else {
190 - if ($value[0] == 'select') {
191 - if (is_array($value[1])) {
192 - $value[1] = implode(",", $value[1]);
193 - }
194 -
195 - echo '<label for="' . $key . '">' . $key_title . ' </label>';
196 - echo '<input type="text" id="' . $key . '" value="' . $value[1] . '">';
197 -
198 - } else {
199 - echo '<label for="' . $key . '">' . $key_title . ' </label>';
200 - // Use 'text' if type is empty, and sanitize attributes
201 - $type_attr = ! empty( $value[0] ) ? $value[0] : 'text';
202 - echo '<input type="' . esc_attr( $type_attr ) . '" id="' . esc_attr( $key ) . '" value="' . esc_attr( $value[1] ) . '">';
203 - }
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>';
204 203 }
205 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) . '">';
206 212 } else {
207 - $prefix = "form_field-";
208 - $key_title = !empty($value[2]) ? $value[2] : ucfirst(str_replace($prefix, "", $key));
209 -
210 - echo '<label for="' . $key . '">' . $key_title . ' </label>';
211 - echo '<input type="text" id="' . $key . '" value="' . $value[0] . '">';
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) . '">';
212 217 }
213 218 echo '</div>';
214 219 }
215 220
@@ -215,8 +220,48 @@
215 220
216 221
217 222 }
218 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 +
219 264 public function register_post_type_king_addons_submissions()
220 265 {
221 266 $labels = [
222 267 'name' => esc_html__('Form Submissions', 'king-addons'),
@@ -256,8 +301,9 @@
256 301
257 302
258 303 $columns['main'] = __('Main', 'king-addons');
259 304 $columns['action_status'] = __('Action Status', 'king-addons');
305 + $columns['payment'] = __('Payment', 'king-addons');
260 306 $columns['form_id'] = __('Form', 'king-addons');
261 307 $columns['page'] = __('Page', 'king-addons');
262 308 $columns['post_id'] = __('ID', 'king-addons');
263 309 $columns['read_status'] = __('Read Status');
@@ -276,8 +322,9 @@
276 322 {
277 323 $submission = get_post($post_id);
278 324 $submission_meta = get_post_meta($post_id);
279 325 $action_status = 'success';
326 + $main_key = '';
280 327
281 328 foreach ($submission_meta as $key => $value) {
282 329 if (str_contains($key, 'form_field-email')) {
283 330 $main_key = $key;
@@ -291,37 +338,60 @@
291 338 }
292 339
293 340 switch ($column) {
294 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 + }
295 347
296 348 echo sprintf(
297 349 '<a href="%s" title="%s">%s</a>',
298 350 esc_url(admin_url('post.php?post=' . $post_id . '&action=edit')),
299 - __('View', 'king-addons'),
300 - __(get_post_meta($post_id, $main_key, true)[1], 'king-addons')
351 + esc_attr__('View', 'king-addons'),
352 + esc_html($main_value)
301 353 );
302 354 break;
303 355
304 356 case 'action_status':
305 357
306 - echo $action_status;
358 + echo esc_html($action_status);
307 359 break;
308 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 +
309 375 case 'form_id':
310 - echo '<a href="' . admin_url('post.php?post=' . get_post_meta($post_id, 'king_addons_form_page_id', true) . '&action=elementor') . '" target="_blank">';
311 - echo get_post_meta($post_id, 'king_addons_form_name', true);
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);
312 380 echo '</a>';
313 381 break;
314 382
315 383 case 'page':
316 - echo '<a href="' . get_permalink(get_post_meta($post_id, 'king_addons_form_page_id', true)) . '" target="_blank">';
317 - echo get_post_meta($post_id, 'king_addons_form_page', true);
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);
318 388 echo '</a>';
319 389 break;
320 390
321 391 case 'post_id':
322 392
323 - echo $submission->ID;
393 + echo esc_html(absint($submission->ID));
324 394 break;
325 395
326 396 case 'read_status':
327 397 $read_status = get_post_meta($post_id, 'king_addons_submission_read_status', true);
@@ -326,17 +396,16 @@
326 396 case 'read_status':
327 397 $read_status = get_post_meta($post_id, 'king_addons_submission_read_status', true);
328 398
329 399 if ($read_status == '1') {
330 - echo '<span class="king-addons-button king-addons-submission-read">' . __('Read') . '</span>';
400 + echo '<span class="king-addons-button king-addons-submission-read">' . esc_html__('Read', 'king-addons') . '</span>';
331 401 } else {
332 - echo '<span class="king-addons-button king-addons-submission-unread">' . __('Unread') . '</span>';
402 + echo '<span class="king-addons-button king-addons-submission-unread">' . esc_html__('Unread', 'king-addons') . '</span>';
333 403 }
334 404 break;
335 405
336 406 case 'custom_date':
337 -
338 - echo get_post_meta($post_id, 'custom_date_key', true);
407 + echo esc_html((string) get_post_meta($post_id, 'custom_date_key', true));
339 408 break;
340 409 }
341 410 }
342 411
@@ -348,8 +417,12 @@
348 417
349 418 $post_id = intval($_POST['post_id']);
350 419 $read_status = $_POST['read_status'] === '1' ? '1' : '0';
351 420
421 + if (!current_user_can('edit_post', $post_id)) {
422 + wp_send_json_error('Insufficient permissions');
423 + }
424 +
352 425 update_post_meta($post_id, 'king_addons_submission_read_status', $read_status);
353 426
354 427 wp_send_json_success();
355 428 }
@@ -364,8 +437,11 @@
364 437 if (isset($_GET['post']) && !empty($_GET['post'])) {
365 438 $post_id = intval($_GET['post']);
366 439 $post = get_post($post_id);
367 440
441 + if (!$post || !current_user_can('edit_post', $post_id)) {
442 + return;
443 + }
368 444
369 445 update_post_meta($post_id, 'king_addons_submission_read_status', '1');
370 446 }
371 447 }