PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 4.0.8
Visualizer – Tables & Charts Manager with Built-in AI Generator v4.0.8
4.0.8 4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 All 149 releases
← All changes | classes/Visualizer/Module/Wizard.php +57 -32 3.10.134.0.8 View file →
@@ -72,8 +72,9 @@
72 72 add_action( "load-$hook", array( $this, 'visualizer_load_setup_wizard_page' ) );
73 73 }
74 74 }
75 75
76 +
76 77 /**
77 78 * Method to register the setup wizard page.
78 79 *
79 80 * @access public
@@ -151,8 +152,14 @@
151 152 * @param bool $redirect_to_dashboard Redirect to dashboard.
152 153 * @return bool|void
153 154 */
154 155 public function dismissWizard( $redirect_to_dashboard = true ) {
156 + if ( ! current_user_can( 'manage_options' ) ) {
157 + wp_die( esc_html__( 'You do not have permission to perform this action.', 'visualizer' ), '', array( 'response' => 403 ) );
158 + }
159 + if ( false !== $redirect_to_dashboard ) {
160 + check_admin_referer( 'visualizer_dismiss_wizard' );
161 + }
155 162 // phpcs:ignore WordPress.Security.NonceVerification.Recommended
156 163 $status = isset( $_REQUEST['status'] ) ? (int) $_REQUEST['status'] : 0;
157 164 update_option( 'visualizer_fresh_install', $status );
158 165 delete_option( 'visualizer_wizard_data' );
@@ -167,9 +174,12 @@
167 174 * Setup wizard process.
168 175 */
169 176 public function visualizer_wizard_step_process() {
170 177 check_ajax_referer( VISUALIZER_ABSPATH, 'security' );
171 - $step = ! empty( $_POST['step'] ) ? filter_input( INPUT_POST, 'step', FILTER_SANITIZE_STRING ) : 1;
178 + if ( ! current_user_can( 'manage_options' ) ) {
179 + wp_send_json( array( 'status' => 0 ), 403 );
180 + }
181 + $step = ! empty( $_POST['step'] ) ? sanitize_text_field( wp_unslash( $_POST['step'] ) ) : 1;
172 182 switch ( $step ) {
173 183 case 'step_2':
174 184 $this->setup_wizard_import_chart();
175 185 break;
@@ -192,9 +202,9 @@
192 202 * Step: 2 import chart.
193 203 */
194 204 private function setup_wizard_import_chart() {
195 205 // phpcs:ignore WordPress.Security.NonceVerification.Missing
196 - $chart_type = ! empty( $_POST['chart_type'] ) ? filter_input( INPUT_POST, 'chart_type', FILTER_SANITIZE_STRING ) : '';
206 + $chart_type = ! empty( $_POST['chart_type'] ) ? sanitize_text_field( wp_unslash( $_POST['chart_type'] ) ) : '';
197 207 $chart_status = Visualizer_Module_Admin::checkChartStatus( $chart_type );
198 208 if ( ! $chart_status ) {
199 209 wp_send_json(
200 210 array(
@@ -232,9 +242,9 @@
232 242 update_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() );
233 243 update_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $series );
234 244 update_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_LIBRARY, '' );
235 245
236 - $data = maybe_unserialize( $data );
246 + $data = Visualizer_Module::decode_content( $data );
237 247 $setting_series = array();
238 248 $setting_slices = array();
239 249 foreach ( $data as $s ) {
240 250 $setting_series[] = array(
@@ -385,9 +395,10 @@
385 395 'chart_id' => $chart_id,
386 396 );
387 397 $this->update_wizard_data( $wizard_data, false );
388 398 $response = array(
389 - 'success' => 1,
399 + 'success' => 1,
400 + 'chart_id' => $chart_id,
390 401 );
391 402 }
392 403 wp_send_json( $response );
393 404 exit;
@@ -415,9 +426,9 @@
415 426 */
416 427 private function setup_wizard_create_draft_page( $return_page_id = false ) {
417 428 $add_basic_shortcode = ! empty( $_POST['add_basic_shortcode'] ) ? sanitize_text_field( wp_unslash( $_POST['add_basic_shortcode'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing
418 429 $add_basic_shortcode = 'true' === $add_basic_shortcode ? true : false;
419 - $basic_shortcode = ! empty( $_POST['basic_shortcode'] ) ? filter_input( INPUT_POST, 'basic_shortcode', FILTER_SANITIZE_STRING ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing
430 + $basic_shortcode = ! empty( $_POST['basic_shortcode'] ) ? sanitize_text_field( wp_unslash( $_POST['basic_shortcode'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing
420 431
421 432 if ( ! $add_basic_shortcode ) {
422 433 wp_send_json(
423 434 array(
@@ -475,9 +486,9 @@
475 486 * Step: 3 Install plugin.
476 487 */
477 488 private function setup_wizard_install_plugin() {
478 489 // phpcs:ignore WordPress.Security.NonceVerification.Missing
479 - $slug = ! empty( $_POST['slug'] ) ? filter_input( INPUT_POST, 'slug', FILTER_SANITIZE_STRING ) : '';
490 + $slug = ! empty( $_POST['slug'] ) ? sanitize_text_field( wp_unslash( $_POST['slug'] ) ) : '';
480 491 if ( empty( $slug ) ) {
481 492 wp_send_json(
482 493 array(
483 494 'status' => 0,
@@ -495,10 +506,12 @@
495 506 );
496 507 }
497 508
498 509 if ( ! empty( $slug ) ) {
510 + $wizard_data = get_option( self::OPTION_NAME, array() );
499 511 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
500 512 include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
513 + require_once ABSPATH . 'wp-admin/includes/plugin.php';
501 514
502 515 $api = plugins_api(
503 516 'plugin_information',
504 517 array(
@@ -558,13 +571,38 @@
558 571
559 572 wp_send_json( $status );
560 573 }
561 574
562 - activate_plugin( 'optimole-wp/optimole-wp.php' );
563 - delete_transient( 'optml_fresh_install' );
564 - // Update wizard data.
565 - $wizard_data['enable_perfomance'] = true;
566 - $this->update_wizard_data( $wizard_data );
575 + $installed_plugins = get_plugins( '/' . sanitize_key( wp_unslash( $slug ) ) );
576 + if ( ! empty( $installed_plugins ) ) {
577 + $plugin_files = array_keys( $installed_plugins );
578 + $plugin_file = sanitize_key( wp_unslash( $slug ) ) . '/' . $plugin_files[0];
579 + activate_plugin( $plugin_file );
580 + }
581 + $wizard_data_updated = false;
582 + if ( 'optimole-wp' === $slug ) {
583 + delete_transient( 'optml_fresh_install' );
584 + // Update wizard data.
585 + $wizard_data['enable_perfomance'] = true;
586 + $wizard_data_updated = true;
587 + }
588 + if ( 'otter-blocks' === $slug ) {
589 + // Update wizard data.
590 + $wizard_data['enable_otter_blocks'] = true;
591 + $wizard_data_updated = true;
592 + // Suppress Otter's post-activation redirects so the user stays in Visualizer.
593 + update_option( 'themeisle_blocks_settings_redirect', '0' );
594 + update_option( 'themeisle_blocks_settings_onboarding', '0' );
595 + }
596 + if ( 'wp-cloudflare-page-cache' === $slug ) {
597 + // Update wizard data.
598 + $wizard_data['enable_page_cache'] = true;
599 + $wizard_data_updated = true;
600 + update_option( 'swcfpc_dashboard_redirect', false );
601 + }
602 + if ( $wizard_data_updated ) {
603 + $this->update_wizard_data( $wizard_data );
604 + }
567 605
568 606 wp_send_json(
569 607 array(
570 608 'status' => 1,
@@ -613,18 +651,19 @@
613 651 );
614 652 }
615 653
616 654 if ( $with_subscribe && is_email( $email ) ) {
617 - $request_res = wp_remote_post(
655 + wp_remote_post(
618 656 VISUALIZER_SUBSCRIBE_API,
619 657 array(
620 - 'timeout' => 100,
621 - 'headers' => array(
658 + 'timeout' => 5,
659 + 'blocking' => false,
660 + 'headers' => array(
622 661 'Content-Type' => 'application/json',
623 662 'Cache-Control' => 'no-cache',
624 663 'Accept' => 'application/json, */*;q=0.1',
625 664 ),
626 - 'body' => wp_json_encode(
665 + 'body' => wp_json_encode(
627 666 array(
628 667 'slug' => 'visualizer',
629 668 'site' => home_url(),
630 669 'email' => $email,
@@ -634,26 +673,12 @@
634 673 )
635 674 ),
636 675 )
637 676 );
638 - if ( ! is_wp_error( $request_res ) ) {
639 - $body = json_decode( wp_remote_retrieve_body( $request_res ) );
640 - if ( 'success' === $body->code ) {
641 - $this->dismissWizard( false );
642 - wp_send_json( $response );
643 - }
644 - }
645 - wp_send_json(
646 - array(
647 - 'status' => 0,
648 - 'redirect_to' => '',
649 - 'message' => '',
650 - )
651 - );
652 - } else {
653 - $this->dismissWizard( false );
654 - wp_send_json( $response );
655 677 }
678 +
679 + $this->dismissWizard( false );
680 + wp_send_json( $response );
656 681 }
657 682
658 683 /**
659 684 * Filter chart setting.