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