Issues (896)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

includes/class-sensei-settings.php (3 issues)

Upgrade to new PHP Analysis Engine

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
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 14 and the first side effect is on line 2.

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.

Loading history...
2
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
3
4
/*
5
 * Sensei Settings Class
6
 *
7
 * All functionality pertaining to the settings in Sensei.
8
 *
9
 * @package Core
10
 * @author Automattic
11
 *
12
 * @since 1.0.0
13
 */
14
class Sensei_Settings extends Sensei_Settings_API {
15
16
	/**
17
	 * Constructor.
18
	 * @access public
19
	 * @since 1.0.0
20
	 */
21
	public function __construct () {
22
	    parent::__construct(); // Required in extended classes.
23
24
        $this->token = 'woothemes-sensei-settings';
25
        add_action('init', array( __CLASS__, 'flush_rewrite_rules' ) );
26
27
        // Setup Admin Settings data
28
        if ( is_admin() ) {
29
30
            $this->has_tabs 	= true;
31
            $this->name 		= __( 'Sensei Settings', 'woothemes-sensei' );
32
            $this->menu_label	= __( 'Settings', 'woothemes-sensei' );
33
            $this->page_slug	= 'woothemes-sensei-settings';
34
35
        } // End If Statement
36
37
        $this->register_hook_listener();
38
        $this->get_settings();
39
40
	} // End __construct()
41
42
    /**
43
     * Get settings value
44
     *
45
     * @since 1.9.0
46
     * @param string $setting_name
47
     * @return mixed
48
     */
49
    public function get( $setting_name ){
50
51
        if( isset( $this->settings[ $setting_name ] ) ){
52
53
            return $this->settings[ $setting_name ];
54
55
        }
56
57
        return false;
58
    }
59
60
    /**
61
     * @since 1.9.0
62
     *
63
     * @param $setting
64
     * @param $new_value
65
     */
66
    public function set( $setting, $new_value ){
67
    	
68
        $settings = get_option( $this->token, array() );
69
		$settings[ $setting ] = $new_value;
70
		return update_option( $this->token,$settings );
71
72
    }
73
74
	/**
75
	 * Register the settings screen within the WordPress admin.
76
	 * @access public
77
	 * @since  1.0.0
78
	 * @return void
79
	 */
80
	public function register_settings_screen () {
81
82
		$this->settings_version = Sensei()->version; // Use the global plugin version on this settings screen.
83
		$hook = add_submenu_page( 'sensei', $this->name, $this->menu_label, 'manage_sensei', $this->page_slug, array( $this, 'settings_screen' ) );
84
		$this->hook = $hook;
85
86
		if ( isset( $_GET['page'] ) && ( $_GET['page'] == $this->page_slug ) ) {
87
			add_action( 'admin_notices', array( $this, 'settings_errors' ) );
88
			add_action( 'admin_notices', array( $this, 'language_pack_notices' ) );
89
			add_action( 'admin_print_scripts', array( $this, 'enqueue_scripts' ) );
90
			add_action( 'admin_print_styles', array( $this, 'enqueue_styles' ) );
91
		}
92
	} // End register_settings_screen()
93
94
	/**
95
	 * Add settings sections.
96
	 * @access public
97
	 * @since  1.0.0
98
	 * @return void
99
	 */
100
	public function init_sections () {
101
		$sections = array();
102
103
		$sections['default-settings'] = array(
104
			'name' 			=> __( 'General', 'woothemes-sensei' ),
105
			'description'	=> __( 'Settings that apply to the entire plugin.', 'woothemes-sensei' )
106
		);
107
108
		$sections['course-settings'] = array(
109
			'name' 			=> __( 'Courses', 'woothemes-sensei' ),
110
			'description'	=> __( 'Settings that apply to all Courses.', 'woothemes-sensei' )
111
		);
112
113
		$sections['lesson-settings'] = array(
114
			'name' 			=> __( 'Lessons', 'woothemes-sensei' ),
115
			'description'	=> __( 'Settings that apply to all Lessons.', 'woothemes-sensei' )
116
		);
117
118
		$sections['email-notification-settings'] = array(
119
			'name' 			=> __( 'Email Notifications', 'woothemes-sensei' ),
120
			'description'	=> __( 'Settings for email notifications sent from your site.', 'woothemes-sensei' )
121
		);
122
123
		$sections['learner-profile-settings'] = array(
124
			'name' 			=> __( 'Learner Profiles', 'woothemes-sensei' ),
125
			'description'	=> __( 'Settings for public Learner Profiles.', 'woothemes-sensei' )
126
		);
127
128
		if ( Sensei_WC::is_woocommerce_present() ) {
129
			$sections['woocommerce-settings'] = array(
130
				'name' 			=> __( 'WooCommerce', 'woothemes-sensei' ),
131
				'description'	=> __( 'Optional settings for WooCommerce functions.', 'woothemes-sensei' )
132
			);
133
		} // End If Statement
134
135
		if ( 'en_US' !== get_locale() ) {
136
			$sections['language-settings'] = array(
137
				'name' 			=> __( 'Language', 'woothemes-sensei' ),
138
				'description'	=> __( 'Language options.', 'woothemes-sensei' )
139
			);
140
		}
141
142
		$this->sections = apply_filters( 'sensei_settings_tabs', $sections );
143
	} // End init_sections()
144
145
	/**
146
	 * Add settings fields.
147
	 * @access public
148
	 * @since  1.0.0
149
	 * @uses   Sensei_Utils::get_slider_types()
150
	 * @return void
151
	 */
152
	public function init_fields () {
153
		global $pagenow;
154
155
		$pages_array = $this->pages_array();
156
		$posts_per_page_array = array( '0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', '10' => '10', '11' => '11', '12' => '12', '13' => '13', '14' => '14', '15' => '15', '16' => '16', '17' => '17', '18' => '18', '19' => '19', '20' => '20' );
157
		$complete_settings = array( 'passed' => __( 'Once all the course lessons have been completed', 'woothemes-sensei' ), 'complete' => __( 'At any time (by clicking the \'Complete Course\' button)', 'woothemes-sensei' ) );
158
		$course_display_settings = array( 'excerpt' => __( 'Course Excerpt', 'woothemes-sensei' ), 'full' => __( 'Full Course Content', 'woothemes-sensei' ) );
159
160
	    $fields = array();
161
162
		$fields['access_permission'] = array(
163
								'name' => __( 'Access Permissions', 'woothemes-sensei' ),
164
								'description' => __( 'Users must be logged in to view Course and Lesson content.', 'woothemes-sensei', 'woothemes-sensei' ),
165
								'type' => 'checkbox',
166
								'default' => true,
167
								'section' => 'default-settings'
168
								);
169
170
		$fields['messages_disable'] = array(
171
								'name' => __( 'Disable Private Messages', 'woothemes-sensei' ),
172
								'description' => __( 'Disable the private message functions between learners and teachers.', 'woothemes-sensei' ),
173
								'type' => 'checkbox',
174
								'default' => false,
175
								'section' => 'default-settings'
176
								);
177
178
		$fields['course_page'] = array(
179
								'name' => __( 'Course Archive Page', 'woothemes-sensei' ),
180
								'description' => __( 'The page to use to display courses. If you leave this blank the default custom post type archive will apply.', 'woothemes-sensei' ),
181
								'type' => 'select',
182
								'default' => get_option( 'woothemes-sensei_courses_page_id', 0 ),
183
								'section' => 'default-settings',
184
								'required' => 0,
185
								'options' => $pages_array
186
								);
187
188
		$fields['my_course_page'] = array(
189
								'name' => __( 'My Courses Page', 'woothemes-sensei' ),
190
								'description' => __( 'The page to use to display the courses that a user is currently taking as well as the courses a user has complete.', 'woothemes-sensei' ),
191
								'type' => 'select',
192
								'default' => get_option( 'woothemes-sensei_user_dashboard_page_id', 0 ),
193
								'section' => 'default-settings',
194
								'required' => 0,
195
								'options' => $pages_array
196
								);
197
198
		$fields['placeholder_images_enable'] = array(
199
								'name' => __( 'Use placeholder images', 'woothemes-sensei' ),
200
								'description' => __( 'Output a placeholder image when no featured image has been specified for Courses and Lessons.', 'woothemes-sensei' ),
201
								'type' => 'checkbox',
202
								'default' => false,
203
								'section' => 'default-settings'
204
								);
205
206
		$fields['styles_disable'] = array(
207
								'name' => __( 'Disable Sensei Styles', 'woothemes-sensei' ),
208
								'description' => __( 'Prevent the frontend stylesheets from loading. This will remove the default styles for all Sensei elements.', 'woothemes-sensei' ),
209
								'type' => 'checkbox',
210
								'default' => false,
211
								'section' => 'default-settings'
212
								);
213
214
		$fields['js_disable'] = array(
215
								'name' => __( 'Disable Sensei Javascript', 'woothemes-sensei' ),
216
								'description' => __( 'Prevent the frontend javascript from loading. This affects the progress bars and the My Courses tabs.', 'woothemes-sensei' ),
217
								'type' => 'checkbox',
218
								'default' => false,
219
								'section' => 'default-settings'
220
								);
221
222
    	// Course Settings
223
224
    	$fields['course_completion'] = array(
225
								'name' => __( 'Courses are complete:', 'woothemes-sensei' ),
226
								'description' => __( 'This will determine when courses are marked as complete.', 'woothemes-sensei' ),
227
								'type' => 'select',
228
								'default' => 'passed',
229
								'section' => 'course-settings',
230
								'required' => 0,
231
								'options' => $complete_settings
232
								);
233
234
    	$fields['course_author'] = array(
235
								'name' => __( 'Display Course Author', 'woothemes-sensei' ),
236
								'description' => __( 'Output the Course Author on Course archive and My Courses page.', 'woothemes-sensei' ),
237
								'type' => 'checkbox',
238
								'default' => true,
239
								'section' => 'course-settings'
240
								);
241
242
		$fields['my_course_amount'] = array(
243
								'name' => __( 'My Courses Pagination', 'woothemes-sensei' ),
244
								'description' => __( 'The number of courses to output for the my courses page.', 'woothemes-sensei' ),
245
								'type' => 'range',
246
								'default' => '0',
247
								'section' => 'course-settings',
248
								'required' => 0,
249
								'options' => $posts_per_page_array
250
								);
251
252
		$fields['course_archive_image_enable'] = array(
253
								'name' => __( 'Course Archive Image', 'woothemes-sensei' ),
254
								'description' => __( 'Output the Course Image on the Course Archive Page.', 'woothemes-sensei' ),
255
								'type' => 'checkbox',
256
								'default' => true,
257
								'section' => 'course-settings'
258
								);
259
260
		$fields['course_archive_image_width'] = array(
261
								'name' => __( 'Image Width - Archive', 'woothemes-sensei' ),
262
								'description' => __( 'The width in pixels of the featured image for the Course Archive page.', 'woothemes-sensei' ),
263
								'type' => 'text',
264
								'default' => '100',
265
								'section' => 'course-settings',
266
								'required' => 0
267
								);
268
269
		$fields['course_archive_image_height'] = array(
270
								'name' => __( 'Image Height - Archive', 'woothemes-sensei' ),
271
								'description' => __( 'The height in pixels of the featured image for the Course Archive page.', 'woothemes-sensei' ),
272
								'type' => 'text',
273
								'default' => '100',
274
								'section' => 'course-settings',
275
								'required' => 0
276
								);
277
278
		$fields['course_archive_image_hard_crop'] = array(
279
								'name' => __( 'Image Hard Crop - Archive', 'woothemes-sensei' ),
280
								'description' => sprintf( __( 'After changing this setting, you may need to %1$sregenerate your thumbnails%2$s.', 'woothemes-sensei' ), '<a href="' . esc_url( 'http://wordpress.org/extend/plugins/regenerate-thumbnails/' ) . '">', '</a>' ),
281
								'type' => 'checkbox',
282
								'default' => false,
283
								'section' => 'course-settings'
284
								);
285
286
		$fields['course_single_image_enable'] = array(
287
								'name' => __( 'Single Course Image', 'woothemes-sensei' ),
288
								'description' => __( 'Output the Course Image on the Single Course Page.', 'woothemes-sensei' ),
289
								'type' => 'checkbox',
290
								'default' => false,
291
								'section' => 'course-settings'
292
								);
293
294
		$fields['course_single_image_width'] = array(
295
								'name' => __( 'Image Width - Single', 'woothemes-sensei' ),
296
								'description' => __( 'The width in pixels of the featured image for the Course single post page.', 'woothemes-sensei' ),
297
								'type' => 'text',
298
								'default' => '100',
299
								'section' => 'course-settings',
300
								'required' => 0
301
								);
302
303
		$fields['course_single_image_height'] = array(
304
								'name' => __( 'Image Height - Single', 'woothemes-sensei' ),
305
								'description' => __( 'The height in pixels of the featured image for the Course single post page.', 'woothemes-sensei' ),
306
								'type' => 'text',
307
								'default' => '100',
308
								'section' => 'course-settings',
309
								'required' => 0
310
								);
311
312
		$fields['course_single_image_hard_crop'] = array(
313
								'name' => __( 'Image Hard Crop - Single', 'woothemes-sensei' ),
314
								'description' => sprintf( __( 'After changing this setting, you may need to %1$sregenerate your thumbnails%2$s.', 'woothemes-sensei' ), '<a href="' . esc_url( 'http://wordpress.org/extend/plugins/regenerate-thumbnails/' ) . '">', '</a>' ),
315
								'type' => 'checkbox',
316
								'default' => false,
317
								'section' => 'course-settings'
318
								);
319
320
		$fields['course_single_content_display'] = array(
321
								'name' => __( 'Single Course page displays:', 'woothemes-sensei' ),
322
								'description' => __( 'Determines what content to display on the single course page.', 'woothemes-sensei' ),
323
								'type' => 'select',
324
								'default' => 'excerpt',
325
								'section' => 'course-settings',
326
								'required' => 0,
327
								'options' => $course_display_settings
328
								);
329
330
		$fields['course_archive_featured_enable'] = array(
331
								'name' => __( 'Featured Courses Panel', 'woothemes-sensei' ),
332
								'description' => __( 'Output the Featured Courses Panel on the Course Archive Page.', 'woothemes-sensei' ),
333
								'type' => 'checkbox',
334
								'default' => true,
335
								'section' => 'course-settings'
336
								);
337
338
		$fields['course_archive_more_link_text'] = array(
339
								'name' => __( 'More link text', 'woothemes-sensei' ),
340
								'description' => __( 'The text that will be displayed on the Course Archive for the more courses link.', 'woothemes-sensei' ),
341
								'type' => 'text',
342
								'default' => __ ( 'More', 'woothemes-sensei' ),
343
								'section' => 'course-settings',
344
								'required' => 0
345
								);
346
347
		// Lesson Settings
348
349
		$fields['lesson_comments'] = array(
350
								'name' => __( 'Allow Comments for Lessons', 'woothemes-sensei' ),
351
								'description' => __( 'This will allow learners to post comments on the single Lesson page, only learner who have access to the Lesson will be allowed to comment.', 'woothemes-sensei' ),
352
								'type' => 'checkbox',
353
								'default' => true,
354
								'section' => 'lesson-settings'
355
								);
356
357
		$fields['lesson_author'] = array(
358
								'name' => __( 'Display Lesson Author', 'woothemes-sensei' ),
359
								'description' => __( 'Output the Lesson Author on Course single page & Lesson archive page.', 'woothemes-sensei' ),
360
								'type' => 'checkbox',
361
								'default' => true,
362
								'section' => 'lesson-settings'
363
								);
364
365
		$fields['course_lesson_image_enable'] = array(
366
								'name' => __( 'Course Lesson Images', 'woothemes-sensei' ),
367
								'description' => __( 'Output the Lesson Image on the Single Course Page.', 'woothemes-sensei' ),
368
								'type' => 'checkbox',
369
								'default' => false,
370
								'section' => 'lesson-settings'
371
								);
372
373
		$fields['lesson_archive_image_width'] = array(
374
								'name' => __( 'Image Width - Course Lessons', 'woothemes-sensei' ),
375
								'description' => __( 'The width in pixels of the featured image for the Lessons on the Course Single page.', 'woothemes-sensei' ),
376
								'type' => 'text',
377
								'default' => '100',
378
								'section' => 'lesson-settings',
379
								'required' => 0
380
								);
381
382
		$fields['lesson_archive_image_height'] = array(
383
								'name' => __( 'Image Height - Course Lessons', 'woothemes-sensei' ),
384
								'description' => __( 'The height in pixels of the featured image for the Lessons on the Course Single page.', 'woothemes-sensei' ),
385
								'type' => 'text',
386
								'default' => '100',
387
								'section' => 'lesson-settings',
388
								'required' => 0
389
								);
390
391
		$fields['lesson_archive_image_hard_crop'] = array(
392
								'name' => __( 'Image Hard Crop - Course Lessons', 'woothemes-sensei' ),
393
								'description' => sprintf( __( 'After changing this setting, you may need to %1$sregenerate your thumbnails%2$s.', 'woothemes-sensei' ), '<a href="' . esc_url( 'http://wordpress.org/extend/plugins/regenerate-thumbnails/' ) . '">', '</a>' ),
394
								'type' => 'checkbox',
395
								'default' => false,
396
								'section' => 'lesson-settings'
397
								);
398
399
		$fields['lesson_single_image_enable'] = array(
400
								'name' => __( 'Single Lesson Images', 'woothemes-sensei' ),
401
								'description' => __( 'Output the Lesson Image on the Single Lesson Page.', 'woothemes-sensei' ),
402
								'type' => 'checkbox',
403
								'default' => false,
404
								'section' => 'lesson-settings'
405
								);
406
407
		$fields['lesson_single_image_width'] = array(
408
								'name' => __( 'Image Width - Single', 'woothemes-sensei' ),
409
								'description' => __( 'The width in pixels of the featured image for the Lessons single post page.', 'woothemes-sensei' ),
410
								'type' => 'text',
411
								'default' => '100',
412
								'section' => 'lesson-settings',
413
								'required' => 0
414
								);
415
416
		$fields['lesson_single_image_height'] = array(
417
								'name' => __( 'Image Height - Single', 'woothemes-sensei' ),
418
								'description' => __( 'The height in pixels of the featured image for the Lessons single post page.', 'woothemes-sensei' ),
419
								'type' => 'text',
420
								'default' => '100',
421
								'section' => 'lesson-settings',
422
								'required' => 0
423
								);
424
425
		$fields['lesson_single_image_hard_crop'] = array(
426
								'name' => __( 'Image Hard Crop - Single', 'woothemes-sensei' ),
427
								'description' => sprintf( __( 'After changing this setting, you may need to %1$sregenerate your thumbnails%2$s.', 'woothemes-sensei' ), '<a href="' . esc_url( 'http://wordpress.org/extend/plugins/regenerate-thumbnails/' ) . '">', '</a>' ),
428
								'type' => 'checkbox',
429
								'default' => false,
430
								'section' => 'lesson-settings'
431
								);
432
433
		// Learner Profile settings
434
435
		$profile_url_base = apply_filters( 'sensei_learner_profiles_url_base', __( 'learner', 'woothemes-sensei') );
436
		$profile_url_example = trailingslashit( get_site_url() ) . $profile_url_base . '/%username%';
437
438
		$fields['learner_profile_enable'] = array(
439
							'name' => __( 'Public learner profiles', 'woothemes-sensei' ),
440
							'description' => sprintf( __( 'Enable public learner profiles that will be accessible to everyone. Profile URL format: %s', 'woothemes-sensei' ), $profile_url_example ),
441
							'type' => 'checkbox',
442
							'default' => true,
443
							'section' => 'learner-profile-settings'
444
							);
445
446
		$fields['learner_profile_show_courses'] = array(
447
							'name' => __( 'Show learner\'s courses', 'woothemes-sensei' ),
448
							'description' => __( 'Display the learner\'s active and completed courses on their profile.', 'woothemes-sensei' ),
449
							'type' => 'checkbox',
450
							'default' => true,
451
							'section' => 'learner-profile-settings'
452
							);
453
454
		// Email notifications
455
456
		$learner_email_options = array(
457
			'learner-graded-quiz' => __( 'Their quiz is graded (auto and manual grading)', 'woothemes-sensei' ),
458
			'learner-completed-course' => __( 'They complete a course', 'woothemes-sensei' ),
459
		);
460
461
		$teacher_email_options = array(
462
            'teacher-started-course' => __( 'A learner starts their course', 'woothemes-sensei' ),
463
            'teacher-completed-course' => __( 'A learner completes their course', 'woothemes-sensei' ),
464
            'teacher-completed-lesson' => __( 'A learner completes a lesson', 'woothemes-sensei' ),
465
            'teacher-quiz-submitted' => __( 'A learner submits a quiz for grading', 'woothemes-sensei' ),
466
			'teacher-new-message' => __( 'A learner sends a private message to a teacher', 'woothemes-sensei' ),
467
		);
468
469
		$global_email_options = array(
470
			'new-message-reply' => __( 'They receive a reply to their private message', 'woothemes-sensei' ),
471
		);
472
473
		$fields['email_learners'] = array(
474
								'name' => __( 'Emails Sent to Learners', 'woothemes-sensei' ),
475
								'description' => __( 'Select the notifications that will be sent to learners.', 'woothemes-sensei' ),
476
								'type' => 'multicheck',
477
								'options' => $learner_email_options,
478
								'defaults' => array( 'learner-graded-quiz', 'learner-completed-course' ),
479
								'section' => 'email-notification-settings'
480
								);
481
482
		$fields['email_teachers'] = array(
483
								'name' => __( 'Emails Sent to Teachers', 'woothemes-sensei' ),
484
								'description' => __( 'Select the notifications that will be sent to teachers.', 'woothemes-sensei' ),
485
								'type' => 'multicheck',
486
								'options' => $teacher_email_options,
487
								'defaults' => array( 'teacher-completed-course', 'teacher-started-course', 'teacher-quiz-submitted', 'teacher-new-message' ),
488
								'section' => 'email-notification-settings'
489
								);
490
491
		$fields['email_global'] = array(
492
								'name' => __( 'Emails Sent to All Users', 'woothemes-sensei' ),
493
								'description' => __( 'Select the notifications that will be sent to all users.', 'woothemes-sensei' ),
494
								'type' => 'multicheck',
495
								'options' => $global_email_options,
496
								'defaults' => array( 'new-message-reply' ),
497
								'section' => 'email-notification-settings'
498
								);
499
500
		$fields['email_from_name'] = array(
501
								'name' => __( '"From" Name', 'woothemes-sensei' ),
502
								'description' => __( 'The name from which all emails will be sent.', 'woothemes-sensei' ),
503
								'type' => 'text',
504
								'default' => get_bloginfo( 'name' ),
505
								'section' => 'email-notification-settings',
506
								'required' => 1
507
								);
508
509
		$fields['email_from_address'] = array(
510
								'name' => __( '"From" Address', 'woothemes-sensei' ),
511
								'description' => __( 'The address from which all emails will be sent.', 'woothemes-sensei' ),
512
								'type' => 'text',
513
								'default' => get_bloginfo( 'admin_email' ),
514
								'section' => 'email-notification-settings',
515
								'required' => 1
516
								);
517
518
		$fields['email_header_image'] = array(
519
								'name' => __( 'Header Image', 'woothemes-sensei' ),
520
								'description' => sprintf( __( 'Enter a URL to an image you want to show in the email\'s header. Upload your image using the %1$smedia uploader%2$s.', 'woothemes-sensei' ), '<a href="' . admin_url( 'media-new.php' ) . '">', '</a>' ),
521
								'type' => 'text',
522
								'default' => '',
523
								'section' => 'email-notification-settings',
524
								'required' => 0
525
								);
526
527
		$fields['email_footer_text'] = array(
528
								'name' => __( 'Email Footer Text', 'woothemes-sensei' ),
529
								'description' => __( 'The text to appear in the footer of Sensei emails.', 'woothemes-sensei' ),
530
								'type' => 'textarea',
531
								'default' => sprintf( __( '%1$s - Powered by Sensei', 'woothemes-sensei' ), get_bloginfo( 'name' ) ),
532
								'section' => 'email-notification-settings',
533
								'required' => 0
534
								);
535
536
		$fields['email_base_color'] = array(
537
								'name' => __( 'Base Colour', 'woothemes-sensei' ),
538
								'description' => sprintf( __( 'The base colour for Sensei email templates. Default %1$s#557da1%2$s.', 'woothemes-sensei' ), '<code>', '</code>' ),
539
								'type' => 'color',
540
								'default' => '#557da1',
541
								'section' => 'email-notification-settings',
542
								'required' => 1
543
								);
544
545
		$fields['email_background_color'] = array(
546
								'name' => __( 'Background Colour', 'woothemes-sensei' ),
547
								'description' => sprintf( __( 'The background colour for Sensei email templates. Default %1$s#f5f5f5%2$s.', 'woothemes-sensei' ), '<code>', '</code>' ),
548
								'type' => 'color',
549
								'default' => '#f5f5f5',
550
								'section' => 'email-notification-settings',
551
								'required' => 1
552
								);
553
554
		$fields['email_body_background_color'] = array(
555
								'name' => __( 'Body Background Colour', 'woothemes-sensei' ),
556
								'description' => sprintf( __( 'The main body background colour for Sensei email templates. Default %1$s#fdfdfd%2$s.', 'woothemes-sensei' ), '<code>', '</code>' ),
557
								'type' => 'color',
558
								'default' => '#fdfdfd',
559
								'section' => 'email-notification-settings',
560
								'required' => 1
561
								);
562
563
		$fields['email_text_color'] = array(
564
								'name' => __( 'Body Text Colour', 'woothemes-sensei' ),
565
								'description' => sprintf( __( 'The main body text colour for Sensei email templates. Default %1$s#505050%2$s.', 'woothemes-sensei' ), '<code>', '</code>' ),
566
								'type' => 'color',
567
								'default' => '#505050',
568
								'section' => 'email-notification-settings',
569
								'required' => 1
570
								);
571
572
		if ( Sensei_WC::is_woocommerce_present() ) {
573
			// WooCommerce Settings
574
    		$fields['woocommerce_enabled'] = array(
575
									'name' => __( 'Enable WooCommerce Courses', 'woothemes-sensei' ),
576
									'description' => __( 'Use WooCommerce to sell Courses by linking a Product to a Course.', 'woothemes-sensei' ),
577
									'type' => 'checkbox',
578
									'default' => true,
579
									'section' => 'woocommerce-settings'
580
									);
581
582
			$fields['course_archive_free_enable'] = array(
583
									'name' => __( 'Free Courses Panel', 'woothemes-sensei' ),
584
									'description' => __( 'Output the Free Courses Panel on the Course Archive Page.', 'woothemes-sensei' ),
585
									'type' => 'checkbox',
586
									'default' => true,
587
									'section' => 'woocommerce-settings'
588
									);
589
590
			$fields['course_archive_paid_enable'] = array(
591
									'name' => __( 'Paid Courses Panel', 'woothemes-sensei' ),
592
									'description' => __( 'Output the Paid Courses Panel on the Course Archive Page.', 'woothemes-sensei' ),
593
									'type' => 'checkbox',
594
									'default' => true,
595
									'section' => 'woocommerce-settings'
596
									);
597
598
		} // End If Statement
599
600
		if ( 'en_US' !== get_locale() ) {
601
			$fields['install_language_pack'] = array(
602
				'name'        => __( 'Install Language Pack', 'woothemes-sensei' ),
603
				'description' => __( 'Use this action to install or re-install translation for your language if available.', 'woothemes-sensei' ),
604
				'type'        => 'button',
605
				'section'     => 'language-settings',
606
				'target'      => Sensei_Language_Pack_Manager::get_install_uri(),
607
				'label'       => __( 'Install', 'woothemes-sensei' )
608
			);
609
		}
610
611
		$this->fields = apply_filters( 'sensei_settings_fields', $fields );
612
613
	} // End init_fields()
614
615
	/**
616
	 * Get options for the duration fields.
617
	 * @since  1.0.0
618
	 * @param  $include_milliseconds (default: true) Whether or not to include milliseconds between 0 and 1.
619
	 * @return array Options between 0.1 and 10 seconds.
620
	 */
621
	private function get_duration_options ( $include_milliseconds = true ) {
622
		$numbers = array( '1.0', '1.5', '2.0', '2.5', '3.0', '3.5', '4.0', '4.5', '5.0', '5.5', '6.0', '6.5', '7.0', '7.5', '8.0', '8.5', '9.0', '9.5', '10.0' );
623
		$options = array();
624
625
		if ( true == (bool)$include_milliseconds ) {
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like you are loosely comparing two booleans. Considering using the strict comparison === instead.

When comparing two booleans, it is generally considered safer to use the strict comparison operator.

Loading history...
626
			$milliseconds = array( '0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8', '0.9' );
627
			foreach ( $milliseconds as $k => $v ) {
628
				$options[$v] = $v;
629
			}
630
		} else {
631
			$options['0.5'] = '0.5';
632
		}
633
634
		foreach ( $numbers as $k => $v ) {
635
			$options[$v] = $v;
636
		}
637
638
		return $options;
639
	} // End get_duration_options()
640
641
	/**
642
	 * Return an array of pages.
643
	 * @access private
644
	 * @since  1.0.0
645
	 * @return array
646
	 */
647
	private function pages_array() {
648
		// REFACTOR - Transform this into a field type instead.
649
		// Setup an array of portfolio gallery terms for a dropdown.
650
		$args = array( 'echo' => 0, 'hierarchical' => 1, 'sort_column' => 'post_title', 'sort_order' => 'ASC' );
651
		$pages_dropdown = wp_dropdown_pages( $args );
652
		$page_items = array();
653
654
		// Quick string hack to make sure we get the pages with the indents.
655
		$pages_dropdown = str_replace( "<select class='' name='page_id' id='page_id'>", '', $pages_dropdown );
656
		$pages_dropdown = str_replace( '</select>', '', $pages_dropdown );
657
		$pages_split = explode( '</option>', $pages_dropdown );
658
659
		$page_items[] = __( 'Select a Page:', 'woothemes-sensei' );
660
661
		foreach ( $pages_split as $k => $v ) {
662
		    $id = '';
0 ignored issues
show
$id is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
663
		    // Get the ID value.
664
		    preg_match( '/value="(.*?)"/i', $v, $matches );
665
666
		    if ( isset( $matches[1] ) ) {
667
		        $id = $matches[1];
668
		        $page_items[$id] = trim( strip_tags( $v ) );
669
		    } // End If Statement
670
		} // End For Loop
671
672
		$pages_array = $page_items;
673
674
		return $pages_array;
675
	} // End pages_array()
676
677
	/**
678
	 * Language packs notices.
679
	 *
680
	 * @since 1.9.0
681
	 */
682
	public function language_pack_notices() {
683
		Sensei_Language_Pack_Manager::messages();
684
	}
685
686
    /**
687
     * Flush the rewrite rules after the settings have been updated.
688
     * This is to ensure that the
689
     *
690
     * @since 1.9.0
691
     */
692
    public static function flush_rewrite_rules(){
693
694
        if ( isset( $_POST[ 'option_page' ] ) && 'woothemes-sensei-settings' == $_POST[ 'option_page' ]
695
            && isset( $_POST[ 'action' ] ) && 'update' == $_POST[ 'action' ] ) {
696
697
            Sensei()->initiate_rewrite_rules_flush();
698
699
        }
700
701
    }//end  flush_cache
702
} // End Class
703
704
/**
705
 * Class WooThemes_Sensei_Settings
706
 * @ignore only for backward compatibility
707
 * @since 1.9.0
708
 */
709
class WooThemes_Sensei_Settings extends Sensei_Settings{}
710