Plugin Directory

source: visualizer/trunk/classes/Visualizer/Module/Setup.php

Last change on this file was 3474710, checked in by themeisle, 3 weeks ago

Update to version 3.11.15 from GitHub

File size: 15.3 KB
Line 
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 */
30class 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->_addFilter( 'cron_schedules', 'custom_cron_schedules' );
53                $this->_addAction( 'plugins_loaded', 'loadTextDomain' );
54                $this->_addFilter( 'visualizer_logger_data', 'getLoggerData' );
55                $this->_addFilter( 'visualizer_get_chart_counts', 'getUsage', 10, 2 );
56
57                $this->_addAction( 'init', 'checkIsExistingUser' );
58
59                // only for testing
60                // $this->_addAction( 'admin_init', 'getUsage' );
61        }
62        /**
63         * Fetches the SDK logger data.
64         *
65         * @param array $data The default data that needs to be sent.
66         *
67         * @access public
68         */
69        public function getLoggerData( $data ) {
70                return $this->getUsage( $data );
71        }
72
73        /**
74         * Fetches the usage of charts.
75         *
76         * @param array $data The default data that needs to be sent.
77         * @param array $meta_keys An array of name vs. meta keys - to return how many charts have these keys.
78         *
79         * @access public
80         */
81        public function getUsage( $data, $meta_keys = array() ) {
82                $charts                 = array( 'types' => array(), 'sources' => array(), 'library' => array(), 'permissions' => 0, 'manual_config' => 0, 'scheduled' => 0 );
83                $query_args = array(
84                        'post_type'         => Visualizer_Plugin::CPT_VISUALIZER,
85                        'posts_per_page'    => 300,
86                        'post_status'       => 'publish',
87                        'fields'            => 'ids',
88                        'no_rows_found'     => false,
89                        'update_post_meta_cache' => false,
90                        'update_post_term_cache' => false,
91                );
92
93                // default permissions.
94                $default_perms = array(
95                        'read'          => 'all',
96                        'read-specific' => null,
97                        'edit'          => 'roles',
98                        'edit-specific' => array( 'administrator' ),
99                );
100
101                // collect all schedules chart ids.
102                $scheduled      = array_merge(
103                        array_keys( get_option( Visualizer_Plugin::CF_CHART_SCHEDULE, array() ) ),
104                        array_keys( get_option( Visualizer_Plugin::CF_DB_SCHEDULE, array() ) )
105                );
106                $query  = new WP_Query( $query_args );
107                while ( $query->have_posts() ) {
108                        $chart_id   = $query->next_post();
109                        $type       = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, true );
110                        $charts['types'][ $type ]    = isset( $charts['types'][ $type ] ) ? $charts['types'][ $type ] + 1 : 1;
111                        $source     = get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true );
112                        $charts['sources'][ $source ]    = isset( $charts['sources'][ $source ] ) ? $charts['sources'][ $source ] + 1 : 1;
113                        $lib     = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_LIBRARY, true );
114                        $charts['library'][ $lib ]    = isset( $charts['library'][ $lib ] ) ? $charts['library'][ $lib ] + 1 : 1;
115                        $settings       = get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, true );
116                        if ( array_key_exists( 'manual', $settings ) && ! empty( $settings['manual'] ) ) {
117                                $charts['manual_config']    = $charts['manual_config'] + 1;
118                        }
119
120                        // phpcs:ignore WordPress.PHP.StrictInArray.FoundNonStrictFalse
121                        if ( in_array( $chart_id, $scheduled, false ) ) {
122                                $charts['scheduled']    = $charts['scheduled'] + 1;
123                        }
124
125                        if ( Visualizer_Module::is_pro() ) {
126                                $permissions = get_post_meta( $chart_id, Visualizer_Pro::CF_PERMISSIONS, true );
127                                if ( empty( $permissions ) ) {
128                                        continue;
129                                }
130                                $permissions = $permissions['permissions'];
131                                $customized = false;
132                                foreach ( $default_perms as $key => $val ) {
133                                        if ( ! is_array( $val ) && ! is_null( $val ) && isset( $permissions[ $key ] ) && $permissions[ $key ] !== $val ) {
134                                                $customized = true;
135                                        } elseif ( is_array( $val ) && ! is_null( $val ) && isset( $permissions[ $key ] ) && count( $permissions[ $key ] ) !== count( $val ) ) {
136                                                $customized = true;
137                                        }
138                                }
139                                if ( $customized ) {
140                                        $charts['permissions'] = $charts['permissions'] + 1;
141                                }
142                        }
143
144                        if ( ! empty( $meta_keys ) ) {
145                                foreach ( $meta_keys as $name => $key ) {
146                                        $data   = get_post_meta( $chart_id, $key, true );
147                                        if ( ! empty( $data ) ) {
148                                                $charts[ $name ] = isset( $charts[ $name ] ) ? $charts[ $name ] + 1 : 1;
149                                        } else {
150                                                $charts[ $name ] = 0;
151                                        }
152                                }
153                        }
154                }
155
156                return $charts;
157        }
158
159        /**
160         * Registers custom post type for charts.
161         *
162         * @since 1.0.0
163         * @uses register_post_type() To register custom post type for charts.
164         *
165         * @access public
166         */
167        public function setupCustomPostTypes() {
168                register_post_type(
169                        Visualizer_Plugin::CPT_VISUALIZER,
170                        array(
171                                'label'  => 'Visualizer Charts',
172                                'public' => false,
173                                'supports' => array( 'revisions' ),
174                                'show_in_rest'          => true,
175                                'rest_base'             => 'visualizer',
176                                'rest_controller_class' => 'WP_REST_Posts_Controller',
177                        )
178                );
179        }
180
181        /**
182         * Loads plugin text domain translations.
183         *
184         * @since 1.0.0
185         * @uses load_plugin_textdomain() To load translations for the plugin.
186         *
187         * @access public
188         */
189        public function loadTextDomain() {
190                load_plugin_textdomain( Visualizer_Plugin::NAME, false, dirname( plugin_basename( VISUALIZER_BASEFILE ) ) . '/languages/' );
191        }
192
193        /**
194         * Activate the plugin
195         */
196        public function activate( $network_wide ) {
197                if ( is_multisite() && $network_wide ) {
198                        foreach ( get_sites( array( 'fields' => 'ids' ) ) as $blog_id ) {
199                                switch_to_blog( $blog_id );
200                                $this->activate_on_site();
201                                restore_current_blog();
202                        }
203                } else {
204                        $this->activate_on_site();
205                }
206        }
207
208        /**
209         * Activates the plugin on a particular blog instance (supports multisite and single site).
210         */
211        private function activate_on_site() {
212                wp_clear_scheduled_hook( 'visualizer_schedule_refresh_db' );
213                wp_schedule_event( strtotime( 'midnight' ) - get_option( 'gmt_offset' ) * HOUR_IN_SECONDS, apply_filters( 'visualizer_chart_schedule_interval', 'visualizer_ten_minutes' ), 'visualizer_schedule_refresh_db' );
214                add_option( 'visualizer-activated', true );
215                $is_fresh_install  = get_option( 'visualizer_fresh_install', false );
216                if ( ! defined( 'TI_E2E_TESTING' ) && false === $is_fresh_install ) {
217                        update_option( 'visualizer_fresh_install', '1' );
218                }
219        }
220
221        /**
222         * Deactivate the plugin
223         */
224        public function deactivate( $network_wide ) {
225                if ( is_multisite() && $network_wide ) {
226                        foreach ( get_sites( array( 'fields' => 'ids' ) ) as $blog_id ) {
227                                switch_to_blog( $blog_id );
228                                $this->deactivate_on_site();
229                                restore_current_blog();
230                        }
231                } else {
232                        $this->deactivate_on_site();
233                }
234        }
235
236        /**
237         * Deactivates the plugin on a particular blog instance (supports multisite and single site).
238         */
239        private function deactivate_on_site() {
240                wp_clear_scheduled_hook( 'visualizer_schedule_refresh_db' );
241                delete_option( 'visualizer-activated', true );
242        }
243
244        /**
245         * Check if plugin has been activated and then redirect to the correct page.
246         */
247        public function adminInit() {
248                if ( defined( 'TI_UNIT_TESTING' ) ) {
249                        return;
250                }
251
252                define( 'VISUALIZER_SURVEY', Visualizer_Module::is_pro() ? 'https://forms.gle/7Zo7FuZbvQ8DTvRi6' : 'https://forms.gle/muMtbcyvHn1aTvmJ7' );
253                // fire any upgrades necessary.
254                Visualizer_Module_Upgrade::upgrade();
255
256                if ( get_option( 'visualizer-activated' ) ) {
257                        delete_option( 'visualizer-activated' );
258                        if ( ! headers_sent() ) {
259                                if ( ! Visualizer_Module::is_pro() && ! empty( get_option( 'visualizer_fresh_install', false ) ) ) {
260                                        $redirect_url = array(
261                                                'page' => 'visualizer-setup-wizard',
262                                                'tab'  => '#step-1',
263                                        );
264                                } else {
265                                        $page_name    = Visualizer_Module::numberOfCharts() > 0 ? Visualizer_Plugin::NAME : 'viz-support';
266                                        $redirect_url = array(
267                                                'page' => $page_name,
268                                        );
269                                }
270                                wp_safe_redirect(
271                                        add_query_arg(
272                                                $redirect_url,
273                                                admin_url( 'admin.php' )
274                                        )
275                                );
276                                exit();
277                        }
278                }
279        }
280
281
282        /**
283         * Refresh the specific chart from the db.
284         *
285         * @param WP_Post|null $chart The chart object.
286         * @param int          $chart_id The chart id.
287         * @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.
288         *
289         * @access public
290         */
291        public function refresh_db_for_chart( $chart, $chart_id, $force = false ) {
292                if ( ! $chart_id ) {
293                        return $chart;
294                }
295
296                if ( ! $chart ) {
297                        $chart = get_post( $chart_id );
298                }
299
300                if ( ! $chart ) {
301                        return $chart;
302                }
303
304                // check if the source is correct.
305                $source     = get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true );
306                $load_series = false;
307                switch ( $source ) {
308                        case 'Visualizer_Source_Query':
309                                // check if its a live-data chart or a cached-data chart.
310                                if ( ! $force ) {
311                                        $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
312                                        if ( ! empty( $hours ) ) {
313                                                // cached, bail!
314                                                return $chart;
315                                        }
316                                }
317
318                                $params     = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_QUERY, true );
319                                $source     = new Visualizer_Source_Query( $params, $chart_id );
320                                $source->fetch( false );
321                                $load_series = true;
322                                break;
323                        case 'Visualizer_Source_Json':
324                                // check if its a live-data chart or a cached-data chart.
325                                if ( ! $force ) {
326                                        $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE, true );
327                                        if ( ! empty( $hours ) ) {
328                                                // cached, bail!
329                                                return $chart;
330                                        }
331                                }
332
333                                $url        = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_URL, true );
334                                $root       = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_ROOT, true );
335                                $paging     = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_PAGING, true );
336                                $series     = get_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, true );
337                                $source     = new Visualizer_Source_Json( array( 'url' => $url, 'root' => $root, 'paging' => $paging ) );
338                                $source->refresh( $series );
339                                break;
340                        case 'Visualizer_Source_Csv_Remote':
341                                // check if its a live-data chart or a cached-data chart.
342                                if ( ! $force ) {
343                                        $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_SCHEDULE, true );
344                                        if ( ! empty( $hours ) ) {
345                                                // cached, bail!
346                                                return $chart;
347                                        }
348                                }
349                                do_action( 'visualizer_schedule_import' );
350                                return get_post( $chart_id );
351                        default:
352                                return $chart;
353                }
354
355                $error      = $source->get_error();
356                if ( empty( $error ) ) {
357                        $this->disableRevisionsTemporarily();
358                        if ( $load_series ) {
359                                update_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
360                        }
361
362                        $allow_html = false;
363                        $settings   = get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, true );
364                        if ( isset( $settings['allowHtml'] ) && intval( $settings['allowHtml'] ) === 1 ) {
365                                $allow_html = true;
366                        }
367
368                        $allow_html = apply_filters( 'visualizer_allow_html_content', $allow_html, $chart_id, $chart );
369
370                        if ( $allow_html ) {
371                                kses_remove_filters();
372                        }
373
374                        wp_update_post(
375                                array(
376                                        'ID'            => $chart_id,
377                                        'post_content'  => $source->getData( get_post_meta( $chart_id, Visualizer_Plugin::CF_EDITABLE_TABLE, true ) ),
378                                )
379                        );
380
381                        if ( $allow_html ) {
382                                kses_init_filters();
383                        }
384
385                        $chart = get_post( $chart_id );
386                        delete_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR );
387                } else {
388                        update_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR, sprintf( 'Error while updating chart: %s', $error ) );
389                }
390
391                return $chart;
392        }
393
394        /**
395         * Refresh the Database chart type.
396         *
397         * @access public
398         */
399        public function refreshDbChart() {
400                // NOTE: This use a different key from normal schedule. Updated only by Database chart. Check `visualizer_schedule_import` action.
401                $chart_schedules = get_option( Visualizer_Plugin::CF_DB_SCHEDULE, array() );
402                if ( ! $chart_schedules ) {
403                        return;
404                }
405
406                if ( ! defined( 'VISUALIZER_DO_NOT_DIE' ) ) {
407                        // define this so that the ajax call does not die
408                        // this means that if the new version of pro and the old version of free are installed, only the first chart will be updated
409                        define( 'VISUALIZER_DO_NOT_DIE', true );
410                }
411
412                $new_schedules = array();
413                $current_time  = time();
414                foreach ( $chart_schedules as $chart_id => $scheduled_time ) {
415
416                        // Skip deleted charts.
417                        if ( false === get_post_status( $chart_id ) ) {
418                                continue;
419                        }
420
421                        $new_schedules[ $chart_id ] = $scheduled_time;
422
423                        // Should we do an update?
424                        if ( $scheduled_time > $current_time ) {
425                                continue;
426                        }
427
428                        $this->refresh_db_for_chart( null, $chart_id, true );
429
430                        // Clear existing chart cache.
431                        $cache_key = Visualizer_Plugin::CF_CHART_CACHE . '_' . $chart_id;
432                        if ( get_transient( $cache_key ) ) {
433                                delete_transient( $cache_key );
434                        }
435
436                        $scheduled_hours            = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
437                        $new_schedules[ $chart_id ] = $current_time + $scheduled_hours * HOUR_IN_SECONDS;
438                }
439                update_option( Visualizer_Plugin::CF_DB_SCHEDULE, $new_schedules );
440        }
441
442        /**
443         * Save flag for existing users.
444         */
445        public function checkIsExistingUser() {
446                $chart_exists = get_option( 'visualizer-new-user', '' );
447                if ( '' === $chart_exists ) {
448                        $charts = get_posts(
449                                array(
450                                        'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
451                                        'fields' => 'ids',
452                                )
453                        );
454                        update_option( 'visualizer-new-user', ! empty( $charts ) ? 'no' : 'yes' );
455                }
456        }
457
458        /**
459         * Add custom cron schedules.
460         *
461         * @param array $schedules The current schedules options.
462         * @return array The modified schedules options.
463         */
464        public function custom_cron_schedules( $schedules ) {
465                $schedules['visualizer_ten_minutes'] = array(
466                        'interval' => 600,
467                        'display'  => __( 'Every 10 minutes', 'visualizer' ),
468                );
469
470                return $schedules;
471        }
472}
Note: See TracBrowser for help on using the repository browser.