PluginProbe ʕ •ᴥ•ʔ
Post Views Counter / 1.0.12
Post Views Counter v1.0.12
1.7.13 1.7.12 1.7.11 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.2.0 1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3 1.3.1 1.3.10 1.3.11 1.3.12 1.3.13 1.3.2 1.3.2.1 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.7.0 1.7.1 1.7.10 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9
post-views-counter / includes / settings.php
post-views-counter / includes Last commit date
columns.php 11 years ago counter.php 11 years ago cron.php 11 years ago frontend.php 11 years ago functions.php 11 years ago query.php 11 years ago settings.php 11 years ago update.php 11 years ago widgets.php 11 years ago
settings.php
764 lines
1 <?php
2 if ( ! defined( 'ABSPATH' ) )
3 exit;
4
5 new Post_Views_Counter_Settings();
6
7 class Post_Views_Counter_Settings {
8
9 private $tabs;
10 private $choices;
11 private $modes;
12 private $time_types;
13 private $groups;
14 private $user_roles;
15 private $positions;
16 private $display_styles;
17 public $post_types;
18
19 public function __construct() {
20 // set instance
21 Post_Views_Counter()->add_instance( 'settings', $this );
22
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
85 /**
86 * Get post types avaiable for counting.
87 */
88 public function load_post_types() {
89 $post_types = array();
90
91 // built in public post types
92 foreach ( get_post_types( array( '_builtin' => true, 'public' => true ), 'objects', 'and' ) as $key => $post_type ) {
93 if ( $key !== 'attachment' )
94 $post_types[$key] = $post_type->labels->name;
95 }
96
97 // public custom post types
98 foreach ( get_post_types( array( '_builtin' => false, 'public' => true ), 'objects', 'and' ) as $key => $post_type ) {
99 $post_types[$key] = $post_type->labels->name;
100 }
101
102 // sort post types alphabetically with their keys
103 asort( $post_types, SORT_STRING );
104
105 $this->post_types = $post_types;
106 }
107
108 /**
109 * Get all user roles.
110 */
111 public function get_user_roles() {
112 global $wp_roles;
113
114 $roles = array();
115
116 foreach ( apply_filters( 'editable_roles', $wp_roles->roles ) as $role => $details ) {
117 $roles[$role] = translate_user_role( $details['name'] );
118 }
119
120 asort( $roles, SORT_STRING );
121
122 return $roles;
123 }
124
125 /**
126 * Add options page.
127 */
128 public function admin_menu_options() {
129 add_options_page(
130 __( 'Post Views Counter', 'post-views-counter' ), __( 'Post Views Counter', 'post-views-counter' ), 'manage_options', 'post-views-counter', array( &$this, 'options_page' )
131 );
132 }
133
134 /**
135 * Options page callback.
136 */
137 public function options_page() {
138 $tab_key = (isset( $_GET['tab'] ) ? $_GET['tab'] : 'general');
139
140 echo '
141 <div class="wrap">' . screen_icon() . '
142 <h2>' . __( 'Post Views Counter', 'post-views-counter' ) . '</h2>
143 <h2 class="nav-tab-wrapper">';
144
145 foreach ( $this->tabs as $key => $name ) {
146 echo '
147 <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>';
148 }
149
150 echo '
151 </h2>
152 <div class="post-views-counter-settings">
153 <div class="df-credits">
154 <h3 class="hndle">' . __( 'Post Views Counter', 'post-views-counter' ) . ' ' . Post_Views_Counter()->get_attribute( 'defaults', 'version' ) . '</h3>
155 <div class="inside">
156 <h4 class="inner">' . __( 'Need support?', 'post-views-counter' ) . '</h4>
157 <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>
158 <hr />
159 <h4 class="inner">' . __( 'Do you like this plugin?', 'post-views-counter' ) . '</h4>
160 <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 />' .
161 __( '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/>' .
162 __( '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>
163 </p>
164 <hr />
165 <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>
166 </div>
167 </div>
168 <form action="options.php" method="post">';
169
170 wp_nonce_field( 'update-options' );
171 settings_fields( $this->tabs[$tab_key]['key'] );
172 do_settings_sections( $this->tabs[$tab_key]['key'] );
173
174 echo '
175 <p class="submit">';
176
177 submit_button( '', 'primary', $this->tabs[$tab_key]['submit'], false );
178
179 echo ' ';
180
181 submit_button( __( 'Reset to defaults', 'post-views-counter' ), 'secondary reset_pvc_settings', $this->tabs[$tab_key]['reset'], false );
182
183 echo '
184 </p>
185 </form>
186 </div>
187 <div class="clear"></div>
188 </div>';
189 }
190
191 /**
192 * Register settings callback.
193 */
194 public function register_settings() {
195 // general options
196 register_setting( 'post_views_counter_settings_general', 'post_views_counter_settings_general', array( &$this, 'validate_settings' ) );
197 add_settings_section( 'post_views_counter_settings_general', __( 'General settings', 'post-views-counter' ), '', 'post_views_counter_settings_general' );
198 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' );
199 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' );
200 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' );
201 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' );
202 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' );
203 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' );
204 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' );
205 add_settings_field( 'pvc_exclude', __( 'Exclude Visitors', 'post-views-counter' ), array( &$this, 'exclude' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
206 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' );
207 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' );
208 add_settings_field( 'pvc_deactivation_delete', __( 'Deactivation', 'post-views-counter' ), array( &$this, 'deactivation_delete' ), 'post_views_counter_settings_general', 'post_views_counter_settings_general' );
209
210 // display options
211 register_setting( 'post_views_counter_settings_display', 'post_views_counter_settings_display', array( &$this, 'validate_settings' ) );
212 add_settings_section( 'post_views_counter_settings_display', __( 'Display settings', 'post-views-counter' ), '', 'post_views_counter_settings_display' );
213 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' );
214 add_settings_field( 'pvc_post_types_display', __( 'Post Types Display', 'post-views-counter' ), array( &$this, 'post_types_display' ), 'post_views_counter_settings_display', 'post_views_counter_settings_display' );
215 add_settings_field( 'pvc_restrict_display', __( 'Restrict Display', 'post-views-counter' ), array( &$this, 'restrict_display' ), 'post_views_counter_settings_display', 'post_views_counter_settings_display' );
216 add_settings_field( 'pvc_position', __( 'Position', 'post-views-counter' ), array( &$this, 'position' ), 'post_views_counter_settings_display', 'post_views_counter_settings_display' );
217 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' );
218 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' );
219 }
220
221 /**
222 * Post views label option.
223 */
224 public function post_views_label() {
225 echo '
226 <div id="pvc_post_views_label">
227 <fieldset>
228 <input type="text" class="large-text" name="post_views_counter_settings_display[label]" value="' . esc_attr( Post_Views_Counter()->get_attribute( 'options', 'display', 'label' ) ) . '" />
229 <br/>
230 <span class="description">' . esc_html__( 'Enter the label for the post views counter field.', 'post-views-counter' ) . '</span>
231 </fieldset>
232 </div>';
233 }
234
235 /**
236 * Post types to count option.
237 */
238 public function post_types_count() {
239 echo '
240 <div id="pvc_post_types_count">
241 <fieldset>
242 <select class="pvc-chosen" data-placeholder="' . esc_attr__( 'Select post types', 'post-views-counter' ) . '" name="post_views_counter_settings_general[post_types_count][]" multiple="multiple">';
243
244 foreach ( $this->post_types as $post_type => $post_type_name ) {
245 echo '
246 <option value="' . esc_attr( $post_type ) . '" ' . selected( in_array( $post_type, Post_Views_Counter()->get_attribute( 'options', 'general', 'post_types_count' ), true ), true, false ) . '>' . esc_html( $post_type_name ) . '</option>';
247 }
248
249 echo '
250 </select>
251 <br/>
252 <span class="description">' . esc_html__( 'Select post types for which post views will be counted.', 'post-views-counter' ) . '</span>
253 </fieldset>
254 </div>';
255 }
256
257 /**
258 * Post types to display option.
259 */
260 public function post_types_display() {
261 echo '
262 <div id="pvc_post_types_display">
263 <fieldset>
264 <select class="pvc-chosen" data-placeholder="' . esc_attr__( 'Select groups', 'post-views-counter' ) . '" name="post_views_counter_settings_display[post_types_display][]" multiple="multiple">';
265
266 foreach ( $this->post_types as $post_type => $post_type_name ) {
267 echo '
268 <option value="' . esc_attr( $post_type ) . '" ' . selected( in_array( $post_type, Post_Views_Counter()->get_attribute( 'options', 'display', 'post_types_display' ), true ), true, false ) . '>' . esc_html( $post_type_name ) . '</option>';
269 }
270
271 echo '
272 </select>
273 <br/>
274 <span class="description">' . esc_html__( 'Select post types for which post views will be displayed.', 'post-views-counter' ) . '</span>
275 </fieldset>
276 </div>';
277 }
278
279 /**
280 * Counter mode option.
281 */
282 public function counter_mode() {
283 echo '
284 <div id="pvc_counter_mode">
285 <fieldset>';
286
287 foreach ( $this->modes as $key => $value ) {
288 $key = esc_attr( $key );
289
290 echo '
291 <input id="pvc-counter-mode-' . $key . '" type="radio" name="post_views_counter_settings_general[counter_mode]" value="' . $key . '" ' . checked( $key, Post_Views_Counter()->get_attribute( 'options', 'general', 'counter_mode' ), false ) . ' /><label for="pvc-counter-mode-' . $key . '">' . esc_html( $value ) . '</label>';
292 }
293
294 echo '
295 <br/>
296 <span 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' ) . '</span>
297 </fieldset>
298 </div>';
299 }
300
301 /**
302 * Post views column option.
303 */
304 public function post_views_column() {
305 echo '
306 <div id="pvc_post_views_column">
307 <input id="pvc-post-views-column-enable" type="checkbox" name="post_views_counter_settings_general[post_views_column]" value="1" ' . checked( true, (bool) Post_Views_Counter()->get_attribute( 'options', 'general', 'post_views_column' ), false ) . ' /><label for="pvc-post-views-column-enable">' . esc_html__( 'Enable to display post views count column for each of the selected post types.', 'post-views-counter' ) . '</label>
308 </div>';
309 }
310
311 /**
312 * Time between counts option.
313 */
314 public function time_between_counts() {
315 echo '
316 <div id="pvc_time_between_counts">
317 <fieldset>
318 <input size="4" type="text" name="post_views_counter_settings_general[time_between_counts][number]" value="' . esc_attr( Post_Views_Counter()->get_attribute( '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()->get_attribute( 'options', 'general', 'time_between_counts', 'type' ), false ) . '>' . esc_html( $type_name ) . '</option>';
324 }
325
326 echo '
327 </select>
328 <br/>
329 <span class="description">' . esc_html__( 'Enter the time between single user visit count.', 'post-views-counter' ) . '</span>
330 </fieldset>
331 </div>';
332 }
333
334 /**
335 * Reset counts option.
336 */
337 public function reset_counts() {
338 echo '
339 <div id="pvc_reset_counts">
340 <fieldset>
341 <input size="4" type="text" name="post_views_counter_settings_general[reset_counts][number]" value="' . esc_attr( Post_Views_Counter()->get_attribute( 'options', 'general', 'reset_counts', 'number' ) ) . '" />
342 <select class="pvc-chosen-short" name="post_views_counter_settings_general[reset_counts][type]">';
343
344 foreach ( $this->time_types as $type => $type_name ) {
345 echo '
346 <option value="' . esc_attr( $type ) . '" ' . selected( $type, Post_Views_Counter()->get_attribute( 'options', 'general', 'reset_counts', 'type' ), false ) . '>' . esc_html( $type_name ) . '</option>';
347 }
348
349 echo '
350 </select>
351 <br/>
352 <span 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' ) . '</span>
353 </fieldset>
354 </div>';
355 }
356
357 /**
358 * Flush interval option.
359 */
360 public function flush_interval() {
361 echo '
362 <div id="pvc_flush_interval">
363 <fieldset>
364 <input size="4" type="text" name="post_views_counter_settings_general[flush_interval][number]" value="' . esc_attr( Post_Views_Counter()->get_attribute( '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()->get_attribute( 'options', 'general', 'flush_interval', 'type' ), false ) . '>' . esc_html( $type_name ) . '</option>';
370 }
371
372 echo '
373 </select>
374 <br/>
375 <span 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' ) . '</span>
376 </fieldset>
377 </div>';
378 }
379
380 /**
381 * Exlude user groups option.
382 */
383 public function exclude() {
384 echo '
385 <div id="pvc_exclude">
386 <fieldset>
387 <select class="pvc-chosen" data-placeholder="' . esc_attr__( 'Select groups', 'post-views-counter' ) . '" name="post_views_counter_settings_general[exclude][groups][]" multiple="multiple">';
388
389 foreach ( $this->groups as $type => $type_name ) {
390 echo '
391 <option value="' . esc_attr( $type ) . '" ' . selected( in_array( $type, Post_Views_Counter()->get_attribute( 'options', 'general', 'exclude', 'groups' ), true ), true, false ) . '>' . esc_html( $type_name ) . '</option>';
392 }
393
394 echo '
395 </select>
396 <br/>
397 <div class="pvc_user_roles"' . (in_array( 'roles', Post_Views_Counter()->get_attribute( 'options', 'general', 'exclude', 'groups' ), true ) ? '' : ' style="display: none;"') . '>
398 <select class="pvc-chosen" data-placeholder="' . esc_attr__( 'Select user roles', 'post-views-counter' ) . '" name="post_views_counter_settings_general[exclude][roles][]" multiple="multiple">';
399
400 foreach ( $this->user_roles as $role => $role_name ) {
401 echo '
402 <option value="' . esc_attr( $role ) . '" ' . selected( in_array( $role, Post_Views_Counter()->get_attribute( 'options', 'general', 'exclude', 'roles' ), true ), true, false ) . '>' . esc_html( $role_name ) . '</option>';
403 }
404
405 echo '
406 </select>
407 <br/>
408 </div>
409 <span class="description">' . esc_html__( 'Select the type of visitors to be excluded from post views count.', 'post-views-counter' ) . '</span>
410 </fieldset>
411 </div>';
412 }
413
414 /**
415 * Exclude IPs option.
416 */
417 public function exclude_ips() {
418 echo '
419 <div id="pvc_exclude_ips">
420 <fieldset>';
421
422 foreach ( Post_Views_Counter()->get_attribute( 'options', 'general', 'exclude_ips' ) as $key => $ip ) {
423 echo '
424 <div class="ip-box">
425 <input type="text" name="post_views_counter_settings_general[exclude_ips][]" value="' . esc_attr( $ip ) . '" /> <input type="button" class="button button-secondary remove-exclude-ip" value="' . esc_attr__( 'Remove', 'post-views-counter' ) . '" />
426 </div>';
427 }
428
429 // lovely php 5.2 limitations
430 $ips = Post_Views_Counter()->get_attribute( 'options', 'general', 'exclude_ips' );
431
432 echo '
433 <div class="ip-box">
434 <input type="text" name="post_views_counter_settings_general[exclude_ips][]" value="" /> <input type="button" class="button button-secondary remove-exclude-ip" value="' . esc_attr__( 'Remove', 'post-views-counter' ) . '"' . (empty( $ips ) ? ' style="display: none;"' : '') . ' /> <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'] ) . '" />
435 </div>
436 <span class="description">' . esc_html__( 'Enter the IP addresses to be excluded from post views count.', 'post-views-counter' ) . '</span>
437 </fieldset>
438 </div>';
439 }
440
441 /**
442 * WP-PostViews import option.
443 */
444 public function wp_postviews() {
445 echo '
446 <div id="pvc_wp_postviews">
447 <fieldset>
448 <input type="submit" class="button button-secondary" name="post_views_counter_import_wp_postviews" value="' . __( 'Import', 'post-views-counter' ) . '"/>
449 <br/>
450 <p class="description">' . esc_html__( 'Import post views data from WP-PostViews plugin.', 'post-views-counter' ) . '</p>
451 <input id="pvc-wp-postviews" type="checkbox" name="post_views_counter_import_wp_postviews_override" value="1" /><label for="pvc-wp-postviews">' . esc_html__( 'Override existing Post Views Counter data.', 'post-views-counter' ) . '</label>
452 </fieldset>
453 </div>';
454 }
455
456 /**
457 * Limit views edit to admins.
458 */
459 public function restrict_edit_views() {
460 echo '
461 <div id="pvc_restrict_edit_views">
462 <input id="pvc-restrict-edit-views-enable" type="checkbox" name="post_views_counter_settings_general[restrict_edit_views]" value="1" ' . checked( true, (bool) Post_Views_Counter()->get_attribute( 'options', 'general', 'restrict_edit_views' ), false ) . ' /><label for="pvc-restrict-edit-views-enable">' . esc_html__( 'Enable to restrict post views editing to admins only.', 'post-views-counter' ) . '</label>
463 </div>';
464 }
465
466 /**
467 * Plugin deactivation option.
468 */
469 public function deactivation_delete() {
470 echo '
471 <div id="pvc_deactivation_delete">
472 <input id="pvc-deactivation-delete-enable" type="checkbox" name="post_views_counter_settings_general[deactivation_delete]" value="1" ' . checked( true, (bool) Post_Views_Counter()->get_attribute( 'options', 'general', 'deactivation_delete' ), false ) . ' /><label for="pvc-deactivation-delete-enable">' . esc_html__( 'Enable to delete all plugin data on deactivation.', 'post-views-counter' ) . '</label>
473 </div>';
474 }
475
476 /**
477 * Counter position option.
478 */
479 public function position() {
480 echo '
481 <div id="pvc_position">
482 <fieldset>
483 <select class="pvc-chosen-short" name="post_views_counter_settings_display[position]">';
484
485 foreach ( $this->positions as $position => $position_name ) {
486 echo '
487 <option value="' . esc_attr( $position ) . '" ' . selected( $position, Post_Views_Counter()->get_attribute( 'options', 'display', 'position' ), false ) . '>' . esc_html( $position_name ) . '</option>';
488 }
489
490 echo '
491 </select>
492 <br/>
493 <span 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' ) . '</span>
494 </fieldset>
495 </div>';
496 }
497
498 /**
499 * Counter style option.
500 */
501 public function display_style() {
502 echo '
503 <div id="pvc_display_style">
504 <fieldset>';
505
506 foreach ( $this->display_styles as $display => $style ) {
507 $display = esc_attr( $display );
508
509 echo '
510 <input id="pvc-display-style-' . $display . '" type="checkbox" name="post_views_counter_settings_display[display_style][' . $display . ']" value="' . $display . '" ' . checked( true, Post_Views_Counter()->get_attribute( 'options', 'display', 'display_style', $display ), false ) . ' /><label for="pvc-display-style-' . $display . '">' . esc_html( $style ) . '</label>';
511 }
512
513 echo '
514 <br/>
515 <span class="description">' . esc_html__( 'Choose how to display the post views counter.', 'post-views-counter' ) . '</span>
516 </fieldset>
517 </div>';
518 }
519
520 /**
521 * Counter icon class option.
522 */
523 public function icon_class() {
524 echo '
525 <div id="pvc_icon_class">
526 <fieldset>
527 <input type="text" name="post_views_counter_settings_display[icon_class]" class="large-text" value="' . esc_attr( Post_Views_Counter()->get_attribute( 'options', 'display', 'icon_class' ) ) . '"/>
528 <br/>
529 <span 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' ), 'http://melchoyce.github.io/dashicons/' ) . '</span>
530 </fieldset>
531 </div>';
532 }
533
534 /**
535 * Restrict display option.
536 */
537 public function restrict_display() {
538 echo '
539 <div id="pvc_restrict_display">
540 <fieldset>
541 <select class="pvc-chosen" data-placeholder="' . esc_attr__( 'Select groups', 'post-views-counter' ) . '" name="post_views_counter_settings_display[restrict_display][groups][]" multiple="multiple">';
542
543 foreach ( $this->groups as $type => $type_name ) {
544
545 if ( $type === 'robots' )
546 continue;
547
548 echo '
549 <option value="' . esc_attr( $type ) . '" ' . selected( in_array( $type, Post_Views_Counter()->get_attribute( 'options', 'display', 'restrict_display', 'groups' ), true ), true, false ) . '>' . esc_html( $type_name ) . '</option>';
550 }
551
552 echo '
553 </select>
554 <br/>
555 <div class="pvc_user_roles"' . (in_array( 'roles', Post_Views_Counter()->get_attribute( 'options', 'display', 'restrict_display', 'groups' ), true ) ? '' : ' style="display: none;"') . '>
556 <select class="pvc-chosen" data-placeholder="' . esc_attr__( 'Select user roles', 'post-views-counter' ) . '" name="post_views_counter_settings_display[restrict_display][roles][]" multiple="multiple">';
557
558 foreach ( $this->user_roles as $role => $role_name ) {
559 echo '
560 <option value="' . esc_attr( $role ) . '" ' . selected( in_array( $role, Post_Views_Counter()->get_attribute( 'options', 'display', 'restrict_display', 'roles' ), true ), true, false ) . '>' . esc_html( $role_name ) . '</option>';
561 }
562
563 echo '
564 </select>
565 <br/>
566 </div>
567 <span class="description">' . esc_html__( 'Use it to hide the post views counter from selected type of visitors.', 'post-views-counter' ) . '</span>
568 </fieldset>
569 </div>';
570 }
571
572 /**
573 * Validate general settings.
574 */
575 public function validate_settings( $input ) {
576 if ( isset( $_POST['post_views_counter_import_wp_postviews'] ) ) {
577 global $wpdb;
578
579 $views = $wpdb->get_results(
580 "SELECT post_id, meta_value FROM " . $wpdb->postmeta . " WHERE meta_key = 'views'", ARRAY_A, 0
581 );
582
583 if ( ! empty( $views ) ) {
584 $input = Post_Views_Counter()->get_attribute( 'defaults', 'general' );
585 $input['wp_postviews_import'] = true;
586
587 $sql = '';
588
589 foreach ( $views as $view ) {
590 $sql[] = "(" . $view['post_id'] . ", 4, 'total', " . $view['meta_value'] . ")";
591 }
592
593 $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)" );
594
595 add_settings_error( 'wp_postviews_import', 'wp_postviews_import', __( 'WP-PostViews data imported succesfully.', 'post-views-counter' ), 'updated' );
596 } else {
597 add_settings_error( 'wp_postviews_import', 'wp_postviews_import', __( 'There was no data to import.', 'post-views-counter' ), 'updated' );
598 }
599 } elseif ( isset( $_POST['save_pvc_general'] ) ) {
600 // post types count
601 if ( isset( $input['post_types_count'] ) ) {
602 $post_types = array();
603
604 foreach ( $input['post_types_count'] as $post_type ) {
605 if ( isset( $this->post_types[$post_type] ) )
606 $post_types[] = $post_type;
607 }
608
609 $input['post_types_count'] = array_unique( $post_types );
610 } else
611 $input['post_types_count'] = array();
612
613 // counter mode
614 $input['counter_mode'] = (isset( $input['counter_mode'], $this->modes[$input['counter_mode']] ) ? $input['counter_mode'] : Post_Views_Counter()->get_attribute( 'defaults', 'general', 'counter_mode' ));
615
616 // post views column
617 $input['post_views_column'] = (isset( $input['post_views_column'] ) ? (bool) $input['post_views_column'] : Post_Views_Counter()->get_attribute( 'defaults', 'general', 'post_views_column' ));
618
619 // time between counts
620 $input['time_between_counts']['number'] = (int) (isset( $input['time_between_counts']['number'] ) ? $input['time_between_counts']['number'] : Post_Views_Counter()->get_attribute( 'defaults', 'general', 'time_between_counts', 'number' ));
621 $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()->get_attribute( 'defaults', 'general', 'time_between_counts', 'type' ));
622
623 // flush interval
624 $input['flush_interval']['number'] = (int) (isset( $input['flush_interval']['number'] ) ? $input['flush_interval']['number'] : Post_Views_Counter()->get_attribute( 'defaults', 'general', 'flush_interval', 'number' ));
625 $input['flush_interval']['type'] = (isset( $input['flush_interval']['type'], $this->time_types[$input['flush_interval']['type']] ) ? $input['flush_interval']['type'] : Post_Views_Counter()->get_attribute( 'defaults', 'general', 'flush_interval', 'type' ));
626
627 // Since the settings are about to be saved and cache flush interval could've changed,
628 // we want to make sure that any changes done on the settings page are in effect immediately
629 // (instead of having to wait for the previous schedule to occur).
630 // We achieve that by making sure to clear any previous cache flush schedules and
631 // schedule the new one if the specified interval is > 0
632 Post_Views_Counter()->remove_cache_flush();
633
634 if ( $input['flush_interval']['number'] > 0 ) {
635 Post_Views_Counter()->schedule_cache_flush();
636 }
637
638 // reset counts
639 $input['reset_counts']['number'] = (int) (isset( $input['reset_counts']['number'] ) ? $input['reset_counts']['number'] : Post_Views_Counter()->get_attribute( 'defaults', 'general', 'reset_counts', 'number' ));
640 $input['reset_counts']['type'] = (isset( $input['reset_counts']['type'], $this->time_types[$input['reset_counts']['type']] ) ? $input['reset_counts']['type'] : Post_Views_Counter()->get_attribute( 'defaults', 'general', 'reset_counts', 'type' ));
641
642 // run cron on next visit?
643 $input['cron_run'] = ($input['reset_counts']['number'] > 0 ? true : false);
644 $input['cron_update'] = ($input['cron_run'] && (Post_Views_Counter()->get_attribute( 'options', 'general', 'reset_counts', 'number' ) !== $input['reset_counts']['number'] || Post_Views_Counter()->get_attribute( 'options', 'general', 'reset_counts', 'type' ) !== $input['reset_counts']['type']) ? true : false);
645
646 // exclude
647 if ( isset( $input['exclude']['groups'] ) ) {
648 $groups = array();
649
650 foreach ( $input['exclude']['groups'] as $group ) {
651 if ( isset( $this->groups[$group] ) )
652 $groups[] = $group;
653 }
654
655 $input['exclude']['groups'] = array_unique( $groups );
656 } else
657 $input['exclude']['groups'] = array();
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 ) {
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
674 $ips = array();
675
676 foreach ( $input['exclude_ips'] as $ip ) {
677 if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) )
678 $ips[] = $ip;
679 }
680
681 $input['exclude_ips'] = array_unique( $ips );
682 }
683
684 // restrict edit viewa
685 $input['restrict_edit_views'] = (isset( $input['restrict_edit_views'] ) ? (bool) $input['restrict_edit_views'] : Post_Views_Counter()->get_attribute( 'defaults', 'general', 'restrict_edit_views' ));
686
687 // deactivation delete
688 $input['deactivation_delete'] = (isset( $input['deactivation_delete'] ) ? (bool) $input['deactivation_delete'] : Post_Views_Counter()->get_attribute( 'defaults', 'general', 'deactivation_delete' ));
689 } elseif ( isset( $_POST['save_pvc_display'] ) ) {
690
691 // post views label
692 $input['label'] = (isset( $input['label'] ) ? $input['label'] : Post_Views_Counter()->get_attribute( 'defaults', 'general', 'label' ));
693
694 if ( function_exists( 'icl_register_string' ) )
695 icl_register_string( 'Post Views Counter', 'Post Views Label', $input['label'] );
696
697 // position
698 $input['position'] = (isset( $input['position'], $this->positions[$input['position']] ) ? $input['position'] : Post_Views_Counter()->get_attribute( 'defaults', 'general', 'position' ));
699
700 // display style
701 $input['display_style']['icon'] = (isset( $input['display_style']['icon'] ) ? true : false);
702 $input['display_style']['text'] = (isset( $input['display_style']['text'] ) ? true : false);
703
704 // link to post
705 $input['link_to_post'] = (isset( $input['link_to_post'] ) ? (bool) $input['link_to_post'] : Post_Views_Counter()->get_attribute( 'defaults', 'general', 'link_to_post' ));
706
707 // icon class
708 $input['icon_class'] = (isset( $input['icon_class'] ) ? trim( $input['icon_class'] ) : Post_Views_Counter()->get_attribute( 'defaults', 'general', 'icon_class' ));
709
710 // post types display
711 if ( isset( $input['post_types_display'] ) ) {
712 $post_types = array();
713
714 foreach ( $input['post_types_display'] as $post_type ) {
715 if ( isset( $this->post_types[$post_type] ) )
716 $post_types[] = $post_type;
717 }
718
719 $input['post_types_display'] = array_unique( $post_types );
720 } else
721 $input['post_types_display'] = array();
722
723 // restrict display
724 if ( isset( $input['restrict_display']['groups'] ) ) {
725 $groups = array();
726
727 foreach ( $input['restrict_display']['groups'] as $group ) {
728 if ( $group === 'robots' )
729 continue;
730
731 if ( isset( $this->groups[$group] ) )
732 $groups[] = $group;
733 }
734
735 $input['restrict_display']['groups'] = array_unique( $groups );
736 } else
737 $input['restrict_display']['groups'] = array();
738
739 if ( in_array( 'roles', $input['restrict_display']['groups'], true ) && isset( $input['restrict_display']['roles'] ) ) {
740 $roles = array();
741
742 foreach ( $input['restrict_display']['roles'] as $role ) {
743 if ( isset( $this->user_roles[$role] ) )
744 $roles[] = $role;
745 }
746
747 $input['restrict_display']['roles'] = array_unique( $roles );
748 } else
749 $input['restrict_display']['roles'] = array();
750 } elseif ( isset( $_POST['reset_pvc_general'] ) ) {
751 $input = Post_Views_Counter()->get_attribute( 'defaults', 'general' );
752
753 add_settings_error( 'reset_general_settings', 'settings_reset', __( 'General settings restored to defaults.', 'post-views-counter' ), 'updated' );
754 } elseif ( isset( $_POST['reset_pvc_display'] ) ) {
755 $input = Post_Views_Counter()->get_attribute( 'defaults', 'display' );
756
757 add_settings_error( 'reset_general_settings', 'settings_reset', __( 'Display settings restored to defaults.', 'post-views-counter' ), 'updated' );
758 }
759
760 return $input;
761 }
762
763 }
764