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