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

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