PluginProbe ʕ •ᴥ•ʔ
Post Views Counter / 1.3.1
Post Views Counter v1.3.1
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 6 years ago columns.php 6 years ago counter.php 6 years ago crawler-detect.php 6 years ago cron.php 6 years ago dashboard.php 6 years ago frontend.php 6 years ago functions.php 6 years ago query.php 6 years ago settings.php 6 years ago update.php 6 years ago widgets.php 6 years ago
settings.php
804 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
37 if ( ! is_admin() )
38 return;
39
40 $this->modes = array(
41 'php' => __( 'PHP', 'post-views-counter' ),
42 'js' => __( 'JavaScript', 'post-views-counter' ),
43 'ajax' => __( 'Fast AJAX', 'post-views-counter' )
44 );
45
46 if ( function_exists( 'register_rest_route' ) ) {
47 $this->modes['rest_api'] = __( 'REST API', 'post-views-counter' );
48 }
49
50 $this->time_types = array(
51 'minutes' => __( 'minutes', 'post-views-counter' ),
52 'hours' => __( 'hours', 'post-views-counter' ),
53 'days' => __( 'days', 'post-views-counter' ),
54 'weeks' => __( 'weeks', 'post-views-counter' ),
55 'months' => __( 'months', 'post-views-counter' ),
56 'years' => __( 'years', 'post-views-counter' )
57 );
58
59 $this->groups = array(
60 'robots' => __( 'robots', 'post-views-counter' ),
61 'users' => __( 'logged in users', 'post-views-counter' ),
62 'guests' => __( 'guests', 'post-views-counter' ),
63 'roles' => __( 'selected user roles', 'post-views-counter' )
64 );
65
66 $this->positions = array(
67 'before' => __( 'before the content', 'post-views-counter' ),
68 'after' => __( 'after the content', 'post-views-counter' ),
69 'manual' => __( 'manual', 'post-views-counter' )
70 );
71
72 $this->display_styles = array(
73 'icon' => __( 'icon', 'post-views-counter' ),
74 'text' => __( 'label', 'post-views-counter' )
75 );
76
77 $this->tabs = array(
78 'general' => array(
79 'name' => __( 'General', 'post-views-counter' ),
80 'key' => 'post_views_counter_settings_general',
81 'submit' => 'save_pvc_general',
82 'reset' => 'reset_pvc_general'
83 ),
84 'display' => array(
85 'name' => __( 'Display', 'post-views-counter' ),
86 'key' => 'post_views_counter_settings_display',
87 'submit' => 'save_pvc_display',
88 'reset' => 'reset_pvc_display'
89 )
90 );
91
92 $this->user_roles = $this->get_user_roles();
93
94 $this->page_types = apply_filters( 'pvc_page_types_display_options', 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 * Get post types avaiable for counting.
104 */
105 public function load_post_types() {
106
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 if ( $key !== 'attachment' )
115 $post_types[$key] = $post_type->labels->name;
116 }
117
118 // public custom post types
119 foreach ( get_post_types( array( '_builtin' => false, 'public' => true ), 'objects', 'and' ) as $key => $post_type ) {
120 $post_types[$key] = $post_type->labels->name;
121 }
122
123 // sort post types alphabetically with their keys
124 asort( $post_types, SORT_STRING );
125
126 $this->post_types = $post_types;
127 }
128
129 /**
130 * Get all user roles.
131 *
132 * @global object $wp_roles
133 */
134 public function get_user_roles() {
135 global $wp_roles;
136
137 $roles = array();
138
139 foreach ( apply_filters( 'editable_roles', $wp_roles->roles ) as $role => $details ) {
140 $roles[$role] = translate_user_role( $details['name'] );
141 }
142
143 asort( $roles, SORT_STRING );
144
145 return $roles;
146 }
147
148 /**
149 * Add options page.
150 */
151 public function admin_menu_options() {
152 add_options_page(
153 __( 'Post Views Counter', 'post-views-counter' ), __( 'Post Views Counter', 'post-views-counter' ), 'manage_options', 'post-views-counter', array( $this, 'options_page' )
154 );
155 }
156
157 /**
158 * Options page callback.
159 *
160 * @return mixed
161 */
162 public function options_page() {
163 $tab_key = (isset( $_GET['tab'] ) ? esc_attr( $_GET['tab'] ) : 'general');
164
165 echo '
166 <div class="wrap">
167 <h2>' . __( 'Post Views Counter', 'post-views-counter' ) . '</h2>
168 <h2 class="nav-tab-wrapper">';
169
170 foreach ( $this->tabs as $key => $name ) {
171 echo '
172 <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>';
173 }
174
175 echo '
176 </h2>
177 <div class="post-views-counter-settings">
178 <div class="df-credits">
179 <h3 class="hndle">' . __( 'Post Views Counter', 'post-views-counter' ) . ' ' . Post_Views_Counter()->defaults['version'] . '</h3>
180 <div class="inside">
181 <h4 class="inner">' . __( 'Need support?', 'post-views-counter' ) . '</h4>
182 <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>
183 <hr />
184 <h4 class="inner">' . __( 'Do you like this plugin?', 'post-views-counter' ) . '</h4>
185 <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 />' .
186 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 />' .
187 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' ) . '
188 </p>
189 <hr />
190 <p class="df-link inner">' . __( 'Created by', 'post-views-counter' ) . ' <a href="http://www.dfactory.eu/?utm_source=post-views-counter-settings&utm_medium=link&utm_campaign=created-by" target="_blank" title="dFactory - Quality plugins for WordPress"><img src="' . POST_VIEWS_COUNTER_URL . '/images/logo-dfactory.png' . '" title="dFactory - Quality plugins for WordPress" alt="dFactory - Quality plugins for WordPress" /></a></p>
191 </div>
192 </div>
193 <form action="options.php" method="post">';
194
195 wp_nonce_field( 'update-options' );
196 settings_fields( $this->tabs[$tab_key]['key'] );
197 do_settings_sections( $this->tabs[$tab_key]['key'] );
198
199 echo '
200 <p class="submit">';
201
202 submit_button( '', 'primary', $this->tabs[$tab_key]['submit'], false );
203
204 echo ' ';
205
206 submit_button( __( 'Reset to defaults', 'post-views-counter' ), 'secondary reset_pvc_settings', $this->tabs[$tab_key]['reset'], false );
207
208 echo '
209 </p>
210 </form>
211 </div>
212 <div class="clear"></div>
213 </div>';
214 }
215
216 /**
217 * Register settings callback.
218 */
219 public function register_settings() {
220 // general options
221 register_setting( 'post_views_counter_settings_general', 'post_views_counter_settings_general', array( $this, 'validate_settings' ) );
222 add_settings_section( 'post_views_counter_settings_general', __( 'General settings', 'post-views-counter' ), '', 'post_views_counter_settings_general' );
223 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' );
224 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' );
225 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' );
226 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' );
227 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' );
228 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' );
229 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' );
230 add_settings_field( 'pvc_exclude', __( 'Exclude Visitors', 'post-views-counter' ), array( $this, 'exclude' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
231 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' );
232 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' );
233 add_settings_field( 'pvc_wp_postviews', __( 'Tools', 'post-views-counter' ), array( $this, 'wp_postviews' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
234 add_settings_field( 'pvc_deactivation_delete', __( 'Deactivation', 'post-views-counter' ), array( $this, 'deactivation_delete' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
235
236 // display options
237 register_setting( 'post_views_counter_settings_display', 'post_views_counter_settings_display', array( $this, 'validate_settings' ) );
238 add_settings_section( 'post_views_counter_settings_display', __( 'Display settings', 'post-views-counter' ), '', 'post_views_counter_settings_display' );
239 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' );
240 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' );
241 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' );
242 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' );
243 add_settings_field( 'pvc_position', __( 'Position', 'post-views-counter' ), array( $this, 'position' ), 'post_views_counter_settings_display', 'post_views_counter_settings_display' );
244 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' );
245 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' );
246 }
247
248 /**
249 * Post views label option.
250 */
251 public function post_views_label() {
252 echo '
253 <div id="pvc_post_views_label">
254 <fieldset>
255 <input type="text" class="large-text" name="post_views_counter_settings_display[label]" value="' . esc_attr( Post_Views_Counter()->options['display']['label'] ) . '" />
256 <p class="description">' . __( 'Enter the label for the post views counter field.', 'post-views-counter' ) . '</p>
257 </fieldset>
258 </div>';
259 }
260
261 /**
262 * Post types to count option.
263 */
264 public function post_types_count() {
265 echo '
266 <div id="pvc_post_types_count">';
267
268 foreach ( $this->post_types as $post_type => $post_type_name ) {
269 echo '
270 <label class="cb-checkbox"><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>';
271 }
272
273 echo '
274 <p class="description">' . __( 'Select post types for which post views will be counted.', 'post-views-counter' ) . '</p>
275 </div>';
276 }
277
278 /**
279 * Post types to display option.
280 */
281 public function post_types_display() {
282 echo '
283 <div id="pvc_post_types_display">';
284
285 foreach ( $this->post_types as $post_type => $post_type_name ) {
286 echo '
287 <label class="cb-checkbox"><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>';
288 }
289
290 echo '
291 <p class="description">' . __( 'Select post types for which the views count will be displayed.', 'post-views-counter' ) . '</p>
292 </div>';
293 }
294
295 /**
296 * Counter mode option.
297 */
298 public function counter_mode() {
299 echo '
300 <div id="pvc_counter_mode">';
301
302 foreach ( $this->modes as $key => $value ) {
303 $key = esc_attr( $key );
304
305 echo '
306 <label class="cb-radio"><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>';
307 }
308
309 echo '
310 <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>
311 </div>';
312 }
313
314 /**
315 * Post views column option.
316 */
317 public function post_views_column() {
318 echo '
319 <div id="pvc_post_views_column">
320 <label class="cb-checkbox"><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>
321 </div>';
322 }
323
324 /**
325 * Time between counts option.
326 */
327 public function time_between_counts() {
328 echo '
329 <div id="pvc_time_between_counts">
330 <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'] ) . '" />
331 <select class="pvc-chosen-short" name="post_views_counter_settings_general[time_between_counts][type]">';
332
333 foreach ( $this->time_types as $type => $type_name ) {
334 echo '
335 <option value="' . esc_attr( $type ) . '" ' . selected( $type, Post_Views_Counter()->options['general']['time_between_counts']['type'], false ) . '>' . esc_html( $type_name ) . '</option>';
336 }
337
338 echo '
339 </select>
340 <p class="description">' . __( 'Enter the time between single user visit count.', 'post-views-counter' ) . '</p>
341 </div>';
342 }
343
344 /**
345 * Reset counts option.
346 */
347 public function reset_counts() {
348 echo '
349 <div id="pvc_reset_counts">
350 <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'] ) . '" />
351 <select class="pvc-chosen-short" name="post_views_counter_settings_general[reset_counts][type]">';
352
353 foreach ( array_slice( $this->time_types, 2, null, true ) as $type => $type_name ) {
354 echo '
355 <option value="' . esc_attr( $type ) . '" ' . selected( $type, Post_Views_Counter()->options['general']['reset_counts']['type'], false ) . '>' . esc_html( $type_name ) . '</option>';
356 }
357
358 echo '
359 </select>
360 <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>
361 </div>';
362 }
363
364 /**
365 * Flush interval option.
366 */
367 public function flush_interval() {
368 echo '
369 <div id="pvc_flush_interval">
370 <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'] ) . '" />
371 <select class="pvc-chosen-short" name="post_views_counter_settings_general[flush_interval][type]">';
372
373 foreach ( $this->time_types as $type => $type_name ) {
374 echo '
375 <option value="' . esc_attr( $type ) . '" ' . selected( $type, Post_Views_Counter()->options['general']['flush_interval']['type'], false ) . '>' . esc_html( $type_name ) . '</option>';
376 }
377
378 echo '
379 </select>
380 <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>
381 </div>';
382 }
383
384 /**
385 * Exlude user groups option.
386 */
387 public function exclude() {
388 echo '
389 <div id="pvc_exclude">
390 <fieldset>';
391
392 foreach ( $this->groups as $type => $type_name ) {
393 echo '
394 <label class="cb-checkbox"><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>';
395 }
396
397 echo '
398 <p class="description">' . __( 'Use it to hide the post views counter from selected type of visitors.', 'post-views-counter' ) . '</p>
399 <div class="pvc_user_roles"' . (in_array( 'roles', Post_Views_Counter()->options['general']['exclude']['groups'], true ) ? '' : ' style="display: none;"') . '>';
400
401 foreach ( $this->user_roles as $role => $role_name ) {
402 echo '
403 <label class="cb-checkbox"><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>';
404 }
405
406 echo ' <p class="description">' . __( 'Use it to hide the post views counter from selected user roles.', 'post-views-counter' ) . '</p>
407 </div>
408 </fieldset>
409 </div>';
410 }
411
412 /**
413 * Exclude IPs option.
414 */
415 public function exclude_ips() {
416 // lovely php 5.2 limitations
417 $ips = Post_Views_Counter()->options['general']['exclude_ips'];
418
419 echo '
420 <div id="pvc_exclude_ips">';
421
422 if ( ! empty( $ips ) ) {
423 foreach ( $ips as $key => $ip ) {
424 echo '
425 <div class="ip-box">
426 <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>
427 </div>';
428 }
429 } else {
430 echo '
431 <div class="ip-box">
432 <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>
433 </div>';
434 }
435
436 echo '
437 <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>
438 <p class="description">' . __( 'Enter the IP addresses to be excluded from post views count.', 'post-views-counter' ) . '</p>
439 </div>';
440 }
441
442 /**
443 * Strict counts option.
444 */
445 public function strict_counts() {
446 echo '
447 <div id="pvc_strict_counts">
448 <label class="cb-checkbox"><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>
449 </div>';
450 }
451
452 /**
453 * WP-PostViews import option.
454 */
455 public function wp_postviews() {
456 echo '
457 <div id="pvc_wp_postviews">
458 <fieldset>
459 <input type="submit" class="button button-secondary" name="post_views_counter_import_wp_postviews" value="' . __( 'Import views', 'post-views-counter' ) . '"/> <label class="cb-checkbox"><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>
460 <p class="description">' . __( 'Import post views data from WP-PostViews plugin.', 'post-views-counter' ) . '</p>
461 <input type="submit" class="button button-secondary" name="post_views_counter_reset_views" value="' . __( 'Delete views', 'post-views-counter' ) . '"/>
462 <p class="description">' . __( 'Delete ALL the existing post views data.', 'post-views-counter' ) . '</p>
463 </fieldset>
464 </div>';
465 }
466
467 /**
468 * Limit views edit to admins.
469 */
470 public function restrict_edit_views() {
471 echo '
472 <div id="pvc_restrict_edit_views">
473 <label class="cb-checkbox"><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>
474 </div>';
475 }
476
477 /**
478 * Plugin deactivation option.
479 */
480 public function deactivation_delete() {
481 echo '
482 <div id="pvc_deactivation_delete">
483 <label class="cb-checkbox"><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>
484 </div>';
485 }
486
487 /**
488 * Visibility option.
489 */
490 public function page_types_display() {
491 echo '
492 <div id="pvc_post_types_display">';
493
494 foreach ( $this->page_types as $key => $label ) {
495 echo '
496 <label class="cb-checkbox"><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>';
497 }
498
499 echo '
500 <p class="description">' . __( 'Select page types where the views count will be displayed.', 'post-views-counter' ) . '</p>
501 </div>';
502 }
503
504 /**
505 * Counter position option.
506 */
507 public function position() {
508 echo '
509 <div id="pvc_position">
510 <select class="pvc-chosen-short" name="post_views_counter_settings_display[position]">';
511
512 foreach ( $this->positions as $position => $position_name ) {
513 echo '
514 <option value="' . esc_attr( $position ) . '" ' . selected( $position, Post_Views_Counter()->options['display']['position'], false ) . '>' . esc_html( $position_name ) . '</option>';
515 }
516
517 echo '
518 </select>
519 <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>
520 </div>';
521 }
522
523 /**
524 * Counter style option.
525 */
526 public function display_style() {
527 echo '
528 <div id="pvc_display_style">';
529
530 foreach ( $this->display_styles as $display => $style ) {
531 $display = esc_attr( $display );
532
533 echo '
534 <label class="cb-checkbox"><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>';
535 }
536
537 echo '
538 <p class="description">' . __( 'Choose how to display the post views counter.', 'post-views-counter' ) . '</p>
539 </div>';
540 }
541
542 /**
543 * Counter icon class option.
544 */
545 public function icon_class() {
546 echo '
547 <div id="pvc_icon_class">
548 <input type="text" name="post_views_counter_settings_display[icon_class]" class="large-text" value="' . esc_attr( Post_Views_Counter()->options['display']['icon_class'] ) . '" />
549 <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>
550 </div>';
551 }
552
553 /**
554 * Restrict display option.
555 */
556 public function restrict_display() {
557 echo '
558 <div id="pvc_restrict_display">
559 <fieldset>';
560
561 foreach ( $this->groups as $type => $type_name ) {
562
563 if ( $type === 'robots' )
564 continue;
565
566 echo '
567 <label class="cb-checkbox"><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>';
568 }
569
570 echo '
571 <p class="description">' . __( 'Use it to hide the post views counter from selected type of visitors.', 'post-views-counter' ) . '</p>
572 <div class="pvc_user_roles"' . (in_array( 'roles', Post_Views_Counter()->options['display']['restrict_display']['groups'], true ) ? '' : ' style="display: none;"') . '>';
573
574 foreach ( $this->user_roles as $role => $role_name ) {
575 echo '
576 <label class="cb-checkbox"><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>';
577 }
578
579 echo '
580 <p class="description">' . __( 'Use it to hide the post views counter from selected user roles.', 'post-views-counter' ) . '</p>
581 </div>
582 </fieldset>
583 </div>';
584 }
585
586 /**
587 * Validate general settings.
588 */
589 public function validate_settings( $input ) {
590 if ( isset( $_POST['post_views_counter_import_wp_postviews'] ) ) {
591 global $wpdb;
592
593 $meta_key = esc_attr( apply_filters( 'pvc_import_meta_key', 'views' ) );
594
595 $views = $wpdb->get_results( "SELECT post_id, meta_value FROM " . $wpdb->postmeta . " WHERE meta_key = '" . $meta_key . "'", ARRAY_A, 0 );
596
597 if ( ! empty( $views ) ) {
598 $input = Post_Views_Counter()->defaults['general'];
599 $input['wp_postviews_import'] = true;
600
601 $sql = array();
602
603 foreach ( $views as $view ) {
604 $sql[] = "(" . $view['post_id'] . ", 4, 'total', " . $view['meta_value'] . ")";
605 }
606
607 $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)" );
608
609 add_settings_error( 'wp_postviews_import', 'wp_postviews_import', __( 'Post views data imported succesfully.', 'post-views-counter' ), 'updated' );
610 } else {
611 add_settings_error( 'wp_postviews_import', 'wp_postviews_import', __( 'There was no post views data to import.', 'post-views-counter' ), 'updated' );
612 }
613 } elseif ( isset( $_POST['post_views_counter_reset_views'] ) ) {
614 global $wpdb;
615
616 if ( $wpdb->query( 'TRUNCATE TABLE ' . $wpdb->prefix . 'post_views' ) )
617 add_settings_error( 'reset_post_views', 'reset_post_views', __( 'All existing data deleted succesfully.', 'post-views-counter' ), 'updated' );
618 else
619 add_settings_error( 'reset_post_views', 'reset_post_views', __( 'Error occurred. All existing data were not deleted.', 'post-views-counter' ), 'error' );
620 } elseif ( isset( $_POST['save_pvc_general'] ) ) {
621 // post types count
622 if ( isset( $input['post_types_count'] ) ) {
623 $post_types = array();
624
625 foreach ( $input['post_types_count'] as $post_type => $set ) {
626 if ( isset( $this->post_types[$post_type] ) )
627 $post_types[] = $post_type;
628 }
629
630 $input['post_types_count'] = array_unique( $post_types );
631 } else
632 $input['post_types_count'] = array();
633
634 // counter mode
635 $input['counter_mode'] = isset( $input['counter_mode'], $this->modes[$input['counter_mode']] ) ? $input['counter_mode'] : Post_Views_Counter()->defaults['general']['counter_mode'];
636
637 // post views column
638 $input['post_views_column'] = isset( $input['post_views_column'] );
639
640 // time between counts
641 $input['time_between_counts']['number'] = (int) ( isset( $input['time_between_counts']['number'] ) ? $input['time_between_counts']['number'] : Post_Views_Counter()->defaults['general']['time_between_counts']['number'] );
642 $input['time_between_counts']['type'] = isset( $input['time_between_counts']['type'], $this->time_types[$input['time_between_counts']['type']] ) ? $input['time_between_counts']['type'] : Post_Views_Counter()->defaults['general']['time_between_counts']['type'];
643
644 // flush interval
645 $input['flush_interval']['number'] = (int) ( isset( $input['flush_interval']['number'] ) ? $input['flush_interval']['number'] : Post_Views_Counter()->defaults['general']['flush_interval']['number'] );
646 $input['flush_interval']['type'] = isset( $input['flush_interval']['type'], $this->time_types[$input['flush_interval']['type']] ) ? $input['flush_interval']['type'] : Post_Views_Counter()->defaults['general']['flush_interval']['type'];
647
648 // Since the settings are about to be saved and cache flush interval could've changed,
649 // we want to make sure that any changes done on the settings page are in effect immediately
650 // (instead of having to wait for the previous schedule to occur).
651 // We achieve that by making sure to clear any previous cache flush schedules and
652 // schedule the new one if the specified interval is > 0
653 Post_Views_Counter()->remove_cache_flush();
654
655 if ( $input['flush_interval']['number'] > 0 ) {
656 Post_Views_Counter()->schedule_cache_flush();
657 }
658
659 // reset counts
660 $input['reset_counts']['number'] = (int) ( isset( $input['reset_counts']['number'] ) ? $input['reset_counts']['number'] : Post_Views_Counter()->defaults['general']['reset_counts']['number'] );
661 $input['reset_counts']['type'] = isset( $input['reset_counts']['type'], $this->time_types[$input['reset_counts']['type']] ) ? $input['reset_counts']['type'] : Post_Views_Counter()->defaults['general']['reset_counts']['type'];
662
663 // run cron on next visit?
664 $input['cron_run'] = ($input['reset_counts']['number'] > 0 ? true : false);
665 $input['cron_update'] = ($input['cron_run'] && (Post_Views_Counter()->options['general']['reset_counts']['number'] !== $input['reset_counts']['number'] || Post_Views_Counter()->options['general']['reset_counts']['type'] !== $input['reset_counts']['type']) ? true : false);
666
667 // exclude
668 if ( isset( $input['exclude']['groups'] ) ) {
669 $groups = array();
670
671 foreach ( $input['exclude']['groups'] as $group => $set ) {
672 if ( isset( $this->groups[$group] ) )
673 $groups[] = $group;
674 }
675
676 $input['exclude']['groups'] = array_unique( $groups );
677 } else {
678 $input['exclude']['groups'] = array();
679 }
680
681 if ( in_array( 'roles', $input['exclude']['groups'], true ) && isset( $input['exclude']['roles'] ) ) {
682 $roles = array();
683
684 foreach ( $input['exclude']['roles'] as $role => $set ) {
685 if ( isset( $this->user_roles[$role] ) )
686 $roles[] = $role;
687 }
688
689 $input['exclude']['roles'] = array_unique( $roles );
690 } else
691 $input['exclude']['roles'] = array();
692
693 // exclude ips
694 if ( isset( $input['exclude_ips'] ) ) {
695 $ips = array();
696
697 foreach ( $input['exclude_ips'] as $ip ) {
698 if ( strpos( $ip, '*' ) !== false ) {
699 $new_ip = str_replace( '*', '0', $ip );
700
701 if ( filter_var( $new_ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) )
702 $ips[] = $ip;
703 } elseif ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) )
704 $ips[] = $ip;
705 }
706
707 $input['exclude_ips'] = array_unique( $ips );
708 }
709
710 // restrict edit views
711 $input['restrict_edit_views'] = isset( $input['restrict_edit_views'] );
712
713 // strict counts
714 $input['strict_counts'] = isset( $input['strict_counts'] );
715
716 // deactivation delete
717 $input['deactivation_delete'] = isset( $input['deactivation_delete'] );
718 } elseif ( isset( $_POST['save_pvc_display'] ) ) {
719
720 // post views label
721 $input['label'] = isset( $input['label'] ) ? $input['label'] : Post_Views_Counter()->defaults['general']['label'];
722
723 if ( function_exists( 'icl_register_string' ) )
724 icl_register_string( 'Post Views Counter', 'Post Views Label', $input['label'] );
725
726 // position
727 $input['position'] = isset( $input['position'], $this->positions[$input['position']] ) ? $input['position'] : Post_Views_Counter()->defaults['general']['position'];
728
729 // display style
730 $input['display_style']['icon'] = isset( $input['display_style']['icon'] );
731 $input['display_style']['text'] = isset( $input['display_style']['text'] );
732
733 // link to post
734 $input['link_to_post'] = isset( $input['link_to_post'] ) ? $input['link_to_post'] : Post_Views_Counter()->defaults['display']['link_to_post'];
735
736 // icon class
737 $input['icon_class'] = isset( $input['icon_class'] ) ? trim( $input['icon_class'] ) : Post_Views_Counter()->defaults['general']['icon_class'];
738
739 // post types display
740 if ( isset( $input['post_types_display'] ) ) {
741 $post_types = array();
742
743 foreach ( $input['post_types_display'] as $post_type => $set ) {
744 if ( isset( $this->post_types[$post_type] ) )
745 $post_types[] = $post_type;
746 }
747
748 $input['post_types_display'] = array_unique( $post_types );
749 } else
750 $input['post_types_display'] = array();
751
752 // page types display
753 if ( isset( $input['page_types_display'] ) ) {
754 $page_types = array();
755
756 foreach ( $input['page_types_display'] as $page_type => $set ) {
757 if ( isset( $this->page_types[$page_type] ) )
758 $page_types[] = $page_type;
759 }
760
761 $input['page_types_display'] = array_unique( $page_types );
762 } else
763 $input['page_types_display'] = array();
764
765 // restrict display
766 if ( isset( $input['restrict_display']['groups'] ) ) {
767 $groups = array();
768
769 foreach ( $input['restrict_display']['groups'] as $group => $set ) {
770 if ( $group === 'robots' )
771 continue;
772
773 if ( isset( $this->groups[$group] ) )
774 $groups[] = $group;
775 }
776
777 $input['restrict_display']['groups'] = array_unique( $groups );
778 } else
779 $input['restrict_display']['groups'] = array();
780
781 if ( in_array( 'roles', $input['restrict_display']['groups'], true ) && isset( $input['restrict_display']['roles'] ) ) {
782 $roles = array();
783
784 foreach ( $input['restrict_display']['roles'] as $role => $set ) {
785 if ( isset( $this->user_roles[$role] ) )
786 $roles[] = $role;
787 }
788
789 $input['restrict_display']['roles'] = array_unique( $roles );
790 } else
791 $input['restrict_display']['roles'] = array();
792 } elseif ( isset( $_POST['reset_pvc_general'] ) ) {
793 $input = Post_Views_Counter()->defaults['general'];
794
795 add_settings_error( 'reset_general_settings', 'settings_reset', __( 'General settings restored to defaults.', 'post-views-counter' ), 'updated' );
796 } elseif ( isset( $_POST['reset_pvc_display'] ) ) {
797 $input = Post_Views_Counter()->defaults['display'];
798
799 add_settings_error( 'reset_general_settings', 'settings_reset', __( 'Display settings restored to defaults.', 'post-views-counter' ), 'updated' );
800 }
801
802 return $input;
803 }
804 }