PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.7.6
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.7.6
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
visualizer / classes / Visualizer / Module / Setup.php

Setup.php in Visualizer – Tables & Charts Manager with Built-in AI Generator 3.7.6, at classes/Visualizer/Module/Setup.php

427 lines 13.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 // +----------------------------------------------------------------------+
4 // | Copyright 2013 Madpixels (email : visualizer@madpixels.net) |
5 // +----------------------------------------------------------------------+
6 // | This program is free software; you can redistribute it and/or modify |
7 // | it under the terms of the GNU General Public License, version 2, as |
8 // | published by the Free Software Foundation. |
9 // | |
10 // | This program is distributed in the hope that it will be useful, |
11 // | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 // | GNU General Public License for more details. |
14 // | |
15 // | You should have received a copy of the GNU General Public License |
16 // | along with this program; if not, write to the Free Software |
17 // | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, |
18 // | MA 02110-1301 USA |
19 // +----------------------------------------------------------------------+
20 // | Author: Eugene Manuilov <eugene@manuilov.org> |
21 // +----------------------------------------------------------------------+
22 /**
23 * General module what setups all required environment.
24 *
25 * @category Visualizer
26 * @package Module
27 *
28 * @since 1.0.0
29 */
30 class Visualizer_Module_Setup extends Visualizer_Module {
31
32 const NAME = __CLASS__;
33
34 /**
35 * Constructor.
36 *
37 * @since 1.0.0
38 *
39 * @access public
40 * @param Visualizer_Plugin $plugin The instance of the plugin.
41 */
42 public function __construct( Visualizer_Plugin $plugin ) {
43 parent::__construct( $plugin );
44
45 register_activation_hook( VISUALIZER_BASEFILE, array( $this, 'activate' ) );
46 register_deactivation_hook( VISUALIZER_BASEFILE, array( $this, 'deactivate' ) );
47 $this->_addAction( 'visualizer_schedule_refresh_db', 'refreshDbChart' );
48 $this->_addFilter( 'visualizer_schedule_refresh_chart', 'refresh_db_for_chart', 10, 3 );
49
50 $this->_addAction( 'admin_init', 'adminInit' );
51 $this->_addAction( 'init', 'setupCustomPostTypes' );
52 $this->_addAction( 'plugins_loaded', 'loadTextDomain' );
53 $this->_addFilter( 'visualizer_logger_data', 'getLoggerData' );
54 $this->_addFilter( 'visualizer_get_chart_counts', 'getUsage', 10, 2 );
55
56 $this->_addAction( 'init', 'checkIsExistingUser' );
57
58 // only for testing
59 // $this->_addAction( 'admin_init', 'getUsage' );
60 }
61 /**
62 * Fetches the SDK logger data.
63 *
64 * @param array $data The default data that needs to be sent.
65 *
66 * @access public
67 */
68 public function getLoggerData( $data ) {
69 return $this->getUsage( $data );
70 }
71
72 /**
73 * Fetches the usage of charts.
74 *
75 * @param array $data The default data that needs to be sent.
76 * @param array $meta_keys An array of name vs. meta keys - to return how many charts have these keys.
77 *
78 * @access public
79 */
80 public function getUsage( $data, $meta_keys = array() ) {
81 $charts = array( 'types' => array(), 'sources' => array(), 'library' => array(), 'permissions' => 0, 'manual_config' => 0, 'scheduled' => 0 );
82 $query_args = array(
83 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
84 'posts_per_page' => 300,
85 'post_status' => 'publish',
86 'fields' => 'ids',
87 'no_rows_found' => false,
88 'update_post_meta_cache' => false,
89 'update_post_term_cache' => false,
90 );
91
92 // default permissions.
93 $default_perms = array(
94 'read' => 'all',
95 'read-specific' => null,
96 'edit' => 'roles',
97 'edit-specific' => array( 'administrator' ),
98 );
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 );
105 $query = new WP_Query( $query_args );
106 while ( $query->have_posts() ) {
107 $chart_id = $query->next_post();
108 $type = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, true );
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
143 if ( ! empty( $meta_keys ) ) {
144 foreach ( $meta_keys as $name => $key ) {
145 $data = get_post_meta( $chart_id, $key, true );
146 if ( ! empty( $data ) ) {
147 $charts[ $name ] = isset( $charts[ $name ] ) ? $charts[ $name ] + 1 : 1;
148 } else {
149 $charts[ $name ] = 0;
150 }
151 }
152 }
153 }
154
155 return $charts;
156 }
157
158 /**
159 * Registers custom post type for charts.
160 *
161 * @since 1.0.0
162 * @uses register_post_type() To register custom post type for charts.
163 *
164 * @access public
165 */
166 public function setupCustomPostTypes() {
167 register_post_type(
168 Visualizer_Plugin::CPT_VISUALIZER,
169 array(
170 'label' => 'Visualizer Charts',
171 'public' => false,
172 'supports' => array( 'revisions' ),
173 'show_in_rest' => true,
174 'rest_base' => 'visualizer',
175 'rest_controller_class' => 'WP_REST_Posts_Controller',
176 )
177 );
178 }
179
180 /**
181 * Loads plugin text domain translations.
182 *
183 * @since 1.0.0
184 * @uses load_plugin_textdomain() To load translations for the plugin.
185 *
186 * @access public
187 */
188 public function loadTextDomain() {
189 load_plugin_textdomain( Visualizer_Plugin::NAME, false, dirname( plugin_basename( VISUALIZER_BASEFILE ) ) . '/languages/' );
190 }
191
192 /**
193 * Activate the plugin
194 */
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() {
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' );
213 add_option( 'visualizer-activated', true );
214 }
215
216 /**
217 * Deactivate the plugin
218 */
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() {
243 if ( defined( 'TI_UNIT_TESTING' ) ) {
244 return;
245 }
246
247 // fire any upgrades necessary.
248 Visualizer_Module_Upgrade::upgrade();
249
250 if ( get_option( 'visualizer-activated' ) ) {
251 delete_option( 'visualizer-activated' );
252 if ( ! headers_sent() ) {
253 $page_name = Visualizer_Module::numberOfCharts() > 0 ? Visualizer_Plugin::NAME : 'viz-support';
254 wp_redirect( add_query_arg( 'page', $page_name, admin_url( 'admin.php' ) ) );
255 exit();
256 }
257 }
258 }
259
260
261 /**
262 * Refresh the specific chart from the db.
263 *
264 * @param WP_Post $chart The chart object.
265 * @param int $chart_id The chart id.
266 * @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.
267 *
268 * @access public
269 */
270 public function refresh_db_for_chart( $chart, $chart_id, $force = false ) {
271 if ( ! $chart_id ) {
272 return $chart;
273 }
274
275 if ( ! $chart ) {
276 $chart = get_post( $chart_id );
277 }
278
279 if ( ! $chart ) {
280 return $chart;
281 }
282
283 // check if the source is correct.
284 $source = get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true );
285 $load_series = false;
286 switch ( $source ) {
287 case 'Visualizer_Source_Query':
288 // check if its a live-data chart or a cached-data chart.
289 if ( ! $force ) {
290 $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
291 if ( ! empty( $hours ) ) {
292 // cached, bail!
293 return $chart;
294 }
295 }
296
297 $params = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_QUERY, true );
298 $source = new Visualizer_Source_Query( $params, $chart_id );
299 $source->fetch( false );
300 $load_series = true;
301 break;
302 case 'Visualizer_Source_Json':
303 // check if its a live-data chart or a cached-data chart.
304 if ( ! $force ) {
305 $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE, true );
306 if ( ! empty( $hours ) ) {
307 // cached, bail!
308 return $chart;
309 }
310 }
311
312 $url = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_URL, true );
313 $root = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_ROOT, true );
314 $paging = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_PAGING, true );
315 $series = get_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, true );
316 $source = new Visualizer_Source_Json( array( 'url' => $url, 'root' => $root, 'paging' => $paging ) );
317 $source->refresh( $series );
318 break;
319 case 'Visualizer_Source_Csv_Remote':
320 // check if its a live-data chart or a cached-data chart.
321 if ( ! $force ) {
322 $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_SCHEDULE, true );
323 if ( ! empty( $hours ) ) {
324 // cached, bail!
325 return $chart;
326 }
327 }
328 do_action( 'visualizer_schedule_import' );
329 return get_post( $chart_id );
330 default:
331 return $chart;
332 }
333
334 $error = $source->get_error();
335 if ( empty( $error ) ) {
336 $this->disableRevisionsTemporarily();
337 if ( $load_series ) {
338 update_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
339 }
340
341 $allow_html = false;
342 $settings = get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, true );
343 if ( isset( $settings['allowHtml'] ) && intval( $settings['allowHtml'] ) === 1 ) {
344 $allow_html = true;
345 }
346
347 $allow_html = apply_filters( 'visualizer_allow_html_content', $allow_html, $chart_id, $chart );
348
349 if ( $allow_html ) {
350 kses_remove_filters();
351 }
352
353 wp_update_post(
354 array(
355 'ID' => $chart_id,
356 'post_content' => $source->getData( get_post_meta( $chart_id, Visualizer_Plugin::CF_EDITABLE_TABLE, true ) ),
357 )
358 );
359
360 if ( $allow_html ) {
361 kses_init_filters();
362 }
363
364 $chart = get_post( $chart_id );
365 delete_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR );
366 } else {
367 update_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR, sprintf( 'Error while updating chart: %s', $error ) );
368 }
369
370 return $chart;
371 }
372
373 /**
374 * Refresh the db chart.
375 *
376 * @access public
377 */
378 public function refreshDbChart() {
379 $schedules = get_option( Visualizer_Plugin::CF_DB_SCHEDULE, array() );
380 if ( ! $schedules ) {
381 return;
382 }
383 if ( ! defined( 'VISUALIZER_DO_NOT_DIE' ) ) {
384 // define this so that the ajax call does not die
385 // this means that if the new version of pro and the old version of free are installed, only the first chart will be updated
386 define( 'VISUALIZER_DO_NOT_DIE', true );
387 }
388
389 $new_schedules = array();
390 $now = time();
391 foreach ( $schedules as $chart_id => $time ) {
392 $new_schedules[ $chart_id ] = $time;
393 if ( $time > $now ) {
394 continue;
395 }
396
397 // if the time is nigh, we force an update.
398 $this->refresh_db_for_chart( null, $chart_id, true );
399 // Clear existing chart cache.
400 $cache_key = Visualizer_Plugin::CF_CHART_CACHE . '_' . $chart_id;
401 if ( get_transient( $cache_key ) ) {
402 delete_transient( $cache_key );
403 }
404 $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
405 $new_schedules[ $chart_id ] = time() + $hours * HOUR_IN_SECONDS;
406 }
407 update_option( Visualizer_Plugin::CF_DB_SCHEDULE, $new_schedules );
408 }
409
410 /**
411 * Save flag for existing users.
412 */
413 public function checkIsExistingUser() {
414 $chart_exists = get_option( 'visualizer-new-user', '' );
415 if ( '' === $chart_exists ) {
416 $charts = get_posts(
417 array(
418 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
419 'fields' => 'ids',
420 )
421 );
422 update_option( 'visualizer-new-user', ! empty( $charts ) ? 'no' : 'yes' );
423 }
424 }
425
426 }
427