PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.7.9
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.7.9
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 3.10.4 All 148 releases
← All changes | classes/Visualizer/Module/Setup.php +205 -39 3.1.33.7.9 View file →
@@ -46,14 +46,18 @@
46 46 register_deactivation_hook( VISUALIZER_BASEFILE, array( $this, 'deactivate' ) );
47 47 $this->_addAction( 'visualizer_schedule_refresh_db', 'refreshDbChart' );
48 48 $this->_addFilter( 'visualizer_schedule_refresh_chart', 'refresh_db_for_chart', 10, 3 );
49 49
50 - $this->_addAction( 'activated_plugin', 'onActivation' );
50 + $this->_addAction( 'admin_init', 'adminInit' );
51 51 $this->_addAction( 'init', 'setupCustomPostTypes' );
52 52 $this->_addAction( 'plugins_loaded', 'loadTextDomain' );
53 53 $this->_addFilter( 'visualizer_logger_data', 'getLoggerData' );
54 - $this->_addFilter( 'visualizer_get_chart_counts', 'getChartCountsByTypeAndMeta' );
54 + $this->_addFilter( 'visualizer_get_chart_counts', 'getUsage', 10, 2 );
55 55
56 + $this->_addAction( 'init', 'checkIsExistingUser' );
57 +
58 + // only for testing
59 + // $this->_addAction( 'admin_init', 'getUsage' );
56 60 }
57 61 /**
58 62 * Fetches the SDK logger data.
59 63 *
@@ -61,36 +65,82 @@
61 65 *
62 66 * @access public
63 67 */
64 68 public function getLoggerData( $data ) {
65 - return $this->getChartCountsByTypeAndMeta();
69 + return $this->getUsage( $data );
66 70 }
67 71
68 72 /**
69 - * Fetches the types of charts created and their counts.
73 + * Fetches the usage of charts.
70 74 *
75 + * @param array $data The default data that needs to be sent.
71 76 * @param array $meta_keys An array of name vs. meta keys - to return how many charts have these keys.
72 - * @access private
77 + *
78 + * @access public
73 79 */
74 - public function getChartCountsByTypeAndMeta( $meta_keys = array() ) {
75 - $charts = array();
76 - $charts['chart_types'] = array();
77 - // the initial query arguments to fetch charts
80 + public function getUsage( $data, $meta_keys = array() ) {
81 + $charts = array( 'types' => array(), 'sources' => array(), 'library' => array(), 'permissions' => 0, 'manual_config' => 0, 'scheduled' => 0 );
78 82 $query_args = array(
79 83 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
80 84 'posts_per_page' => 300,
85 + 'post_status' => 'publish',
81 86 'fields' => 'ids',
82 87 'no_rows_found' => false,
83 88 'update_post_meta_cache' => false,
84 89 'update_post_term_cache' => false,
90 + );
85 91
92 + // default permissions.
93 + $default_perms = array(
94 + 'read' => 'all',
95 + 'read-specific' => null,
96 + 'edit' => 'roles',
97 + 'edit-specific' => array( 'administrator' ),
86 98 );
87 99
100 + // collect all schedules chart ids.
101 + $scheduled = array_merge(
102 + array_keys( get_option( Visualizer_Plugin::CF_CHART_SCHEDULE, array() ) ),
103 + array_keys( get_option( Visualizer_Plugin::CF_DB_SCHEDULE, array() ) )
104 + );
88 105 $query = new WP_Query( $query_args );
89 106 while ( $query->have_posts() ) {
90 107 $chart_id = $query->next_post();
91 108 $type = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, true );
92 - $charts['chart_types'][ $type ] = isset( $charts['chart_types'][ $type ] ) ? $charts['chart_types'][ $type ] + 1 : 1;
109 + $charts['types'][ $type ] = isset( $charts['types'][ $type ] ) ? $charts['types'][ $type ] + 1 : 1;
110 + $source = get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true );
111 + $charts['sources'][ $source ] = isset( $charts['sources'][ $source ] ) ? $charts['sources'][ $source ] + 1 : 1;
112 + $lib = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_LIBRARY, true );
113 + $charts['library'][ $lib ] = isset( $charts['library'][ $lib ] ) ? $charts['library'][ $lib ] + 1 : 1;
114 + $settings = get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, true );
115 + if ( array_key_exists( 'manual', $settings ) && ! empty( $settings['manual'] ) ) {
116 + $charts['manual_config'] = $charts['manual_config'] + 1;
117 + }
118 +
119 + // phpcs:ignore WordPress.PHP.StrictInArray.FoundNonStrictFalse
120 + if ( in_array( $chart_id, $scheduled, false ) ) {
121 + $charts['scheduled'] = $charts['scheduled'] + 1;
122 + }
123 +
124 + if ( Visualizer_Module::is_pro() ) {
125 + $permissions = get_post_meta( $chart_id, Visualizer_PRO::CF_PERMISSIONS, true );
126 + if ( empty( $permissions ) ) {
127 + continue;
128 + }
129 + $permissions = $permissions['permissions'];
130 + $customized = false;
131 + foreach ( $default_perms as $key => $val ) {
132 + if ( ! is_array( $val ) && ! is_null( $val ) && isset( $permissions[ $key ] ) && $permissions[ $key ] !== $val ) {
133 + $customized = true;
134 + } elseif ( is_array( $val ) && ! is_null( $val ) && isset( $permissions[ $key ] ) && count( $permissions[ $key ] ) !== count( $val ) ) {
135 + $customized = true;
136 + }
137 + }
138 + if ( $customized ) {
139 + $charts['permissions'] = $charts['permissions'] + 1;
140 + }
141 + }
142 +
93 143 if ( ! empty( $meta_keys ) ) {
94 144 foreach ( $meta_keys as $name => $key ) {
95 145 $data = get_post_meta( $chart_id, $key, true );
96 146 if ( ! empty( $data ) ) {
@@ -100,8 +150,9 @@
100 150 }
101 151 }
102 152 }
103 153 }
154 +
104 155 return $charts;
105 156 }
106 157
107 158 /**
@@ -140,36 +191,76 @@
140 191
141 192 /**
142 193 * Activate the plugin
143 194 */
144 - public function activate() {
195 + public function activate( $network_wide ) {
196 + if ( is_multisite() && $network_wide ) {
197 + foreach ( get_sites( array( 'fields' => 'ids' ) ) as $blog_id ) {
198 + switch_to_blog( $blog_id );
199 + $this->activate_on_site();
200 + restore_current_blog();
201 + }
202 + } else {
203 + $this->activate_on_site();
204 + }
205 + }
206 +
207 + /**
208 + * Activates the plugin on a particular blog instance (supports multisite and single site).
209 + */
210 + private function activate_on_site() {
145 211 wp_clear_scheduled_hook( 'visualizer_schedule_refresh_db' );
146 - wp_schedule_event( strtotime( 'midnight' ) - get_option( 'gmt_offset' ) * HOUR_IN_SECONDS, 'hourly', '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' );
213 + add_option( 'visualizer-activated', true );
147 214 }
148 215
149 216 /**
150 - * On activation of the plugin
217 + * Deactivate the plugin
151 218 */
152 - public function onActivation( $plugin ) {
219 + public function deactivate( $network_wide ) {
220 + if ( is_multisite() && $network_wide ) {
221 + foreach ( get_sites( array( 'fields' => 'ids' ) ) as $blog_id ) {
222 + switch_to_blog( $blog_id );
223 + $this->deactivate_on_site();
224 + restore_current_blog();
225 + }
226 + } else {
227 + $this->deactivate_on_site();
228 + }
229 + }
230 +
231 + /**
232 + * Deactivates the plugin on a particular blog instance (supports multisite and single site).
233 + */
234 + private function deactivate_on_site() {
235 + wp_clear_scheduled_hook( 'visualizer_schedule_refresh_db' );
236 + delete_option( 'visualizer-activated', true );
237 + }
238 +
239 + /**
240 + * Check if plugin has been activated and then redirect to the correct page.
241 + */
242 + public function adminInit() {
153 243 if ( defined( 'TI_UNIT_TESTING' ) ) {
154 244 return;
155 245 }
156 246
157 - if ( $plugin == VISUALIZER_BASENAME ) {
158 - wp_redirect( admin_url( 'upload.php?page=' . Visualizer_Plugin::NAME ) );
159 - exit();
247 + define( 'VISUALIZER_SURVEY', Visualizer_Module::is_pro() ? 'https://forms.gle/7Zo7FuZbvQ8DTvRi6' : 'https://forms.gle/muMtbcyvHn1aTvmJ7' );
248 + // fire any upgrades necessary.
249 + Visualizer_Module_Upgrade::upgrade();
250 +
251 + if ( get_option( 'visualizer-activated' ) ) {
252 + delete_option( 'visualizer-activated' );
253 + if ( ! headers_sent() ) {
254 + $page_name = Visualizer_Module::numberOfCharts() > 0 ? Visualizer_Plugin::NAME : 'viz-support';
255 + wp_redirect( esc_url_raw( add_query_arg( 'page', $page_name, admin_url( 'admin.php' ) ) ) );
256 + exit();
257 + }
160 258 }
161 259 }
162 260
163 261
164 262 /**
165 - * Deactivate the plugin
166 - */
167 - public function deactivate() {
168 - wp_clear_scheduled_hook( 'visualizer_schedule_refresh_db' );
169 - }
170 -
171 - /**
172 263 * Refresh the specific chart from the db.
173 264 *
174 265 * @param WP_Post $chart The chart object.
175 266 * @param int $chart_id The chart id.
@@ -191,37 +282,91 @@
191 282 }
192 283
193 284 // check if the source is correct.
194 285 $source = get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true );
195 - if ( $source !== 'Visualizer_Source_Query' ) {
196 - return $chart;
197 - }
286 + $load_series = false;
287 + switch ( $source ) {
288 + case 'Visualizer_Source_Query':
289 + // check if its a live-data chart or a cached-data chart.
290 + if ( ! $force ) {
291 + $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
292 + if ( ! empty( $hours ) ) {
293 + // cached, bail!
294 + return $chart;
295 + }
296 + }
198 297
199 - // check if its a live-data chart or a cached-data chart.
200 - if ( ! $force ) {
201 - $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
202 - if ( ! empty( $hours ) ) {
203 - // cached, bail!
298 + $params = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_QUERY, true );
299 + $source = new Visualizer_Source_Query( $params, $chart_id );
300 + $source->fetch( false );
301 + $load_series = true;
302 + break;
303 + case 'Visualizer_Source_Json':
304 + // check if its a live-data chart or a cached-data chart.
305 + if ( ! $force ) {
306 + $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE, true );
307 + if ( ! empty( $hours ) ) {
308 + // cached, bail!
309 + return $chart;
310 + }
311 + }
312 +
313 + $url = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_URL, true );
314 + $root = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_ROOT, true );
315 + $paging = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_PAGING, true );
316 + $series = get_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, true );
317 + $source = new Visualizer_Source_Json( array( 'url' => $url, 'root' => $root, 'paging' => $paging ) );
318 + $source->refresh( $series );
319 + break;
320 + case 'Visualizer_Source_Csv_Remote':
321 + // check if its a live-data chart or a cached-data chart.
322 + if ( ! $force ) {
323 + $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_SCHEDULE, true );
324 + if ( ! empty( $hours ) ) {
325 + // cached, bail!
326 + return $chart;
327 + }
328 + }
329 + do_action( 'visualizer_schedule_import' );
330 + return get_post( $chart_id );
331 + default:
204 332 return $chart;
205 - }
206 333 }
207 334
208 - $params = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_QUERY, true );
209 - $source = new Visualizer_Source_Query( $params );
210 - $source->fetch( false );
211 -
212 335 $error = $source->get_error();
213 336 if ( empty( $error ) ) {
214 - update_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
337 + $this->disableRevisionsTemporarily();
338 + if ( $load_series ) {
339 + update_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
340 + }
215 341
342 + $allow_html = false;
343 + $settings = get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, true );
344 + if ( isset( $settings['allowHtml'] ) && intval( $settings['allowHtml'] ) === 1 ) {
345 + $allow_html = true;
346 + }
347 +
348 + $allow_html = apply_filters( 'visualizer_allow_html_content', $allow_html, $chart_id, $chart );
349 +
350 + if ( $allow_html ) {
351 + kses_remove_filters();
352 + }
353 +
216 354 wp_update_post(
217 355 array(
218 356 'ID' => $chart_id,
219 - 'post_content' => $source->getData(),
357 + 'post_content' => $source->getData( get_post_meta( $chart_id, Visualizer_Plugin::CF_EDITABLE_TABLE, true ) ),
220 358 )
221 359 );
222 360
361 + if ( $allow_html ) {
362 + kses_init_filters();
363 + }
364 +
223 365 $chart = get_post( $chart_id );
366 + delete_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR );
367 + } else {
368 + update_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR, sprintf( 'Error while updating chart: %s', $error ) );
224 369 }
225 370
226 371 return $chart;
227 372 }
@@ -251,11 +396,32 @@
251 396 }
252 397
253 398 // if the time is nigh, we force an update.
254 399 $this->refresh_db_for_chart( null, $chart_id, true );
400 + // Clear existing chart cache.
401 + $cache_key = Visualizer_Plugin::CF_CHART_CACHE . '_' . $chart_id;
402 + if ( get_transient( $cache_key ) ) {
403 + delete_transient( $cache_key );
404 + }
255 405 $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
256 406 $new_schedules[ $chart_id ] = time() + $hours * HOUR_IN_SECONDS;
257 407 }
258 408 update_option( Visualizer_Plugin::CF_DB_SCHEDULE, $new_schedules );
409 + }
410 +
411 + /**
412 + * Save flag for existing users.
413 + */
414 + public function checkIsExistingUser() {
415 + $chart_exists = get_option( 'visualizer-new-user', '' );
416 + if ( '' === $chart_exists ) {
417 + $charts = get_posts(
418 + array(
419 + 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
420 + 'fields' => 'ids',
421 + )
422 + );
423 + update_option( 'visualizer-new-user', ! empty( $charts ) ? 'no' : 'yes' );
424 + }
259 425 }
260 426
261 427 }