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

358 lines 11.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 // 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() {
194 wp_clear_scheduled_hook( 'visualizer_schedule_refresh_db' );
195 wp_schedule_event( strtotime( 'midnight' ) - get_option( 'gmt_offset' ) * HOUR_IN_SECONDS, 'hourly', 'visualizer_schedule_refresh_db' );
196 add_option( 'visualizer-activated', true );
197 }
198
199 /**
200 * Check if plugin has been activated and then redirect to the correct page.
201 */
202 public function adminInit() {
203 if ( defined( 'TI_UNIT_TESTING' ) ) {
204 return;
205 }
206
207 // fire any upgrades necessary.
208 Visualizer_Module_Upgrade::upgrade();
209
210 if ( get_option( 'visualizer-activated' ) ) {
211 delete_option( 'visualizer-activated' );
212 if ( ! headers_sent() ) {
213 $page_name = Visualizer_Module::numberOfCharts() > 0 ? Visualizer_Plugin::NAME : 'viz-support';
214 wp_redirect( add_query_arg( 'page', $page_name, admin_url( 'admin.php' ) ) );
215 exit();
216 }
217 }
218 }
219
220
221 /**
222 * Deactivate the plugin
223 */
224 public function deactivate() {
225 wp_clear_scheduled_hook( 'visualizer_schedule_refresh_db' );
226 delete_option( 'visualizer-activated', true );
227 }
228
229 /**
230 * Refresh the specific chart from the db.
231 *
232 * @param WP_Post $chart The chart object.
233 * @param int $chart_id The chart id.
234 * @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.
235 *
236 * @access public
237 */
238 public function refresh_db_for_chart( $chart, $chart_id, $force = false ) {
239 if ( ! $chart_id ) {
240 return $chart;
241 }
242
243 if ( ! $chart ) {
244 $chart = get_post( $chart_id );
245 }
246
247 if ( ! $chart ) {
248 return $chart;
249 }
250
251 // check if the source is correct.
252 $source = get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true );
253 $load_series = false;
254 switch ( $source ) {
255 case 'Visualizer_Source_Query':
256 // check if its a live-data chart or a cached-data chart.
257 if ( ! $force ) {
258 $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
259 if ( ! empty( $hours ) ) {
260 // cached, bail!
261 return $chart;
262 }
263 }
264
265 $params = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_QUERY, true );
266 $source = new Visualizer_Source_Query( $params, $chart_id );
267 $source->fetch( false );
268 $load_series = true;
269 break;
270 case 'Visualizer_Source_Json':
271 // check if its a live-data chart or a cached-data chart.
272 if ( ! $force ) {
273 $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE, true );
274 if ( ! empty( $hours ) ) {
275 // cached, bail!
276 return $chart;
277 }
278 }
279
280 $url = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_URL, true );
281 $root = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_ROOT, true );
282 $paging = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_PAGING, true );
283 $series = get_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, true );
284 $source = new Visualizer_Source_Json( array( 'url' => $url, 'root' => $root, 'paging' => $paging ) );
285 $source->refresh( $series );
286 break;
287 case 'Visualizer_Source_Csv_Remote':
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_CHART_SCHEDULE, true );
291 if ( ! empty( $hours ) ) {
292 // cached, bail!
293 return $chart;
294 }
295 }
296 do_action( 'visualizer_schedule_import' );
297 return get_post( $chart_id );
298 default:
299 return $chart;
300 }
301
302 $error = $source->get_error();
303 if ( empty( $error ) ) {
304 $this->disableRevisionsTemporarily();
305 if ( $load_series ) {
306 update_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
307 }
308
309 wp_update_post(
310 array(
311 'ID' => $chart_id,
312 'post_content' => $source->getData(),
313 )
314 );
315
316 $chart = get_post( $chart_id );
317 delete_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR );
318 } else {
319 update_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR, sprintf( 'Error while updating chart: %s', $error ) );
320 }
321
322 return $chart;
323 }
324
325 /**
326 * Refresh the db chart.
327 *
328 * @access public
329 */
330 public function refreshDbChart() {
331 $schedules = get_option( Visualizer_Plugin::CF_DB_SCHEDULE, array() );
332 if ( ! $schedules ) {
333 return;
334 }
335 if ( ! defined( 'VISUALIZER_DO_NOT_DIE' ) ) {
336 // define this so that the ajax call does not die
337 // this means that if the new version of pro and the old version of free are installed, only the first chart will be updated
338 define( 'VISUALIZER_DO_NOT_DIE', true );
339 }
340
341 $new_schedules = array();
342 $now = time();
343 foreach ( $schedules as $chart_id => $time ) {
344 $new_schedules[ $chart_id ] = $time;
345 if ( $time > $now ) {
346 continue;
347 }
348
349 // if the time is nigh, we force an update.
350 $this->refresh_db_for_chart( null, $chart_id, true );
351 $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
352 $new_schedules[ $chart_id ] = time() + $hours * HOUR_IN_SECONDS;
353 }
354 update_option( Visualizer_Plugin::CF_DB_SCHEDULE, $new_schedules );
355 }
356
357 }
358