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/Setup.php +109 -23 3.10.114.0.8 View file →
@@ -48,8 +48,9 @@
48 48 $this->_addFilter( 'visualizer_schedule_refresh_chart', 'refresh_db_for_chart', 10, 3 );
49 49
50 50 $this->_addAction( 'admin_init', 'adminInit' );
51 51 $this->_addAction( 'init', 'setupCustomPostTypes' );
52 + $this->_addFilter( 'cron_schedules', 'custom_cron_schedules' );
52 53 $this->_addAction( 'plugins_loaded', 'loadTextDomain' );
53 54 $this->_addFilter( 'visualizer_logger_data', 'getLoggerData' );
54 55 $this->_addFilter( 'visualizer_get_chart_counts', 'getUsage', 10, 2 );
55 56
@@ -111,9 +112,9 @@
111 112 $charts['sources'][ $source ] = isset( $charts['sources'][ $source ] ) ? $charts['sources'][ $source ] + 1 : 1;
112 113 $lib = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_LIBRARY, true );
113 114 $charts['library'][ $lib ] = isset( $charts['library'][ $lib ] ) ? $charts['library'][ $lib ] + 1 : 1;
114 115 $settings = get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, true );
115 - if ( array_key_exists( 'manual', $settings ) && ! empty( $settings['manual'] ) ) {
116 + if ( is_array( $settings ) && ! empty( $settings['manual'] ) ) {
116 117 $charts['manual_config'] = $charts['manual_config'] + 1;
117 118 }
118 119
119 120 // phpcs:ignore WordPress.PHP.StrictInArray.FoundNonStrictFalse
@@ -121,10 +122,10 @@
121 122 $charts['scheduled'] = $charts['scheduled'] + 1;
122 123 }
123 124
124 125 if ( Visualizer_Module::is_pro() ) {
125 - $permissions = get_post_meta( $chart_id, Visualizer_PRO::CF_PERMISSIONS, true );
126 - if ( empty( $permissions ) ) {
126 + $permissions = get_post_meta( $chart_id, Visualizer_Pro::CF_PERMISSIONS, true );
127 + if ( ! is_array( $permissions ) || empty( $permissions['permissions'] ) || ! is_array( $permissions['permissions'] ) ) {
127 128 continue;
128 129 }
129 130 $permissions = $permissions['permissions'];
130 131 $customized = false;
@@ -130,9 +131,9 @@
130 131 $customized = false;
131 132 foreach ( $default_perms as $key => $val ) {
132 133 if ( ! is_array( $val ) && ! is_null( $val ) && isset( $permissions[ $key ] ) && $permissions[ $key ] !== $val ) {
133 134 $customized = true;
134 - } elseif ( is_array( $val ) && ! is_null( $val ) && isset( $permissions[ $key ] ) && count( $permissions[ $key ] ) !== count( $val ) ) {
135 + } elseif ( is_array( $val ) && ! is_null( $val ) && isset( $permissions[ $key ] ) && is_array( $permissions[ $key ] ) && count( $permissions[ $key ] ) !== count( $val ) ) {
135 136 $customized = true;
136 137 }
137 138 }
138 139 if ( $customized ) {
@@ -207,13 +208,12 @@
207 208 /**
208 209 * Activates the plugin on a particular blog instance (supports multisite and single site).
209 210 */
210 211 private function activate_on_site() {
211 - wp_clear_scheduled_hook( 'visualizer_schedule_refresh_db' );
212 - wp_schedule_event( strtotime( 'midnight' ) - get_option( 'gmt_offset' ) * HOUR_IN_SECONDS, apply_filters( 'visualizer_chart_schedule_interval', 'hourly' ), 'visualizer_schedule_refresh_db' );
212 + $this->schedule_refresh_db_action();
213 213 add_option( 'visualizer-activated', true );
214 214 $is_fresh_install = get_option( 'visualizer_fresh_install', false );
215 - if ( ! defined( 'TI_CYPRESS_TESTING' ) && false === $is_fresh_install ) {
215 + if ( ! defined( 'TI_E2E_TESTING' ) && false === $is_fresh_install ) {
216 216 update_option( 'visualizer_fresh_install', '1' );
217 217 }
218 218 }
219 219
@@ -235,9 +235,9 @@
235 235 /**
236 236 * Deactivates the plugin on a particular blog instance (supports multisite and single site).
237 237 */
238 238 private function deactivate_on_site() {
239 - wp_clear_scheduled_hook( 'visualizer_schedule_refresh_db' );
239 + $this->unschedule_refresh_db_action();
240 240 delete_option( 'visualizer-activated', true );
241 241 }
242 242
243 243 /**
@@ -251,12 +251,23 @@
251 251 define( 'VISUALIZER_SURVEY', Visualizer_Module::is_pro() ? 'https://forms.gle/7Zo7FuZbvQ8DTvRi6' : 'https://forms.gle/muMtbcyvHn1aTvmJ7' );
252 252 // fire any upgrades necessary.
253 253 Visualizer_Module_Upgrade::upgrade();
254 254
255 - if ( get_option( 'visualizer-activated' ) ) {
255 + $activated_flag = get_option( 'visualizer-activated' );
256 + $fresh_install = get_option( 'visualizer_fresh_install', false );
257 + $is_pro = Visualizer_Module::is_pro();
258 + if ( $activated_flag ) {
259 + if ( function_exists( 'wp_doing_ajax' ) && wp_doing_ajax() ) {
260 + // Defer redirect until a normal admin request.
261 + return;
262 + }
263 + if ( wp_doing_cron() ) {
264 + // Defer redirect during cron requests.
265 + return;
266 + }
256 267 delete_option( 'visualizer-activated' );
257 268 if ( ! headers_sent() ) {
258 - if ( ! Visualizer_Module::is_pro() && ! empty( get_option( 'visualizer_fresh_install', false ) ) ) {
269 + if ( ! $is_pro && ! empty( $fresh_install ) ) {
259 270 $redirect_url = array(
260 271 'page' => 'visualizer-setup-wizard',
261 272 'tab' => '#step-1',
262 273 );
@@ -280,11 +291,11 @@
280 291
281 292 /**
282 293 * Refresh the specific chart from the db.
283 294 *
284 - * @param WP_Post $chart The chart object.
285 - * @param int $chart_id The chart id.
286 - * @param bool $force If this is true, then the chart data will be force refreshed. If false, data will be refreshed only if the chart requests live data.
295 + * @param WP_Post|null $chart The chart object.
296 + * @param int $chart_id The chart id.
297 + * @param bool $force If this is true, then the chart data will be force refreshed. If false, data will be refreshed only if the chart requests live data.
287 298 *
288 299 * @access public
289 300 */
290 301 public function refresh_db_for_chart( $chart, $chart_id, $force = false ) {
@@ -390,17 +401,19 @@
390 401 return $chart;
391 402 }
392 403
393 404 /**
394 - * Refresh the db chart.
405 + * Refresh the Database chart type.
395 406 *
396 407 * @access public
397 408 */
398 409 public function refreshDbChart() {
399 - $schedules = get_option( Visualizer_Plugin::CF_DB_SCHEDULE, array() );
400 - if ( ! $schedules ) {
410 + // NOTE: This use a different key from normal schedule. Updated only by Database chart. Check `visualizer_schedule_import` action.
411 + $chart_schedules = get_option( Visualizer_Plugin::CF_DB_SCHEDULE, array() );
412 + if ( ! $chart_schedules ) {
401 413 return;
402 414 }
415 +
403 416 if ( ! defined( 'VISUALIZER_DO_NOT_DIE' ) ) {
404 417 // define this so that the ajax call does not die
405 418 // this means that if the new version of pro and the old version of free are installed, only the first chart will be updated
406 419 define( 'VISUALIZER_DO_NOT_DIE', true );
@@ -406,24 +419,33 @@
406 419 define( 'VISUALIZER_DO_NOT_DIE', true );
407 420 }
408 421
409 422 $new_schedules = array();
410 - $now = time();
411 - foreach ( $schedules as $chart_id => $time ) {
412 - $new_schedules[ $chart_id ] = $time;
413 - if ( $time > $now ) {
423 + $current_time = time();
424 + foreach ( $chart_schedules as $chart_id => $scheduled_time ) {
425 +
426 + // Skip deleted charts.
427 + if ( false === get_post_status( $chart_id ) ) {
414 428 continue;
415 429 }
416 430
417 - // if the time is nigh, we force an update.
431 + $new_schedules[ $chart_id ] = $scheduled_time;
432 +
433 + // Should we do an update?
434 + if ( $scheduled_time > $current_time ) {
435 + continue;
436 + }
437 +
418 438 $this->refresh_db_for_chart( null, $chart_id, true );
439 +
419 440 // Clear existing chart cache.
420 441 $cache_key = Visualizer_Plugin::CF_CHART_CACHE . '_' . $chart_id;
421 442 if ( get_transient( $cache_key ) ) {
422 443 delete_transient( $cache_key );
423 444 }
424 - $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
425 - $new_schedules[ $chart_id ] = time() + $hours * HOUR_IN_SECONDS;
445 +
446 + $scheduled_hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
447 + $new_schedules[ $chart_id ] = $current_time + $scheduled_hours * HOUR_IN_SECONDS;
426 448 }
427 449 update_option( Visualizer_Plugin::CF_DB_SCHEDULE, $new_schedules );
428 450 }
429 451
@@ -442,5 +464,69 @@
442 464 update_option( 'visualizer-new-user', ! empty( $charts ) ? 'no' : 'yes' );
443 465 }
444 466 }
445 467
468 + /**
469 + * Add custom cron schedules.
470 + *
471 + * @param array $schedules The current schedules options.
472 + * @return array The modified schedules options.
473 + */
474 + public function custom_cron_schedules( $schedules ) {
475 + $schedules['visualizer_ten_minutes'] = array(
476 + 'interval' => 600,
477 + 'display' => __( 'Every 10 minutes', 'visualizer' ),
478 + );
479 +
480 + return $schedules;
481 + }
482 +
483 + /**
484 + * Schedule the recurring DB refresh action.
485 + */
486 + private function schedule_refresh_db_action(): void {
487 + $hook = 'visualizer_schedule_refresh_db';
488 + $group = 'visualizer';
489 + $interval_key = apply_filters( 'visualizer_chart_schedule_interval', 'visualizer_ten_minutes' );
490 + $interval = $this->get_schedule_interval_seconds( $interval_key );
491 + $timestamp = strtotime( 'midnight' ) - get_option( 'gmt_offset' ) * HOUR_IN_SECONDS;
492 +
493 + if ( function_exists( 'as_next_scheduled_action' ) && function_exists( 'as_schedule_recurring_action' ) ) {
494 + $next = as_next_scheduled_action( $hook, array(), $group );
495 + if ( false === $next ) {
496 + as_schedule_recurring_action( $timestamp, $interval, $hook, array(), $group );
497 + }
498 + wp_clear_scheduled_hook( $hook );
499 + return;
500 + }
501 +
502 + wp_clear_scheduled_hook( $hook );
503 + wp_schedule_event( $timestamp, $interval_key, $hook );
504 + }
505 +
506 + /**
507 + * Unschedule the recurring DB refresh action.
508 + */
509 + private function unschedule_refresh_db_action(): void {
510 + $hook = 'visualizer_schedule_refresh_db';
511 + $group = 'visualizer';
512 + if ( function_exists( 'as_unschedule_all_actions' ) ) {
513 + as_unschedule_all_actions( $hook, array(), $group );
514 + }
515 + wp_clear_scheduled_hook( $hook );
516 + }
517 +
518 + /**
519 + * Resolve a cron schedule key to seconds.
520 + *
521 + * @param string $interval_key Cron schedule key.
522 + * @return int Interval in seconds.
523 + */
524 + private function get_schedule_interval_seconds( $interval_key ) {
525 + $schedules = wp_get_schedules();
526 + if ( isset( $schedules[ $interval_key ]['interval'] ) ) {
527 + return (int) $schedules[ $interval_key ]['interval'];
528 + }
529 +
530 + return 600;
531 + }
446 532 }