PluginProbe
Tutor LMS – eLearning and online course solution / 1.8.10
Tutor LMS – eLearning and online course solution v1.8.10
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 4.0.2 4.0.1 4.0.0 3.9.15 3.9.14 3.9.13 3.9.12 3.9.11 trunk 1.0.0 1.0.0-alpha 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 All 191 releases
← All changes | classes/Tutor.php +269 -1081 trunk1.8.10 View file →
@@ -1,749 +1,288 @@
1 1 <?php
2 -/**
3 - * Initialize all the dependency classes
4 - *
5 - * @package Tutor
6 - * @author Themeum <support@themeum.com>
7 - * @link https://www.themeum.com/
8 - * @since 1.0.0
9 - */
10 -
11 2 namespace TUTOR;
12 3
13 -use Tutor\Models\CourseModel;
14 -use Tutor\Ecommerce\Ecommerce;
15 -use Tutor\GDPR\GDPR;
16 -use Tutor\Helpers\QueryHelper;
17 -use Tutor\Migrations\Migration;
18 -
19 -if ( ! defined( 'ABSPATH' ) ) {
4 +if ( ! defined( 'ABSPATH' ) )
20 5 exit;
21 -}
22 6
23 -/**
24 - * Tutor final class
25 - *
26 - * @since 1.0.0
27 - */
28 -final class Tutor extends Singleton {
29 -
30 - /**
31 - * Tutor version
32 - *
33 - * @since 1.0.0
34 - *
35 - * @var string
36 - */
7 +final class Tutor{
37 8 public $version = TUTOR_VERSION;
38 -
39 - /**
40 - * Plugin dir path
41 - *
42 - * @since 1.0.0
43 - *
44 - * @var string
45 - */
46 9 public $path;
47 -
48 - /**
49 - * Plugin dir path
50 - *
51 - * @since 1.0.0
52 - *
53 - * @var string
54 - */
55 10 public $url;
11 + public $basename;
56 12
57 13 /**
58 - * Plugin dir name
14 + * The single instance of the class.
59 15 *
60 - * @since 1.0.0
61 - *
62 - * @var string
16 + * @since v.1.2.0
63 17 */
64 - public $basename;
18 + protected static $_instance = null;
65 19
66 - /**
67 - * Utils class object
68 - *
69 - * @since 1.1.0
70 - *
71 - * @var object
72 - */
20 + //Components
73 21 public $utils;
74 -
75 - /**
76 - * Admin class object
77 - *
78 - * @since 1.1.0
79 - *
80 - * @var object
81 - */
82 22 public $admin;
83 -
84 - /**
85 - * Ajax class object
86 - *
87 - * @since 1.1.0
88 - *
89 - * @var object
90 - */
91 23 public $ajax;
92 -
93 - /**
94 - * Options class object
95 - *
96 - * @since 1.1.0
97 - *
98 - * @var object
99 - */
100 24 public $options;
101 -
102 - /**
103 - * Short code class object
104 - *
105 - * @since 1.1.0
106 - *
107 - * @var object
108 - */
109 25 public $shortcode;
110 26
111 - /**
112 - * Addons class object
113 - *
114 - * @since 1.1.0
115 - *
116 - * @var object
117 - */
118 27 private $addons;
119 -
120 - /**
121 - * PostType class object
122 - *
123 - * @since 1.1.0
124 - *
125 - * @var object
126 - */
127 28 private $post_types;
128 -
129 - /**
130 - * Taxonomies class object
131 - *
132 - * @since 1.1.0
133 - *
134 - * @var object
135 - */
136 29 private $taxonomies;
137 -
138 - /**
139 - * Assets class object
140 - *
141 - * @since 1.1.0
142 - *
143 - * @var object
144 - */
145 30 private $assets;
146 -
147 - /**
148 - * Course class object
149 - *
150 - * @since 1.1.0
151 - *
152 - * @var object
153 - */
154 31 private $course;
155 -
156 - /**
157 - * Lesson class object
158 - *
159 - * @since 1.1.0
160 - *
161 - * @var object
162 - */
163 - public $lesson;
164 -
165 - /**
166 - * Rewrite_Rules class object
167 - *
168 - * @since 1.1.0
169 - *
170 - * @var object
171 - */
32 + private $lesson;
172 33 private $rewrite_rules;
173 -
174 - /**
175 - * Template class object
176 - *
177 - * @since 1.1.0
178 - *
179 - * @var object
180 - */
181 34 private $template;
182 -
183 - /**
184 - * Instructor class object
185 - *
186 - * @since 1.1.0
187 - *
188 - * @var object
189 - */
190 35 private $instructor;
191 -
192 - /**
193 - * Student class object
194 - *
195 - * @since 1.1.0
196 - *
197 - * @var object
198 - */
199 36 private $student;
200 -
201 - /**
202 - * Q_And_A class object
203 - *
204 - * @since 1.1.0
205 - *
206 - * @var object
207 - */
208 37 private $q_and_a;
209 -
210 - /**
211 - * Quiz class object
212 - *
213 - * @since 1.1.0
214 - *
215 - * @var object
216 - */
217 38 private $quiz;
218 -
219 - /**
220 - * Tools class object
221 - *
222 - * @since 1.1.0
223 - *
224 - * @var object
225 - */
226 39 private $tools;
227 -
228 - /**
229 - * User class object
230 - *
231 - * @since 1.1.0
232 - *
233 - * @var object
234 - */
235 40 private $user;
236 -
237 - /**
238 - * UserPreference class object
239 - *
240 - * @since 4.0.0
241 - *
242 - * @var UserPreference
243 - */
244 - private $user_preference;
245 -
246 - /**
247 - * Theme_Compatibility class object
248 - *
249 - * @since 1.1.0
250 - *
251 - * @var object
252 - */
253 41 private $theme_compatibility;
254 -
255 - /**
256 - * Gutenberg class object
257 - *
258 - * @since 1.1.0
259 - *
260 - * @var object
261 - */
262 42 private $gutenberg;
263 -
264 - /**
265 - * Course_Settings_Tabs class object
266 - *
267 - * @since 1.1.0
268 - *
269 - * @var object
270 - */
271 43 private $course_settings_tabs;
272 -
273 - /**
274 - * Withdraw class object
275 - *
276 - * @since 1.1.0
277 - *
278 - * @var object
279 - */
280 44 private $withdraw;
281 45
282 - /**
283 - * Course_Widget class object
284 - *
285 - * @since 1.1.0
286 - *
287 - * @var object
288 - */
289 46 private $course_widget;
290 -
291 - /**
292 - * Upgrader class object
293 - *
294 - * @since 1.1.0
295 - *
296 - * @var object
297 - */
298 47 private $upgrader;
299 -
300 - /**
301 - * Dashboard class object
302 - *
303 - * @since 1.1.0
304 - *
305 - * @var object
306 - */
307 48 private $dashboard;
308 -
309 - /**
310 - * FormHandler class object
311 - *
312 - * @since 1.1.0
313 - *
314 - * @var object
315 - */
316 49 private $form_handler;
317 -
318 - /**
319 - * Frontend class object
320 - *
321 - * @since 1.1.0
322 - *
323 - * @var object
324 - */
325 50 private $frontend;
326 -
327 - /**
328 - * Email property
329 - *
330 - * @since 1.1.0
331 - *
332 - * @var object
333 - */
334 51 private $email;
335 52
336 - /**
337 - * WooCommerce integration class object
338 - *
339 - * @since 1.1.0
340 - *
341 - * @var object
342 - */
53 + //Integrations
343 54 private $woocommerce;
344 -
345 - /**
346 - * Tutor_EDD class object
347 - *
348 - * @since 1.1.0
349 - *
350 - * @var object
351 - */
352 55 private $edd;
353 56
354 57 /**
355 - * Announcement
58 + * @return null|Tutor
356 59 *
357 - * @since 2.0.0
60 + * Run the TUTOR
358 61 *
359 - * @var object
62 + * @since 1.2.0
360 63 */
361 - public $announcements;
64 + public static function instance() {
65 + if ( is_null( self::$_instance ) ) {
66 + self::$_instance = new self();
67 + }
68 + return self::$_instance;
69 + }
362 70
363 - /**
364 - * Reviews class object
365 - *
366 - * @since 1.1.0
367 - *
368 - * @var object
369 - */
370 - private $reviews;
71 + function __construct() {
371 72
372 - /**
373 - * Withdraw_List class object
374 - *
375 - * @since 1.1.0
376 - *
377 - * @var object
378 - */
379 - public $withdraw_list;
73 + $this->path = plugin_dir_path(TUTOR_FILE);
74 + $this->url = plugin_dir_url(TUTOR_FILE);
75 + $this->basename = plugin_basename(TUTOR_FILE);
380 76
381 - /**
382 - * Student_List class object
383 - *
384 - * @since 1.1.0
385 - *
386 - * @var object
387 - */
388 - public $student_list;
389 -
390 - /**
391 - * Instructor_List class object
392 - *
393 - * @since 1.1.0
394 - *
395 - * @var object
396 - */
397 - public $instructor_list;
398 -
399 - /**
400 - * Course List
401 - *
402 - * @var Course_List
403 - *
404 - * @since 2.0.0
405 - */
406 - public $course_list;
407 -
408 - //phpcs:disable
409 - public $q_and_a_list;
410 - public $q_attempt;
411 - public $rest_api;
412 - public $setup;
413 - public $private_course_access;
414 - public $course_filter;
415 - //phpcs:enable
416 -
417 - /**
418 - * Course Embed
419 - *
420 - * @var $course_embed
421 - *
422 - * @since 2.1.0
423 - */
424 - private $course_embed;
425 -
426 - /**
427 - * Rest Authentication
428 - *
429 - * @var $rest_auth
430 - *
431 - * @since 2.1.0
432 - */
433 - private $rest_auth;
434 -
435 - /**
436 - * Permalink
437 - *
438 - * @var Permalink
439 - */
440 - private $permalink;
441 -
442 - /**
443 - * Initialize props & other dependencies
444 - *
445 - * @since 1.0.0
446 - */
447 - public function __construct() {
448 -
449 - $this->path = plugin_dir_path( TUTOR_FILE );
450 - $this->url = plugin_dir_url( TUTOR_FILE );
451 - $this->basename = plugin_basename( TUTOR_FILE );
452 -
453 77 /**
454 78 * Adding Tutor Database table to $wpdb;
455 - *
456 - * @since 1.4.2
79 + * @since v.1.4.2
457 80 */
458 81 global $wpdb;
459 - $wpdb->tutor_earnings = $wpdb->prefix . 'tutor_earnings';
460 - $wpdb->tutor_gradebooks = $wpdb->prefix . 'tutor_gradebooks';
461 - $wpdb->tutor_gradebooks_results = $wpdb->prefix . 'tutor_gradebooks_results';
462 - $wpdb->tutor_quiz_attempts = $wpdb->prefix . 'tutor_quiz_attempts';
463 - $wpdb->tutor_quiz_attempt_answers = $wpdb->prefix . 'tutor_quiz_attempt_answers';
464 - $wpdb->tutor_quiz_questions = $wpdb->prefix . 'tutor_quiz_questions';
465 - $wpdb->tutor_quiz_question_answers = $wpdb->prefix . 'tutor_quiz_question_answers';
466 - $wpdb->tutor_withdraws = $wpdb->prefix . 'tutor_withdraws';
467 - $wpdb->tutor_email_queue = $wpdb->prefix . 'tutor_email_queue';
468 - $wpdb->tutor_order_items = $wpdb->prefix . 'tutor_order_items';
469 - $wpdb->tutor_orders = $wpdb->prefix . 'tutor_orders';
470 - $wpdb->tutor_ordermeta = $wpdb->prefix . 'tutor_ordermeta';
471 - $wpdb->tutor_subscription_plan_items = $wpdb->prefix . 'tutor_subscription_plan_items';
472 - $wpdb->tutor_subscription_plans = $wpdb->prefix . 'tutor_subscription_plans';
473 - $wpdb->tutor_subscriptions = $wpdb->prefix . 'tutor_subscriptions';
474 - $wpdb->tutor_subscriptionmeta = $wpdb->prefix . 'tutor_subscriptionmeta';
475 - $wpdb->tutor_order_itemmeta = $wpdb->prefix . 'tutor_order_itemmeta';
82 + $wpdb->tutor_earnings = $wpdb->prefix.'tutor_earnings';
83 + $wpdb->tutor_gradebooks = $wpdb->prefix.'tutor_gradebooks';
84 + $wpdb->tutor_gradebooks_results = $wpdb->prefix.'tutor_gradebooks_results';
85 + $wpdb->tutor_quiz_attempts = $wpdb->prefix.'tutor_quiz_attempts';
86 + $wpdb->tutor_quiz_attempt_answers = $wpdb->prefix.'tutor_quiz_attempt_answers';
87 + $wpdb->tutor_quiz_questions = $wpdb->prefix.'tutor_quiz_questions';
88 + $wpdb->tutor_quiz_question_answers = $wpdb->prefix.'tutor_quiz_question_answers';
89 + $wpdb->tutor_withdraws = $wpdb->prefix.'tutor_withdraws';
90 + $wpdb->tutor_email_queue = $wpdb->prefix.'tutor_email_queue';
476 91
477 92 /**
478 93 * Changing default wp doing ajax return based on tutor ajax action
479 94 */
480 - add_filter( 'wp_doing_ajax', array( $this, 'wp_doing_ajax' ) );
95 + add_filter('wp_doing_ajax', array($this, 'wp_doing_ajax'));
481 96
482 97 /**
483 98 * Include Files
484 99 */
100 + //add_action( 'init', array( $this, 'includes' ), 11 );
485 101 $this->includes();
486 102
487 - do_action( 'tutor_before_load' );
103 + /**
104 + * Loading Autoloader
105 + */
488 106
489 - GDPR::get_instance();
107 + if ( function_exists( '__autoload' ) ) {
108 + spl_autoload_register( '__autoload' );
109 + }
110 + spl_autoload_register(array($this, 'loader'));
490 111
491 - $this->addons = new Addons();
492 - $this->post_types = new Post_types();
493 - $this->taxonomies = new Taxonomies();
494 - $this->assets = new Assets();
495 - $this->admin = new Admin();
496 - $this->ajax = new Ajax();
497 - $this->options = new Options_V2();
498 - $this->shortcode = new Shortcode();
499 - $this->course = new Course();
500 - $this->lesson = new Lesson();
501 - $this->rewrite_rules = new Rewrite_Rules();
502 - $this->template = new Template();
503 - $this->instructor = new Instructor();
504 - $this->student = new Student();
505 - $this->q_and_a = new Q_And_A();
506 - $this->q_and_a_list = new Question_Answers_List();
507 - $this->q_attempt = new Quiz_Attempts_List();
508 - $this->quiz = new Quiz();
509 - $this->tools = new Tools();
510 - $this->user = new User();
511 - $this->user_preference = new UserPreference();
512 - $this->theme_compatibility = new Theme_Compatibility();
513 - $this->gutenberg = new Gutenberg();
514 - $this->course_settings_tabs = new Course_Settings_Tabs();
515 - $this->withdraw = new Withdraw();
516 - $this->upgrader = new Upgrader();
517 - $this->dashboard = new Dashboard();
518 - $this->form_handler = new FormHandler();
519 - $this->frontend = new Frontend();
520 - $this->rest_api = new RestAPI();
521 - $this->setup = new Tutor_Setup();
112 + do_action('tutor_before_load');
113 +
114 + $this->addons = new Addons();
115 + $this->post_types = new Post_types();
116 + $this->taxonomies = new Taxonomies();
117 + $this->assets = new Assets();
118 + $this->admin = new Admin();
119 + $this->ajax = new Ajax();
120 + $this->options = new Options();
121 + $this->shortcode = new Shortcode();
122 + $this->course = new Course();
123 + $this->lesson = new Lesson();
124 + $this->rewrite_rules = new Rewrite_Rules();
125 + $this->template = new Template();
126 + $this->instructor = new Instructor();
127 + $this->student = new Student();
128 + $this->q_and_a = new Q_and_A();
129 + $this->quiz = new Quiz();
130 + $this->tools = new Tools();
131 + $this->user = new User();
132 + $this->theme_compatibility = new Theme_Compatibility();
133 + $this->gutenberg = new Gutenberg();
134 + $this->course_settings_tabs = new Course_Settings_Tabs();
135 + $this->withdraw = new Withdraw();
136 + $this->course_widget = new Course_Widget();
137 + $this->upgrader = new Upgrader();
138 + $this->dashboard = new Dashboard();
139 + $this->form_handler = new FormHandler();
140 + $this->frontend = new Frontend();
141 + $this->email = new Email();
142 + $this->rest_api = new RestAPI();
143 + $this->setup = new Tutor_Setup();
522 144 $this->private_course_access = new Private_Course_Access();
523 - $this->course_filter = new Course_Filter();
524 - $this->permalink = new Permalink();
145 + $this->course_filter = new Course_Filter();
525 146
526 - // Integrations.
147 + //Integrations
527 148 $this->woocommerce = new WooCommerce();
528 - $this->edd = new TutorEDD();
149 + $this->edd = new TutorEDD();
529 150
530 151 /**
531 - * Init obj
532 - *
533 - * @since 2.0.0
534 - */
535 - $this->announcements = new Announcements();
536 - $this->course_list = new Course_List();
537 - $this->reviews = new Reviews();
538 - $this->withdraw_list = new Withdraw_Requests_List();
539 - $this->student_list = new Students_List();
540 - $this->instructor_list = new Instructors_List();
541 - $this->course_embed = new Course_Embed();
542 - $this->rest_auth = new RestAuth();
543 -
544 - /**
545 - * New Course Builder.
546 - *
547 - * @since 3.0.0
548 - */
549 - new QuizBuilder();
550 -
551 - /**
552 - * Tutor native e-commerce
553 - *
554 - * @since 3.0.0
555 - */
556 - new Ecommerce();
557 -
558 - /**
559 - * Data migrations
560 - *
561 - * @since 3.8.0
562 - */
563 - new Migration();
564 -
565 - /**
566 152 * Run Method
567 - *
568 - * @since 1.2.0
153 + * @since v.1.2.0
569 154 */
570 155 $this->run();
571 156
572 - do_action( 'tutor_loaded' );
157 + do_action('tutor_loaded');
573 158
574 159 add_action( 'init', array( $this, 'init_action' ) );
575 - add_action( 'init', array( $this, 'update_instructor_capability' ) );
576 160
577 - /**
578 - * Check activated plugin
579 - *
580 - * @since 1.5.7
581 - */
161 + /**
162 + * redirect to the wizard page
163 + * @since v.1.5.7
164 + *
165 + */
582 166
583 - add_action( 'activated_plugin', array( $this, 'activated_tutor' ), 10, 2 );
584 -
585 - /**
586 - * Redirect to setup page
587 - *
588 - * @since 2.8.0
589 - */
590 - add_action( 'admin_init', array( $this, 'redirect_to_setup_page' ) );
591 -
592 - // add_filter( 'rest_request_before_callbacks', array( $this, 'enforce_courses_privacy_rest_api' ), 10, 3 );
167 + add_action( 'activated_plugin', array( $this, 'activated_tutor' ) );
593 168 }
594 169
595 - /**
596 - * Check activated plugin
597 - *
598 - * @since 1.5.7
599 - *
600 - * @param mixed $plugin plugin.
601 - * @param mixed $network_wide network wide.
602 - *
603 - * @return void
604 - */
605 - public function activated_tutor( $plugin, $network_wide = null ) {
606 - if ( tutor()->basename === $plugin ) {
607 - $this->redirect_to_setup_page();
608 - }
609 - }
610 -
611 - /**
612 - * Redirect to setup page
613 - *
614 - * @since 2.8.0
615 - *
616 - * @return void
617 - */
618 - public function redirect_to_setup_page() {
619 - if ( ( ! get_option( 'tutor_wizard' ) ) && version_compare( TUTOR_VERSION, '1.5.6', '>' ) ) {
620 - if ( ! wp_doing_ajax() ) {
621 - update_option( 'tutor_wizard', 'active' );
622 - $is_wp_cli = defined( 'WP_CLI' ) && WP_CLI;
623 - if ( ! $is_wp_cli ) {
624 - wp_safe_redirect( admin_url( 'admin.php?page=tutor-setup' ) );
625 - }
626 - exit;
170 + /**
171 + * @param $plugin
172 + *
173 + * redirect to the wizard page
174 + * @since v.1.5.7
175 + *
176 + */
177 + public function activated_tutor( $plugin ) {
178 + if( $plugin == tutor()->basename ) {
179 + if( (! get_option('tutor_wizard') ) && version_compare(TUTOR_VERSION, '1.5.6', '>') ) {
180 + update_option('tutor_wizard', 'active');
181 + exit(wp_redirect(admin_url('admin.php?page=tutor-setup')));
627 182 }
628 183 }
629 184 }
630 185
631 186 /**
632 - * Include utility functions
187 + * @param $className
633 188 *
634 - * @return void
189 + * Auto Load class and the files
635 190 */
636 - public function includes() {
637 - $tutor_path = plugin_dir_path( TUTOR_FILE );
191 + private function loader($className) {
192 + if ( ! class_exists($className)){
193 + $className = preg_replace(
194 + array('/([a-z])([A-Z])/', '/\\\/'),
195 + array('$1$2', DIRECTORY_SEPARATOR),
196 + $className
197 + );
638 198
639 - include $tutor_path . 'includes/tutor-general-functions.php';
640 - include $tutor_path . 'includes/tutor-template-functions.php';
641 - include $tutor_path . 'includes/tutor-template-hook.php';
642 - include $tutor_path . 'includes/translate-text.php';
643 - include $tutor_path . 'includes/country.php';
644 - include $tutor_path . 'includes/ecommerce-functions.php';
199 + $className = str_replace('TUTOR'.DIRECTORY_SEPARATOR, 'classes'.DIRECTORY_SEPARATOR, $className);
200 + $file_name = $this->path.$className.'.php';
645 201
646 - if ( ! function_exists( 'is_plugin_active' ) ) {
647 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
202 + if (file_exists($file_name) ) {
203 + require_once $file_name;
204 + }
648 205 }
206 + }
649 207
650 - // Only kirki latest has class KirkiMain.
651 - $is_kirki_active = \is_plugin_active( 'kirki-pro/kirki-pro.php' ) && class_exists( 'KirkiProMain' );
208 + public function includes(){
209 + include tutor()->path.'includes/tutor-general-functions.php';
210 + include tutor()->path.'includes/tutor-template-functions.php';
211 + include tutor()->path.'includes/tutor-template-hook.php';
212 + }
652 213
653 - if ( $is_kirki_active ) {
654 - $tutor_kirki_path = $tutor_path . 'includes/kirki/kirki.php';
655 - if ( file_exists( $tutor_kirki_path ) ) {
656 - include $tutor_kirki_path;
657 - }
658 - } else {
659 - $is_droip_active = \is_plugin_active( 'droip/droip.php' );
660 - $tutor_droip_path = $tutor_path . 'includes/droip/droip.php';
661 - if ( $is_droip_active && file_exists( $tutor_droip_path ) ) {
662 - include $tutor_droip_path;
663 - }
664 - }
665 - }
214 + //Run the TUTOR right now
215 + public function run(){
216 + do_action('tutor_before_run');
666 217
667 - /**
668 - * Providing hooks
669 - *
670 - * @return void
671 - */
672 - public function run() {
673 - do_action( 'tutor_before_run' );
674 - do_action( 'tutor_after_run' );
218 + do_action('tutor_after_run');
675 219 }
676 220
677 221 /**
678 222 * Tutor Action Via do_action
679 - *
680 223 * @since 1.2.14
681 224 */
682 - public function init_action() {
683 - $tutor_action = Input::sanitize_request_data( 'tutor_action' );
684 - if ( '' !== $tutor_action ) {
685 - do_action( 'tutor_action_' . $tutor_action );
225 + public function init_action(){
226 + if (isset($_REQUEST['tutor_action'])){
227 + do_action('tutor_action_'.$_REQUEST['tutor_action']);
686 228 }
687 229 }
688 230
689 231 /**
690 232 * Do some task during plugin activation
691 - *
692 - * @since 4.0.0 Flush rewrite rules on activation.
693 233 */
694 - public static function tutor_activate() {
695 - // Rewrite Flush.
696 - Permalink::set_permalink_flag();
697 -
698 - $version = get_option( 'tutor_version' );
699 - if ( ! function_exists( 'tutor_time' ) ) {
700 - include tutor()->path . 'includes/tutor-general-functions.php';
234 + public static function tutor_activate(){
235 + $version = get_option('tutor_version');
236 + if ( ! function_exists('tutor_time')){
237 + include tutor()->path.'includes/tutor-general-functions.php';
701 238 }
239 + //Save Option
240 + if ( ! $version ){
241 + //Create Database
242 + self::create_database();
702 243
703 - // Create Database.
704 - self::create_database();
705 -
706 - // Save Option.
707 - if ( ! $version ) {
708 -
709 244 $options = self::default_options();
710 - update_option( 'tutor_option', $options );
245 + update_option('tutor_option', $options);
711 246
247 + //Rewrite Flush
248 + update_option('required_rewrite_flush', tutor_time());
712 249 self::manage_tutor_roles_and_permissions();
713 250
714 - // Save initial Page.
715 - self::save_data();
716 - update_option( 'tutor_version', TUTOR_VERSION );
251 + self::save_data();//Save initial Page
252 + update_option('tutor_version', TUTOR_VERSION);
717 253 }
718 254
719 - // Set Schedule.
720 - if ( ! wp_next_scheduled( 'tutor_once_in_day_run_schedule' ) ) {
721 - wp_schedule_event( tutor_time(), 'twicedaily', 'tutor_once_in_day_run_schedule' );
255 + //Set Schedule
256 + if (! wp_next_scheduled ( 'tutor_once_in_day_run_schedule' )) {
257 + wp_schedule_event(tutor_time(), 'twicedaily', 'tutor_once_in_day_run_schedule');
722 258 }
723 259
724 260 /**
725 261 * Backward Compatibility for version < 1.2.0
726 262 */
727 - if ( version_compare( get_option( 'tutor_version' ), '1.2.0', '<' ) ) {
263 + if (version_compare(get_option('tutor_version'), '1.2.0', '<')){
728 264 /**
729 265 * Creating New Database
730 266 */
731 267 self::create_withdraw_database();
732 - // Update the tutor version.
733 - update_option( 'tutor_version', '1.2.0' );
268 + //Update the tutor version
269 + update_option('tutor_version', '1.2.0');
270 + //Rewrite Flush
271 + update_option('required_rewrite_flush', tutor_time());
734 272 }
735 273
736 274 /**
737 275 * Backward Compatibility to < 1.3.1 for make course plural
738 276 */
739 - if ( version_compare( get_option( 'tutor_version' ), '1.3.1', '<' ) ) {
277 + if (version_compare(get_option('tutor_version'), '1.3.1', '<')){
740 278 global $wpdb;
741 279
742 - if ( ! get_option( 'is_course_post_type_updated' ) ) {
743 - $wpdb->update( $wpdb->posts, array( 'post_type' => tutor()->course_post_type ), array( 'post_type' => 'course' ) );
744 - update_option( 'is_course_post_type_updated', true );
745 - update_option( 'tutor_version', '1.3.1' );
280 + if ( ! get_option('is_course_post_type_updated')){
281 + $wpdb->update($wpdb->posts, array('post_type' => 'courses'), array('post_type' => 'course'));
282 + update_option('is_course_post_type_updated', true);
283 + update_option('tutor_version', '1.3.1');
284 + flush_rewrite_rules();
746 285 }
747 286 }
748 287
749 288 /**
@@ -748,31 +287,20 @@
748 287
749 288 /**
750 289 * Save First activation Time
751 290 */
752 - $first_activation_date = get_option( 'tutor_first_activation_time' );
753 - if ( ! $first_activation_date ) {
754 - update_option( 'tutor_first_activation_time', tutor_time() );
291 + $first_activation_date = get_option('tutor_first_activation_time');
292 + if ( ! $first_activation_date){
293 + update_option('tutor_first_activation_time', tutor_time());
755 294 }
756 295 }
757 296
758 - /**
759 - * Run task on deactivation
760 - *
761 - * @since 1.0.0
762 - *
763 - * @return void
764 - */
297 + //Run task on deactivation
765 298 public static function tutor_deactivation() {
766 - wp_clear_scheduled_hook( 'tutor_once_in_day_run_schedule' );
299 + wp_clear_scheduled_hook('tutor_once_in_day_run_schedule');
767 300 }
768 301
769 - /**
770 - * Create database
771 - *
772 - * @return void
773 - */
774 - public static function create_database() {
302 + public static function create_database(){
775 303 global $wpdb;
776 304
777 305 $charset_collate = $wpdb->get_charset_collate();
778 306
@@ -785,15 +313,15 @@
785 313 * {$wpdb->prefix}tutor_quiz_question_answers
786 314 * {$wpdb->prefix}tutor_earnings
787 315 * {$wpdb->prefix}tutor_withdraws
788 316 *
789 - * @since 1.0.0
317 + * @since v.1.0.0
790 318 */
791 319 $quiz_attempts_sql = "CREATE TABLE {$wpdb->prefix}tutor_quiz_attempts (
792 - attempt_id bigint(20) NOT NULL AUTO_INCREMENT,
793 - course_id bigint(20) DEFAULT NULL,
794 - quiz_id bigint(20) DEFAULT NULL,
795 - user_id bigint(20) DEFAULT NULL,
320 + attempt_id int(11) NOT NULL AUTO_INCREMENT,
321 + course_id int(11) DEFAULT NULL,
322 + quiz_id int(11) DEFAULT NULL,
323 + user_id int(11) DEFAULT NULL,
796 324 total_questions int(11) DEFAULT NULL,
797 325 total_answered_questions int(11) DEFAULT NULL,
798 326 total_marks decimal(9,2) DEFAULT NULL,
799 327 earned_marks decimal(9,2) DEFAULT NULL,
@@ -803,22 +331,17 @@
803 331 attempt_started_at datetime DEFAULT NULL,
804 332 attempt_ended_at datetime DEFAULT NULL,
805 333 is_manually_reviewed int(1) DEFAULT NULL,
806 334 manually_reviewed_at datetime DEFAULT NULL,
807 - result varchar(10) DEFAULT NULL,
808 - PRIMARY KEY (attempt_id),
809 - INDEX (course_id),
810 - INDEX (quiz_id),
811 - INDEX (user_id),
812 - INDEX (result)
335 + PRIMARY KEY (attempt_id)
813 336 ) $charset_collate;";
814 337
815 338 $quiz_attempt_answers = "CREATE TABLE {$wpdb->prefix}tutor_quiz_attempt_answers (
816 - attempt_answer_id bigint(20) NOT NULL AUTO_INCREMENT,
817 - user_id bigint(20) DEFAULT NULL,
818 - quiz_id bigint(20) DEFAULT NULL,
819 - question_id bigint(20) DEFAULT NULL,
820 - quiz_attempt_id bigint(20) DEFAULT NULL,
339 + attempt_answer_id int(11) NOT NULL AUTO_INCREMENT,
340 + user_id int(11) DEFAULT NULL,
341 + quiz_id int(11) DEFAULT NULL,
342 + question_id int(11) DEFAULT NULL,
343 + quiz_attempt_id int(11) DEFAULT NULL,
821 344 given_answer longtext,
822 345 question_mark decimal(8,2) DEFAULT NULL,
823 346 achieved_mark decimal(8,2) DEFAULT NULL,
824 347 minus_mark decimal(8,2) DEFAULT NULL,
@@ -826,13 +349,12 @@
826 349 PRIMARY KEY (attempt_answer_id)
827 350 ) $charset_collate;";
828 351
829 352 $tutor_quiz_questions = "CREATE TABLE {$wpdb->prefix}tutor_quiz_questions (
830 - question_id bigint(20) NOT NULL AUTO_INCREMENT,
831 - quiz_id bigint(20) DEFAULT NULL,
353 + question_id int(11) NOT NULL AUTO_INCREMENT,
354 + quiz_id int(11) DEFAULT NULL,
832 355 question_title text,
833 356 question_description longtext,
834 - answer_explanation longtext DEFAULT '',
835 357 question_type varchar(50) DEFAULT NULL,
836 358 question_mark decimal(9,2) DEFAULT NULL,
837 359 question_settings longtext,
838 360 question_order int(11) DEFAULT NULL,
@@ -839,14 +361,14 @@
839 361 PRIMARY KEY (question_id)
840 362 ) $charset_collate;";
841 363
842 364 $tutor_quiz_question_answers = "CREATE TABLE {$wpdb->prefix}tutor_quiz_question_answers (
843 - answer_id bigint(20) NOT NULL AUTO_INCREMENT,
844 - belongs_question_id bigint(20) DEFAULT NULL,
365 + answer_id int(11) NOT NULL AUTO_INCREMENT,
366 + belongs_question_id int(11) DEFAULT NULL,
845 367 belongs_question_type varchar(250) DEFAULT NULL,
846 368 answer_title text,
847 369 is_correct tinyint(4) DEFAULT NULL,
848 - image_id bigint(20) DEFAULT NULL,
370 + image_id int(11) DEFAULT NULL,
849 371 answer_two_gap_match text,
850 372 answer_view_format varchar(250) DEFAULT NULL,
851 373 answer_settings text,
852 374 answer_order int(11) DEFAULT '0',
@@ -853,12 +375,12 @@
853 375 PRIMARY KEY (answer_id)
854 376 ) $charset_collate;";
855 377
856 378 $earning_table = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}tutor_earnings (
857 - earning_id bigint(20) NOT NULL AUTO_INCREMENT,
858 - user_id bigint(20) DEFAULT NULL,
859 - course_id bigint(20) DEFAULT NULL,
860 - order_id bigint(20) DEFAULT NULL,
379 + earning_id int(11) NOT NULL AUTO_INCREMENT,
380 + user_id int(11) DEFAULT NULL,
381 + course_id int(11) DEFAULT NULL,
382 + order_id int(11) DEFAULT NULL,
861 383 order_status varchar(50) DEFAULT NULL,
862 384 course_price_total decimal(16,2) DEFAULT NULL,
863 385 course_price_grand_total decimal(16,2) DEFAULT NULL,
864 386 instructor_amount decimal(16,2) DEFAULT NULL,
@@ -870,18 +392,14 @@
870 392 deduct_fees_name varchar(250) DEFAULT NULL,
871 393 deduct_fees_type varchar(20) DEFAULT NULL,
872 394 process_by varchar(20) DEFAULT NULL,
873 395 created_at datetime DEFAULT NULL,
874 - PRIMARY KEY (earning_id),
875 - INDEX (user_id),
876 - INDEX (course_id),
877 - INDEX (order_id),
878 - INDEX (process_by)
396 + PRIMARY KEY (earning_id)
879 397 ) $charset_collate;";
880 398
881 399 $withdraw_table = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}tutor_withdraws (
882 - withdraw_id bigint(20) NOT NULL AUTO_INCREMENT,
883 - user_id bigint(20) DEFAULT NULL,
400 + withdraw_id int(11) NOT NULL AUTO_INCREMENT,
401 + user_id int(11) DEFAULT NULL,
884 402 amount decimal(16,2) DEFAULT NULL,
885 403 method_data text DEFAULT NULL,
886 404 status varchar(50) DEFAULT NULL,
887 405 updated_at datetime DEFAULT NULL,
@@ -888,161 +406,9 @@
888 406 created_at datetime DEFAULT NULL,
889 407 PRIMARY KEY (withdraw_id)
890 408 ) $charset_collate;";
891 409
892 - $orders_table = "CREATE TABLE {$wpdb->prefix}tutor_orders (
893 - id BIGINT(20) UNSIGNED AUTO_INCREMENT,
894 - parent_id BIGINT(20) UNSIGNED DEFAULT 0, -- for subscription order, store subscription record id
895 - transaction_id VARCHAR(255) COMMENT 'Transaction id from payment gateway',
896 - user_id BIGINT(20) UNSIGNED NOT NULL,
897 - order_type VARCHAR(50) NOT NULL, -- single_order, subscription
898 - order_status VARCHAR(50) NOT NULL,
899 - payment_status VARCHAR(50) NOT NULL,
900 - subtotal_price DECIMAL(13, 2) NOT NULL, -- price calculation based on course sale price
901 - pre_tax_price DECIMAL(13, 2) NOT NULL, -- total price before adding tax
902 - tax_type VARCHAR(50),
903 - tax_rate DECIMAL(13, 2) COMMENT 'Tax percentage',
904 - tax_amount DECIMAL(13, 2),
905 - total_price DECIMAL(13, 2) NOT NULL, -- final price
906 - net_payment DECIMAL(13, 2) NOT NULL, -- calculated price if any refund is done else same as total_price
907 - coupon_code VARCHAR(255),
908 - coupon_amount DECIMAL(13, 2),
909 - discount_type ENUM('percentage', 'flat') DEFAULT NULL,
910 - discount_amount DECIMAL(13, 2),
911 - discount_reason TEXT,
912 - fees DECIMAL(13, 2), -- payment gateway fees
913 - earnings DECIMAL(13, 2), -- net earning
914 - refund_amount DECIMAL(13, 2), -- Refund amount
915 - payment_method VARCHAR(255),
916 - payment_payloads LONGTEXT,
917 - note TEXT,
918 - created_at_gmt DATETIME NOT NULL,
919 - created_by BIGINT(20) UNSIGNED NOT NULL,
920 - updated_at_gmt DATETIME,
921 - updated_by BIGINT(20) UNSIGNED NOT NULL,
922 - PRIMARY KEY (id),
923 - KEY user_id (user_id),
924 - KEY order_type (order_type),
925 - KEY payment_status (payment_status),
926 - KEY order_status (order_status),
927 - KEY transaction_id (transaction_id)
928 - ) $charset_collate;";
929 -
930 - $order_meta_table = "CREATE TABLE {$wpdb->prefix}tutor_ordermeta (
931 - id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
932 - order_id BIGINT(20) UNSIGNED NOT NULL,
933 - meta_key VARCHAR(255) NOT NULL,
934 - meta_value LONGTEXT NOT NULL,
935 - created_at_gmt DATETIME NOT NULL,
936 - created_by BIGINT(20) UNSIGNED NOT NULL,
937 - updated_at_gmt DATETIME,
938 - updated_by BIGINT(20) UNSIGNED NOT NULL,
939 - PRIMARY KEY (id),
940 - KEY order_id (order_id),
941 - KEY meta_key (meta_key),
942 - CONSTRAINT fk_tutor_ordermeta_order_id FOREIGN KEY (order_id) REFERENCES {$wpdb->prefix}tutor_orders(id) ON DELETE CASCADE
943 - ) $charset_collate;";
944 -
945 - $order_items_table = "CREATE TABLE {$wpdb->prefix}tutor_order_items (
946 - id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
947 - order_id BIGINT(20) UNSIGNED NOT NULL,
948 - item_id BIGINT(20) UNSIGNED NOT NULL, -- course id/plan id
949 - regular_price DECIMAL(13, 2) NOT NULL, -- course regular price
950 - sale_price VARCHAR(13) DEFAULT NULL, -- course sale price
951 - discount_price VARCHAR(13) DEFAULT NULL, -- course discount price
952 - coupon_code VARCHAR(255) DEFAULT NULL, -- coupon code
953 - PRIMARY KEY (id),
954 - KEY order_id (order_id),
955 - KEY item_id (item_id),
956 - CONSTRAINT fk_tutor_order_item_order_id FOREIGN KEY (order_id) REFERENCES {$wpdb->prefix}tutor_orders(id) ON DELETE CASCADE
957 - ) $charset_collate;";
958 -
959 - $coupons_table = "CREATE TABLE {$wpdb->prefix}tutor_coupons (
960 - id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
961 - coupon_status VARCHAR(50),
962 - coupon_type VARCHAR(100) DEFAULT 'code', -- coupon type 'code' or 'automatic'
963 - coupon_code VARCHAR(50) NOT NULL,
964 - coupon_title VARCHAR(255) NOT NULL,
965 - coupon_description TEXT,
966 - discount_type ENUM('percentage', 'flat') NOT NULL,
967 - discount_amount DECIMAL(13, 2) NOT NULL,
968 - applies_to VARCHAR(100) DEFAULT 'all_courses_and_bundles', -- possible values 'all_courses_and_bundles', 'all_courses', 'all_bundles', 'specific_courses', 'specific_bundles', 'specific_category'
969 - total_usage_limit INT(10) UNSIGNED DEFAULT NULL, -- null for unlimited usage
970 - per_user_usage_limit TINYINT(4) UNSIGNED DEFAULT NULL, -- null for unlimited usage
971 - purchase_requirement VARCHAR(50) DEFAULT 'no_minimum', -- possible values 'no_minimum', 'minimum_purchase', 'minimum_quantity'
972 - purchase_requirement_value DECIMAL(13, 2),
973 - start_date_gmt DATETIME NOT NULL,
974 - expire_date_gmt DATETIME DEFAULT NULL,
975 - created_at_gmt DATETIME NOT NULL,
976 - created_by BIGINT(20) UNSIGNED NOT NULL,
977 - updated_at_gmt DATETIME,
978 - updated_by BIGINT(20) UNSIGNED NOT NULL,
979 - PRIMARY KEY (id),
980 - UNIQUE KEY coupon_code (coupon_code),
981 - KEY start_date_gmt (start_date_gmt),
982 - KEY expire_date_gmt (expire_date_gmt)
983 - ) $charset_collate;";
984 -
985 - $coupon_applications_table = "CREATE TABLE {$wpdb->prefix}tutor_coupon_applications (
986 - coupon_code VARCHAR(50) NOT NULL,
987 - reference_id BIGINT(20) UNSIGNED NOT NULL,
988 - KEY coupon_code (coupon_code),
989 - KEY reference_id (reference_id),
990 - CONSTRAINT fk_tutor_coupon_application_coupon_code FOREIGN KEY (coupon_code) REFERENCES {$wpdb->prefix}tutor_coupons(coupon_code) ON DELETE CASCADE
991 - ) $charset_collate;";
992 -
993 - $coupon_usage_table = "CREATE TABLE {$wpdb->prefix}tutor_coupon_usages (
994 - id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
995 - coupon_code VARCHAR(50) NOT NULL,
996 - user_id BIGINT(20) UNSIGNED NOT NULL,
997 - PRIMARY KEY (id),
998 - KEY coupon_code (coupon_code),
999 - KEY user_id (user_id),
1000 - CONSTRAINT fk_tutor_coupon_usage_coupon_code FOREIGN KEY (coupon_code) REFERENCES {$wpdb->prefix}tutor_coupons(coupon_code) ON DELETE CASCADE,
1001 - CONSTRAINT fk_tutor_coupon_usage_user_id FOREIGN KEY (user_id) REFERENCES {$wpdb->prefix}users(ID) ON DELETE CASCADE
1002 - ) $charset_collate;";
1003 -
1004 - $cart_table = "CREATE TABLE {$wpdb->prefix}tutor_carts (
1005 - id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
1006 - user_id BIGINT(20) UNSIGNED DEFAULT NULL,
1007 - coupon_code VARCHAR(50) DEFAULT NULL,
1008 - created_at_gmt DATETIME NOT NULL,
1009 - updated_at_gmt DATETIME,
1010 - PRIMARY KEY (id),
1011 - KEY user_id (user_id),
1012 - KEY coupon_code (coupon_code),
1013 - CONSTRAINT fk_tutor_cart_user_id FOREIGN KEY (user_id) REFERENCES {$wpdb->prefix}users(ID) ON DELETE CASCADE
1014 - ) $charset_collate;";
1015 -
1016 - $cart_items_table = "CREATE TABLE {$wpdb->prefix}tutor_cart_items (
1017 - id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
1018 - cart_id BIGINT(20) UNSIGNED NOT NULL,
1019 - course_id BIGINT(20) UNSIGNED NOT NULL,
1020 - PRIMARY KEY (id),
1021 - KEY cart_id (cart_id),
1022 - KEY course_id (course_id),
1023 - CONSTRAINT fk_tutor_cart_item_cart_id FOREIGN KEY (cart_id) REFERENCES {$wpdb->prefix}tutor_carts(id) ON DELETE CASCADE,
1024 - CONSTRAINT fk_tutor_cart_item_course_id FOREIGN KEY (course_id) REFERENCES {$wpdb->prefix}posts(ID) ON DELETE CASCADE
1025 - ) $charset_collate;";
1026 -
1027 - $customer_table = "CREATE TABLE {$wpdb->prefix}tutor_customers (
1028 - id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
1029 - user_id BIGINT(20) UNSIGNED DEFAULT NULL,
1030 - billing_first_name VARCHAR(255) NOT NULL,
1031 - billing_last_name VARCHAR(255) NOT NULL,
1032 - billing_email VARCHAR(255) NOT NULL,
1033 - billing_phone VARCHAR(20) NOT NULL,
1034 - billing_zip_code VARCHAR(20) NOT NULL,
1035 - billing_address TEXT NOT NULL,
1036 - billing_country VARCHAR(100) NOT NULL,
1037 - billing_state VARCHAR(100) NOT NULL,
1038 - billing_city VARCHAR(100) NOT NULL,
1039 - PRIMARY KEY (id),
1040 - KEY user_id (user_id),
1041 - KEY billing_email (billing_email)
1042 - ) $charset_collate;";
1043 -
1044 - require_once ABSPATH . 'wp-admin/includes/upgrade.php';
410 + require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
1045 411 dbDelta( $quiz_attempts_sql );
1046 412 dbDelta( $quiz_attempt_answers );
1047 413 dbDelta( $tutor_quiz_questions );
1048 414 dbDelta( $tutor_quiz_question_answers );
@@ -1047,43 +413,31 @@
1047 413 dbDelta( $tutor_quiz_questions );
1048 414 dbDelta( $tutor_quiz_question_answers );
1049 415 dbDelta( $earning_table );
1050 416 dbDelta( $withdraw_table );
1051 - dbDelta( $orders_table );
1052 - dbDelta( $order_meta_table );
1053 - dbDelta( $order_items_table );
1054 - dbDelta( $coupons_table );
1055 - dbDelta( $coupon_applications_table );
1056 - dbDelta( $coupon_usage_table );
1057 - dbDelta( $cart_table );
1058 - dbDelta( $cart_items_table );
1059 - dbDelta( $customer_table );
1060 417 }
1061 418
1062 - /**
1063 - * Manage tutor roles & permission
1064 - *
1065 - * @return void
1066 - */
1067 - public static function manage_tutor_roles_and_permissions() {
419 + public static function manage_tutor_roles_and_permissions(){
1068 420 /**
1069 421 * Add role for instructor
1070 422 */
1071 423 $instructor_role = tutor()->instructor_role;
1072 424
1073 - remove_role( $instructor_role );
1074 - add_role( $instructor_role, __( 'Tutor Instructor', 'tutor' ), array() );
425 + remove_role($instructor_role);
426 + add_role( $instructor_role, __('Tutor Instructor', 'tutor'), array() );
1075 427
1076 428 $custom_post_type_permission = array(
1077 - // Manage Instructor.
429 + //Manage Instructor
1078 430 'manage_tutor_instructor',
1079 431
1080 - // Tutor Posts Type Permission.
432 + //Tutor Posts Type Permission
1081 433 'edit_tutor_course',
1082 434 'read_tutor_course',
1083 435 'delete_tutor_course',
1084 436 'delete_tutor_courses',
1085 437 'edit_tutor_courses',
438 + 'edit_others_tutor_courses',
439 + 'read_private_tutor_courses',
1086 440 'edit_tutor_courses',
1087 441
1088 442 'edit_tutor_lesson',
1089 443 'read_tutor_lesson',
@@ -1089,8 +443,10 @@
1089 443 'read_tutor_lesson',
1090 444 'delete_tutor_lesson',
1091 445 'delete_tutor_lessons',
1092 446 'edit_tutor_lessons',
447 + 'edit_others_tutor_lessons',
448 + 'read_private_tutor_lessons',
1093 449 'edit_tutor_lessons',
1094 450 'publish_tutor_lessons',
1095 451
1096 452 'edit_tutor_quiz',
@@ -1097,8 +453,10 @@
1097 453 'read_tutor_quiz',
1098 454 'delete_tutor_quiz',
1099 455 'delete_tutor_quizzes',
1100 456 'edit_tutor_quizzes',
457 + 'edit_others_tutor_quizzes',
458 + 'read_private_tutor_quizzes',
1101 459 'edit_tutor_quizzes',
1102 460 'publish_tutor_quizzes',
1103 461
1104 462 'edit_tutor_question',
@@ -1105,28 +463,30 @@
1105 463 'read_tutor_question',
1106 464 'delete_tutor_question',
1107 465 'delete_tutor_questions',
1108 466 'edit_tutor_questions',
467 + 'edit_others_tutor_questions',
1109 468 'publish_tutor_questions',
469 + 'read_private_tutor_questions',
1110 470 'edit_tutor_questions',
1111 471 );
1112 472
1113 473 $instructor = get_role( $instructor_role );
1114 474 if ( $instructor ) {
1115 - $instructor_cap = array(
475 + $instructor_cap = array (
1116 476 'edit_posts',
1117 477 'read',
1118 478 'upload_files',
1119 479 );
1120 480
1121 - $instructor_cap = array_merge( $instructor_cap, $custom_post_type_permission );
481 + $instructor_cap = array_merge($instructor_cap, $custom_post_type_permission);
1122 482
1123 - $can_publish_course = (bool) tutor_utils()->get_option( 'instructor_can_publish_course' );
1124 - if ( $can_publish_course ) {
483 + $can_publish_course = (bool) tutor_utils()->get_option('instructor_can_publish_course');
484 + if ($can_publish_course){
1125 485 $instructor_cap[] = 'publish_tutor_courses';
1126 486 }
1127 487
1128 - foreach ( $instructor_cap as $cap ) {
488 + foreach ($instructor_cap as $cap){
1129 489 $instructor->add_cap( $cap );
1130 490 }
1131 491 }
1132 492
@@ -1132,15 +492,15 @@
1132 492
1133 493 $administrator = get_role( 'administrator' );
1134 494 if ( $administrator ) {
1135 495
1136 - $administrator_cap = array(
496 + $administrator_cap = array (
1137 497 'manage_tutor',
1138 498 );
1139 - $administrator_cap = array_merge( $administrator_cap, $custom_post_type_permission );
499 + $administrator_cap = array_merge($administrator_cap, $custom_post_type_permission);
1140 500 $administrator_cap[] = 'publish_tutor_courses';
1141 501
1142 - foreach ( $administrator_cap as $cap ) {
502 + foreach ($administrator_cap as $cap){
1143 503 $administrator->add_cap( $cap );
1144 504 }
1145 505 }
1146 506
@@ -1146,109 +506,85 @@
1146 506
1147 507 /**
1148 508 * Add Instructor role to administrator
1149 509 */
1150 - if ( current_user_can( 'administrator' ) ) {
1151 - tutor_utils()->add_instructor_role( get_current_user_id() );
510 + if (current_user_can('administrator')){
511 + tutor_utils()->add_instructor_role(get_current_user_id());
1152 512 }
513 +
1153 514 }
1154 515
1155 516 /**
1156 - * On plugin activate save initial data
1157 - * Like: generate tutor pages
1158 - *
1159 - * @since 1.0.0
1160 - *
1161 - * @return void
517 + * Save data like page
1162 518 */
1163 - public static function save_data() {
1164 -
1165 - $student_dashboard_args = array(
1166 - 'post_title' => __( 'Dashboard', 'tutor' ),
1167 - 'post_content' => '',
1168 - 'post_type' => 'page',
1169 - 'post_status' => 'publish',
519 + public static function save_data(){
520 + $student_dashboard_args = array(
521 + 'post_title' => __('Dashboard', 'tutor'),
522 + 'post_content' => '',
523 + 'post_type' => 'page',
524 + 'post_status' => 'publish',
1170 525 );
1171 526 $student_dashboard_page_id = wp_insert_post( $student_dashboard_args );
1172 - tutor_utils()->update_option( 'tutor_dashboard_page_id', $student_dashboard_page_id );
527 + tutor_utils()->update_option('tutor_dashboard_page_id', $student_dashboard_page_id);
1173 528
1174 529 $student_registration_args = array(
1175 - 'post_title' => __( 'Student Registration', 'tutor' ),
1176 - 'post_content' => '[tutor_student_registration_form]',
1177 - 'post_type' => 'page',
1178 - 'post_status' => 'publish',
530 + 'post_title' => __('Student Registration', 'tutor'),
531 + 'post_content' => '[tutor_student_registration_form]',
532 + 'post_type' => 'page',
533 + 'post_status' => 'publish',
1179 534 );
1180 - $student_register_page_id = wp_insert_post( $student_registration_args );
1181 - tutor_utils()->update_option( 'student_register_page', $student_register_page_id );
535 + $student_register_page_id = wp_insert_post( $student_registration_args );
536 + tutor_utils()->update_option('student_register_page', $student_register_page_id);
1182 537
1183 538 $instructor_registration_args = array(
1184 - 'post_title' => __( 'Instructor Registration', 'tutor' ),
1185 - 'post_content' => '[tutor_instructor_registration_form]',
1186 - 'post_type' => 'page',
1187 - 'post_status' => 'publish',
539 + 'post_title' => __('Instructor Registration', 'tutor'),
540 + 'post_content' => '[tutor_instructor_registration_form]',
541 + 'post_type' => 'page',
542 + 'post_status' => 'publish',
1188 543 );
1189 - $instructor_registration_id = wp_insert_post( $instructor_registration_args );
1190 - tutor_utils()->update_option( 'instructor_register_page', $instructor_registration_id );
544 + $instructor_registration_id = wp_insert_post( $instructor_registration_args );
545 + tutor_utils()->update_option('instructor_register_page', $instructor_registration_id);
1191 546 }
1192 547
1193 - /**
1194 - * Default options
1195 - *
1196 - * @since 1.0.0
1197 - *
1198 - * @since 3.4.1 Supported video sources added
1199 - *
1200 - * @return array
1201 - */
1202 - public static function default_options() {
1203 - $options = array(
548 + public static function default_options(){
549 + $options = array (
1204 550 'pagination_per_page' => '20',
551 + 'load_tutor_css' => '1',
552 + 'load_tutor_js' => '1',
1205 553 'course_allow_upload_private_files' => '1',
1206 554 'display_course_instructors' => '1',
1207 555 'enable_q_and_a_on_course' => '1',
1208 556 'courses_col_per_row' => '3',
1209 - 'courses_per_page' => '12',
1210 - 'course_permalink_base' => 'courses',
1211 - 'lesson_permalink_base' => 'lessons',
557 + 'courses_per_page' => '3',
558 + 'lesson_permalink_base' => 'lesson',
559 + 'quiz_time_limit' =>
560 + array (
561 + 'value' => '0',
562 + 'time' => 'minutes',
563 + ),
1212 564 'quiz_when_time_expires' => 'autosubmit',
565 + 'quiz_attempts_allowed' => '10',
1213 566 'quiz_grade_method' => 'highest_grade',
1214 - 'enable_public_profile' => '1',
567 + 'enable_public_profile' => '1',
1215 568 'email_to_students' =>
1216 - array(
1217 - 'quiz_completed' => '1',
569 + array (
570 + 'quiz_completed' => '1',
1218 571 'completed_course' => '1',
1219 572 ),
1220 - 'email_to_instructors' =>
1221 - array(
1222 - 'a_student_enrolled_in_course' => '1',
1223 - 'a_student_completed_course' => '1',
1224 - 'a_student_completed_lesson' => '1',
1225 - 'a_student_placed_question' => '1',
573 + 'email_to_instructors' =>
574 + array (
575 + 'a_student_enrolled_in_course' => '1',
576 + 'a_student_completed_course' => '1',
577 + 'a_student_completed_lesson' => '1',
578 + 'a_student_placed_question' => '1',
1226 579 ),
1227 - 'email_from_name' => get_option( 'blogname' ),
1228 - 'email_from_address' => get_option( 'admin_email' ),
580 + 'email_from_name' => get_option('blogname'),
581 + 'email_from_address' => get_option('admin_email'),
1229 582 'email_footer_text' => '',
1230 - 'earning_admin_commission' => '20',
1231 - 'earning_instructor_commission' => '80',
1232 -
1233 - // Default options for tutor ecommerce.
1234 - 'monetize_by' => Ecommerce::MONETIZE_BY,
1235 - 'currency_code' => 'USD',
1236 - 'currency_position' => 'left',
1237 - 'thousand_separator' => ',',
1238 - 'decimal_separator' => '.',
1239 - 'number_of_decimals' => '2',
1240 - 'is_coupon_applicable' => 'on',
1241 - 'supported_video_sources' => array(
1242 - 'html5',
1243 - 'external_url',
1244 - 'youtube',
1245 - 'vimeo',
1246 - 'embedded',
1247 - 'shortcode',
1248 - ),
583 + 'earning_admin_commission' => '20',
584 + 'earning_admin_commission' => '20',
585 + 'earning_instructor_commission' => '80'
1249 586 );
1250 -
1251 587 return $options;
1252 588 }
1253 589
1254 590
@@ -1254,11 +590,11 @@
1254 590
1255 591 /**
1256 592 * Create withdraw database
1257 593 *
1258 - * @since 1.2.0
594 + * @since v.1.2.0
1259 595 */
1260 - public static function create_withdraw_database() {
596 + public static function create_withdraw_database(){
1261 597 global $wpdb;
1262 598
1263 599 $charset_collate = $wpdb->get_charset_collate();
1264 600
@@ -1267,16 +603,16 @@
1267 603 *
1268 604 * {$wpdb->prefix}tutor_earnings
1269 605 * {$wpdb->prefix}tutor_withdraws
1270 606 *
1271 - * @since 1.2.0
607 + * @since v.1.2.0
1272 608 */
1273 609
1274 610 $earning_table = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}tutor_earnings (
1275 - earning_id bigint(20) NOT NULL AUTO_INCREMENT,
1276 - user_id bigint(20) DEFAULT NULL,
1277 - course_id bigint(20) DEFAULT NULL,
1278 - order_id bigint(20) DEFAULT NULL,
611 + earning_id int(11) NOT NULL AUTO_INCREMENT,
612 + user_id int(11) DEFAULT NULL,
613 + course_id int(11) DEFAULT NULL,
614 + order_id int(11) DEFAULT NULL,
1279 615 order_status varchar(50) DEFAULT NULL,
1280 616 course_price_total decimal(16,2) DEFAULT NULL,
1281 617 course_price_grand_total decimal(16,2) DEFAULT NULL,
1282 618 instructor_amount decimal(16,2) DEFAULT NULL,
@@ -1292,10 +628,10 @@
1292 628 PRIMARY KEY (earning_id)
1293 629 ) $charset_collate;";
1294 630
1295 631 $withdraw_table = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}tutor_withdraws (
1296 - withdraw_id bigint(20) NOT NULL AUTO_INCREMENT,
1297 - user_id bigint(20) DEFAULT NULL,
632 + withdraw_id int(11) NOT NULL AUTO_INCREMENT,
633 + user_id int(11) DEFAULT NULL,
1298 634 amount decimal(16,2) DEFAULT NULL,
1299 635 method_data text DEFAULT NULL,
1300 636 status varchar(50) DEFAULT NULL,
1301 637 updated_at datetime DEFAULT NULL,
@@ -1302,9 +638,9 @@
1302 638 created_at datetime DEFAULT NULL,
1303 639 PRIMARY KEY (withdraw_id)
1304 640 ) $charset_collate;";
1305 641
1306 - require_once ABSPATH . 'wp-admin/includes/upgrade.php';
642 + require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
1307 643 dbDelta( $earning_table );
1308 644 dbDelta( $withdraw_table );
1309 645
1310 646 /**
@@ -1309,174 +645,26 @@
1309 645
1310 646 /**
1311 647 * Setting previous dashboard to new dashboard
1312 648 */
1313 - $previous_dashboard_page_id = (int) tutor_utils()->get_option( 'student_dashboard' );
1314 - tutor_utils()->update_option( 'tutor_dashboard_page_id', $previous_dashboard_page_id );
649 + $previous_dashboard_page_id = (int) tutor_utils()->get_option('student_dashboard');
650 + tutor_utils()->update_option('tutor_dashboard_page_id', $previous_dashboard_page_id);
1315 651 }
1316 652
1317 653 /**
1318 - * Filter the wp_doing_ajax from tutor requests to get advanced
1319 - * advantages from Tutor
654 + * @param $bool
1320 655 *
1321 - * @since 1.3.4
656 + * @return bool
1322 657 *
1323 - * @param bool $bool default value.
658 + * Filter the wp_doing_ajax from tutor requests to get advanced advantages from Tutor
1324 659 *
1325 - * @return bool
660 + * @since v.1.3.4
1326 661 */
1327 - public function wp_doing_ajax( $bool ) {
1328 - // Don't use Input::has helper to avoid conflict.
1329 - if ( isset( $_REQUEST['tutor_ajax_action'] ) ) {
662 + public function wp_doing_ajax($bool){
663 + if (isset($_REQUEST['tutor_ajax_action'])){
1330 664 return true;
1331 665 }
1332 666 return $bool;
1333 667 }
1334 668
1335 - /**
1336 - * Handle plugin un-installation
1337 - *
1338 - * @since 2.6.2
1339 - *
1340 - * @return void
1341 - */
1342 - public static function tutor_uninstall() {
1343 - self::erase_tutor_data();
1344 - }
1345 669
1346 - /**
1347 - * Erase tutor data
1348 - *
1349 - * @since 2.6.2
1350 - *
1351 - * @return void
1352 - */
1353 - public static function erase_tutor_data() {
1354 - global $wpdb;
1355 -
1356 - $is_erase_data = tutor_utils()->get_option( 'delete_on_uninstall' );
1357 - // Deleting Data.
1358 -
1359 - if ( $is_erase_data ) {
1360 - /**
1361 - * Deleting Post Type, Meta Data, taxonomy
1362 - */
1363 - $course_post_type = tutor()->course_post_type;
1364 - $lesson_post_type = tutor()->lesson_post_type;
1365 -
1366 - $post_types = array(
1367 - $course_post_type,
1368 - $lesson_post_type,
1369 - 'tutor_quiz',
1370 - 'tutor_enrolled',
1371 - 'topics',
1372 - 'tutor_enrolled',
1373 - 'tutor_announcements',
1374 - );
1375 -
1376 - $in_clause = QueryHelper::prepare_in_clause( $post_types );
1377 - $tutor_posts = $wpdb->get_col( $wpdb->prepare( "SELECT ID from {$wpdb->posts} WHERE post_type IN({$in_clause}) ;" ) ); //phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
1378 -
1379 - if ( is_array( $tutor_posts ) && count( $tutor_posts ) ) {
1380 - foreach ( $tutor_posts as $post_id ) {
1381 - // Delete categories.
1382 - $terms = wp_get_object_terms( $post_id, CourseModel::COURSE_CATEGORY );
1383 - foreach ( $terms as $term ) {
1384 - wp_remove_object_terms( $post_id, array( $term->term_id ), CourseModel::COURSE_CATEGORY );
1385 - }
1386 -
1387 - // Delete tags if available.
1388 - $terms = wp_get_object_terms( $post_id, CourseModel::COURSE_TAG );
1389 - foreach ( $terms as $term ) {
1390 - wp_remove_object_terms( $post_id, array( $term->term_id ), CourseModel::COURSE_TAG );
1391 - }
1392 -
1393 - // Delete All Meta.
1394 - $wpdb->delete( $wpdb->postmeta, array( 'post_id' => $post_id ) );
1395 - $wpdb->delete( $wpdb->posts, array( 'ID' => $post_id ) );
1396 - }
1397 - }
1398 -
1399 - /**
1400 - * Deleting Comments (reviews, questions, quiz_answers, etc)
1401 - */
1402 - $tutor_comments = $wpdb->get_col( "SELECT comment_ID from {$wpdb->comments} WHERE comment_agent = 'comment_agent' ;" );
1403 - if ( is_array( $tutor_comments ) && count( $tutor_comments ) ) {
1404 - $in_clause = QueryHelper::prepare_in_clause( $tutor_comments );
1405 - $wpdb->query( $wpdb->prepare( "DELETE from {$wpdb->commentmeta} WHERE comment_ID in({$in_clause}) " ) ); //phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
1406 - }
1407 - $wpdb->delete( $wpdb->comments, array( 'comment_agent' => 'comment_agent' ) );
1408 -
1409 - /**
1410 - * Delete Options
1411 - */
1412 -
1413 - delete_option( 'tutor_option' );
1414 - $wpdb->delete( $wpdb->usermeta, array( 'meta_key' => '_is_tutor_student' ) );
1415 - $wpdb->delete( $wpdb->usermeta, array( 'meta_key' => '_tutor_instructor_approved' ) );
1416 - $wpdb->delete( $wpdb->usermeta, array( 'meta_key' => '_tutor_instructor_status' ) );
1417 - $wpdb->delete( $wpdb->usermeta, array( 'meta_key' => '_is_tutor_instructor' ) );
1418 - $wpdb->query( "DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE '%_tutor_completed_lesson_id_%' " );
1419 -
1420 - // Deleting Table.
1421 - $prefix = $wpdb->prefix;
1422 - //phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
1423 - $wpdb->query( "DROP TABLE IF EXISTS {$prefix}tutor_quiz_attempts, {$prefix}tutor_quiz_attempt_answers, {$prefix}tutor_quiz_questions, {$prefix}tutor_quiz_question_answers, {$prefix}tutor_earnings, {$prefix}tutor_withdraws " );
1424 -
1425 - }
1426 - }
1427 -
1428 - /**
1429 - * Update instructor capability
1430 - *
1431 - * Remove other author items permission
1432 - *
1433 - * @since 4.0.5
1434 - *
1435 - * @since 4.0.6 read_private_{items} permissions removed
1436 - */
1437 - public function update_instructor_capability() {
1438 - // Remove edit_others content cap from tutor_instructor role.
1439 - $is_removed_edit_other_items_permissions = get_option( 'tutor_removed_edit_other_items_permission', false );
1440 - $is_removed_private_items_permissions = get_option( 'tutor_removed_read_private_items_permission', false );
1441 -
1442 - $role = get_role( tutor()->instructor_role );
1443 - if ( ! $is_removed_edit_other_items_permissions ) {
1444 - $role = get_role( tutor()->instructor_role );
1445 -
1446 - $caps_to_be_removed = array(
1447 - 'edit_others_tutor_courses',
1448 - 'edit_others_tutor_lessons',
1449 - 'edit_others_tutor_quizzes',
1450 - 'edit_others_tutor_questions',
1451 - 'edit_others_tutor_assignments',
1452 - );
1453 -
1454 - foreach ( $caps_to_be_removed as $cap ) {
1455 - if ( $role->has_cap( $cap ) ) {
1456 - $role->remove_cap( $cap );
1457 - }
1458 - }
1459 -
1460 - update_option( 'tutor_removed_edit_other_items_permission', true, false );
1461 - }
1462 -
1463 - // Removed private items permission @since 4.0.6.
1464 - if ( ! $is_removed_private_items_permissions ) {
1465 - $caps_to_be_removed = array(
1466 - 'read_private_tutor_courses',
1467 - 'read_private_tutor_lessons',
1468 - 'read_private_tutor_quizzes',
1469 - 'read_private_tutor_assignments',
1470 - 'read_private_tutor_questions',
1471 - );
1472 -
1473 - foreach ( $caps_to_be_removed as $cap ) {
1474 - if ( $role->has_cap( $cap ) ) {
1475 - $role->remove_cap( $cap );
1476 - }
1477 - }
1478 -
1479 - update_option( 'tutor_removed_read_private_items_permission', true, false );
1480 - }
1481 - }
1482 -}
670 +}