PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.10.2
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.10.2
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.10.2, at classes/Visualizer/Module/Setup.php

447 lines 14.5 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 $is_fresh_install = get_option( 'visualizer_fresh_install', false );
215 if ( ! defined( 'TI_CYPRESS_TESTING' ) && false === $is_fresh_install ) {
216 update_option( 'visualizer_fresh_install', '1' );
217 }
218 }
219
220 /**
221 * Deactivate the plugin
222 */
223 public function deactivate( $network_wide ) {
224 if ( is_multisite() && $network_wide ) {
225 foreach ( get_sites( array( 'fields' => 'ids' ) ) as $blog_id ) {
226 switch_to_blog( $blog_id );
227 $this->deactivate_on_site();
228 restore_current_blog();
229 }
230 } else {
231 $this->deactivate_on_site();
232 }
233 }
234
235 /**
236 * Deactivates the plugin on a particular blog instance (supports multisite and single site).
237 */
238 private function deactivate_on_site() {
239 wp_clear_scheduled_hook( 'visualizer_schedule_refresh_db' );
240 delete_option( 'visualizer-activated', true );
241 }
242
243 /**
244 * Check if plugin has been activated and then redirect to the correct page.
245 */
246 public function adminInit() {
247 if ( defined( 'TI_UNIT_TESTING' ) ) {
248 return;
249 }
250
251 define( 'VISUALIZER_SURVEY', Visualizer_Module::is_pro() ? 'https://forms.gle/7Zo7FuZbvQ8DTvRi6' : 'https://forms.gle/muMtbcyvHn1aTvmJ7' );
252 // fire any upgrades necessary.
253 Visualizer_Module_Upgrade::upgrade();
254
255 if ( get_option( 'visualizer-activated' ) ) {
256 delete_option( 'visualizer-activated' );
257 if ( ! headers_sent() ) {
258 if ( ! Visualizer_Module::is_pro() && ! empty( get_option( 'visualizer_fresh_install', false ) ) ) {
259 $redirect_url = array(
260 'page' => 'visualizer-setup-wizard',
261 'tab' => '#step-1',
262 );
263 } else {
264 $page_name = Visualizer_Module::numberOfCharts() > 0 ? Visualizer_Plugin::NAME : 'viz-support';
265 $redirect_url = array(
266 'page' => $page_name,
267 );
268 }
269 wp_safe_redirect(
270 add_query_arg(
271 $redirect_url,
272 admin_url( 'admin.php' )
273 )
274 );
275 exit();
276 }
277 }
278 }
279
280
281 /**
282 * Refresh the specific chart from the db.
283 *
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.
287 *
288 * @access public
289 */
290 public function refresh_db_for_chart( $chart, $chart_id, $force = false ) {
291 if ( ! $chart_id ) {
292 return $chart;
293 }
294
295 if ( ! $chart ) {
296 $chart = get_post( $chart_id );
297 }
298
299 if ( ! $chart ) {
300 return $chart;
301 }
302
303 // check if the source is correct.
304 $source = get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true );
305 $load_series = false;
306 switch ( $source ) {
307 case 'Visualizer_Source_Query':
308 // check if its a live-data chart or a cached-data chart.
309 if ( ! $force ) {
310 $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
311 if ( ! empty( $hours ) ) {
312 // cached, bail!
313 return $chart;
314 }
315 }
316
317 $params = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_QUERY, true );
318 $source = new Visualizer_Source_Query( $params, $chart_id );
319 $source->fetch( false );
320 $load_series = true;
321 break;
322 case 'Visualizer_Source_Json':
323 // check if its a live-data chart or a cached-data chart.
324 if ( ! $force ) {
325 $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE, true );
326 if ( ! empty( $hours ) ) {
327 // cached, bail!
328 return $chart;
329 }
330 }
331
332 $url = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_URL, true );
333 $root = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_ROOT, true );
334 $paging = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_PAGING, true );
335 $series = get_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, true );
336 $source = new Visualizer_Source_Json( array( 'url' => $url, 'root' => $root, 'paging' => $paging ) );
337 $source->refresh( $series );
338 break;
339 case 'Visualizer_Source_Csv_Remote':
340 // check if its a live-data chart or a cached-data chart.
341 if ( ! $force ) {
342 $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_SCHEDULE, true );
343 if ( ! empty( $hours ) ) {
344 // cached, bail!
345 return $chart;
346 }
347 }
348 do_action( 'visualizer_schedule_import' );
349 return get_post( $chart_id );
350 default:
351 return $chart;
352 }
353
354 $error = $source->get_error();
355 if ( empty( $error ) ) {
356 $this->disableRevisionsTemporarily();
357 if ( $load_series ) {
358 update_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
359 }
360
361 $allow_html = false;
362 $settings = get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, true );
363 if ( isset( $settings['allowHtml'] ) && intval( $settings['allowHtml'] ) === 1 ) {
364 $allow_html = true;
365 }
366
367 $allow_html = apply_filters( 'visualizer_allow_html_content', $allow_html, $chart_id, $chart );
368
369 if ( $allow_html ) {
370 kses_remove_filters();
371 }
372
373 wp_update_post(
374 array(
375 'ID' => $chart_id,
376 'post_content' => $source->getData( get_post_meta( $chart_id, Visualizer_Plugin::CF_EDITABLE_TABLE, true ) ),
377 )
378 );
379
380 if ( $allow_html ) {
381 kses_init_filters();
382 }
383
384 $chart = get_post( $chart_id );
385 delete_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR );
386 } else {
387 update_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR, sprintf( 'Error while updating chart: %s', $error ) );
388 }
389
390 return $chart;
391 }
392
393 /**
394 * Refresh the db chart.
395 *
396 * @access public
397 */
398 public function refreshDbChart() {
399 $schedules = get_option( Visualizer_Plugin::CF_DB_SCHEDULE, array() );
400 if ( ! $schedules ) {
401 return;
402 }
403 if ( ! defined( 'VISUALIZER_DO_NOT_DIE' ) ) {
404 // define this so that the ajax call does not die
405 // 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 define( 'VISUALIZER_DO_NOT_DIE', true );
407 }
408
409 $new_schedules = array();
410 $now = time();
411 foreach ( $schedules as $chart_id => $time ) {
412 $new_schedules[ $chart_id ] = $time;
413 if ( $time > $now ) {
414 continue;
415 }
416
417 // if the time is nigh, we force an update.
418 $this->refresh_db_for_chart( null, $chart_id, true );
419 // Clear existing chart cache.
420 $cache_key = Visualizer_Plugin::CF_CHART_CACHE . '_' . $chart_id;
421 if ( get_transient( $cache_key ) ) {
422 delete_transient( $cache_key );
423 }
424 $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
425 $new_schedules[ $chart_id ] = time() + $hours * HOUR_IN_SECONDS;
426 }
427 update_option( Visualizer_Plugin::CF_DB_SCHEDULE, $new_schedules );
428 }
429
430 /**
431 * Save flag for existing users.
432 */
433 public function checkIsExistingUser() {
434 $chart_exists = get_option( 'visualizer-new-user', '' );
435 if ( '' === $chart_exists ) {
436 $charts = get_posts(
437 array(
438 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
439 'fields' => 'ids',
440 )
441 );
442 update_option( 'visualizer-new-user', ! empty( $charts ) ? 'no' : 'yes' );
443 }
444 }
445
446 }
447