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