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