This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
0 ignored issues
–
show
|
|||
2 | if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly |
||
3 | |||
4 | /** |
||
5 | * A settings API (wrapping the WordPress Settings API). |
||
6 | * |
||
7 | * @package Core |
||
8 | * @author Automattic |
||
9 | * |
||
10 | * @since 1.0.0 |
||
11 | */ |
||
12 | class Sensei_Settings_API { |
||
13 | |||
14 | public $token; |
||
15 | public $page_slug; |
||
16 | public $name; |
||
17 | public $menu_label; |
||
18 | public $settings; |
||
19 | public $sections; |
||
20 | public $fields; |
||
21 | public $errors; |
||
22 | |||
23 | public $has_range; |
||
24 | public $has_imageselector; |
||
25 | public $has_tabs; |
||
26 | private $tabs; |
||
27 | public $settings_version; |
||
28 | |||
29 | /** |
||
30 | * Constructor. |
||
31 | * @access public |
||
32 | * @since 1.0.0 |
||
33 | */ |
||
34 | public function __construct () { |
||
35 | |||
36 | $this->token = 'woothemes-sensei-settings'; |
||
37 | $this->page_slug = 'woothemes-sensei-settings-api'; |
||
38 | |||
39 | $this->sections = array(); |
||
40 | $this->fields = array(); |
||
41 | $this->remaining_fields = array(); |
||
42 | $this->errors = array(); |
||
43 | |||
44 | $this->has_range = false; |
||
45 | $this->has_imageselector = false; |
||
46 | $this->has_tabs = false; |
||
47 | $this->tabs = array(); |
||
48 | $this->settings_version = ''; |
||
49 | |||
50 | } // End __construct() |
||
51 | |||
52 | /** |
||
53 | * Setup the settings screen and necessary functions. |
||
54 | * @access public |
||
55 | * @since 1.0.0 |
||
56 | * @return void |
||
57 | */ |
||
58 | public function register_hook_listener() { |
||
59 | |||
60 | add_action( 'admin_menu', array( $this, 'register_settings_screen' ), 60 ); |
||
61 | add_action( 'admin_init', array( $this, 'settings_fields' ) ); |
||
62 | add_action( 'init', array( $this, 'general_init' ), 5 ); |
||
63 | |||
64 | } // End setup_settings() |
||
65 | |||
66 | /** |
||
67 | * Initialise settings sections, settings fields and create tabs, if applicable. |
||
68 | * @access public |
||
69 | * @since 1.0.3 |
||
70 | * @return void |
||
71 | */ |
||
72 | public function general_init() { |
||
73 | $this->init_sections(); |
||
74 | $this->init_fields(); |
||
75 | $this->get_settings(); |
||
76 | if ( $this->has_tabs == true ) { |
||
0 ignored issues
–
show
|
|||
77 | $this->create_tabs(); |
||
78 | } // End If Statement |
||
79 | } // End general_init() |
||
80 | |||
81 | /** |
||
82 | * Register the settings sections. |
||
83 | * @access public |
||
84 | * @since 1.0.0 |
||
85 | * @return void |
||
86 | */ |
||
87 | public function init_sections () { |
||
88 | // Override this function in your class and assign the array of sections to $this->sections. |
||
89 | _e( 'Override init_sections() in your class.', 'woothemes-sensei' ); |
||
90 | } // End init_sections() |
||
91 | |||
92 | /** |
||
93 | * Register the settings fields. |
||
94 | * @access public |
||
95 | * @since 1.0.0 |
||
96 | * @return void |
||
97 | */ |
||
98 | public function init_fields () { |
||
99 | // Override this function in your class and assign the array of sections to $this->fields. |
||
100 | _e( 'Override init_fields() in your class.', 'woothemes-sensei' ); |
||
101 | } // End init_fields() |
||
102 | |||
103 | /** |
||
104 | * Construct and output HTML markup for the settings tabs. |
||
105 | * @access public |
||
106 | * @since 1.1.0 |
||
107 | * @return void |
||
108 | */ |
||
109 | public function settings_tabs () { |
||
110 | |||
111 | if ( ! $this->has_tabs ) { return; } |
||
112 | |||
113 | if ( count( $this->tabs ) > 0 ) { |
||
114 | $html = ''; |
||
115 | |||
116 | $html .= '<ul id="settings-sections" class="subsubsub hide-if-no-js">' . "\n"; |
||
117 | |||
118 | $sections = array( |
||
119 | 'all' => array( 'href' => '#all', 'name' => __( 'All', 'woothemes-sensei' ), 'class' => 'current all tab' ) |
||
120 | ); |
||
121 | |||
122 | foreach ( $this->tabs as $k => $v ) { |
||
123 | $sections[$k] = array( 'href' => '#' . esc_attr( $k ), 'name' => esc_attr( $v['name'] ), 'class' => 'tab' ); |
||
124 | } |
||
125 | |||
126 | $count = 1; |
||
127 | foreach ( $sections as $k => $v ) { |
||
128 | $count++; |
||
129 | $html .= '<li><a href="' . $v['href'] . '"'; |
||
130 | View Code Duplication | if ( isset( $v['class'] ) && ( $v['class'] != '' ) ) { $html .= ' class="' . esc_attr( $v['class'] ) . '"'; } |
|
0 ignored issues
–
show
This code seems to be duplicated across your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
131 | $html .= '>' . esc_attr( $v['name'] ) . '</a>'; |
||
132 | if ( $count <= count( $sections ) ) { $html .= ' | '; } |
||
133 | $html .= '</li>' . "\n"; |
||
134 | } |
||
135 | |||
136 | $html .= '</ul><div class="clear"></div>' . "\n"; |
||
137 | |||
138 | echo $html; |
||
139 | } |
||
140 | } // End settings_tabs() |
||
141 | |||
142 | /** |
||
143 | * Create settings tabs based on the settings sections. |
||
144 | * @access private |
||
145 | * @since 1.1.0 |
||
146 | * @return void |
||
147 | */ |
||
148 | private function create_tabs () { |
||
149 | if ( count( $this->sections ) > 0 ) { |
||
150 | $tabs = array(); |
||
151 | foreach ( $this->sections as $k => $v ) { |
||
152 | $tabs[$k] = $v; |
||
153 | } |
||
154 | |||
155 | $this->tabs = $tabs; |
||
156 | } |
||
157 | } // End create_tabs() |
||
158 | |||
159 | /** |
||
160 | * Create settings sections. |
||
161 | * @access public |
||
162 | * @since 1.0.0 |
||
163 | * @return void |
||
164 | */ |
||
165 | public function create_sections () { |
||
166 | if ( count( $this->sections ) > 0 ) { |
||
167 | foreach ( $this->sections as $k => $v ) { |
||
168 | add_settings_section( $k, $v['name'], array( $this, 'section_description' ), $this->token ); |
||
169 | } |
||
170 | } |
||
171 | } // End create_sections() |
||
172 | |||
173 | /** |
||
174 | * Create settings fields. |
||
175 | * @access public |
||
176 | * @since 1.0.0 |
||
177 | * @return void |
||
178 | */ |
||
179 | public function create_fields () { |
||
180 | if ( count( $this->sections ) > 0 ) { |
||
181 | // $this->parse_fields( $this->fields ); |
||
0 ignored issues
–
show
Unused Code
Comprehensibility
introduced
by
59% of this comment could be valid code. Did you maybe forget this after debugging?
Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it. The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production. This check looks for comments that seem to be mostly valid code and reports them. ![]() |
|||
182 | |||
183 | foreach ( $this->fields as $k => $v ) { |
||
184 | $method = $this->determine_method( $v, 'form' ); |
||
185 | $name = $v['name']; |
||
186 | if ( $v['type'] == 'info' ) { $name = ''; } |
||
187 | add_settings_field( $k, $name, $method, $this->token, $v['section'], array( 'key' => $k, 'data' => $v ) ); |
||
188 | |||
189 | // Let the API know that we have a colourpicker field. |
||
190 | if ( $v['type'] == 'range' && $this->has_range == false ) { $this->has_range = true; } |
||
0 ignored issues
–
show
|
|||
191 | } |
||
192 | } |
||
193 | } // End create_fields() |
||
194 | |||
195 | /** |
||
196 | * Determine the method to use for outputting a field, validating a field or checking a field. |
||
197 | * @access protected |
||
198 | * @since 1.0.0 |
||
199 | * @param array $data |
||
200 | * @return callable, array or string |
||
201 | */ |
||
202 | protected function determine_method ( $data, $type = 'form' ) { |
||
203 | $method = ''; |
||
204 | |||
205 | if ( ! in_array( $type, array( 'form', 'validate', 'check' ) ) ) { return; } |
||
206 | |||
207 | // Check for custom functions. |
||
208 | if ( isset( $data[$type] ) ) { |
||
209 | if ( function_exists( $data[$type] ) ) { |
||
210 | $method = $data[$type]; |
||
211 | } |
||
212 | |||
213 | if ( $method == '' && method_exists( $this, $data[$type] ) ) { |
||
214 | if ( $type == 'form' ) { |
||
215 | $method = array( $this, $data[$type] ); |
||
216 | } else { |
||
217 | $method = $data[$type]; |
||
218 | } |
||
219 | } |
||
220 | } |
||
221 | |||
222 | if ( $method == '' && method_exists ( $this, $type . '_field_' . $data['type'] ) ) { |
||
223 | if ( $type == 'form' ) { |
||
224 | $method = array( $this, $type . '_field_' . $data['type'] ); |
||
225 | } else { |
||
226 | $method = $type . '_field_' . $data['type']; |
||
227 | } |
||
228 | } |
||
229 | |||
230 | if ( $method == '' && function_exists ( $this->token . '_' . $type . '_field_' . $data['type'] ) ) { |
||
231 | $method = $this->token . '_' . $type . '_field_' . $data['type']; |
||
232 | } |
||
233 | |||
234 | if ( $method == '' ) { |
||
235 | if ( $type == 'form' ) { |
||
236 | $method = array( $this, $type . '_field_text' ); |
||
237 | } else { |
||
238 | $method = $type . '_field_text'; |
||
239 | } |
||
240 | } |
||
241 | |||
242 | return $method; |
||
243 | } // End determine_method() |
||
244 | |||
245 | /** |
||
246 | * Parse the fields into an array index on the sections property. |
||
247 | * @access public |
||
248 | * @since 1.0.0 |
||
249 | * @param array $fields |
||
250 | * @return void |
||
251 | */ |
||
252 | public function parse_fields ( $fields ) { |
||
253 | foreach ( $fields as $k => $v ) { |
||
254 | if ( isset( $v['section'] ) && ( $v['section'] != '' ) && ( isset( $this->sections[$v['section']] ) ) ) { |
||
255 | View Code Duplication | if ( ! isset( $this->sections[$v['section']]['fields'] ) ) { |
|
0 ignored issues
–
show
This code seems to be duplicated across your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
256 | $this->sections[$v['section']]['fields'] = array(); |
||
257 | } |
||
258 | |||
259 | $this->sections[$v['section']]['fields'][$k] = $v; |
||
260 | } else { |
||
261 | $this->remaining_fields[$k] = $v; |
||
262 | } |
||
263 | } |
||
264 | } // End parse_fields() |
||
265 | |||
266 | /** |
||
267 | * Register the settings screen within the WordPress admin. |
||
268 | * @access public |
||
269 | * @since 1.0.0 |
||
270 | * @return void |
||
271 | */ |
||
272 | public function register_settings_screen () { |
||
273 | |||
274 | View Code Duplication | if ( current_user_can( 'manage_sensei' ) ) { |
|
275 | $hook = add_submenu_page( 'sensei', $this->name, $this->menu_label, 'manage_sensei', $this->page_slug, array( $this, 'settings_screen' ) ); |
||
276 | |||
277 | $this->hook = $hook; |
||
278 | } |
||
279 | |||
280 | if ( isset( $_GET['page'] ) && ( $_GET['page'] == $this->page_slug ) ) { |
||
281 | |||
282 | add_action( 'admin_notices', array( $this, 'settings_errors' ) ); |
||
283 | add_action( 'admin_print_scripts', array( $this, 'enqueue_scripts' ) ); |
||
284 | add_action( 'admin_print_styles', array( $this, 'enqueue_styles' ) ); |
||
285 | |||
286 | } |
||
287 | } // End register_settings_screen() |
||
288 | |||
289 | /** |
||
290 | * The markup for the settings screen. |
||
291 | * @access public |
||
292 | * @since 1.0.0 |
||
293 | * @return void |
||
294 | */ |
||
295 | public function settings_screen () |
||
296 | { |
||
297 | |||
298 | ?> |
||
299 | <div id="woothemes-sensei" class="wrap <?php echo esc_attr($this->token); ?>"> |
||
300 | <?php screen_icon('woothemes-sensei'); ?> |
||
301 | <h2><?php echo esc_html($this->name); ?><?php if ('' != $this->settings_version) { |
||
302 | echo ' <span class="version">' . $this->settings_version . '</span>'; |
||
303 | } ?></h2> |
||
304 | <p class="powered-by-woo"><?php _e('Powered by', 'woothemes-sensei'); ?><a href="http://www.woothemes.com/" |
||
305 | title="WooThemes"><img |
||
306 | src="<?php echo Sensei()->plugin_url; ?>assets/images/woothemes.png" alt="WooThemes"/></a></p> |
||
307 | <?php do_action('settings_before_form'); ?> |
||
308 | <form action="options.php" method="post"> |
||
309 | |||
310 | <?php |
||
311 | $this->settings_tabs(); |
||
312 | settings_fields($this->token); |
||
313 | $page = 'woothemes-sensei-settings'; |
||
314 | foreach ($this->sections as $section_id => $section) { |
||
315 | |||
316 | echo '<section id="' . $section_id . '">'; |
||
317 | |||
318 | if ($section['name']) |
||
319 | echo "<h2>{$section['name']}</h2>\n"; |
||
320 | |||
321 | echo '<table class="form-table">'; |
||
322 | do_settings_fields($page, $section_id ); |
||
323 | echo '</table>'; |
||
324 | |||
325 | echo '</section>'; |
||
326 | |||
327 | } |
||
328 | |||
329 | submit_button(); |
||
330 | ?> |
||
331 | </form> |
||
332 | <?php do_action( 'settings_after_form' ); ?> |
||
333 | </div><!--/#woothemes-sensei--> |
||
334 | <?php |
||
335 | } // End settings_screen() |
||
336 | |||
337 | /** |
||
338 | * Retrieve the settings from the database. |
||
339 | * @access public |
||
340 | * @since 1.0.0 |
||
341 | * @return array |
||
342 | */ |
||
343 | public function get_settings () { |
||
344 | |||
345 | $this->settings = get_option( $this->token, array() ); |
||
346 | |||
347 | foreach ( $this->fields as $k => $v ) { |
||
348 | if ( ! isset( $this->settings[$k] ) && isset( $v['default'] ) ) { |
||
349 | $this->settings[$k] = $v['default']; |
||
350 | } |
||
351 | if ( $v['type'] == 'checkbox' && $this->settings[$k] != true ) { |
||
352 | $this->settings[$k] = 0; |
||
353 | } |
||
354 | } |
||
355 | |||
356 | return $this->settings; |
||
357 | } // End get_settings() |
||
358 | |||
359 | /** |
||
360 | * Register the settings fields. |
||
361 | * @access public |
||
362 | * @since 1.0.0 |
||
363 | * @return void |
||
364 | */ |
||
365 | public function settings_fields () { |
||
366 | register_setting( $this->token, $this->token, array( $this, 'validate_fields' ) ); |
||
367 | $this->create_sections(); |
||
368 | $this->create_fields(); |
||
369 | } // End settings_fields() |
||
370 | |||
371 | /** |
||
372 | * Display settings errors. |
||
373 | * @access public |
||
374 | * @since 1.0.0 |
||
375 | * @return void |
||
376 | */ |
||
377 | public function settings_errors () { |
||
378 | settings_errors( $this->token . '-errors' ); |
||
379 | } // End settings_errors() |
||
380 | |||
381 | /** |
||
382 | * Display the description for a settings section. |
||
383 | * @access public |
||
384 | * @since 1.0.0 |
||
385 | * @return void |
||
386 | */ |
||
387 | public function section_description ( $section ) { |
||
388 | View Code Duplication | if ( isset( $this->sections[$section['id']]['description'] ) ) { |
|
0 ignored issues
–
show
This code seems to be duplicated across your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
389 | echo wpautop( $this->sections[$section['id']]['description'] ); |
||
390 | } |
||
391 | } // End section_description_main() |
||
392 | |||
393 | /** |
||
394 | * Generate text input field. |
||
395 | * @access public |
||
396 | * @since 1.0.0 |
||
397 | * @param array $args |
||
398 | * @return void |
||
399 | */ |
||
400 | View Code Duplication | public function form_field_text ( $args ) { |
|
0 ignored issues
–
show
This method seems to be duplicated in your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
401 | $options = $this->get_settings(); |
||
402 | |||
403 | echo '<input id="' . esc_attr( $args['key'] ) . '" name="' . $this->token . '[' . esc_attr( $args['key'] ) . ']" size="40" type="text" value="' . esc_attr( $options[$args['key']] ) . '" />' . "\n"; |
||
404 | if ( isset( $args['data']['description'] ) ) { |
||
405 | echo '<span class="description">' . $args['data']['description'] . '</span>' . "\n"; |
||
406 | } |
||
407 | } // End form_field_text() |
||
408 | |||
409 | /** |
||
410 | * Generate color picker field. |
||
411 | * @access public |
||
412 | * @since 1.6.0 |
||
413 | * @param array $args |
||
414 | * @return void |
||
415 | */ |
||
416 | View Code Duplication | public function form_field_color ( $args ) { |
|
417 | $options = $this->get_settings(); |
||
418 | |||
419 | echo '<input id="' . esc_attr( $args['key'] ) . '" name="' . $this->token . '[' . esc_attr( $args['key'] ) . ']" size="40" type="text" class="color" value="' . esc_attr( $options[$args['key']] ) . '" />' . "\n"; |
||
420 | echo '<div style="position:absolute;background:#FFF;z-index:99;border-radius:100%;" class="colorpicker"></div>'; |
||
421 | if ( isset( $args['data']['description'] ) ) { |
||
422 | echo '<span class="description">' . $args['data']['description'] . '</span>' . "\n"; |
||
423 | } |
||
424 | } // End form_field_text() |
||
425 | |||
426 | /** |
||
427 | * Generate checkbox field. |
||
428 | * @access public |
||
429 | * @since 1.0.0 |
||
430 | * @param array $args |
||
431 | * @return void |
||
432 | */ |
||
433 | public function form_field_checkbox ( $args ) { |
||
434 | $options = $this->get_settings(); |
||
435 | |||
436 | $has_description = false; |
||
437 | if ( isset( $args['data']['description'] ) ) { |
||
438 | $has_description = true; |
||
439 | echo '<label for="' . esc_attr( $args['key'] ) . '">' . "\n"; |
||
440 | } |
||
441 | echo '<input id="' . $args['key'] . '" name="' . $this->token . '[' . esc_attr( $args['key'] ) . ']" type="checkbox" value="1"' . checked( esc_attr( $options[$args['key']] ), '1', false ) . ' />' . "\n"; |
||
442 | if ( $has_description ) { |
||
443 | echo wp_kses( $args['data']['description'], array( 'a' => array( |
||
444 | 'href' => array(), |
||
445 | 'title' => array() |
||
446 | ) |
||
447 | ) |
||
448 | ) . '</label>' . "\n"; |
||
449 | } |
||
450 | } // End form_field_checkbox() |
||
451 | |||
452 | /** |
||
453 | * Generate textarea field. |
||
454 | * @access public |
||
455 | * @since 1.0.0 |
||
456 | * @param array $args |
||
457 | * @return void |
||
458 | */ |
||
459 | View Code Duplication | public function form_field_textarea ( $args ) { |
|
0 ignored issues
–
show
This method seems to be duplicated in your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
460 | $options = $this->get_settings(); |
||
461 | |||
462 | echo '<textarea id="' . esc_attr( $args['key'] ) . '" name="' . $this->token . '[' . esc_attr( $args['key'] ) . ']" cols="42" rows="5">' . esc_html( $options[$args['key']] ) . '</textarea>' . "\n"; |
||
463 | if ( isset( $args['data']['description'] ) ) { |
||
464 | echo '<p><span class="description">' . esc_html( $args['data']['description'] ) . '</span></p>' . "\n"; |
||
465 | } |
||
466 | } // End form_field_textarea() |
||
467 | |||
468 | /** |
||
469 | * Generate select box field. |
||
470 | * @access public |
||
471 | * @since 1.0.0 |
||
472 | * @param array $args |
||
473 | * @return void |
||
474 | */ |
||
475 | View Code Duplication | public function form_field_select ( $args ) { |
|
0 ignored issues
–
show
This method seems to be duplicated in your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
476 | $options = $this->get_settings(); |
||
477 | |||
478 | if ( isset( $args['data']['options'] ) && ( count( (array)$args['data']['options'] ) > 0 ) ) { |
||
479 | $html = ''; |
||
480 | $html .= '<select class="" id="' . esc_attr( $args['key'] ) . '" name="' . esc_attr( $this->token ) . '[' . esc_attr( $args['key'] ) . ']">' . "\n"; |
||
481 | foreach ( $args['data']['options'] as $k => $v ) { |
||
482 | $html .= '<option value="' . esc_attr( $k ) . '"' . selected( esc_attr( $options[$args['key']] ), $k, false ) . '>' . $v . '</option>' . "\n"; |
||
483 | } |
||
484 | $html .= '</select>' . "\n"; |
||
485 | echo $html; |
||
486 | |||
487 | if ( isset( $args['data']['description'] ) ) { |
||
488 | echo '<p><span class="description">' . esc_html( $args['data']['description'] ) . '</span></p>' . "\n"; |
||
489 | } |
||
490 | } |
||
491 | } // End form_field_select() |
||
492 | |||
493 | /** |
||
494 | * Generate radio button field. |
||
495 | * @access public |
||
496 | * @since 1.0.0 |
||
497 | * @param array $args |
||
498 | * @return void |
||
499 | */ |
||
500 | View Code Duplication | public function form_field_radio ( $args ) { |
|
0 ignored issues
–
show
This method seems to be duplicated in your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
501 | $options = $this->get_settings(); |
||
502 | |||
503 | if ( isset( $args['data']['options'] ) && ( count( (array)$args['data']['options'] ) > 0 ) ) { |
||
504 | $html = ''; |
||
505 | foreach ( $args['data']['options'] as $k => $v ) { |
||
506 | $html .= '<input type="radio" name="' . $this->token . '[' . esc_attr( $args['key'] ) . ']" value="' . esc_attr( $k ) . '"' . checked( esc_attr( $options[$args['key']] ), $k, false ) . ' /> ' . $v . '<br />' . "\n"; |
||
507 | } |
||
508 | echo $html; |
||
509 | |||
510 | if ( isset( $args['data']['description'] ) ) { |
||
511 | echo '<span class="description">' . esc_html( $args['data']['description'] ) . '</span>' . "\n"; |
||
512 | } |
||
513 | } |
||
514 | } // End form_field_radio() |
||
515 | |||
516 | /** |
||
517 | * Generate multicheck field. |
||
518 | * @access public |
||
519 | * @since 1.0.0 |
||
520 | * @param array $args |
||
521 | * @return void |
||
522 | */ |
||
523 | public function form_field_multicheck ( $args ) { |
||
524 | $options = $this->get_settings(); |
||
525 | |||
526 | if ( isset( $args['data']['options'] ) && ( count( (array)$args['data']['options'] ) > 0 ) ) { |
||
527 | $html = '<div class="multicheck-container" style="margin-bottom:10px;">' . "\n"; |
||
528 | foreach ( $args['data']['options'] as $k => $v ) { |
||
529 | $checked = ''; |
||
530 | |||
531 | if( isset( $options[ $args['key'] ] ) ) { |
||
532 | if ( in_array( $k, (array)$options[ $args['key'] ] ) ) { $checked = ' checked="checked"'; } |
||
533 | } else { |
||
534 | if ( in_array( $k, $args['data']['defaults'] ) ) { $checked = ' checked="checked"'; } |
||
535 | } |
||
536 | $html .= '<label for="checkbox-' . esc_attr( $k ) . '">' . "\n"; |
||
537 | $html .= '<input type="checkbox" name="' . esc_attr( $this->token ) . '[' . esc_attr( $args['key'] ) . '][]" class="multicheck multicheck-' . esc_attr( $args['key'] ) . '" value="' . esc_attr( $k ) . '" id="checkbox-' . esc_attr( $k ) . '" ' . $checked . ' /> ' . $v . "\n"; |
||
538 | $html .= '</label><br />' . "\n"; |
||
539 | } |
||
540 | $html .= '</div>' . "\n"; |
||
541 | echo $html; |
||
542 | |||
543 | if ( isset( $args['data']['description'] ) ) { |
||
544 | echo '<span class="description">' . esc_html( $args['data']['description'] ) . '</span>' . "\n"; |
||
545 | } |
||
546 | } |
||
547 | } // End form_field_multicheck() |
||
548 | |||
549 | /** |
||
550 | * Generate range field. |
||
551 | * @access public |
||
552 | * @since 1.0.0 |
||
553 | * @param array $args |
||
554 | * @return void |
||
555 | */ |
||
556 | View Code Duplication | public function form_field_range ( $args ) { |
|
0 ignored issues
–
show
This method seems to be duplicated in your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
557 | $options = $this->get_settings(); |
||
558 | |||
559 | if ( isset( $args['data']['options'] ) && ( count( (array)$args['data']['options'] ) > 0 ) ) { |
||
560 | $html = ''; |
||
561 | $html .= '<select id="' . esc_attr( $args['key'] ) . '" name="' . esc_attr( $this->token ) . '[' . esc_attr( $args['key'] ) . ']" class="range-input">' . "\n"; |
||
562 | foreach ( $args['data']['options'] as $k => $v ) { |
||
563 | $html .= '<option value="' . esc_attr( $k ) . '"' . selected( esc_attr( $options[$args['key']] ), $k, false ) . '>' . $v . '</option>' . "\n"; |
||
564 | } |
||
565 | $html .= '</select>' . "\n"; |
||
566 | echo $html; |
||
567 | |||
568 | if ( isset( $args['data']['description'] ) ) { |
||
569 | echo '<p><span class="description">' . esc_html( $args['data']['description'] ) . '</span></p>' . "\n"; |
||
570 | } |
||
571 | } |
||
572 | } // End form_field_range() |
||
573 | |||
574 | /** |
||
575 | * Generate image-based selector form field. |
||
576 | * @access public |
||
577 | * @since 1.0.0 |
||
578 | * @param array $args |
||
579 | * @return void |
||
580 | */ |
||
581 | View Code Duplication | public function form_field_images ( $args ) { |
|
0 ignored issues
–
show
This method seems to be duplicated in your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
582 | $options = $this->get_settings(); |
||
583 | |||
584 | if ( isset( $args['data']['options'] ) && ( count( (array)$args['data']['options'] ) > 0 ) ) { |
||
585 | $html = ''; |
||
586 | foreach ( $args['data']['options'] as $k => $v ) { |
||
587 | $html .= '<input type="radio" name="' . esc_attr( $this->token ) . '[' . esc_attr( $args['key'] ) . ']" value="' . esc_attr( $k ) . '"' . checked( esc_attr( $options[$args['key']] ), $k, false ) . ' /> ' . $v . '<br />' . "\n"; |
||
588 | } |
||
589 | echo $html; |
||
590 | |||
591 | if ( isset( $args['data']['description'] ) ) { |
||
592 | echo '<span class="description">' . esc_html( $args['data']['description'] ) . '</span>' . "\n"; |
||
593 | } |
||
594 | } |
||
595 | } // End form_field_images() |
||
596 | |||
597 | /** |
||
598 | * Generate information box field. |
||
599 | * @access public |
||
600 | * @since 1.0.0 |
||
601 | * @param array $args |
||
602 | * @return void |
||
603 | */ |
||
604 | public function form_field_info ( $args ) { |
||
605 | $class = ''; |
||
606 | View Code Duplication | if ( isset( $args['data']['class'] ) ) { |
|
0 ignored issues
–
show
This code seems to be duplicated across your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
607 | $class = ' ' . esc_attr( $args['data']['class'] ); |
||
608 | } |
||
609 | $html = '<div id="' . $args['key'] . '" class="info-box' . $class . '">' . "\n"; |
||
610 | View Code Duplication | if ( isset( $args['data']['name'] ) && ( $args['data']['name'] != '' ) ) { |
|
0 ignored issues
–
show
This code seems to be duplicated across your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
611 | $html .= '<h3 class="title">' . esc_html( $args['data']['name'] ) . '</h3>' . "\n"; |
||
612 | } |
||
613 | View Code Duplication | if ( isset( $args['data']['description'] ) && ( $args['data']['description'] != '' ) ) { |
|
0 ignored issues
–
show
This code seems to be duplicated across your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
614 | $html .= '<p>' . esc_html( $args['data']['description'] ) . '</p>' . "\n"; |
||
615 | } |
||
616 | $html .= '</div>' . "\n"; |
||
617 | |||
618 | echo $html; |
||
619 | } // End form_field_info() |
||
620 | |||
621 | |||
622 | /** |
||
623 | * Generate button field. |
||
624 | * @access public |
||
625 | * @since 1.9.0 |
||
626 | * @param array $args |
||
627 | */ |
||
628 | public function form_field_button( $args ) { |
||
629 | $options = $this->get_settings(); |
||
630 | |||
631 | if ( isset( $args['data']['target'] ) && isset( $args['data']['label'] ) ) { |
||
632 | printf( '<a href="%s" class="button button-secondary">%s</a> ', esc_url( $args['data']['target'] ), esc_html( $args['data']['label'] ) ); |
||
633 | |||
634 | if ( isset( $args['data']['description'] ) ) { |
||
635 | echo '<span class="description">' . esc_html( $args['data']['description'] ) . '</span>' . "\n"; |
||
636 | } |
||
637 | } |
||
638 | } // End form_field_button() |
||
639 | |||
640 | |||
641 | /** |
||
642 | * Validate registered settings fields. |
||
643 | * @access public |
||
644 | * @since 1.0.0 |
||
645 | * @param array $input |
||
646 | * @uses $this->parse_errors() |
||
647 | * @return array $options |
||
648 | */ |
||
649 | public function validate_fields ( $input ) { |
||
650 | $options = $this->get_settings(); |
||
651 | |||
652 | foreach ( $this->fields as $k => $v ) { |
||
653 | // Make sure checkboxes are present even when false. |
||
654 | View Code Duplication | if ( $v['type'] == 'checkbox' && ! isset( $input[$k] ) ) { $input[$k] = false; } |
|
0 ignored issues
–
show
This code seems to be duplicated across your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
655 | View Code Duplication | if ( $v['type'] == 'multicheck' && ! isset( $input[$k] ) ) { $input[$k] = false; } |
|
656 | |||
657 | if ( isset( $input[$k] ) ) { |
||
658 | // Perform checks on required fields. |
||
659 | if ( isset( $v['required'] ) && ( $v['required'] == true ) ) { |
||
660 | if ( in_array( $v['type'], $this->get_array_field_types() ) && ( count( (array) $input[$k] ) <= 0 ) ) { |
||
661 | $this->add_error( $k, $v ); |
||
662 | continue; |
||
663 | } else { |
||
664 | if ( $input[$k] == '' ) { |
||
665 | $this->add_error( $k, $v ); |
||
666 | continue; |
||
667 | } |
||
668 | } |
||
669 | } |
||
670 | |||
671 | $value = $input[$k]; |
||
672 | |||
673 | // Check if the field is valid. |
||
674 | $method = $this->determine_method( $v, 'check' ); |
||
675 | |||
676 | View Code Duplication | if ( function_exists ( $method ) ) { |
|
0 ignored issues
–
show
This code seems to be duplicated across your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
677 | $is_valid = $method( $value ); |
||
678 | } else { |
||
679 | if ( method_exists( $this, $method ) ) { |
||
680 | $is_valid = $this->$method( $value ); |
||
681 | } |
||
682 | } |
||
683 | |||
684 | if ( ! $is_valid ) { |
||
685 | $this->add_error( $k, $v ); |
||
686 | continue; |
||
687 | } |
||
688 | |||
689 | $method = $this->determine_method( $v, 'validate' ); |
||
690 | |||
691 | View Code Duplication | if ( function_exists ( $method ) ) { |
|
0 ignored issues
–
show
This code seems to be duplicated across your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
692 | $options[$k] = $method( $value ); |
||
693 | } else { |
||
694 | if ( method_exists( $this, $method ) ) { |
||
695 | $options[$k] = $this->$method( $value ); |
||
696 | } |
||
697 | } |
||
698 | } |
||
699 | } |
||
700 | |||
701 | // Parse error messages into the Settings API. |
||
702 | $this->parse_errors(); |
||
703 | return $options; |
||
704 | } // End validate_fields() |
||
705 | |||
706 | /** |
||
707 | * Validate text fields. |
||
708 | * @access public |
||
709 | * @since 1.0.0 |
||
710 | * @param string $input |
||
711 | * @return string |
||
712 | */ |
||
713 | public function validate_field_text ( $input ) { |
||
714 | return trim( esc_attr( $input ) ); |
||
715 | } // End validate_field_text() |
||
716 | |||
717 | /** |
||
718 | * Validate checkbox fields. |
||
719 | * @access public |
||
720 | * @since 1.0.0 |
||
721 | * @param string $input |
||
722 | * @return string |
||
723 | */ |
||
724 | public function validate_field_checkbox ( $input ) { |
||
725 | if ( ! isset( $input ) ) { |
||
726 | return 0; |
||
727 | } else { |
||
728 | return (bool)$input; |
||
729 | } |
||
730 | } // End validate_field_checkbox() |
||
731 | |||
732 | /** |
||
733 | * Validate multicheck fields. |
||
734 | * @access public |
||
735 | * @since 1.0.0 |
||
736 | * @param string $input |
||
737 | * @return string |
||
738 | */ |
||
739 | public function validate_field_multicheck ( $input ) { |
||
740 | $input = (array) $input; |
||
741 | |||
742 | $input = array_map( 'esc_attr', $input ); |
||
743 | |||
744 | return $input; |
||
745 | } // End validate_field_multicheck() |
||
746 | |||
747 | /** |
||
748 | * Validate range fields. |
||
749 | * @access public |
||
750 | * @since 1.0.0 |
||
751 | * @param string $input |
||
752 | * @return string |
||
753 | */ |
||
754 | public function validate_field_range ( $input ) { |
||
755 | $input = number_format( floatval( $input ), 0 ); |
||
756 | |||
757 | return $input; |
||
758 | } // End validate_field_range() |
||
759 | |||
760 | /** |
||
761 | * Validate URL fields. |
||
762 | * @access public |
||
763 | * @since 1.0.0 |
||
764 | * @param string $input |
||
765 | * @return string |
||
766 | */ |
||
767 | public function validate_field_url ( $input ) { |
||
768 | return trim( esc_url( $input ) ); |
||
769 | } // End validate_field_url() |
||
770 | |||
771 | /** |
||
772 | * Check and validate the input from text fields. |
||
773 | * @param string $input String of the value to be validated. |
||
774 | * @since 1.1.0 |
||
775 | * @return boolean Is the value valid? |
||
776 | */ |
||
777 | public function check_field_text ( $input ) { |
||
0 ignored issues
–
show
|
|||
778 | $is_valid = true; |
||
779 | |||
780 | return $is_valid; |
||
781 | } // End check_field_text() |
||
782 | |||
783 | /** |
||
784 | * Log an error internally, for processing later using $this->parse_errors(). |
||
785 | * @access protected |
||
786 | * @since 1.0.0 |
||
787 | * @param string $key |
||
788 | * @param array $data |
||
789 | * @return void |
||
790 | */ |
||
791 | protected function add_error ( $key, $data ) { |
||
792 | if ( isset( $data['error_message'] ) ) { |
||
793 | $message = $data['error_message']; |
||
794 | } else { |
||
795 | $message = sprintf( __( '%s is a required field', 'woothemes-sensei' ), $data['name'] ); |
||
796 | } |
||
797 | $this->errors[$key] = $message; |
||
798 | } // End add_error() |
||
799 | |||
800 | /** |
||
801 | * Parse logged errors. |
||
802 | * @access protected |
||
803 | * @since 1.0.0 |
||
804 | * @return void |
||
805 | */ |
||
806 | protected function parse_errors () { |
||
807 | if ( count ( $this->errors ) > 0 ) { |
||
808 | foreach ( $this->errors as $k => $v ) { |
||
809 | add_settings_error( $this->token . '-errors', $k, $v, 'error' ); |
||
810 | } |
||
811 | } else { |
||
812 | $message = sprintf( __( '%s updated', 'woothemes-sensei' ), $this->name ); |
||
813 | add_settings_error( $this->token . '-errors', $this->token, $message, 'updated' ); |
||
814 | } |
||
815 | } // End parse_errors() |
||
816 | |||
817 | /** |
||
818 | * Return an array of field types expecting an array value returned. |
||
819 | * @access protected |
||
820 | * @since 1.0.0 |
||
821 | * @return array |
||
822 | */ |
||
823 | protected function get_array_field_types () { |
||
824 | return array( 'multicheck' ); |
||
825 | } // End get_array_field_types() |
||
826 | |||
827 | /** |
||
828 | * Load in JavaScripts where necessary. |
||
829 | * @access public |
||
830 | * @since 1.0.0 |
||
831 | * @return void |
||
832 | */ |
||
833 | public function enqueue_scripts () { |
||
834 | |||
835 | $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; |
||
836 | |||
837 | wp_enqueue_script( 'farbtastic' ); |
||
838 | wp_enqueue_script( 'woothemes-sensei-settings', esc_url( Sensei()->plugin_url . 'assets/js/settings' . $suffix . '.js' ), array( 'jquery', 'farbtastic' ), Sensei()->version ); |
||
839 | |||
840 | View Code Duplication | if ( $this->has_range ) { |
|
0 ignored issues
–
show
This code seems to be duplicated across your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
841 | wp_enqueue_script( 'woothemes-sensei-settings-ranges', esc_url( Sensei()->plugin_url . 'assets/js/ranges' . $suffix . '.js' ), array( 'jquery-ui-slider' ), Sensei()->version ); |
||
842 | } |
||
843 | |||
844 | wp_register_script( 'woothemes-sensei-settings-imageselectors', esc_url( Sensei()->plugin_url . 'assets/js/image-selectors' . $suffix . '.js' ), array( 'jquery' ), Sensei()->version ); |
||
845 | |||
846 | if ( $this->has_imageselector ) { |
||
847 | wp_enqueue_script( 'woothemes-sensei-settings-imageselectors' ); |
||
848 | } |
||
849 | |||
850 | } // End enqueue_scripts() |
||
851 | |||
852 | /** |
||
853 | * Load in CSS styles where necessary. |
||
854 | * @access public |
||
855 | * @since 1.0.0 |
||
856 | * @return void |
||
857 | */ |
||
858 | public function enqueue_styles () { |
||
859 | |||
860 | wp_enqueue_style( $this->token . '-admin' ); |
||
861 | |||
862 | wp_enqueue_style( 'farbtastic' ); |
||
863 | wp_enqueue_style( 'woothemes-sensei-settings-api', esc_url( Sensei()->plugin_url . 'assets/css/settings.css' ), array( 'farbtastic' ), Sensei()->version ); |
||
864 | |||
865 | $this->enqueue_field_styles(); |
||
866 | } // End enqueue_styles() |
||
867 | |||
868 | /** |
||
869 | * Load in CSS styles for field types where necessary. |
||
870 | * @access public |
||
871 | * @since 1.0.0 |
||
872 | * @return void |
||
873 | */ |
||
874 | public function enqueue_field_styles () { |
||
875 | |||
876 | View Code Duplication | if ( $this->has_range ) { |
|
0 ignored issues
–
show
This code seems to be duplicated across your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
877 | wp_enqueue_style( 'woothemes-sensei-settings-ranges', esc_url( Sensei()->plugin_url . 'assets/css/ranges.css' ), '', Sensei()->version ); |
||
878 | } |
||
879 | |||
880 | wp_register_style( 'woothemes-sensei-settings-imageselectors', esc_url( Sensei()->plugin_url . 'assets/css/image-selectors.css' ), '', Sensei()->version ); |
||
881 | |||
882 | if ( $this->has_imageselector ) { |
||
883 | wp_enqueue_style( 'woothemes-sensei-settings-imageselectors' ); |
||
884 | } |
||
885 | } // End enqueue_field_styles() |
||
886 | } // End Class |
||
887 | |||
888 | /** |
||
889 | * Class WooThemes_Sensei_Settings_API |
||
890 | * @ignore only for backward compatibility |
||
891 | * @since 1.9.0 |
||
892 | */ |
||
893 | class WooThemes_Sensei_Settings_API extends Sensei_Settings_API{} |
||
894 |
The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.
The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.
To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.