PluginProbe
WPVR – 360 Panorama viewer and Virtual Tour Builder for WordPress / 8.5.37
WPVR – 360 Panorama viewer and Virtual Tour Builder for WordPress v8.5.37
9.1.2 9.1.1 9.1.0 9.0.3 9.0.2 9.0.1 9.0.0 8.5.79 8.5.78 8.5.77 8.5.76 8.5.75 8.5.74 8.5.73 8.5.72 8.5.71 8.5.70 8.5.69 8.5.68 8.5.35 8.5.36 8.5.37 8.5.38 8.5.39 8.5.4 All 221 releases
wpvr / admin / classes / class-wpvr-ajax.php

class-wpvr-ajax.php in WPVR – 360 Panorama viewer and Virtual Tour Builder for WordPress 8.5.37, at admin/classes/class-wpvr-ajax.php

670 lines 21.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 if (!defined('ABSPATH')) exit; // Exit if accessed directly
4 /**
5 * The admin-specific Ajax files.
6 *
7 * @link http://rextheme.com/
8 * @since 8.0.0
9 *
10 * @package Wpvr
11 * @subpackage Wpvr/admin
12 */
13
14 class Wpvr_Ajax
15 {
16
17 /**
18 * Instance of WPVR_Format class
19 *
20 * @var object
21 * @since 8.0.0
22 */
23 protected $format;
24
25
26 /**
27 * Instance of WPVR_StreetView class
28 *
29 * @var object
30 * @since 8.0.0
31 */
32 protected $streetview;
33
34
35 /**
36 * Instance of WPVR_Video class
37 *
38 * @var object
39 * @since 8.0.0
40 */
41 protected $video;
42
43
44 /**
45 * Instance of WPVR_Scene class
46 *
47 * @var object
48 * @since 8.0.0
49 */
50 protected $scene;
51
52
53 /**
54 * Instance of WPVR_Validator class
55 *
56 * @var object
57 * @since 8.0.0
58 */
59 protected $validator;
60
61
62 function __construct()
63 {
64 $this->format = new WPVR_Format();
65 $this->streetview = new WPVR_StreetView();
66 $this->video = new WPVR_Video();
67 $this->scene = new WPVR_Scene();
68 $this->validator = new WPVR_Validator();
69
70 add_action('wp_ajax_wpvr_save', array($this, 'wpvr_save_data'));
71 add_action('wp_ajax_wpvr_preview', array($this, 'wpvr_show_preview'));
72 add_action('wp_ajax_wpvrstreetview_preview', array($this, 'wpvrstreetview_preview'));
73 add_action('wp_ajax_wpvr_file_import', array($this, 'wpvr_file_import'));
74 add_action('wp_ajax_wpvr_role_management', array($this, 'wpvr_role_management'));
75 add_action('wp_ajax_wpvr_notice', array($this, 'wpvr_notice'));
76 add_action('wp_ajax_wpvr_dismiss_black_friday_notice', array($this, 'dismiss_black_friday_notice'));
77 add_action('wp_ajax_wpvr_review_request', array($this, 'wpvr_review_request'));
78
79 //setup wizard ajax
80 add_action( 'wp_ajax_wpvr_create_contact', array($this, 'wpvr_create_contact' ) );
81
82 //general setting ajax
83 add_action( 'wp_ajax_wpvr_save_general_settings', array($this, 'wpvr_save_general_settings' ) );
84 }
85
86 public function wpvr_review_request()
87 {
88 if( !current_user_can( 'manage_options' ) ){
89 wp_send_json_error( array( 'message' => 'Unauthorized user' ), 403 );
90 return;
91 }
92 $nonce = sanitize_text_field($_POST['nonce']);
93 if (!wp_verify_nonce($nonce, 'wpvr-dismiss-notice-five-star-review')) {
94 $response = array(
95 'success' => false,
96 'data' => 'Permission denied.'
97 );
98 wp_send_json($response);
99 }
100 $payload = !empty($_POST['payload']) ? $_POST['payload'] : array();
101 $data = array(
102 'show' => !empty($payload['show']) ? $payload['show'] : '',
103 'time' => !empty($payload['frequency']) && 'never' !== $payload['frequency'] ? time() : '',
104 'frequency' => !empty($payload['frequency']) ? $payload['frequency'] : '',
105 );
106 update_option('wpvr_feed_review_request', $data);
107 $response = array(
108 'success' => true,
109 'data' => 'Review request updated successfully.'
110 );
111 wp_send_json($response);
112 die();
113 }
114
115 /**
116 * Responsible for Tour Preview
117 *
118 * @return void
119 * @since 8.0.0
120 */
121 public function wpvr_show_preview()
122 {
123 //===Current user capabilities check===//
124 if (!current_user_can('edit_posts')) {
125 $response = array(
126 'success' => false,
127 'data' => 'Contact admin.'
128 );
129 wp_send_json($response);
130 }
131 //===Current user capabilities check===//
132 //===Nonce check===//
133 $nonce = sanitize_text_field($_POST['nonce']);
134 if (!wp_verify_nonce($nonce, 'wpvr')) {
135 $response = array(
136 'success' => false,
137 'data' => 'Permission denied.'
138 );
139 wp_send_json($response);
140 }
141 //===Nonce check===//
142
143 $panoid = '';
144 $postid = sanitize_text_field($_POST['postid']);
145 $panoid = 'pano' . $postid;
146 if (isset($_POST['panovideo'])) {
147 $panovideo = sanitize_text_field($_POST['panovideo']);
148 }
149
150 $post_type = get_post_type($postid);
151 if ($post_type != 'wpvr_item') {
152 die();
153 }
154
155 do_action('wpvr_pro_street_view_preview', $postid, $panoid);
156
157 if ($panovideo == 'off') {
158 $this->scene->wpvr_scene_preview($panoid, $panovideo); // Preapre preview based on Scene data //
159 } else {
160 $this->video->wpvr_video_preview($panoid); // Prepare preview based on Video data //
161 }
162 }
163
164
165 /**
166 * Responsible for saving WPVR data
167 *
168 * @return void
169 * @since 8.0.0
170 */
171 public function wpvr_save_data()
172 {
173
174 //===Current user capabilities check===//
175 if (!current_user_can('edit_posts')) {
176 $response = array(
177 'success' => false,
178 'data' => 'Permission denied.'
179 );
180 wp_send_json($response);
181 }
182 //===Current user capabilities check===//
183 //===Nonce check===//
184 $nonce = sanitize_text_field($_POST['nonce']);
185 if (!wp_verify_nonce($nonce, 'wpvr')) {
186 $response = array(
187 'success' => false,
188 'data' => 'Permission denied.'
189 );
190 wp_send_json($response);
191 }
192 //===Nonce check===//
193 $panoid = '';
194 $postid = sanitize_text_field($_POST['postid']);
195 $post_type = get_post_type($postid);
196 if ($post_type != 'wpvr_item') {
197 die();
198 }
199 $panoid = 'pano' . $postid;
200
201 $post_status = get_post_status($postid);
202
203 do_action('wpvr_tour_status', $postid, $post_status);
204
205 if ($post_status != 'publish') {
206 wp_update_post(array(
207 'ID' => $postid,
208 'post_status' => 'publish'
209 ));
210 }
211
212
213 $post_array = [];
214 if (isset($_POST['post_status'])) {
215 $post_status = sanitize_text_field($_POST['post_status']);
216 $post_array['post_status'] = $post_status;
217 }
218 if (isset($_POST['post_password'])) {
219 $visibility = sanitize_text_field($_POST['post_password']);
220 $post_array['post_password'] = $visibility;
221 }
222 if (isset($_POST['visibility'])) {
223 $visibility = sanitize_text_field($_POST['visibility']);
224 $post_array['visibility'] = $visibility;
225 if ($visibility == 'public' || $visibility == 'private') {
226 $post_array['post_password'] = '';
227 }
228 }
229
230 $user_site_language = get_locale();
231 $language_mapping = [
232 'ar' => [ // Arabic
233 'نشر' => 'Publish', // nashr
234 'تحديث' => 'Update' // tahdith
235 ],
236 'pt_PT' => [ // Portuguese (Portugal)
237 'Publicar' => 'Publish',
238 'Atualizar' => 'Update'
239 ],
240 'es_ES' => [ // Spanish (Spain)
241 'Publicar' => 'Publish',
242 'Actualizar' => 'Update'
243 ],
244 'he_IL' => [ // Hebrew (Israel)
245 'לפרסם' => 'Publish', // lefarsem
246 'לעדכן' => 'Update' // le'adken
247 ],
248 'af' => [ // Afrikaans
249 'Publiseer' => 'Publish',
250 'Opdateer' => 'Update'
251 ],
252 'cs_CZ' => [ // Czech (Czech Republic)
253 'Publikovat' => 'Publish',
254 'Aktualizovat'=> 'Update'
255 ],
256 'da_DK' => [ // Danish (Denmark)
257 'Udgiv' => 'Publish',
258 'Opdater' => 'Update'
259 ],
260 'de_DE' => [ // German (Germany)
261 'Veröffentlichen' => 'Publish',
262 'Aktualisieren' => 'Update'
263 ],
264 'fi' => [ // Finnish
265 'Julkaise' => 'Publish',
266 'Päivitä' => 'Update'
267 ],
268 'hr' => [ // Croatian
269 'Objavi' => 'Publish',
270 'Ažuriraj' => 'Update'
271 ],
272 'it_IT' => [ // Italian (Italy)
273 'Pubblica' => 'Publish',
274 'Aggiorna' => 'Update'
275 ],
276 'ja' => [ // Japanese
277 '�
278 �開' => 'Publish', // こうかい (Kōkai)
279 '更新' => 'Update' // こうしん (Kōshin)
280 ],
281 'nl_NL' => [ // Dutch (Netherlands)
282 'Publiceren' => 'Publish',
283 'Bijwerken' => 'Update'
284 ],
285 'pl_PL' => [ // Polish (Poland)
286 'Opublikuj' => 'Publish',
287 'Aktualizuj' => 'Update'
288 ],
289 'ru_RU' => [ // Russian (Russia)
290 'Опубликовать' => 'Publish', // Opublikovat'
291 'Обновить' => 'Update' // Obnovit'
292 ],
293 'sv_SE' => [ // Swedish (Sweden)
294 'Publicera' => 'Publish',
295 'Uppdatera' => 'Update'
296 ],
297 'fr_FR' => [ // French (France)
298 'Publier' => 'Publish',
299 'Mettre à jour' => 'Update'
300 ],
301 'fr_CA' => [ // French (Canada)
302 'Publier' => 'Publish',
303 'Mettre à jour' => 'Update', // or 'Actualiser'
304 ],
305 'fr_BE' => [ // French (Belgium)
306 'Publier' => 'Publish',
307 'Mettre à jour' => 'Update',
308 ],
309 'fr_CH' => [ // Switzerland
310 'Publier' => 'Publish',
311 'Mettre à jour' => 'Update',
312 ],
313 'fr_LU' => [ // Luxembourg
314 'Publier' => 'Publish',
315 'Mettre à jour' => 'Update',
316 ],
317 'fr_MC' => [ // Monaco
318 'Publier' => 'Publish',
319 'Mettre à jour' => 'Update',
320 ],
321 'fr_CM' => [ // Cameroon
322 'Publier' => 'Publish',
323 'Mettre à jour' => 'Update',
324 ],
325 'fr_DZ' => [ // Algeria
326 'Publier' => 'Publish',
327 'Mettre à jour' => 'Update',
328 ],
329 'fr_MA' => [ // Morocco
330 'Publier' => 'Publish',
331 'Mettre à jour' => 'Update',
332 ],
333 'fr_TN' => [ // Tunisia
334 'Publier' => 'Publish',
335 'Mettre à jour' => 'Update',
336 ],
337 'fr_SN' => [ // Senegal
338 'Publier' => 'Publish',
339 'Mettre à jour' => 'Update',
340 ],
341 'fr_HT' => [ // Haiti
342 'Publier' => 'Publish',
343 'Mettre à jour' => 'Update',
344 ],
345 'fr_RW' => [ // Rwanda
346 'Publier' => 'Publish',
347 'Mettre à jour' => 'Update',
348 ],
349 'fr_CD' => [ // DR Congo
350 'Publier' => 'Publish',
351 'Mettre à jour' => 'Update',
352 ],
353 'fr_CI' => [ // Côte d’Ivoire
354 'Publier' => 'Publish',
355 'Mettre à jour' => 'Update',
356 ],
357 ];
358
359 if (isset($_POST['post_value'])) {
360 $post_value = sanitize_text_field($_POST['post_value']);
361 $post_value = $language_mapping[$user_site_language][$post_value] ?? $post_value;
362 if ($post_array['visibility'] == 'private') {
363 $post_array['post_status'] = 'private';
364 } elseif ($post_value === 'Publish') {
365 $post_array['post_status'] = 'publish';
366 }
367 }
368 $post_title = sanitize_text_field($_POST['post_title']);
369 wp_update_post(array(
370 'ID' => $postid,
371 'post_status' => $post_array['post_status'],
372 'post_password' => $post_array['post_password'],
373 'visibility' => $post_array['visibility'],
374 'post_title' => $post_title,
375
376 ));
377
378 do_action('wpvr_pro_update_street_view', $postid, $panoid);
379
380 if(isset( $_POST['checklistData'] ) && !empty($_POST['checklistData'])){
381 $checklist_data = array_map( 'sanitize_text_field', $_POST['checklistData'] );
382 update_post_meta($postid, 'wpvr_checklist', $checklist_data );
383 }
384
385 if ($_POST['panovideo'] == "on") {
386 $this->video->wpvr_update_meta_box($postid, $panoid);
387 } else {
388 $this->scene->wpvr_update_meta_box($postid, $panoid);
389 }
390 }
391
392
393 /**
394 * Responsible for importing tour
395 *
396 * @return void
397 * @since 8.0.0
398 */
399 public function wpvr_file_import()
400 {
401 //===Current user capabilities check===//
402 if (!current_user_can('edit_posts')) {
403 $response = array(
404 'success' => false,
405 'data' => 'Permission denied.'
406 );
407 wp_send_json($response);
408 }
409 //===Current user capabilities check===//
410 //===Nonce check===//
411 $nonce = sanitize_text_field($_POST['nonce']);
412 if (!wp_verify_nonce($nonce, 'wpvr')) {
413 $response = array(
414 'success' => false,
415 'data' => 'Permission denied.'
416 );
417 wp_send_json($response);
418 }
419 $file_name = '';
420
421 if ( isset( $_FILES['wpvr_import_file'] ) && ! empty( $_FILES['wpvr_import_file']['tmp_name'] ) ) {
422 $file = $_FILES['wpvr_import_file'];
423
424 // Validate file type - check if it's a ZIP file
425 $file_type = wp_check_filetype($file['name']);
426 $file_ext = strtolower($file_type['ext']);
427 if ($file_ext !== 'zip') {
428 wp_send_json_error(array('message' => 'Invalid file format. Only ZIP files are allowed.'));
429 return;
430 }
431
432 // Get WordPress uploads directory
433 $upload_dir = wp_upload_dir();
434 $temp_folder = $upload_dir['basedir'] . '/wpvr_imported_temp';
435
436 // Create temp folder if it doesn't exist
437 if ( ! file_exists( $temp_folder ) ) {
438 wp_mkdir_p( $temp_folder );
439 }
440
441 $file_name = basename( $file['name'] );
442
443 // Define target file path inside temp folder
444 $target_file = $temp_folder . '/' . basename( $file['name'] );
445
446 move_uploaded_file( $file['tmp_name'], $target_file );
447
448 } else {
449 wp_send_json_error( array( 'message' => 'No file selected.' ) );
450 }
451
452 //===Nonce check===//
453 WPVR_Import::prepare_tour_import_feature($file_name);
454 }
455
456
457
458 /**
459 * WPVR Role Management
460 *
461 * @return void
462 * @since 8.0.0
463 */
464 function wpvr_role_management()
465 {
466
467 //===Current user capabilities check===//
468 if (!current_user_can('edit_posts')) {
469 $response = array(
470 'success' => false,
471 'data' => 'Permission denied.'
472 );
473 wp_send_json($response);
474 }
475 //===Current user capabilities check===//
476 //===Nonce check===//
477 $nonce = sanitize_text_field($_POST['nonce']);
478 if (!wp_verify_nonce($nonce, 'wpvr')) {
479 $response = array(
480 'success' => false,
481 'data' => 'Permission denied.'
482 );
483 wp_send_json($response);
484 }
485 //===Nonce check===//
486
487 $editor = sanitize_text_field($_POST['editor']);
488 $author = sanitize_text_field($_POST['author']);
489 $fontawesome = sanitize_text_field($_POST['fontawesome']);
490
491
492 $cardboard = !empty($_POST['wpvr_cardboard_disable']) ? sanitize_text_field($_POST['wpvr_cardboard_disable']) : 'no'; //
493
494 $wpvr_webp_conversion = !empty($_POST['wpvr_webp_conversion']) ? sanitize_text_field($_POST['wpvr_webp_conversion']) : 'no';
495
496 $mobile_media_resize = sanitize_text_field($_POST['mobile_media_resize']);
497 $high_res_image = sanitize_text_field($_POST['high_res_image']);
498 $dis_on_hover = sanitize_text_field($_POST['dis_on_hover']);
499 $wpvr_frontend_notice = sanitize_text_field($_POST['wpvr_frontend_notice']);
500 $wpvr_frontend_notice_area = sanitize_text_field($_POST['wpvr_frontend_notice_area']);
501 $wpvr_script_control = sanitize_text_field($_POST['wpvr_script_control']);
502 $wpvr_script_list = sanitize_text_field($_POST['wpvr_script_list']);
503
504 $wpvr_video_script_control = sanitize_text_field($_POST['wpvr_video_script_control']);
505 $wpvr_video_script_list = sanitize_text_field($_POST['wpvr_video_script_list']);
506
507 // $enable_woocommerce = sanitize_text_field($_POST['woocommerce']);
508
509 $wpvr_script_list = str_replace(' ', '', $wpvr_script_list);
510
511 update_option('wpvr_editor_active', $editor);
512 update_option('wpvr_author_active', $author);
513 update_option('wpvr_fontawesome_disable', $fontawesome);
514 update_option('wpvr_cardboard_disable', $cardboard);
515 update_option('wpvr_webp_conversion', $wpvr_webp_conversion);
516 update_option('mobile_media_resize', $mobile_media_resize);
517 update_option('high_res_image', $high_res_image);
518 update_option('dis_on_hover', $dis_on_hover);
519 update_option('wpvr_frontend_notice', $wpvr_frontend_notice);
520 update_option('wpvr_frontend_notice_area', $wpvr_frontend_notice_area);
521 update_option('wpvr_script_control', $wpvr_script_control);
522 update_option('wpvr_script_list', $wpvr_script_list);
523
524 update_option('wpvr_video_script_control', $wpvr_video_script_control);
525 update_option('wpvr_video_script_list', $wpvr_video_script_list);
526
527 if(is_plugin_active( 'dokan-lite/dokan.php' ) || is_plugin_active( 'dokan-pro/dokan.php' )){
528 $dokan_vendor = isset( $_POST['dokan_vendor'] ) ? sanitize_text_field($_POST['dokan_vendor']) : false;
529 update_option('dokan_vendor_active', $dokan_vendor);
530 }
531
532 // update_option('wpvr_enable_woocommerce', $enable_woocommerce);
533
534 $response = array(
535 'status' => 'success',
536 'message' => 'Successfully saved',
537 );
538 wp_send_json($response);
539 }
540
541
542 /**
543 * WPVR Notice
544 *
545 * @return void
546 * @since 8.0.0
547 */
548 function wpvr_notice()
549 {
550 //===Current user capabilities check===//
551 if (!current_user_can('edit_posts')) {
552 $response = array(
553 'success' => false,
554 'data' => 'Permission denied.'
555 );
556 wp_send_json($response);
557 }
558 //===Current user capabilities check===//
559 //===Nonce check===//
560 $nonce = sanitize_text_field($_POST['nonce']);
561 if (!wp_verify_nonce($nonce, 'wpvr')) {
562 $response = array(
563 'success' => false,
564 'data' => 'Permission denied.'
565 );
566 wp_send_json($response);
567 }
568 //===Nonce check===//
569 update_option('wpvr_black_friday_notice', '1');
570 }
571
572 /**
573 * Dismiss black friday notice
574 */
575 function dismiss_black_friday_notice(){
576 if( !current_user_can( 'manage_options' ) ){
577 wp_send_json_error( array( 'message' => 'Unauthorized user' ), 403 );
578 return;
579 }
580 if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'wpvr')) {
581 wp_die(__('Permission check failed', 'wpvr'));
582 }
583 update_option('_wpvr_eid_al_adha_2024', 'yes');
584 echo json_encode(['success' => true,]);
585 wp_die();
586 }
587
588 /**
589 * Handles the creation of a contact via a webhook.
590 *
591 * This function validates the nonce, sanitizes and validates the input fields,
592 * and then creates a new contact using the WPVR_Create_Contact class.
593 *
594 * @since 8.4.10
595 */
596 function wpvr_create_contact(){
597 if( !current_user_can( 'manage_options' ) ){
598 wp_send_json_error( array( 'message' => 'Unauthorized user' ), 403 );
599 return;
600 }
601 $nonce = filter_input(INPUT_POST, 'security', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
602 $nonce = !empty( $nonce ) ? $nonce : null;
603 if ( !wp_verify_nonce( $nonce, 'wpvr' ) ) {
604 wp_send_json_error( array( 'message' => 'Invalid nonce' ), 400 );
605 return;
606 }
607
608 $name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
609 $industry = filter_input(INPUT_POST, 'industry', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
610 $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
611 $opt_in = filter_input(INPUT_POST, 'opt_in', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
612
613 $name = !empty($name) ? $name: '';
614 $industry = !empty($industry ) ? $industry : '';
615 $email = !empty( $email ) ? $email : '';
616
617 if ( empty( $email ) ) {
618 wp_send_json_error( array( 'message' => __('Email is required', 'rex-product-feed') ), 400 );
619 }elseif( !is_email( $email ) ){
620 wp_send_json_error( array( 'message' => __('Email is invalid', 'rex-product-feed') ), 400 );
621 }
622
623 $create_contact_instance = new WPVR_Create_Contact( $email, $name, $industry );
624 $response = $create_contact_instance->create_contact_via_webhook();
625
626 update_option('wpvr_posthog_access_enabled', $opt_in);
627
628
629 if ( $response ) {
630 wp_send_json_success( array( 'message' => __('Contact created successfully', 'wpvr') ), 200 );
631 } else {
632 wp_send_json_error( array( 'message' => __('Failed to create contact', 'wpvr') ), 500 );
633 }
634 }
635
636 /**
637 * Saves the general settings for the WPVR plugin.
638 *
639 * This function handles the nonce verification, sanitizes the input fields,
640 * and updates the options in the database. It responds with a JSON success or error message.
641 *
642 * @since 8.4.10
643 */
644 function wpvr_save_general_settings(){
645
646 if ( ! current_user_can( 'manage_options' ) ) {
647 wp_send_json_error( array( 'message' => 'Unauthorized user' ), 403 );
648 return;
649 }
650
651 $nonce = filter_input(INPUT_POST, 'security', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
652 $nonce = !empty( $nonce ) ? $nonce : null; // phpcs:ignore
653 if ( !wp_verify_nonce( $nonce, 'wpvr' ) ) {
654 wp_send_json_error( array( 'message' => 'Invalid nonce' ), 400 );
655 return;
656 }
657
658 $is_mobile_media_resize = filter_input(INPUT_POST, 'media_resizer', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
659 $convert_to_webp = filter_input(INPUT_POST, 'convert_to_webp', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
660 $vr_glass_support = filter_input(INPUT_POST, 'vr_glass_support', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
661
662 update_option('mobile_media_resize', $is_mobile_media_resize);
663 update_option('wpvr_webp_conversion', $convert_to_webp);
664 update_option('wpvr_cardboard_disable', $vr_glass_support);
665
666 wp_send_json_success( array( 'message' => __('General setting data successfully saved.', 'wpvr') ), 200 );
667 }
668
669 }
670