PluginProbe ʕ •ᴥ•ʔ
Post Views Counter / 1.3.8
Post Views Counter v1.3.8
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 class-admin.php 4 years ago class-columns.php 4 years ago class-counter.php 4 years ago class-crawler-detect.php 4 years ago class-cron.php 4 years ago class-dashboard.php 4 years ago class-frontend.php 4 years ago class-functions.php 4 years ago class-query.php 4 years ago class-settings-api.php 4 years ago class-settings.php 4 years ago class-update.php 4 years ago class-widgets.php 4 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 4 years ago query.php 6 years ago settings.php 6 years ago update.php 6 years ago widgets.php 6 years ago
settings.php
816 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 }
253
254 /**
255 * Post views label option.
256 */
257 public function post_views_label() {
258 echo '
259 <div id="pvc_post_views_label">
260 <fieldset>
261 <input type="text" class="large-text" name="post_views_counter_settings_display[label]" value="' . esc_attr( Post_Views_Counter()->options['display']['label'] ) . '" />
262 <p class="description">' . __( 'Enter the label for the post views counter field.', 'post-views-counter' ) . '</p>
263 </fieldset>
264 </div>';
265 }
266
267 /**
268 * Post types to count option.
269 */
270 public function post_types_count() {
271 echo '
272 <div id="pvc_post_types_count">';
273
274 foreach ( $this->post_types as $post_type => $post_type_name ) {
275 echo '
276 <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>';
277 }
278
279 echo '
280 <p class="description">' . __( 'Select post types for which post views will be counted.', 'post-views-counter' ) . '</p>
281 </div>';
282 }
283
284 /**
285 * Post types to display option.
286 */
287 public function post_types_display() {
288 echo '
289 <div id="pvc_post_types_display">';
290
291 foreach ( $this->post_types as $post_type => $post_type_name ) {
292 echo '
293 <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>';
294 }
295
296 echo '
297 <p class="description">' . __( 'Select post types for which the views count will be displayed.', 'post-views-counter' ) . '</p>
298 </div>';
299 }
300
301 /**
302 * Counter mode option.
303 */
304 public function counter_mode() {
305 echo '
306 <div id="pvc_counter_mode">';
307
308 foreach ( $this->modes as $key => $value ) {
309 $key = esc_attr( $key );
310
311 echo '
312 <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>';
313 }
314
315 echo '
316 <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>
317 </div>';
318 }
319
320 /**
321 * Post views column option.
322 */
323 public function post_views_column() {
324 echo '
325 <div id="pvc_post_views_column">
326 <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>
327 </div>';
328 }
329
330 /**
331 * Time between counts option.
332 */
333 public function time_between_counts() {
334 echo '
335 <div id="pvc_time_between_counts">
336 <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'] ) . '" />
337 <select class="pvc-chosen-short" name="post_views_counter_settings_general[time_between_counts][type]">';
338
339 foreach ( $this->time_types as $type => $type_name ) {
340 echo '
341 <option value="' . esc_attr( $type ) . '" ' . selected( $type, Post_Views_Counter()->options['general']['time_between_counts']['type'], false ) . '>' . esc_html( $type_name ) . '</option>';
342 }
343
344 echo '
345 </select>
346 <p class="description">' . __( 'Enter the time between single user visit count.', 'post-views-counter' ) . '</p>
347 </div>';
348 }
349
350 /**
351 * Reset counts option.
352 */
353 public function reset_counts() {
354 echo '
355 <div id="pvc_reset_counts">
356 <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'] ) . '" />
357 <select class="pvc-chosen-short" name="post_views_counter_settings_general[reset_counts][type]">';
358
359 foreach ( array_slice( $this->time_types, 2, null, true ) as $type => $type_name ) {
360 echo '
361 <option value="' . esc_attr( $type ) . '" ' . selected( $type, Post_Views_Counter()->options['general']['reset_counts']['type'], false ) . '>' . esc_html( $type_name ) . '</option>';
362 }
363
364 echo '
365 </select>
366 <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>
367 </div>';
368 }
369
370 /**
371 * Flush interval option.
372 */
373 public function flush_interval() {
374 echo '
375 <div id="pvc_flush_interval">
376 <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'] ) . '" />
377 <select class="pvc-chosen-short" name="post_views_counter_settings_general[flush_interval][type]">';
378
379 foreach ( $this->time_types as $type => $type_name ) {
380 echo '
381 <option value="' . esc_attr( $type ) . '" ' . selected( $type, Post_Views_Counter()->options['general']['flush_interval']['type'], false ) . '>' . esc_html( $type_name ) . '</option>';
382 }
383
384 echo '
385 </select>
386 <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>
387 </div>';
388 }
389
390 /**
391 * Exlude user groups option.
392 */
393 public function exclude() {
394 echo '
395 <div id="pvc_exclude">
396 <fieldset>';
397
398 foreach ( $this->groups as $type => $type_name ) {
399 echo '
400 <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>';
401 }
402
403 echo '
404 <p class="description">' . __( 'Use it to hide the post views counter from selected type of visitors.', 'post-views-counter' ) . '</p>
405 <div class="pvc_user_roles"' . (in_array( 'roles', Post_Views_Counter()->options['general']['exclude']['groups'], true ) ? '' : ' style="display: none;"') . '>';
406
407 foreach ( $this->user_roles as $role => $role_name ) {
408 echo '
409 <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>';
410 }
411
412 echo ' <p class="description">' . __( 'Use it to hide the post views counter from selected user roles.', 'post-views-counter' ) . '</p>
413 </div>
414 </fieldset>
415 </div>';
416 }
417
418 /**
419 * Exclude IPs option.
420 */
421 public function exclude_ips() {
422 // lovely php 5.2 limitations
423 $ips = Post_Views_Counter()->options['general']['exclude_ips'];
424
425 echo '
426 <div id="pvc_exclude_ips">';
427
428 if ( ! empty( $ips ) ) {
429 foreach ( $ips as $key => $ip ) {
430 echo '
431 <div class="ip-box">
432 <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>
433 </div>';
434 }
435 } else {
436 echo '
437 <div class="ip-box">
438 <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>
439 </div>';
440 }
441
442 echo '
443 <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>
444 <p class="description">' . __( 'Enter the IP addresses to be excluded from post views count.', 'post-views-counter' ) . '</p>
445 </div>';
446 }
447
448 /**
449 * Strict counts option.
450 */
451 public function strict_counts() {
452 echo '
453 <div id="pvc_strict_counts">
454 <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>
455 </div>';
456 }
457
458 /**
459 * WP-PostViews import option.
460 */
461 public function wp_postviews() {
462 echo '
463 <div id="pvc_wp_postviews">
464 <fieldset>
465 <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>
466 <p class="description">' . __( 'Import post views data from WP-PostViews plugin.', 'post-views-counter' ) . '</p>
467 <input type="submit" class="button button-secondary" name="post_views_counter_reset_views" value="' . __( 'Delete views', 'post-views-counter' ) . '"/>
468 <p class="description">' . __( 'Delete ALL the existing post views data.', 'post-views-counter' ) . '</p>
469 </fieldset>
470 </div>';
471 }
472
473 /**
474 * Limit views edit to admins.
475 */
476 public function restrict_edit_views() {
477 echo '
478 <div id="pvc_restrict_edit_views">
479 <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>
480 </div>';
481 }
482
483 /**
484 * Plugin deactivation option.
485 */
486 public function deactivation_delete() {
487 echo '
488 <div id="pvc_deactivation_delete">
489 <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>
490 </div>';
491 }
492
493 /**
494 * Visibility option.
495 */
496 public function page_types_display() {
497 echo '
498 <div id="pvc_post_types_display">';
499
500 foreach ( $this->page_types as $key => $label ) {
501 echo '
502 <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>';
503 }
504
505 echo '
506 <p class="description">' . __( 'Select page types where the views count will be displayed.', 'post-views-counter' ) . '</p>
507 </div>';
508 }
509
510 /**
511 * Counter position option.
512 */
513 public function position() {
514 echo '
515 <div id="pvc_position">
516 <select class="pvc-chosen-short" name="post_views_counter_settings_display[position]">';
517
518 foreach ( $this->positions as $position => $position_name ) {
519 echo '
520 <option value="' . esc_attr( $position ) . '" ' . selected( $position, Post_Views_Counter()->options['display']['position'], false ) . '>' . esc_html( $position_name ) . '</option>';
521 }
522
523 echo '
524 </select>
525 <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>
526 </div>';
527 }
528
529 /**
530 * Counter style option.
531 */
532 public function display_style() {
533 echo '
534 <div id="pvc_display_style">';
535
536 foreach ( $this->display_styles as $display => $style ) {
537 $display = esc_attr( $display );
538
539 echo '
540 <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>';
541 }
542
543 echo '
544 <p class="description">' . __( 'Choose how to display the post views counter.', 'post-views-counter' ) . '</p>
545 </div>';
546 }
547
548 /**
549 * Counter icon class option.
550 */
551 public function icon_class() {
552 echo '
553 <div id="pvc_icon_class">
554 <input type="text" name="post_views_counter_settings_display[icon_class]" class="large-text" value="' . esc_attr( Post_Views_Counter()->options['display']['icon_class'] ) . '" />
555 <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>
556 </div>';
557 }
558
559 /**
560 * Restrict display option.
561 */
562 public function restrict_display() {
563 echo '
564 <div id="pvc_restrict_display">
565 <fieldset>';
566
567 foreach ( $this->groups as $type => $type_name ) {
568
569 if ( $type === 'robots' )
570 continue;
571
572 echo '
573 <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>';
574 }
575
576 echo '
577 <p class="description">' . __( 'Use it to hide the post views counter from selected type of visitors.', 'post-views-counter' ) . '</p>
578 <div class="pvc_user_roles"' . (in_array( 'roles', Post_Views_Counter()->options['display']['restrict_display']['groups'], true ) ? '' : ' style="display: none;"') . '>';
579
580 foreach ( $this->user_roles as $role => $role_name ) {
581 echo '
582 <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>';
583 }
584
585 echo '
586 <p class="description">' . __( 'Use it to hide the post views counter from selected user roles.', 'post-views-counter' ) . '</p>
587 </div>
588 </fieldset>
589 </div>';
590 }
591
592 /**
593 * Validate general settings.
594 */
595 public function validate_settings( $input ) {
596 // get main instance
597 $pvc = Post_Views_Counter();
598
599 if ( isset( $_POST['post_views_counter_import_wp_postviews'] ) ) {
600 global $wpdb;
601
602 $meta_key = esc_attr( apply_filters( 'pvc_import_meta_key', 'views' ) );
603
604 $views = $wpdb->get_results( "SELECT post_id, meta_value FROM " . $wpdb->postmeta . " WHERE meta_key = '" . $meta_key . "'", ARRAY_A, 0 );
605
606 if ( ! empty( $views ) ) {
607 $input = $pvc->defaults['general'];
608 $input['wp_postviews_import'] = true;
609
610 $sql = array();
611
612 foreach ( $views as $view ) {
613 $sql[] = "(" . $view['post_id'] . ", 4, 'total', " . $view['meta_value'] . ")";
614 }
615
616 $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)" );
617
618 add_settings_error( 'wp_postviews_import', 'wp_postviews_import', __( 'Post views data imported succesfully.', 'post-views-counter' ), 'updated' );
619 } else {
620 add_settings_error( 'wp_postviews_import', 'wp_postviews_import', __( 'There was no post views data to import.', 'post-views-counter' ), 'updated' );
621 }
622 } elseif ( isset( $_POST['post_views_counter_reset_views'] ) ) {
623 global $wpdb;
624
625 if ( $wpdb->query( 'TRUNCATE TABLE ' . $wpdb->prefix . 'post_views' ) )
626 add_settings_error( 'reset_post_views', 'reset_post_views', __( 'All existing data deleted succesfully.', 'post-views-counter' ), 'updated' );
627 else
628 add_settings_error( 'reset_post_views', 'reset_post_views', __( 'Error occurred. All existing data were not deleted.', 'post-views-counter' ), 'error' );
629 } elseif ( isset( $_POST['save_pvc_general'] ) ) {
630 // post types count
631 if ( isset( $input['post_types_count'] ) ) {
632 $post_types = array();
633
634 foreach ( $input['post_types_count'] as $post_type => $set ) {
635 if ( isset( $this->post_types[$post_type] ) )
636 $post_types[] = $post_type;
637 }
638
639 $input['post_types_count'] = array_unique( $post_types );
640 } else
641 $input['post_types_count'] = array();
642
643 // counter mode
644 $input['counter_mode'] = isset( $input['counter_mode'], $this->modes[$input['counter_mode']] ) ? $input['counter_mode'] : $pvc->defaults['general']['counter_mode'];
645
646 // post views column
647 $input['post_views_column'] = isset( $input['post_views_column'] );
648
649 // time between counts
650 $input['time_between_counts']['number'] = (int) ( isset( $input['time_between_counts']['number'] ) ? $input['time_between_counts']['number'] : $pvc->defaults['general']['time_between_counts']['number'] );
651 $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'];
652
653 // flush interval
654 $input['flush_interval']['number'] = (int) ( isset( $input['flush_interval']['number'] ) ? $input['flush_interval']['number'] : $pvc->defaults['general']['flush_interval']['number'] );
655 $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'];
656
657 // Since the settings are about to be saved and cache flush interval could've changed,
658 // we want to make sure that any changes done on the settings page are in effect immediately
659 // (instead of having to wait for the previous schedule to occur).
660 // We achieve that by making sure to clear any previous cache flush schedules and
661 // schedule the new one if the specified interval is > 0
662 $pvc->remove_cache_flush();
663
664 if ( $input['flush_interval']['number'] > 0 ) {
665 $pvc->schedule_cache_flush();
666 }
667
668 // reset counts
669 $input['reset_counts']['number'] = (int) ( isset( $input['reset_counts']['number'] ) ? $input['reset_counts']['number'] : $pvc->defaults['general']['reset_counts']['number'] );
670 $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'];
671
672 // run cron on next visit?
673 $input['cron_run'] = ($input['reset_counts']['number'] > 0 ? true : false);
674 $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'] ) ? true : false);
675
676 // exclude
677 if ( isset( $input['exclude']['groups'] ) ) {
678 $groups = array();
679
680 foreach ( $input['exclude']['groups'] as $group => $set ) {
681 if ( isset( $this->groups[$group] ) )
682 $groups[] = $group;
683 }
684
685 $input['exclude']['groups'] = array_unique( $groups );
686 } else {
687 $input['exclude']['groups'] = array();
688 }
689
690 if ( in_array( 'roles', $input['exclude']['groups'], true ) && isset( $input['exclude']['roles'] ) ) {
691 $roles = array();
692
693 foreach ( $input['exclude']['roles'] as $role => $set ) {
694 if ( isset( $this->user_roles[$role] ) )
695 $roles[] = $role;
696 }
697
698 $input['exclude']['roles'] = array_unique( $roles );
699 } else
700 $input['exclude']['roles'] = array();
701
702 // exclude ips
703 if ( isset( $input['exclude_ips'] ) ) {
704 $ips = array();
705
706 foreach ( $input['exclude_ips'] as $ip ) {
707 if ( strpos( $ip, '*' ) !== false ) {
708 $new_ip = str_replace( '*', '0', $ip );
709
710 if ( filter_var( $new_ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) )
711 $ips[] = $ip;
712 } elseif ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) )
713 $ips[] = $ip;
714 }
715
716 $input['exclude_ips'] = array_unique( $ips );
717 }
718
719 // restrict edit views
720 $input['restrict_edit_views'] = isset( $input['restrict_edit_views'] );
721
722 // strict counts
723 $input['strict_counts'] = isset( $input['strict_counts'] );
724
725 // deactivation delete
726 $input['deactivation_delete'] = isset( $input['deactivation_delete'] );
727
728 $input['update_version'] = $pvc->options['general']['update_version'];
729 $input['update_notice'] = $pvc->options['general']['update_notice'];
730 } elseif ( isset( $_POST['save_pvc_display'] ) ) {
731
732 // post views label
733 $input['label'] = isset( $input['label'] ) ? $input['label'] : $pvc->defaults['general']['label'];
734
735 if ( function_exists( 'icl_register_string' ) )
736 icl_register_string( 'Post Views Counter', 'Post Views Label', $input['label'] );
737
738 // position
739 $input['position'] = isset( $input['position'], $this->positions[$input['position']] ) ? $input['position'] : $pvc->defaults['general']['position'];
740
741 // display style
742 $input['display_style']['icon'] = isset( $input['display_style']['icon'] );
743 $input['display_style']['text'] = isset( $input['display_style']['text'] );
744
745 // link to post
746 $input['link_to_post'] = isset( $input['link_to_post'] ) ? $input['link_to_post'] : $pvc->defaults['display']['link_to_post'];
747
748 // icon class
749 $input['icon_class'] = isset( $input['icon_class'] ) ? trim( $input['icon_class'] ) : $pvc->defaults['general']['icon_class'];
750
751 // post types display
752 if ( isset( $input['post_types_display'] ) ) {
753 $post_types = array();
754
755 foreach ( $input['post_types_display'] as $post_type => $set ) {
756 if ( isset( $this->post_types[$post_type] ) )
757 $post_types[] = $post_type;
758 }
759
760 $input['post_types_display'] = array_unique( $post_types );
761 } else
762 $input['post_types_display'] = array();
763
764 // page types display
765 if ( isset( $input['page_types_display'] ) ) {
766 $page_types = array();
767
768 foreach ( $input['page_types_display'] as $page_type => $set ) {
769 if ( isset( $this->page_types[$page_type] ) )
770 $page_types[] = $page_type;
771 }
772
773 $input['page_types_display'] = array_unique( $page_types );
774 } else
775 $input['page_types_display'] = array();
776
777 // restrict display
778 if ( isset( $input['restrict_display']['groups'] ) ) {
779 $groups = array();
780
781 foreach ( $input['restrict_display']['groups'] as $group => $set ) {
782 if ( $group === 'robots' )
783 continue;
784
785 if ( isset( $this->groups[$group] ) )
786 $groups[] = $group;
787 }
788
789 $input['restrict_display']['groups'] = array_unique( $groups );
790 } else
791 $input['restrict_display']['groups'] = array();
792
793 if ( in_array( 'roles', $input['restrict_display']['groups'], true ) && isset( $input['restrict_display']['roles'] ) ) {
794 $roles = array();
795
796 foreach ( $input['restrict_display']['roles'] as $role => $set ) {
797 if ( isset( $this->user_roles[$role] ) )
798 $roles[] = $role;
799 }
800
801 $input['restrict_display']['roles'] = array_unique( $roles );
802 } else
803 $input['restrict_display']['roles'] = array();
804 } elseif ( isset( $_POST['reset_pvc_general'] ) ) {
805 $input = $pvc->defaults['general'];
806
807 add_settings_error( 'reset_general_settings', 'settings_reset', __( 'General settings restored to defaults.', 'post-views-counter' ), 'updated' );
808 } elseif ( isset( $_POST['reset_pvc_display'] ) ) {
809 $input = $pvc->defaults['display'];
810
811 add_settings_error( 'reset_general_settings', 'settings_reset', __( 'Display settings restored to defaults.', 'post-views-counter' ), 'updated' );
812 }
813
814 return $input;
815 }
816 }