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