PluginProbe ʕ •ᴥ•ʔ
Post Views Counter / 1.3.5
Post Views Counter v1.3.5
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 / includes / settings.php
post-views-counter / includes Last commit date
ajax.php 7 years ago columns.php 4 years ago counter.php 4 years ago crawler-detect.php 6 years ago cron.php 6 years ago dashboard.php 4 years ago frontend.php 6 years ago functions.php 4 years ago query.php 6 years ago settings.php 4 years ago update.php 6 years ago widgets.php 4 years ago
settings.php
839 lines
1 <?php
2 // exit if accessed directly
3 if ( ! defined( 'ABSPATH' ) )
4 exit;
5
6 /**
7 * Post_Views_Counter_Settings class.
8 *
9 * @class Post_Views_Counter_Settings
10 */
11 class Post_Views_Counter_Settings {
12
13 private $tabs;
14 private $choices;
15 private $modes;
16 private $time_types;
17 private $groups;
18 private $user_roles;
19 private $positions;
20 private $display_styles;
21 public $post_types;
22 public $page_types;
23
24 public function __construct() {
25 // actions
26 add_action( 'admin_init', array( $this, 'register_settings' ) );
27 add_action( 'admin_menu', array( $this, 'admin_menu_options' ) );
28 add_action( 'after_setup_theme', array( $this, 'load_defaults' ) );
29 add_action( 'wp_loaded', array( $this, 'load_post_types' ) );
30 }
31
32 /**
33 * Load default settings.
34 */
35 public function load_defaults() {
36 if ( ! is_admin() )
37 return;
38
39 $this->modes = array(
40 'php' => __( 'PHP', 'post-views-counter' ),
41 'js' => __( 'JavaScript', 'post-views-counter' ),
42 'ajax' => __( 'Fast AJAX', 'post-views-counter' )
43 );
44
45 if ( function_exists( 'register_rest_route' ) )
46 $this->modes['rest_api'] = __( 'REST API', 'post-views-counter' );
47
48 $this->time_types = array(
49 'minutes' => __( 'minutes', 'post-views-counter' ),
50 'hours' => __( 'hours', 'post-views-counter' ),
51 'days' => __( 'days', 'post-views-counter' ),
52 'weeks' => __( 'weeks', 'post-views-counter' ),
53 'months' => __( 'months', 'post-views-counter' ),
54 'years' => __( 'years', 'post-views-counter' )
55 );
56
57 $this->groups = array(
58 'robots' => __( 'robots', 'post-views-counter' ),
59 'users' => __( 'logged in users', 'post-views-counter' ),
60 'guests' => __( 'guests', 'post-views-counter' ),
61 'roles' => __( 'selected user roles', 'post-views-counter' )
62 );
63
64 $this->positions = array(
65 'before' => __( 'before the content', 'post-views-counter' ),
66 'after' => __( 'after the content', 'post-views-counter' ),
67 'manual' => __( 'manual', 'post-views-counter' )
68 );
69
70 $this->display_styles = array(
71 'icon' => __( 'icon', 'post-views-counter' ),
72 'text' => __( 'label', 'post-views-counter' )
73 );
74
75 $this->tabs = array(
76 'general' => array(
77 'name' => __( 'General', 'post-views-counter' ),
78 'key' => 'post_views_counter_settings_general',
79 'submit' => 'save_pvc_general',
80 'reset' => 'reset_pvc_general'
81 ),
82 'display' => array(
83 'name' => __( 'Display', 'post-views-counter' ),
84 'key' => 'post_views_counter_settings_display',
85 'submit' => 'save_pvc_display',
86 'reset' => 'reset_pvc_display'
87 )
88 );
89
90 $this->user_roles = $this->get_user_roles();
91
92 $this->page_types = apply_filters(
93 'pvc_page_types_display_options',
94 array(
95 'home' => __( 'Home', 'post-views-counter' ),
96 'archive' => __( 'Archives', 'post-views-counter' ),
97 'singular' => __( 'Single pages', 'post-views-counter' ),
98 'search' => __( 'Search results', 'post-views-counter' ),
99 )
100 );
101 }
102
103 /**
104 * Get post types avaiable for counting.
105 */
106 public function load_post_types() {
107 if ( ! is_admin() )
108 return;
109
110 $post_types = array();
111
112 // built in public post types
113 foreach ( get_post_types( array( '_builtin' => true, 'public' => true ), 'objects', 'and' ) as $key => $post_type ) {
114 $post_types[$key] = $post_type->labels->name;
115 }
116
117 // public custom post types
118 foreach ( get_post_types( array( '_builtin' => false, 'public' => true ), 'objects', 'and' ) as $key => $post_type ) {
119 $post_types[$key] = $post_type->labels->name;
120 }
121
122 // remove bbPress replies
123 if ( class_exists( 'bbPress' ) && isset( $post_types['reply'] ) )
124 unset( $post_types['reply'] );
125
126 $post_types = apply_filters( 'pvc_available_post_types', $post_types );
127
128 // sort post types alphabetically with their keys
129 asort( $post_types, SORT_STRING );
130
131 $this->post_types = $post_types;
132 }
133
134 /**
135 * Get all user roles.
136 *
137 * @global object $wp_roles
138 * @return array
139 */
140 public function get_user_roles() {
141 global $wp_roles;
142
143 $roles = array();
144
145 foreach ( apply_filters( 'editable_roles', $wp_roles->roles ) as $role => $details ) {
146 $roles[$role] = translate_user_role( $details['name'] );
147 }
148
149 asort( $roles, SORT_STRING );
150
151 return $roles;
152 }
153
154 /**
155 * Add options page.
156 *
157 * @return void
158 */
159 public function admin_menu_options() {
160 add_options_page( __( 'Post Views Counter', 'post-views-counter' ), __( 'Post Views Counter', 'post-views-counter' ), 'manage_options', 'post-views-counter', array( $this, 'options_page' ) );
161 }
162
163 /**
164 * Options page callback.
165 *
166 * @return void
167 */
168 public function options_page() {
169 $tab_key = (isset( $_GET['tab'] ) ? esc_attr( $_GET['tab'] ) : 'general');
170
171 echo '
172 <div class="wrap">
173 <h2>' . __( 'Post Views Counter', 'post-views-counter' ) . '</h2>
174 <h2 class="nav-tab-wrapper">';
175
176 foreach ( $this->tabs as $key => $name ) {
177 echo '
178 <a class="nav-tab ' . ($tab_key == $key ? 'nav-tab-active' : '') . '" href="' . esc_url( admin_url( 'options-general.php?page=post-views-counter&tab=' . $key ) ) . '">' . $name['name'] . '</a>';
179 }
180
181 echo '
182 </h2>
183 <div class="post-views-counter-settings">
184 <div class="df-credits">
185 <h3 class="hndle">' . __( 'Post Views Counter', 'post-views-counter' ) . ' ' . Post_Views_Counter()->defaults['version'] . '</h3>
186 <div class="inside">
187 <h4 class="inner">' . __( 'Need support?', 'post-views-counter' ) . '</h4>
188 <p class="inner">' . sprintf( __( 'If you are having problems with this plugin, please browse it\'s <a href="%s" target="_blank">Documentation</a> or talk about them in the <a href="%s" target="_blank">Support forum</a>', 'post-views-counter' ), 'https://www.dfactory.eu/docs/post-views-counter/?utm_source=post-views-counter-settings&utm_medium=link&utm_campaign=docs', 'https://www.dfactory.eu/support/?utm_source=post-views-counter-settings&utm_medium=link&utm_campaign=support' ) . '</p>
189 <hr />
190 <h4 class="inner">' . __( 'Do you like this plugin?', 'post-views-counter' ) . '</h4>
191 <p class="inner">' . sprintf( __( '<a href="%s" target="_blank">Rate it 5</a> on WordPress.org', 'post-views-counter' ), 'https://wordpress.org/support/plugin/post-views-counter/reviews/?filter=5' ) . '<br />' .
192 sprintf( __( 'Blog about it & link to the <a href="%s" target="_blank">plugin page</a>.', 'post-views-counter' ), 'https://dfactory.eu/plugins/post-views-counter/?utm_source=post-views-counter-settings&utm_medium=link&utm_campaign=blog-about' ) . '<br />' .
193 sprintf( __( 'Check out our other <a href="%s" target="_blank">WordPress plugins</a>.', 'post-views-counter' ), 'https://dfactory.eu/plugins/?utm_source=post-views-counter-settings&utm_medium=link&utm_campaign=other-plugins' ) . '
194 </p>
195 <hr />
196 <p class="df-link inner"><a href="http://www.dfactory.eu/?utm_source=post-views-counter-settings&utm_medium=link&utm_campaign=created-by" target="_blank" title="Digital Factory"><img src="//pvc-53eb.kxcdn.com/df-black-sm.png' . '" alt="Digital Factory" /></a></p>
197 </div>
198 </div>
199 <form action="options.php" method="post">';
200
201 wp_nonce_field( 'update-options' );
202 settings_fields( $this->tabs[$tab_key]['key'] );
203 do_settings_sections( $this->tabs[$tab_key]['key'] );
204
205 echo '
206 <p class="submit">';
207
208 submit_button( '', 'primary', $this->tabs[$tab_key]['submit'], false );
209
210 echo ' ';
211
212 submit_button( __( 'Reset to defaults', 'post-views-counter' ), 'secondary reset_pvc_settings', $this->tabs[$tab_key]['reset'], false );
213
214 echo '
215 </p>
216 </form>
217 </div>
218 <div class="clear"></div>
219 </div>';
220 }
221
222 /**
223 * Register settings callback.
224 */
225 public function register_settings() {
226 // general options
227 register_setting( 'post_views_counter_settings_general', 'post_views_counter_settings_general', array( $this, 'validate_settings' ) );
228 add_settings_section( 'post_views_counter_settings_general', __( 'General settings', 'post-views-counter' ), '', 'post_views_counter_settings_general' );
229 add_settings_field( 'pvc_post_types_count', __( 'Post Types Count', 'post-views-counter' ), array( $this, 'post_types_count' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
230 add_settings_field( 'pvc_counter_mode', __( 'Counter Mode', 'post-views-counter' ), array( $this, 'counter_mode' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
231 add_settings_field( 'pvc_post_views_column', __( 'Post Views Column', 'post-views-counter' ), array( $this, 'post_views_column' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
232 add_settings_field( 'pvc_restrict_edit_views', __( 'Restrict Edit', 'post-views-counter' ), array( $this, 'restrict_edit_views' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
233 add_settings_field( 'pvc_time_between_counts', __( 'Count Interval', 'post-views-counter' ), array( $this, 'time_between_counts' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
234 add_settings_field( 'pvc_reset_counts', __( 'Reset Data Interval', 'post-views-counter' ), array( $this, 'reset_counts' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
235 add_settings_field( 'pvc_flush_interval', __( 'Flush Object Cache Interval', 'post-views-counter' ), array( $this, 'flush_interval' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
236 add_settings_field( 'pvc_exclude', __( 'Exclude Visitors', 'post-views-counter' ), array( $this, 'exclude' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
237 add_settings_field( 'pvc_exclude_ips', __( 'Exclude IPs', 'post-views-counter' ), array( $this, 'exclude_ips' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
238 add_settings_field( 'pvc_strict_counts', __( 'Strict counts', 'post-views-counter' ), array( $this, 'strict_counts' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
239 add_settings_field( 'pvc_wp_postviews', __( 'Tools', 'post-views-counter' ), array( $this, 'wp_postviews' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
240 add_settings_field( 'pvc_deactivation_delete', __( 'Deactivation', 'post-views-counter' ), array( $this, 'deactivation_delete' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
241
242 // display options
243 register_setting( 'post_views_counter_settings_display', 'post_views_counter_settings_display', array( $this, 'validate_settings' ) );
244 add_settings_section( 'post_views_counter_settings_display', __( 'Display settings', 'post-views-counter' ), '', 'post_views_counter_settings_display' );
245 add_settings_field( 'pvc_post_views_label', __( 'Post Views Label', 'post-views-counter' ), array( $this, 'post_views_label' ), 'post_views_counter_settings_display', 'post_views_counter_settings_display' );
246 add_settings_field( 'pvc_post_types_display', __( 'Post Type', 'post-views-counter' ), array( $this, 'post_types_display' ), 'post_views_counter_settings_display', 'post_views_counter_settings_display' );
247 add_settings_field( 'pvc_page_types_display', __( 'Page Type', 'post-views-counter' ), array( $this, 'page_types_display' ), 'post_views_counter_settings_display', 'post_views_counter_settings_display' );
248 add_settings_field( 'pvc_restrict_display', __( 'User Type', 'post-views-counter' ), array( $this, 'restrict_display' ), 'post_views_counter_settings_display', 'post_views_counter_settings_display' );
249 add_settings_field( 'pvc_position', __( 'Position', 'post-views-counter' ), array( $this, 'position' ), 'post_views_counter_settings_display', 'post_views_counter_settings_display' );
250 add_settings_field( 'pvc_display_style', __( 'Display Style', 'post-views-counter' ), array( $this, 'display_style' ), 'post_views_counter_settings_display', 'post_views_counter_settings_display' );
251 add_settings_field( 'pvc_icon_class', __( 'Icon Class', 'post-views-counter' ), array( $this, 'icon_class' ), 'post_views_counter_settings_display', 'post_views_counter_settings_display' );
252 add_settings_field( 'pvc_toolbar_statistics', __( 'Toolbar Chart', 'post-views-counter' ), array( $this, 'toolbar_statistics' ), 'post_views_counter_settings_display', 'post_views_counter_settings_display' );
253 }
254
255 /**
256 * Post views label option.
257 */
258 public function post_views_label() {
259 echo '
260 <div id="pvc_post_views_label">
261 <fieldset>
262 <input type="text" class="large-text" name="post_views_counter_settings_display[label]" value="' . esc_attr( Post_Views_Counter()->options['display']['label'] ) . '" />
263 <p class="description">' . __( 'Enter the label for the post views counter field.', 'post-views-counter' ) . '</p>
264 </fieldset>
265 </div>';
266 }
267
268 /**
269 * Post types to count option.
270 */
271 public function post_types_count() {
272 echo '
273 <div id="pvc_post_types_count">';
274
275 foreach ( $this->post_types as $post_type => $post_type_name ) {
276 echo '
277 <label><input id="pvc_post_types_count-' . esc_attr( $post_type ) . '" type="checkbox" name="post_views_counter_settings_general[post_types_count][' . esc_attr( $post_type ) . ']" value="1" ' . checked( in_array( $post_type, Post_Views_Counter()->options['general']['post_types_count'], true ), true, false ) . ' />' . esc_html( $post_type_name ) . ' </label>';
278 }
279
280 echo '
281 <p class="description">' . __( 'Select post types for which post views will be counted.', 'post-views-counter' ) . '</p>
282 </div>';
283 }
284
285 /**
286 * Post types to display option.
287 */
288 public function post_types_display() {
289 echo '
290 <div id="pvc_post_types_display">';
291
292 foreach ( $this->post_types as $post_type => $post_type_name ) {
293 echo '
294 <label><input id="pvc_post_types_display-' . esc_attr( $post_type ) . '" type="checkbox" name="post_views_counter_settings_display[post_types_display][' . esc_attr( $post_type ) . ']" value="1" ' . checked( in_array( $post_type, Post_Views_Counter()->options['display']['post_types_display'], true ), true, false ) . ' />' . esc_html( $post_type_name ) . '</label>';
295 }
296
297 echo '
298 <p class="description">' . __( 'Select post types for which the views count will be displayed.', 'post-views-counter' ) . '</p>
299 </div>';
300 }
301
302 /**
303 * Counter mode option.
304 */
305 public function counter_mode() {
306 echo '
307 <div id="pvc_counter_mode">';
308
309 foreach ( $this->modes as $key => $value ) {
310 $key = esc_attr( $key );
311
312 echo '
313 <label><input type="radio" name="post_views_counter_settings_general[counter_mode]" value="' . $key . '" ' . checked( $key, Post_Views_Counter()->options['general']['counter_mode'], false ) . ' />' . esc_html( $value ) . '</label>';
314 }
315
316 echo '
317 <p class="description">' . __( 'Select the method of collecting post views data. If you are using any of the caching plugins select Javascript or REST API (if available).', 'post-views-counter' ) . '<br />' . __( 'Optionally try the Fast AJAX experimental method, usually 10+ times faster than Javascript or REST API.', 'post-views-counter' ) . '</p>
318 </div>';
319 }
320
321 /**
322 * Post views column option.
323 */
324 public function post_views_column() {
325 echo '
326 <div id="pvc_post_views_column">
327 <label><input id="pvc-post-views-column-enable" type="checkbox" name="post_views_counter_settings_general[post_views_column]" value="1" ' . checked( true, Post_Views_Counter()->options['general']['post_views_column'], false ) . ' />' . __( 'Enable to display post views count column for each of the selected post types.', 'post-views-counter' ) . '</label>
328 </div>';
329 }
330
331 /**
332 * Time between counts option.
333 */
334 public function time_between_counts() {
335 echo '
336 <div id="pvc_time_between_counts">
337 <input size="4" type="text" name="post_views_counter_settings_general[time_between_counts][number]" value="' . esc_attr( Post_Views_Counter()->options['general']['time_between_counts']['number'] ) . '" />
338 <select class="pvc-chosen-short" name="post_views_counter_settings_general[time_between_counts][type]">';
339
340 foreach ( $this->time_types as $type => $type_name ) {
341 echo '
342 <option value="' . esc_attr( $type ) . '" ' . selected( $type, Post_Views_Counter()->options['general']['time_between_counts']['type'], false ) . '>' . esc_html( $type_name ) . '</option>';
343 }
344
345 echo '
346 </select>
347 <p class="description">' . __( 'Enter the time between single user visit count.', 'post-views-counter' ) . '</p>
348 </div>';
349 }
350
351 /**
352 * Reset counts option.
353 */
354 public function reset_counts() {
355 echo '
356 <div id="pvc_reset_counts">
357 <input size="4" type="text" name="post_views_counter_settings_general[reset_counts][number]" value="' . esc_attr( Post_Views_Counter()->options['general']['reset_counts']['number'] ) . '" />
358 <select class="pvc-chosen-short" name="post_views_counter_settings_general[reset_counts][type]">';
359
360 foreach ( array_slice( $this->time_types, 2, null, true ) as $type => $type_name ) {
361 echo '
362 <option value="' . esc_attr( $type ) . '" ' . selected( $type, Post_Views_Counter()->options['general']['reset_counts']['type'], false ) . '>' . esc_html( $type_name ) . '</option>';
363 }
364
365 echo '
366 </select>
367 <p class="description">' . __( 'Delete single day post views data older than specified above. Enter 0 (number zero) if you want to preserve your data regardless of its age.', 'post-views-counter' ) . '</p>
368 </div>';
369 }
370
371 /**
372 * Flush interval option.
373 */
374 public function flush_interval() {
375 echo '
376 <div id="pvc_flush_interval">
377 <input size="4" type="text" name="post_views_counter_settings_general[flush_interval][number]" value="' . esc_attr( Post_Views_Counter()->options['general']['flush_interval']['number'] ) . '" />
378 <select class="pvc-chosen-short" name="post_views_counter_settings_general[flush_interval][type]">';
379
380 foreach ( $this->time_types as $type => $type_name ) {
381 echo '
382 <option value="' . esc_attr( $type ) . '" ' . selected( $type, Post_Views_Counter()->options['general']['flush_interval']['type'], false ) . '>' . esc_html( $type_name ) . '</option>';
383 }
384
385 echo '
386 </select>
387 <p class="description">' . __( 'How often to flush cached view counts from the object cache into the database. This feature is used only if a persistent object cache is detected and the interval is greater than 0 (number zero). When used, view counts will be collected and stored in the object cache instead of the database and will then be asynchronously flushed to the database according to the specified interval.<br /><strong>Notice:</strong> Potential data loss may occur if the object cache is cleared/unavailable for the duration of the interval.', 'post-views-counter' ) . '</p>
388 </div>';
389 }
390
391 /**
392 * Exlude user groups option.
393 */
394 public function exclude() {
395 echo '
396 <div id="pvc_exclude">
397 <fieldset>';
398
399 foreach ( $this->groups as $type => $type_name ) {
400 echo '
401 <label><input id="pvc_exclude-' . $type . '" type="checkbox" name="post_views_counter_settings_general[exclude][groups][' . $type . ']" value="1" ' . checked( in_array( $type, Post_Views_Counter()->options['general']['exclude']['groups'], true ), true, false ) . ' />' . esc_html( $type_name ) . '</label>';
402 }
403
404 echo '
405 <p class="description">' . __( 'Use it to hide the post views counter from selected type of visitors.', 'post-views-counter' ) . '</p>
406 <div class="pvc_user_roles"' . (in_array( 'roles', Post_Views_Counter()->options['general']['exclude']['groups'], true ) ? '' : ' style="display: none;"') . '>';
407
408 foreach ( $this->user_roles as $role => $role_name ) {
409 echo '
410 <label><input type="checkbox" name="post_views_counter_settings_general[exclude][roles][' . $role . ']" value="1" ' . checked( in_array( $role, Post_Views_Counter()->options['general']['exclude']['roles'], true ), true, false ) . '>' . esc_html( $role_name ) . '</label>';
411 }
412
413 echo '
414 <p class="description">' . __( 'Use it to hide the post views counter from selected user roles.', 'post-views-counter' ) . '</p>
415 </div>
416 </fieldset>
417 </div>';
418 }
419
420 /**
421 * Exclude IPs option.
422 */
423 public function exclude_ips() {
424 // lovely php 5.2 limitations
425 $ips = Post_Views_Counter()->options['general']['exclude_ips'];
426
427 echo '
428 <div id="pvc_exclude_ips">';
429
430 if ( ! empty( $ips ) ) {
431 foreach ( $ips as $key => $ip ) {
432 echo '
433 <div class="ip-box">
434 <input type="text" name="post_views_counter_settings_general[exclude_ips][]" value="' . esc_attr( $ip ) . '" /> <a href="#" class="remove-exclude-ip" title="' . esc_attr__( 'Remove', 'post-views-counter' ) . '">' . esc_attr__( 'Remove', 'post-views-counter' ) . '</a>
435 </div>';
436 }
437 } else {
438 echo '
439 <div class="ip-box">
440 <input type="text" name="post_views_counter_settings_general[exclude_ips][]" value="" /> <a href="#" class="remove-exclude-ip" title="' . esc_attr__( 'Remove', 'post-views-counter' ) . '">' . esc_attr__( 'Remove', 'post-views-counter' ) . '</a>
441 </div>';
442 }
443
444 echo '
445 <p><input type="button" class="button button-secondary add-exclude-ip" value="' . esc_attr__( 'Add new', 'post-views-counter' ) . '" /> <input type="button" class="button button-secondary add-current-ip" value="' . esc_attr__( 'Add my current IP', 'post-views-counter' ) . '" data-rel="' . esc_attr( $_SERVER['REMOTE_ADDR'] ) . '" /></p>
446 <p class="description">' . __( 'Enter the IP addresses to be excluded from post views count.', 'post-views-counter' ) . '</p>
447 </div>';
448 }
449
450 /**
451 * Strict counts option.
452 */
453 public function strict_counts() {
454 echo '
455 <div id="pvc_strict_counts">
456 <label><input id="pvc-strict-counts" type="checkbox" name="post_views_counter_settings_general[strict_counts]" value="1" ' . checked( true, Post_Views_Counter()->options['general']['strict_counts'], false ) . ' />' . __( 'Enable to prevent bypassing the counts interval (for e.g. using incognito browser window or by clearing cookies).', 'post-views-counter' ) . '</label>
457 </div>';
458 }
459
460 /**
461 * WP-PostViews import option.
462 */
463 public function wp_postviews() {
464 echo '
465 <div id="pvc_wp_postviews">
466 <fieldset>
467 <input type="submit" class="button button-secondary" name="post_views_counter_import_wp_postviews" value="' . __( 'Import views', 'post-views-counter' ) . '"/> <label><input id="pvc-wp-postviews" type="checkbox" name="post_views_counter_import_wp_postviews_override" value="1" />' . __( 'Override existing views data.', 'post-views-counter' ) . '</label>
468 <p class="description">' . __( 'Import post views data from WP-PostViews plugin.', 'post-views-counter' ) . '</p>
469 <br /><input type="submit" class="button button-secondary" name="post_views_counter_reset_views" value="' . __( 'Delete views', 'post-views-counter' ) . '"/>
470 <p class="description">' . __( 'Delete ALL the existing post views data.', 'post-views-counter' ) . '</p>
471 </fieldset>
472 </div>';
473 }
474
475 /**
476 * Limit views edit to admins.
477 */
478 public function restrict_edit_views() {
479 echo '
480 <div id="pvc_restrict_edit_views">
481 <label><input type="checkbox" name="post_views_counter_settings_general[restrict_edit_views]" value="1" ' . checked( true, Post_Views_Counter()->options['general']['restrict_edit_views'], false ) . ' />' . __( 'Enable to restrict post views editing to admins only.', 'post-views-counter' ) . '</label>
482 </div>';
483 }
484
485 /**
486 * Plugin deactivation option.
487 */
488 public function deactivation_delete() {
489 echo '
490 <div id="pvc_deactivation_delete">
491 <label><input type="checkbox" name="post_views_counter_settings_general[deactivation_delete]" value="1" ' . checked( true, Post_Views_Counter()->options['general']['deactivation_delete'], false ) . ' />' . __( 'Enable to delete all plugin data on deactivation.', 'post-views-counter' ) . '</label>
492 </div>';
493 }
494
495 /**
496 * Visibility option.
497 */
498 public function page_types_display() {
499 echo '
500 <div id="pvc_post_types_display">';
501
502 foreach ( $this->page_types as $key => $label ) {
503 echo '
504 <label><input id="pvc_page_types_display-' . esc_attr( $key ) . '" type="checkbox" name="post_views_counter_settings_display[page_types_display][' . esc_attr( $key ) . ']" value="1" ' . checked( in_array( $key, Post_Views_Counter()->options['display']['page_types_display'], true ), true, false ) . ' />' . esc_html( $label ) . '</label>';
505 }
506
507 echo '
508 <p class="description">' . __( 'Select page types where the views count will be displayed.', 'post-views-counter' ) . '</p>
509 </div>';
510 }
511
512 /**
513 * Counter position option.
514 */
515 public function position() {
516 echo '
517 <div id="pvc_position">
518 <select class="pvc-chosen-short" name="post_views_counter_settings_display[position]">';
519
520 foreach ( $this->positions as $position => $position_name ) {
521 echo '
522 <option value="' . esc_attr( $position ) . '" ' . selected( $position, Post_Views_Counter()->options['display']['position'], false ) . '>' . esc_html( $position_name ) . '</option>';
523 }
524
525 echo '
526 </select>
527 <p class="description">' . __( 'Select where would you like to display the post views counter. Use [post-views] shortcode for manual display.', 'post-views-counter' ) . '</p>
528 </div>';
529 }
530
531 /**
532 * Counter style option.
533 */
534 public function display_style() {
535 echo '
536 <div id="pvc_display_style">';
537
538 foreach ( $this->display_styles as $display => $style ) {
539 $display = esc_attr( $display );
540
541 echo '
542 <label><input type="checkbox" name="post_views_counter_settings_display[display_style][' . $display . ']" value="1" ' . checked( true, Post_Views_Counter()->options['display']['display_style'][$display], false ) . ' />' . esc_html( $style ) . '</label>';
543 }
544
545 echo '
546 <p class="description">' . __( 'Choose how to display the post views counter.', 'post-views-counter' ) . '</p>
547 </div>';
548 }
549
550 /**
551 * Counter icon class option.
552 */
553 public function icon_class() {
554 echo '
555 <div id="pvc_icon_class">
556 <input type="text" name="post_views_counter_settings_display[icon_class]" class="large-text" value="' . esc_attr( Post_Views_Counter()->options['display']['icon_class'] ) . '" />
557 <p class="description">' . sprintf( __( 'Enter the post views icon class. Any of the <a href="%s" target="_blank">Dashicons</a> classes are available.', 'post-views-counter' ), 'https://developer.wordpress.org/resource/dashicons/' ) . '</p>
558 </div>';
559 }
560
561 /**
562 * Toolbar statistics.
563 */
564 public function toolbar_statistics() {
565 echo '
566 <div id="pvc_toolbar_statistics">
567 <label><input type="checkbox" name="post_views_counter_settings_display[toolbar_statistics]" value="1" ' . checked( true, Post_Views_Counter()->options['display']['toolbar_statistics'], false ) . ' />' . __( 'Enable to display the post views chart at the toolbar.', 'post-views-counter' ) . '</label>
568 <p class="description">' . __( 'The post views chart will be displayed for the post types that are being counted.', 'post-views-counter' ) . '</p>
569 </div>';
570 }
571
572 /**
573 * Restrict display option.
574 */
575 public function restrict_display() {
576 echo '
577 <div id="pvc_restrict_display">
578 <fieldset>';
579
580 foreach ( $this->groups as $type => $type_name ) {
581
582 if ( $type === 'robots' )
583 continue;
584
585 echo '
586 <label><input id="pvc_restrict_display-' . $type . '" type="checkbox" name="post_views_counter_settings_display[restrict_display][groups][' . esc_html( $type ) . ']" value="1" ' . checked( in_array( $type, Post_Views_Counter()->options['display']['restrict_display']['groups'], true ), true, false ) . ' />' . esc_html( $type_name ) . '</label>';
587 }
588
589 echo '
590 <p class="description">' . __( 'Use it to hide the post views counter from selected type of visitors.', 'post-views-counter' ) . '</p>
591 <div class="pvc_user_roles"' . (in_array( 'roles', Post_Views_Counter()->options['display']['restrict_display']['groups'], true ) ? '' : ' style="display: none;"') . '>';
592
593 foreach ( $this->user_roles as $role => $role_name ) {
594 echo '
595 <label><input type="checkbox" name="post_views_counter_settings_display[restrict_display][roles][' . $role . ']" value="1" ' . checked( in_array( $role, Post_Views_Counter()->options['display']['restrict_display']['roles'], true ), true, false ) . ' />' . esc_html( $role_name ) . '</label>';
596 }
597
598 echo '
599 <p class="description">' . __( 'Use it to hide the post views counter from selected user roles.', 'post-views-counter' ) . '</p>
600 </div>
601 </fieldset>
602 </div>';
603 }
604
605 /**
606 * Validate general settings.
607 */
608 public function validate_settings( $input ) {
609 // get main instance
610 $pvc = Post_Views_Counter();
611
612 // import post views data from another plugin
613 if ( isset( $_POST['post_views_counter_import_wp_postviews'] ) ) {
614 // make sure we do not change anything in the settings
615 $input = $pvc->options['general'];
616
617 global $wpdb;
618
619 $meta_key = esc_attr( apply_filters( 'pvc_import_meta_key', 'views' ) );
620
621 $views = $wpdb->get_results( "SELECT post_id, meta_value FROM " . $wpdb->postmeta . " WHERE meta_key = '" . $meta_key . "'", ARRAY_A, 0 );
622
623 if ( ! empty( $views ) ) {
624 $sql = array();
625
626 foreach ( $views as $view ) {
627 $sql[] = "(" . $view['post_id'] . ", 4, 'total', " . $view['meta_value'] . ")";
628 }
629
630 $wpdb->query( "INSERT INTO " . $wpdb->prefix . "post_views(id, type, period, count) VALUES " . implode( ',', $sql ) . " ON DUPLICATE KEY UPDATE count = " . ( isset( $_POST['post_views_counter_import_wp_postviews_override'] ) ? '' : 'count + ' ) . "VALUES(count)" );
631
632 add_settings_error( 'wp_postviews_import', 'wp_postviews_import', __( 'Post views data imported succesfully.', 'post-views-counter' ), 'updated' );
633 } else {
634 add_settings_error( 'wp_postviews_import', 'wp_postviews_import', __( 'There was no post views data to import.', 'post-views-counter' ), 'updated' );
635 }
636 // delete all post views data
637 } elseif ( isset( $_POST['post_views_counter_reset_views'] ) ) {
638 // make sure we do not change anything in the settings
639 $input = $pvc->options['general'];
640
641 global $wpdb;
642
643 if ( $wpdb->query( 'TRUNCATE TABLE ' . $wpdb->prefix . 'post_views' ) )
644 add_settings_error( 'reset_post_views', 'reset_post_views', __( 'All existing data deleted succesfully.', 'post-views-counter' ), 'updated' );
645 else
646 add_settings_error( 'reset_post_views', 'reset_post_views', __( 'Error occurred. All existing data were not deleted.', 'post-views-counter' ), 'error' );
647 // save general settings
648 } elseif ( isset( $_POST['save_pvc_general'] ) ) {
649 // post types count
650 if ( isset( $input['post_types_count'] ) ) {
651 $post_types = array();
652
653 foreach ( $input['post_types_count'] as $post_type => $set ) {
654 if ( isset( $this->post_types[$post_type] ) )
655 $post_types[] = $post_type;
656 }
657
658 $input['post_types_count'] = array_unique( $post_types );
659 } else
660 $input['post_types_count'] = array();
661
662 // counter mode
663 $input['counter_mode'] = isset( $input['counter_mode'], $this->modes[$input['counter_mode']] ) ? $input['counter_mode'] : $pvc->defaults['general']['counter_mode'];
664
665 // post views column
666 $input['post_views_column'] = isset( $input['post_views_column'] );
667
668 // time between counts
669 $input['time_between_counts']['number'] = (int) ( isset( $input['time_between_counts']['number'] ) ? $input['time_between_counts']['number'] : $pvc->defaults['general']['time_between_counts']['number'] );
670 $input['time_between_counts']['type'] = isset( $input['time_between_counts']['type'], $this->time_types[$input['time_between_counts']['type']] ) ? $input['time_between_counts']['type'] : $pvc->defaults['general']['time_between_counts']['type'];
671
672 // flush interval
673 $input['flush_interval']['number'] = (int) ( isset( $input['flush_interval']['number'] ) ? $input['flush_interval']['number'] : $pvc->defaults['general']['flush_interval']['number'] );
674 $input['flush_interval']['type'] = isset( $input['flush_interval']['type'], $this->time_types[$input['flush_interval']['type']] ) ? $input['flush_interval']['type'] : $pvc->defaults['general']['flush_interval']['type'];
675
676 // Since the settings are about to be saved and cache flush interval could've changed,
677 // we want to make sure that any changes done on the settings page are in effect immediately
678 // (instead of having to wait for the previous schedule to occur).
679 // We achieve that by making sure to clear any previous cache flush schedules and
680 // schedule the new one if the specified interval is > 0
681 $pvc->remove_cache_flush();
682
683 if ( $input['flush_interval']['number'] > 0 )
684 $pvc->schedule_cache_flush();
685
686 // reset counts
687 $input['reset_counts']['number'] = (int) ( isset( $input['reset_counts']['number'] ) ? $input['reset_counts']['number'] : $pvc->defaults['general']['reset_counts']['number'] );
688 $input['reset_counts']['type'] = isset( $input['reset_counts']['type'], $this->time_types[$input['reset_counts']['type']] ) ? $input['reset_counts']['type'] : $pvc->defaults['general']['reset_counts']['type'];
689
690 // run cron on next visit?
691 $input['cron_run'] = ( $input['reset_counts']['number'] > 0 );
692 $input['cron_update'] = ( $input['cron_run'] && ( $pvc->options['general']['reset_counts']['number'] !== $input['reset_counts']['number'] || $pvc->options['general']['reset_counts']['type'] !== $input['reset_counts']['type'] ) );
693
694 // exclude
695 if ( isset( $input['exclude']['groups'] ) ) {
696 $groups = array();
697
698 foreach ( $input['exclude']['groups'] as $group => $set ) {
699 if ( isset( $this->groups[$group] ) )
700 $groups[] = $group;
701 }
702
703 $input['exclude']['groups'] = array_unique( $groups );
704 } else {
705 $input['exclude']['groups'] = array();
706 }
707
708 if ( in_array( 'roles', $input['exclude']['groups'], true ) && isset( $input['exclude']['roles'] ) ) {
709 $roles = array();
710
711 foreach ( $input['exclude']['roles'] as $role => $set ) {
712 if ( isset( $this->user_roles[$role] ) )
713 $roles[] = $role;
714 }
715
716 $input['exclude']['roles'] = array_unique( $roles );
717 } else
718 $input['exclude']['roles'] = array();
719
720 // exclude ips
721 if ( isset( $input['exclude_ips'] ) ) {
722 $ips = array();
723
724 foreach ( $input['exclude_ips'] as $ip ) {
725 if ( strpos( $ip, '*' ) !== false ) {
726 $new_ip = str_replace( '*', '0', $ip );
727
728 if ( filter_var( $new_ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) )
729 $ips[] = $ip;
730 } elseif ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) )
731 $ips[] = $ip;
732 }
733
734 $input['exclude_ips'] = array_unique( $ips );
735 }
736
737 // restrict edit views
738 $input['restrict_edit_views'] = isset( $input['restrict_edit_views'] );
739
740 // strict counts
741 $input['strict_counts'] = isset( $input['strict_counts'] );
742
743 // deactivation delete
744 $input['deactivation_delete'] = isset( $input['deactivation_delete'] );
745
746 $input['update_version'] = $pvc->options['general']['update_version'];
747 $input['update_notice'] = $pvc->options['general']['update_notice'];
748 // save display settings
749 } elseif ( isset( $_POST['save_pvc_display'] ) ) {
750
751 // post views label
752 $input['label'] = isset( $input['label'] ) ? $input['label'] : $pvc->defaults['display']['label'];
753
754 if ( function_exists( 'icl_register_string' ) )
755 icl_register_string( 'Post Views Counter', 'Post Views Label', $input['label'] );
756
757 // position
758 $input['position'] = isset( $input['position'], $this->positions[$input['position']] ) ? $input['position'] : $pvc->defaults['display']['position'];
759
760 // display style
761 $input['display_style']['icon'] = isset( $input['display_style']['icon'] );
762 $input['display_style']['text'] = isset( $input['display_style']['text'] );
763
764 // link to post
765 $input['link_to_post'] = isset( $input['link_to_post'] ) ? $input['link_to_post'] : $pvc->defaults['display']['link_to_post'];
766
767 // icon class
768 $input['icon_class'] = isset( $input['icon_class'] ) ? trim( $input['icon_class'] ) : $pvc->defaults['display']['icon_class'];
769
770 $input['toolbar_statistics'] = isset( $input['toolbar_statistics'] ) ? trim( $input['toolbar_statistics'] ) : $pvc->defaults['display']['toolbar_statistics'];
771
772 // post types display
773 if ( isset( $input['post_types_display'] ) ) {
774 $post_types = array();
775
776 foreach ( $input['post_types_display'] as $post_type => $set ) {
777 if ( isset( $this->post_types[$post_type] ) )
778 $post_types[] = $post_type;
779 }
780
781 $input['post_types_display'] = array_unique( $post_types );
782 } else
783 $input['post_types_display'] = array();
784
785 // page types display
786 if ( isset( $input['page_types_display'] ) ) {
787 $page_types = array();
788
789 foreach ( $input['page_types_display'] as $page_type => $set ) {
790 if ( isset( $this->page_types[$page_type] ) )
791 $page_types[] = $page_type;
792 }
793
794 $input['page_types_display'] = array_unique( $page_types );
795 } else
796 $input['page_types_display'] = array();
797
798 // restrict display
799 if ( isset( $input['restrict_display']['groups'] ) ) {
800 $groups = array();
801
802 foreach ( $input['restrict_display']['groups'] as $group => $set ) {
803 if ( $group === 'robots' )
804 continue;
805
806 if ( isset( $this->groups[$group] ) )
807 $groups[] = $group;
808 }
809
810 $input['restrict_display']['groups'] = array_unique( $groups );
811 } else
812 $input['restrict_display']['groups'] = array();
813
814 if ( in_array( 'roles', $input['restrict_display']['groups'], true ) && isset( $input['restrict_display']['roles'] ) ) {
815 $roles = array();
816
817 foreach ( $input['restrict_display']['roles'] as $role => $set ) {
818 if ( isset( $this->user_roles[$role] ) )
819 $roles[] = $role;
820 }
821
822 $input['restrict_display']['roles'] = array_unique( $roles );
823 } else
824 $input['restrict_display']['roles'] = array();
825 // reset general settings
826 } elseif ( isset( $_POST['reset_pvc_general'] ) ) {
827 $input = $pvc->defaults['general'];
828
829 add_settings_error( 'reset_general_settings', 'settings_reset', __( 'General settings restored to defaults.', 'post-views-counter' ), 'updated' );
830 // reset display settings
831 } elseif ( isset( $_POST['reset_pvc_display'] ) ) {
832 $input = $pvc->defaults['display'];
833
834 add_settings_error( 'reset_general_settings', 'settings_reset', __( 'Display settings restored to defaults.', 'post-views-counter' ), 'updated' );
835 }
836
837 return $input;
838 }
839 }