PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.4.2
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.4.2
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
← All changes | classes/Visualizer/Module/Setup.php +232 -10 3.0.93.4.2 View file →
@@ -41,12 +41,21 @@
41 41 */
42 42 public function __construct( Visualizer_Plugin $plugin ) {
43 43 parent::__construct( $plugin );
44 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' );
45 51 $this->_addAction( 'init', 'setupCustomPostTypes' );
46 52 $this->_addAction( 'plugins_loaded', 'loadTextDomain' );
47 53 $this->_addFilter( 'visualizer_logger_data', 'getLoggerData' );
48 - $this->_addFilter( 'visualizer_get_chart_counts', 'getChartCountsByTypeAndMeta' );
54 + $this->_addFilter( 'visualizer_get_chart_counts', 'getUsage', 10, 2 );
55 +
56 + // only for testing
57 + // $this->_addAction( 'admin_init', 'getUsage' );
49 58 }
50 59 /**
51 60 * Fetches the SDK logger data.
52 61 *
@@ -54,36 +63,82 @@
54 63 *
55 64 * @access public
56 65 */
57 66 public function getLoggerData( $data ) {
58 - return $this->getChartCountsByTypeAndMeta();
67 + return $this->getUsage( $data );
59 68 }
60 69
61 70 /**
62 - * Fetches the types of charts created and their counts.
71 + * Fetches the usage of charts.
63 72 *
73 + * @param array $data The default data that needs to be sent.
64 74 * @param array $meta_keys An array of name vs. meta keys - to return how many charts have these keys.
65 - * @access private
75 + *
76 + * @access public
66 77 */
67 - public function getChartCountsByTypeAndMeta( $meta_keys = array() ) {
68 - $charts = array();
69 - $charts['chart_types'] = array();
70 - // the initial query arguments to fetch charts
78 + public function getUsage( $data, $meta_keys = array() ) {
79 + $charts = array( 'types' => array(), 'sources' => array(), 'library' => array(), 'permissions' => 0, 'manual_config' => 0, 'scheduled' => 0 );
71 80 $query_args = array(
72 81 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
73 82 'posts_per_page' => 300,
83 + 'post_status' => 'publish',
74 84 'fields' => 'ids',
75 85 'no_rows_found' => false,
76 86 'update_post_meta_cache' => false,
77 87 'update_post_term_cache' => false,
88 + );
78 89
90 + // default permissions.
91 + $default_perms = array(
92 + 'read' => 'all',
93 + 'read-specific' => null,
94 + 'edit' => 'roles',
95 + 'edit-specific' => array( 'administrator' ),
79 96 );
80 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 + );
81 103 $query = new WP_Query( $query_args );
82 104 while ( $query->have_posts() ) {
83 105 $chart_id = $query->next_post();
84 106 $type = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, true );
85 - $charts['chart_types'][ $type ] = isset( $charts['chart_types'][ $type ] ) ? $charts['chart_types'][ $type ] + 1 : 1;
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 +
86 141 if ( ! empty( $meta_keys ) ) {
87 142 foreach ( $meta_keys as $name => $key ) {
88 143 $data = get_post_meta( $chart_id, $key, true );
89 144 if ( ! empty( $data ) ) {
@@ -93,8 +148,9 @@
93 148 }
94 149 }
95 150 }
96 151 }
152 +
97 153 return $charts;
98 154 }
99 155
100 156 /**
@@ -106,12 +162,16 @@
106 162 * @access public
107 163 */
108 164 public function setupCustomPostTypes() {
109 165 register_post_type(
110 - Visualizer_Plugin::CPT_VISUALIZER, array(
166 + Visualizer_Plugin::CPT_VISUALIZER,
167 + array(
111 168 'label' => 'Visualizer Charts',
112 169 'public' => false,
113 170 'supports' => array( 'revisions' ),
171 + 'show_in_rest' => true,
172 + 'rest_base' => 'visualizer',
173 + 'rest_controller_class' => 'WP_REST_Posts_Controller',
114 174 )
115 175 );
116 176 }
117 177
@@ -124,7 +184,169 @@
124 184 * @access public
125 185 */
126 186 public function loadTextDomain() {
127 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 );
128 350 }
129 351
130 352 }