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