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
visualizer / classes / Visualizer / Module / Setup.php

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

404 lines 13.2 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 // only for testing
57 // $this->_addAction( 'admin_init', 'getUsage' );
58 }
59 /**
60 * Fetches the SDK logger data.
61 *
62 * @param array $data The default data that needs to be sent.
63 *
64 * @access public
65 */
66 public function getLoggerData( $data ) {
67 return $this->getUsage( $data );
68 }
69
70 /**
71 * Fetches the usage of charts.
72 *
73 * @param array $data The default data that needs to be sent.
74 * @param array $meta_keys An array of name vs. meta keys - to return how many charts have these keys.
75 *
76 * @access public
77 */
78 public function getUsage( $data, $meta_keys = array() ) {
79 $charts = array( 'types' => array(), 'sources' => array(), 'library' => array(), 'permissions' => 0, 'manual_config' => 0, 'scheduled' => 0 );
80 $query_args = array(
81 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
82 'posts_per_page' => 300,
83 'post_status' => 'publish',
84 'fields' => 'ids',
85 'no_rows_found' => false,
86 'update_post_meta_cache' => false,
87 'update_post_term_cache' => false,
88 );
89
90 // default permissions.
91 $default_perms = array(
92 'read' => 'all',
93 'read-specific' => null,
94 'edit' => 'roles',
95 'edit-specific' => array( 'administrator' ),
96 );
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 );
103 $query = new WP_Query( $query_args );
104 while ( $query->have_posts() ) {
105 $chart_id = $query->next_post();
106 $type = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, true );
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
141 if ( ! empty( $meta_keys ) ) {
142 foreach ( $meta_keys as $name => $key ) {
143 $data = get_post_meta( $chart_id, $key, true );
144 if ( ! empty( $data ) ) {
145 $charts[ $name ] = isset( $charts[ $name ] ) ? $charts[ $name ] + 1 : 1;
146 } else {
147 $charts[ $name ] = 0;
148 }
149 }
150 }
151 }
152
153 return $charts;
154 }
155
156 /**
157 * Registers custom post type for charts.
158 *
159 * @since 1.0.0
160 * @uses register_post_type() To register custom post type for charts.
161 *
162 * @access public
163 */
164 public function setupCustomPostTypes() {
165 register_post_type(
166 Visualizer_Plugin::CPT_VISUALIZER,
167 array(
168 'label' => 'Visualizer Charts',
169 'public' => false,
170 'supports' => array( 'revisions' ),
171 'show_in_rest' => true,
172 'rest_base' => 'visualizer',
173 'rest_controller_class' => 'WP_REST_Posts_Controller',
174 )
175 );
176 }
177
178 /**
179 * Loads plugin text domain translations.
180 *
181 * @since 1.0.0
182 * @uses load_plugin_textdomain() To load translations for the plugin.
183 *
184 * @access public
185 */
186 public function loadTextDomain() {
187 load_plugin_textdomain( Visualizer_Plugin::NAME, false, dirname( plugin_basename( VISUALIZER_BASEFILE ) ) . '/languages/' );
188 }
189
190 /**
191 * Activate the plugin
192 */
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() {
209 wp_clear_scheduled_hook( 'visualizer_schedule_refresh_db' );
210 wp_schedule_event( strtotime( 'midnight' ) - get_option( 'gmt_offset' ) * HOUR_IN_SECONDS, 'hourly', 'visualizer_schedule_refresh_db' );
211 add_option( 'visualizer-activated', true );
212 }
213
214 /**
215 * Deactivate the plugin
216 */
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() {
233 wp_clear_scheduled_hook( 'visualizer_schedule_refresh_db' );
234 delete_option( 'visualizer-activated', true );
235 }
236
237 /**
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.
261 *
262 * @param WP_Post $chart The chart object.
263 * @param int $chart_id The chart id.
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.
265 *
266 * @access public
267 */
268 public function refresh_db_for_chart( $chart, $chart_id, $force = false ) {
269 if ( ! $chart_id ) {
270 return $chart;
271 }
272
273 if ( ! $chart ) {
274 $chart = get_post( $chart_id );
275 }
276
277 if ( ! $chart ) {
278 return $chart;
279 }
280
281 // check if the source is correct.
282 $source = get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true );
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;
330 }
331
332 $error = $source->get_error();
333 if ( empty( $error ) ) {
334 $this->disableRevisionsTemporarily();
335 if ( $load_series ) {
336 update_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
337 }
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
351 wp_update_post(
352 array(
353 'ID' => $chart_id,
354 'post_content' => $source->getData( get_post_meta( $chart_id, Visualizer_Plugin::CF_EDITABLE_TABLE, true ) ),
355 )
356 );
357
358 if ( $allow_html ) {
359 kses_init_filters();
360 }
361
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 ) );
366 }
367
368 return $chart;
369 }
370
371 /**
372 * Refresh the db chart.
373 *
374 * @access public
375 */
376 public function refreshDbChart() {
377 $schedules = get_option( Visualizer_Plugin::CF_DB_SCHEDULE, array() );
378 if ( ! $schedules ) {
379 return;
380 }
381 if ( ! defined( 'VISUALIZER_DO_NOT_DIE' ) ) {
382 // define this so that the ajax call does not die
383 // this means that if the new version of pro and the old version of free are installed, only the first chart will be updated
384 define( 'VISUALIZER_DO_NOT_DIE', true );
385 }
386
387 $new_schedules = array();
388 $now = time();
389 foreach ( $schedules as $chart_id => $time ) {
390 $new_schedules[ $chart_id ] = $time;
391 if ( $time > $now ) {
392 continue;
393 }
394
395 // if the time is nigh, we force an update.
396 $this->refresh_db_for_chart( null, $chart_id, true );
397 $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
398 $new_schedules[ $chart_id ] = time() + $hours * HOUR_IN_SECONDS;
399 }
400 update_option( Visualizer_Plugin::CF_DB_SCHEDULE, $new_schedules );
401 }
402
403 }
404