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

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