PluginProbe ʕ •ᴥ•ʔ
Post Views Counter / 1.2.3
Post Views Counter v1.2.3
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 9 years ago images 9 years ago includes 9 years ago js 9 years ago languages 9 years ago index.php 9 years ago post-views-counter.php 9 years ago readme.txt 9 years ago
post-views-counter.php
375 lines
1 <?php
2 /*
3 Plugin Name: Post Views Counter
4 Description: Forget WP-PostViews. 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.3
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-2016, 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.3
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.3'
84 );
85
86 /**
87 * Disable object clone.
88 */
89 private function __clone() {}
90
91 /**
92 * Disable unserializing of the class.
93 */
94 private function __wakeup() {}
95
96 /**
97 * Main Post_Views_Counter instance,
98 * Insures that only one instance of Post_Views_Counter exists in memory at one time.
99 *
100 * @return object
101 */
102 public static function instance() {
103 if ( ! isset( self::$instance ) && ! ( self::$instance instanceof Post_Views_Counter ) ) {
104 self::$instance = new Post_Views_Counter;
105 self::$instance->define_constants();
106
107 add_action( 'plugins_loaded', array( self::$instance, 'load_textdomain' ) );
108
109 self::$instance->includes();
110 self::$instance->update = new Post_Views_Counter_Update();
111 self::$instance->settings = new Post_Views_Counter_Settings();
112 self::$instance->query = new Post_Views_Counter_Query();
113 self::$instance->cron = new Post_Views_Counter_Cron();
114 self::$instance->counter = new Post_Views_Counter_Counter();
115 self::$instance->columns = new Post_Views_Counter_Columns();
116 self::$instance->frontend = new Post_Views_Counter_Frontend();
117 self::$instance->dashboard = new Post_Views_Counter_Dashboard();
118 self::$instance->widgets = new Post_Views_Counter_Widgets();
119 }
120 return self::$instance;
121 }
122
123 /**
124 * Setup plugin constants.
125 *
126 * @return void
127 */
128 private function define_constants() {
129 define( 'POST_VIEWS_COUNTER_URL', plugins_url( '', __FILE__ ) );
130 define( 'POST_VIEWS_COUNTER_PATH', plugin_dir_path( __FILE__ ) );
131 define( 'POST_VIEWS_COUNTER_REL_PATH', dirname( plugin_basename( __FILE__ ) ) . '/' );
132 }
133
134 /**
135 * Include required files
136 *
137 * @return void
138 */
139 private function includes() {
140 include_once( POST_VIEWS_COUNTER_PATH . 'includes/update.php' );
141 include_once( POST_VIEWS_COUNTER_PATH . 'includes/settings.php' );
142 include_once( POST_VIEWS_COUNTER_PATH . 'includes/columns.php' );
143 include_once( POST_VIEWS_COUNTER_PATH . 'includes/query.php' );
144 include_once( POST_VIEWS_COUNTER_PATH . 'includes/cron.php' );
145 include_once( POST_VIEWS_COUNTER_PATH . 'includes/counter.php' );
146 include_once( POST_VIEWS_COUNTER_PATH . 'includes/frontend.php' );
147 include_once( POST_VIEWS_COUNTER_PATH . 'includes/dashboard.php' );
148 include_once( POST_VIEWS_COUNTER_PATH . 'includes/widgets.php' );
149 }
150
151 /**
152 * Class constructor.
153 *
154 * @return void
155 */
156 public function __construct() {
157 register_activation_hook( __FILE__, array( $this, 'activation' ) );
158 register_deactivation_hook( __FILE__, array( $this, 'deactivation' ) );
159
160 // settings
161 $this->options = array(
162 'general' => array_merge( $this->defaults['general'], get_option( 'post_views_counter_settings_general', $this->defaults['general'] ) ),
163 'display' => array_merge( $this->defaults['display'], get_option( 'post_views_counter_settings_display', $this->defaults['display'] ) )
164 );
165
166 // actions
167 add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts_styles' ) );
168 add_action( 'wp_loaded', array( $this, 'load_pluggable_functions' ), 10 );
169
170 // filters
171 add_filter( 'plugin_row_meta', array( $this, 'plugin_extend_links' ), 10, 2 );
172 add_filter( 'plugin_action_links', array( $this, 'plugin_settings_link' ), 10, 2 );
173 }
174
175 /**
176 * Plugin activation function.
177 */
178 public function activation() {
179 global $wpdb, $charset_collate;
180
181 // required for dbdelta
182 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
183
184 // create post views table
185 dbDelta( '
186 CREATE TABLE IF NOT EXISTS ' . $wpdb->prefix . 'post_views (
187 id bigint unsigned NOT NULL,
188 type tinyint(1) unsigned NOT NULL,
189 period varchar(8) NOT NULL,
190 count bigint unsigned NOT NULL,
191 PRIMARY KEY (type, period, id),
192 UNIQUE INDEX id_period (id, period) USING BTREE,
193 INDEX type_period_count (type, period, count) USING BTREE
194 ) ' . $charset_collate . ';'
195 );
196
197 // add default options
198 add_option( 'post_views_counter_settings_general', $this->defaults['general'], '', 'no' );
199 add_option( 'post_views_counter_settings_display', $this->defaults['display'], '', 'no' );
200 add_option( 'post_views_counter_version', $this->defaults['version'], '', 'no' );
201
202 // schedule cache flush
203 $this->schedule_cache_flush();
204 }
205
206 /**
207 * Plugin deactivation function.
208 */
209 public function deactivation() {
210 // delete default options
211 if ( $this->options['general']['deactivation_delete'] ) {
212 delete_option( 'post_views_counter_settings_general' );
213 delete_option( 'post_views_counter_settings_display' );
214
215 global $wpdb;
216
217 // delete table from database
218 $wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'post_views' );
219 }
220
221 // remove schedule
222 wp_clear_scheduled_hook( 'pvc_reset_counts' );
223 remove_action( 'pvc_reset_counts', array( Post_Views_Counter()->cron, 'reset_counts' ) );
224
225 $this->remove_cache_flush();
226 }
227
228 /**
229 * Schedule cache flushing if it's not already scheduled.
230 */
231 public function schedule_cache_flush( $forced = true ) {
232 if ( $forced || ! wp_next_scheduled( 'pvc_flush_cached_counts' ) ) {
233 wp_schedule_event( time(), 'post_views_counter_flush_interval', 'pvc_flush_cached_counts' );
234 }
235 }
236
237 /**
238 * Remove scheduled cache flush and the corresponding action.
239 */
240 public function remove_cache_flush() {
241 wp_clear_scheduled_hook( 'pvc_flush_cached_counts' );
242 remove_action( 'pvc_flush_cached_counts', array( Post_Views_Counter()->cron, 'flush_cached_counts' ) );
243 }
244
245 /**
246 * Load text domain.
247 */
248 public function load_textdomain() {
249 load_plugin_textdomain( 'post-views-counter', false, POST_VIEWS_COUNTER_REL_PATH . 'languages/' );
250 }
251
252 /**
253 * Load pluggable template functions.
254 */
255 public function load_pluggable_functions() {
256 include_once( POST_VIEWS_COUNTER_PATH . 'includes/functions.php' );
257 }
258
259 /**
260 * Enqueue admin scripts and styles.
261 */
262 public function admin_scripts_styles( $page ) {
263 wp_register_style(
264 'pvc-admin', POST_VIEWS_COUNTER_URL . '/css/admin.css'
265 );
266
267 wp_register_script(
268 'pvc-admin-settings', POST_VIEWS_COUNTER_URL . '/js/admin-settings.js', array( 'jquery' ), $this->defaults['version']
269 );
270
271 wp_register_script(
272 'pvc-admin-post', POST_VIEWS_COUNTER_URL . '/js/admin-post.js', array( 'jquery' ), $this->defaults['version']
273 );
274
275 wp_register_script(
276 'pvc-admin-quick-edit', POST_VIEWS_COUNTER_URL . '/js/admin-quick-edit.js', array( 'jquery', 'inline-edit-post' ), $this->defaults['version']
277 );
278
279 // load on PVC settings page
280 if ( $page === 'settings_page_post-views-counter' ) {
281
282 wp_enqueue_script( 'pvc-admin-settings' );
283
284 wp_localize_script(
285 'pvc-admin-settings', 'pvcArgsSettings', array(
286 'resetToDefaults' => __( 'Are you sure you want to reset these settings to defaults?', 'post-views-counter' )
287 )
288 );
289
290 wp_enqueue_style( 'pvc-admin' );
291
292 // load on single post page
293 } elseif ( $page === 'post.php' || $page === 'post-new.php' ) {
294
295 $post_types = Post_Views_Counter()->options['general']['post_types_count'];
296
297 global $post_type;
298
299 if ( ! in_array( $post_type, (array) $post_types ) )
300 return;
301
302 wp_enqueue_style( 'pvc-admin' );
303 wp_enqueue_script( 'pvc-admin-post' );
304 } elseif ( $page === 'edit.php' ) {
305 $post_types = Post_Views_Counter()->options['general']['post_types_count'];
306
307 global $post_type;
308
309 if ( ! in_array( $post_type, (array) $post_types ) )
310 return;
311
312 wp_enqueue_style( 'pvc-admin' );
313 wp_enqueue_script( 'pvc-admin-quick-edit' );
314 }
315 }
316
317 /**
318 * Add links to plugin support forum.
319 */
320 public function plugin_extend_links( $links, $file ) {
321
322 if ( ! current_user_can( 'install_plugins' ) )
323 return $links;
324
325 $plugin = plugin_basename( __FILE__ );
326
327 if ( $file == $plugin ) {
328 return array_merge(
329 $links, array( sprintf( '<a href="http://www.dfactory.eu/support/forum/post-views-counter/" target="_blank">%s</a>', __( 'Support', 'post-views-counter' ) ) )
330 );
331 }
332
333 return $links;
334 }
335
336 /**
337 * Add link to settings page.
338 */
339 public function plugin_settings_link( $links, $file ) {
340 if ( ! is_admin() || ! current_user_can( 'manage_options' ) )
341 return $links;
342
343 static $plugin;
344
345 $plugin = plugin_basename( __FILE__ );
346
347 if ( $file == $plugin ) {
348 $settings_link = sprintf( '<a href="%s">%s</a>', admin_url( 'options-general.php' ) . '?page=post-views-counter', __( 'Settings', 'post-views-counter' ) );
349
350 array_unshift( $links, $settings_link );
351 }
352
353 return $links;
354 }
355
356 }
357
358 endif; // end if class_exists check
359
360 /**
361 * Initialise Post Views Counter.
362 *
363 * @return object
364 */
365 function Post_Views_Counter() {
366 static $instance;
367
368 // first call to instance() initializes the plugin
369 if ( $instance === null || ! ( $instance instanceof Post_Views_Counter ) )
370 $instance = Post_Views_Counter::instance();
371
372 return $instance;
373 }
374
375 Post_Views_Counter();