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

428 lines 14.0 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 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 }
258 }
259 }
260
261
262 /**
263 * Refresh the specific chart from the db.
264 *
265 * @param WP_Post $chart The chart object.
266 * @param int $chart_id The chart id.
267 * @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.
268 *
269 * @access public
270 */
271 public function refresh_db_for_chart( $chart, $chart_id, $force = false ) {
272 if ( ! $chart_id ) {
273 return $chart;
274 }
275
276 if ( ! $chart ) {
277 $chart = get_post( $chart_id );
278 }
279
280 if ( ! $chart ) {
281 return $chart;
282 }
283
284 // check if the source is correct.
285 $source = get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true );
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 }
297
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:
332 return $chart;
333 }
334
335 $error = $source->get_error();
336 if ( empty( $error ) ) {
337 $this->disableRevisionsTemporarily();
338 if ( $load_series ) {
339 update_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
340 }
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
354 wp_update_post(
355 array(
356 'ID' => $chart_id,
357 'post_content' => $source->getData( get_post_meta( $chart_id, Visualizer_Plugin::CF_EDITABLE_TABLE, true ) ),
358 )
359 );
360
361 if ( $allow_html ) {
362 kses_init_filters();
363 }
364
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 ) );
369 }
370
371 return $chart;
372 }
373
374 /**
375 * Refresh the db chart.
376 *
377 * @access public
378 */
379 public function refreshDbChart() {
380 $schedules = get_option( Visualizer_Plugin::CF_DB_SCHEDULE, array() );
381 if ( ! $schedules ) {
382 return;
383 }
384 if ( ! defined( 'VISUALIZER_DO_NOT_DIE' ) ) {
385 // define this so that the ajax call does not die
386 // this means that if the new version of pro and the old version of free are installed, only the first chart will be updated
387 define( 'VISUALIZER_DO_NOT_DIE', true );
388 }
389
390 $new_schedules = array();
391 $now = time();
392 foreach ( $schedules as $chart_id => $time ) {
393 $new_schedules[ $chart_id ] = $time;
394 if ( $time > $now ) {
395 continue;
396 }
397
398 // if the time is nigh, we force an update.
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 }
405 $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
406 $new_schedules[ $chart_id ] = time() + $hours * HOUR_IN_SECONDS;
407 }
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 }
425 }
426
427 }
428