PluginProbe ʕ •ᴥ•ʔ
Post Views Counter / 1.2.9
Post Views Counter v1.2.9
1.7.13 1.7.12 1.7.11 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.2.0 1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3 1.3.1 1.3.10 1.3.11 1.3.12 1.3.13 1.3.2 1.3.2.1 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.7.0 1.7.1 1.7.10 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9
post-views-counter / post-views-counter.php
post-views-counter Last commit date
css 8 years ago images 8 years ago includes 8 years ago js 8 years ago languages 8 years ago index.php 8 years ago post-views-counter.php 8 years ago readme.txt 8 years ago
post-views-counter.php
495 lines
1 <?php
2 /*
3 Plugin Name: Post Views Counter
4 Description: Post Views Counter allows you to display how many times a post, page or custom post type had been viewed in a simple, fast and reliable way.
5 Version: 1.2.9
6 Author: dFactory
7 Author URI: http://www.dfactory.eu/
8 Plugin URI: http://www.dfactory.eu/plugins/post-views-counter/
9 License: MIT License
10 License URI: http://opensource.org/licenses/MIT
11 Text Domain: post-views-counter
12 Domain Path: /languages
13
14 Post Views Counter
15 Copyright (C) 2014-2017, Digital Factory - info@digitalfactory.pl
16
17 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
18
19 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
20
21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */
23
24 // exit if accessed directly
25 if ( ! defined( 'ABSPATH' ) )
26 exit;
27
28 if ( ! class_exists( 'Post_Views_Counter' ) ) :
29
30 /**
31 * Post Views Counter final class.
32 *
33 * @class Post_Views_Counter
34 * @version 1.2.9
35 */
36 final class Post_Views_Counter {
37
38 private static $instance;
39 public $options;
40 public $defaults = array(
41 'general' => array(
42 'post_types_count' => array( 'post' ),
43 'counter_mode' => 'php',
44 'post_views_column' => true,
45 'time_between_counts' => array(
46 'number' => 24,
47 'type' => 'hours'
48 ),
49 'reset_counts' => array(
50 'number' => 30,
51 'type' => 'days'
52 ),
53 'flush_interval' => array(
54 'number' => 0,
55 'type' => 'minutes'
56 ),
57 'exclude' => array(
58 'groups' => array(),
59 'roles' => array()
60 ),
61 'exclude_ips' => array(),
62 'restrict_edit_views' => false,
63 'deactivation_delete' => false,
64 'cron_run' => true,
65 'cron_update' => true
66 ),
67 'display' => array(
68 'label' => 'Post Views:',
69 'post_types_display' => array( 'post' ),
70 'page_types_display' => array( 'singular' ),
71 'restrict_display' => array(
72 'groups' => array(),
73 'roles' => array()
74 ),
75 'position' => 'after',
76 'display_style' => array(
77 'icon' => true,
78 'text' => true
79 ),
80 'link_to_post' => true,
81 'icon_class' => 'dashicons-chart-bar'
82 ),
83 'version' => '1.2.9'
84 );
85
86 /**
87 * Disable object clone.
88 */
89 private function __clone() {
90
91 }
92
93 /**
94 * Disable unserializing of the class.
95 */
96 private function __wakeup() {
97
98 }
99
100 /**
101 * Main plugin instance,
102 * Insures that only one instance of the plugin exists in memory at one time.
103 *
104 * @return object
105 */
106 public static function instance() {
107 if ( ! isset( self::$instance ) && ! ( self::$instance instanceof Post_Views_Counter ) ) {
108
109 self::$instance = new Post_Views_Counter;
110 self::$instance->define_constants();
111
112 add_action( 'plugins_loaded', array( self::$instance, 'load_textdomain' ) );
113
114 self::$instance->includes();
115
116 self::$instance->update = new Post_Views_Counter_Update();
117 self::$instance->settings = new Post_Views_Counter_Settings();
118 self::$instance->query = new Post_Views_Counter_Query();
119 self::$instance->cron = new Post_Views_Counter_Cron();
120 self::$instance->counter = new Post_Views_Counter_Counter();
121 self::$instance->columns = new Post_Views_Counter_Columns();
122 self::$instance->crawler_detect = new Post_Views_Counter_Crawler_Detect();
123 self::$instance->frontend = new Post_Views_Counter_Frontend();
124 self::$instance->dashboard = new Post_Views_Counter_Dashboard();
125 self::$instance->widgets = new Post_Views_Counter_Widgets();
126 }
127 return self::$instance;
128 }
129
130 /**
131 * Setup plugin constants.
132 *
133 * @return void
134 */
135 private function define_constants() {
136 define( 'POST_VIEWS_COUNTER_URL', plugins_url( '', __FILE__ ) );
137 define( 'POST_VIEWS_COUNTER_PATH', plugin_dir_path( __FILE__ ) );
138 define( 'POST_VIEWS_COUNTER_REL_PATH', dirname( plugin_basename( __FILE__ ) ) . '/' );
139 }
140
141 /**
142 * Include required files.
143 *
144 * @return void
145 */
146 private function includes() {
147 include_once( POST_VIEWS_COUNTER_PATH . 'includes/update.php' );
148 include_once( POST_VIEWS_COUNTER_PATH . 'includes/settings.php' );
149 include_once( POST_VIEWS_COUNTER_PATH . 'includes/columns.php' );
150 include_once( POST_VIEWS_COUNTER_PATH . 'includes/query.php' );
151 include_once( POST_VIEWS_COUNTER_PATH . 'includes/cron.php' );
152 include_once( POST_VIEWS_COUNTER_PATH . 'includes/counter.php' );
153 include_once( POST_VIEWS_COUNTER_PATH . 'includes/crawler-detect.php' );
154 include_once( POST_VIEWS_COUNTER_PATH . 'includes/frontend.php' );
155 include_once( POST_VIEWS_COUNTER_PATH . 'includes/dashboard.php' );
156 include_once( POST_VIEWS_COUNTER_PATH . 'includes/widgets.php' );
157 }
158
159 /**
160 * Class constructor.
161 *
162 * @return void
163 */
164 public function __construct() {
165 register_activation_hook( __FILE__, array( $this, 'multisite_activation' ) );
166 register_deactivation_hook( __FILE__, array( $this, 'multisite_deactivation' ) );
167
168 // settings
169 $this->options = array(
170 'general' => array_merge( $this->defaults['general'], get_option( 'post_views_counter_settings_general', $this->defaults['general'] ) ),
171 'display' => array_merge( $this->defaults['display'], get_option( 'post_views_counter_settings_display', $this->defaults['display'] ) )
172 );
173
174 // actions
175 add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
176 add_action( 'wp_loaded', array( $this, 'load_pluggable_functions' ), 10 );
177
178 // filters
179 add_filter( 'plugin_row_meta', array( $this, 'plugin_row_meta' ), 10, 2 );
180 add_filter( 'plugin_action_links', array( $this, 'plugin_action_links' ), 10, 2 );
181 }
182
183 /**
184 * Multisite activation.
185 *
186 * @global object $wpdb
187 * @param bool $networkwide
188 */
189 public function multisite_activation( $networkwide ) {
190 if ( is_multisite() && $networkwide ) {
191 global $wpdb;
192
193 $activated_blogs = array();
194 $current_blog_id = $wpdb->blogid;
195 $blogs_ids = $wpdb->get_col( $wpdb->prepare( 'SELECT blog_id FROM ' . $wpdb->blogs, '' ) );
196
197 foreach ( $blogs_ids as $blog_id ) {
198 switch_to_blog( $blog_id );
199 $this->activate_single();
200 $activated_blogs[] = (int) $blog_id;
201 }
202
203 switch_to_blog( $current_blog_id );
204 update_site_option( 'post_views_counter_activated_blogs', $activated_blogs, array() );
205 } else
206 $this->activate_single();
207 }
208
209 /**
210 * Single site activation.
211 *
212 * @global array $wp_roles
213 */
214 public function activate_single() {
215 global $wpdb, $charset_collate;
216
217 // required for dbdelta
218 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
219
220 // create post views table
221 dbDelta( '
222 CREATE TABLE IF NOT EXISTS ' . $wpdb->prefix . 'post_views (
223 id bigint unsigned NOT NULL,
224 type tinyint(1) unsigned NOT NULL,
225 period varchar(8) NOT NULL,
226 count bigint unsigned NOT NULL,
227 PRIMARY KEY (type, period, id),
228 UNIQUE INDEX id_type_period_count (id, type, period, count) USING BTREE,
229 INDEX type_period_count (type, period, count) USING BTREE
230 ) ' . $charset_collate . ';'
231 );
232
233 // add default options
234 add_option( 'post_views_counter_settings_general', $this->defaults['general'], '', 'no' );
235 add_option( 'post_views_counter_settings_display', $this->defaults['display'], '', 'no' );
236 add_option( 'post_views_counter_version', $this->defaults['version'], '', 'no' );
237
238 // schedule cache flush
239 $this->schedule_cache_flush();
240 }
241
242 /**
243 * Multisite deactivation.
244 *
245 * @global array $wpdb
246 * @param bool $networkwide
247 */
248 public function multisite_deactivation( $networkwide ) {
249 if ( is_multisite() && $networkwide ) {
250 global $wpdb;
251
252 $current_blog_id = $wpdb->blogid;
253 $blogs_ids = $wpdb->get_col( $wpdb->prepare( 'SELECT blog_id FROM ' . $wpdb->blogs, '' ) );
254
255 if ( ! ($activated_blogs = get_site_option( 'post_views_counter_activated_blogs', false, false )) )
256 $activated_blogs = array();
257
258 foreach ( $blogs_ids as $blog_id ) {
259 switch_to_blog( $blog_id );
260 $this->deactivate_single( true );
261
262 if ( in_array( (int) $blog_id, $activated_blogs, true ) )
263 unset( $activated_blogs[array_search( $blog_id, $activated_blogs )] );
264 }
265
266 switch_to_blog( $current_blog_id );
267 update_site_option( 'post_views_counter_activated_blogs', $activated_blogs );
268 } else
269 $this->deactivate_single();
270 }
271
272 /**
273 * Single site deactivation.
274 *
275 * @global array $wp_roles
276 * @param bool $multi
277 */
278 public function deactivate_single( $multi = false ) {
279 if ( $multi ) {
280 $options = get_option( 'post_views_counter_settings_general' );
281 $check = $options['deactivation_delete'];
282 } else
283 $check = $this->options['general']['deactivation_delete'];
284
285 // delete default options
286 if ( $check ) {
287 delete_option( 'post_views_counter_settings_general' );
288 delete_option( 'post_views_counter_settings_display' );
289
290 global $wpdb;
291
292 // delete table from database
293 $wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'post_views' );
294 }
295
296 // remove schedule
297 wp_clear_scheduled_hook( 'pvc_reset_counts' );
298 remove_action( 'pvc_reset_counts', array( Post_Views_Counter()->cron, 'reset_counts' ) );
299
300 $this->remove_cache_flush();
301 }
302
303 /**
304 * Schedule cache flushing if it's not already scheduled.
305 *
306 * @param bool $forced
307 */
308 public function schedule_cache_flush( $forced = true ) {
309 if ( $forced || ! wp_next_scheduled( 'pvc_flush_cached_counts' ) ) {
310 wp_schedule_event( time(), 'post_views_counter_flush_interval', 'pvc_flush_cached_counts' );
311 }
312 }
313
314 /**
315 * Remove scheduled cache flush and the corresponding action.
316 */
317 public function remove_cache_flush() {
318 wp_clear_scheduled_hook( 'pvc_flush_cached_counts' );
319 remove_action( 'pvc_flush_cached_counts', array( Post_Views_Counter()->cron, 'flush_cached_counts' ) );
320 }
321
322 /**
323 * Load text domain.
324 */
325 public function load_textdomain() {
326 load_plugin_textdomain( 'post-views-counter', false, POST_VIEWS_COUNTER_REL_PATH . 'languages/' );
327 }
328
329 /**
330 * Load pluggable template functions.
331 */
332 public function load_pluggable_functions() {
333 include_once( POST_VIEWS_COUNTER_PATH . 'includes/functions.php' );
334 }
335
336 /**
337 * Enqueue admin scripts and styles.
338 *
339 * @global string $post_type
340 * @param string $page
341 */
342 public function admin_enqueue_scripts( $page ) {
343 wp_register_style(
344 'pvc-admin', POST_VIEWS_COUNTER_URL . '/css/admin.css'
345 );
346
347 wp_register_script(
348 'pvc-admin-settings', POST_VIEWS_COUNTER_URL . '/js/admin-settings.js', array( 'jquery' ), $this->defaults['version']
349 );
350
351 wp_register_script(
352 'pvc-admin-post', POST_VIEWS_COUNTER_URL . '/js/admin-post.js', array( 'jquery' ), $this->defaults['version']
353 );
354
355 wp_register_script(
356 'pvc-admin-quick-edit', POST_VIEWS_COUNTER_URL . '/js/admin-quick-edit.js', array( 'jquery', 'inline-edit-post' ), $this->defaults['version']
357 );
358
359 // load on PVC settings page
360 if ( $page === 'settings_page_post-views-counter' ) {
361
362 wp_enqueue_script( 'pvc-admin-settings' );
363
364 wp_localize_script(
365 'pvc-admin-settings', 'pvcArgsSettings', array(
366 'resetToDefaults' => __( 'Are you sure you want to reset these settings to defaults?', 'post-views-counter' ),
367 'resetViews' => __( 'Are you sure you want to delete all existing data?', 'post-views-counter' )
368 )
369 );
370
371 wp_enqueue_style( 'pvc-admin' );
372
373 // load on single post page
374 } elseif ( $page === 'post.php' || $page === 'post-new.php' ) {
375
376 $post_types = Post_Views_Counter()->options['general']['post_types_count'];
377
378 global $post_type;
379
380 if ( ! in_array( $post_type, (array) $post_types ) )
381 return;
382
383 wp_enqueue_style( 'pvc-admin' );
384 wp_enqueue_script( 'pvc-admin-post' );
385 } elseif ( $page === 'edit.php' ) {
386 $post_types = Post_Views_Counter()->options['general']['post_types_count'];
387
388 global $post_type;
389
390 if ( ! in_array( $post_type, (array) $post_types ) )
391 return;
392
393 wp_enqueue_style( 'pvc-admin' );
394
395 // woocommerce
396 if ( get_post_type() !== 'product' )
397 wp_enqueue_script( 'pvc-admin-quick-edit' );
398 }
399 }
400
401 /**
402 * Add links to plugin support forum.
403 *
404 * @param array $links
405 * @param string $file
406 * @return array
407 */
408 public function plugin_row_meta( $links, $file ) {
409
410 if ( ! current_user_can( 'install_plugins' ) )
411 return $links;
412
413 $plugin = plugin_basename( __FILE__ );
414
415 if ( $file == $plugin ) {
416 return array_merge(
417 $links, array( sprintf( '<a href="http://www.dfactory.eu/support/forum/post-views-counter/" target="_blank">%s</a>', __( 'Support', 'post-views-counter' ) ) )
418 );
419 }
420
421 return $links;
422 }
423
424 /**
425 * Add link to settings page.
426 *
427 * @staticvar string $plugin
428 * @param array $links
429 * @param string $file
430 * @return array
431 */
432 public function plugin_action_links( $links, $file ) {
433 if ( ! is_admin() || ! current_user_can( 'manage_options' ) )
434 return $links;
435
436 static $plugin;
437
438 $plugin = plugin_basename( __FILE__ );
439
440 if ( $file == $plugin ) {
441 $settings_link = sprintf( '<a href="%s">%s</a>', admin_url( 'options-general.php' ) . '?page=post-views-counter', __( 'Settings', 'post-views-counter' ) );
442
443 array_unshift( $links, $settings_link );
444 }
445
446 return $links;
447 }
448
449 /**
450 * Add admin notices.
451 */
452 public function add_notice( $html = '', $status = '', $paragraph = false ) {
453 $this->notices[] = array(
454 'html' => $html,
455 'status' => $status,
456 'paragraph' => $paragraph
457 );
458
459 add_action( 'admin_notices', array( $this, 'display_notice' ) );
460 }
461
462 /**
463 * Print admin notices.
464 */
465 public function display_notice() {
466 foreach ( $this->notices as $notice ) {
467 echo '
468 <div class="post-views-counter ' . $notice['status'] . '">
469 ' . ( $notice['paragraph'] ? '<p>' : '' ) . '
470 ' . $notice['html'] . '
471 ' . ( $notice['paragraph'] ? '</p>' : '' ) . '
472 </div>';
473 }
474 }
475 }
476
477 endif; // end if class_exists check
478
479 /**
480 * Initialise Post Views Counter.
481 *
482 * @return object
483 */
484 function Post_Views_Counter() {
485 static $instance;
486
487 // first call to instance() initializes the plugin
488 if ( $instance === null || ! ( $instance instanceof Post_Views_Counter ) )
489 $instance = Post_Views_Counter::instance();
490
491 return $instance;
492 }
493
494 Post_Views_Counter();
495