PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.9
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.9
4.4.9 4.4.8 4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 All 140 releases
← All changes | inc/user/abstract-lp-user.php +165 -928 4.1.7.1 → 4.4.9 View file →
@@ -10,8 +10,11 @@
10 10
11 11 /**
12 12 * Prevent loading this file directly
13 13 */
14 +
15 +use LearnPress\Models\UserItems\UserCourseModel;
16 +
14 17 defined( 'ABSPATH' ) || exit();
15 18
16 19 if ( ! class_exists( 'LP_Abstract_User' ) ) {
17 20
@@ -79,9 +82,8 @@
79 82
80 83 if ( $this->get_id() > 0 ) {
81 84 $this->load();
82 85 }
83 -
84 86 }
85 87
86 88 /**
87 89 * Load user data from curd
@@ -95,14 +97,14 @@
95 97 *
96 98 * @param int $course_id .
97 99 *
98 100 * @return LP_User_Item_Course|bool
99 - * @version 3.1.3
100 - * @editor tungnx
101 + * @version 3.1.4
101 102 * @modify 4.1.3
102 103 */
103 104 public function get_course_data( int $course_id = 0 ) {
104 - $lp_user_items_db = LP_User_Items_DB::getInstance();
105 + $lp_user_items_db = LP_User_Items_DB::getInstance();
106 + $object_course_data = false;
105 107
106 108 try {
107 109 if ( ! $course_id ) {
108 110 $course_id = get_the_ID();
@@ -107,21 +109,14 @@
107 109 if ( ! $course_id ) {
108 110 $course_id = get_the_ID();
109 111 }
110 112
111 - /*if ( $this instanceof LP_User_Guest ) {
112 - throw new Exception( 'User is Guest' );
113 - }*/
114 -
115 - $filter = new LP_User_Items_Filter();
116 - $filter->item_id = $course_id;
117 - $filter->user_id = $this->get_id();
118 - $last_user_course = $lp_user_items_db->get_last_user_course( $filter );
119 -
120 - if ( $last_user_course ) {
121 - $object_course_data = new LP_User_Item_Course( $last_user_course );
113 + $userCourseModel = UserCourseModel::find( $this->get_id(), $course_id, true );
114 + if ( $userCourseModel ) {
115 + $userCourseArr = (array) $userCourseModel;
116 + $userCourseArr['user_item_id'] = $userCourseModel->get_user_item_id();
117 + $object_course_data = new LP_User_Item_Course( $userCourseArr );
122 118 } else {
123 - $object_course_data = false;
124 119 /**
125 120 * Todo: some themes still not check false, so still use below code.\
126 121 * @editor tungnx 4.1.6.9
127 122 */
@@ -134,8 +129,28 @@
134 129 return $object_course_data;
135 130 }
136 131
137 132 /**
133 + * Get course attend of user not Guest.
134 + * Replace get_course_data method.
135 + *
136 + * @param int $course_id
137 + * @return false|UserCourseModel
138 + * @since 4.2.5
139 + * @version 1.0.1
140 + */
141 + public function get_course_attend( int $course_id = 0 ) {
142 + if ( $this instanceof LP_User_Guest ) {
143 + return false;
144 + }
145 +
146 + $filter = new LP_User_Items_Filter();
147 + $filter->item_id = $course_id;
148 + $filter->user_id = $this->get_id();
149 + return UserCourseModel::get_user_item_model_from_db( $filter );
150 + }
151 +
152 + /**
138 153 * Get user course item.
139 154 *
140 155 * @param int $item_id
141 156 * @param int $course_id
@@ -337,28 +352,8 @@
337 352 return $records;
338 353 }
339 354
340 355 /**
341 - * Count number of rows for an item in user-items
342 - *
343 - * @param int $item_id
344 - * @param int $course_id
345 - *
346 - * @return int
347 - * @editor tungnx
348 - * @modify 4.1.3 - comment - not user
349 - */
350 - /*public function count_item_archive( $item_id, $course_id = 0 ) {
351 - $count = 0;
352 -
353 - if ( $items = $this->get_item_archive( $item_id, $course_id ) ) {
354 - $count = sizeof( $items );
355 - }
356 -
357 - return $count;
358 - }*/
359 -
360 - /**
361 356 * Check quiz can retake?
362 357 *
363 358 * @param [type] $quiz_id
364 359 * @param [type] $course_id
@@ -470,18 +465,16 @@
470 465 $status = '';
471 466
472 467 if ( ! $course_id ) {
473 468 $course_id = get_the_ID();
469 + if ( ! $course_id ) {
470 + return $status;
471 + }
474 472 }
475 473
476 - if ( ! $course_id ) {
477 - return $status;
478 - }
479 -
480 474 $item = $this->get_item( $item_id, $course_id, true );
481 -
482 - if ( false !== $item ) {
483 - $status = $item['status'];
475 + if ( $item instanceof LP_User_Item ) {
476 + $status = $item->get_status();
484 477 }
485 478
486 479 return apply_filters( 'learn-press/user-item-status', $status, $item_id, $this->get_id(), $course_id );
487 480 }
@@ -486,153 +479,8 @@
486 479 return apply_filters( 'learn-press/user-item-status', $status, $item_id, $this->get_id(), $course_id );
487 480 }
488 481
489 482 /**
490 - * To rewrite get_item_status on abstract-lp-user.
491 - *
492 - * @throws Exception
493 - * @author tungnx
494 - */
495 - /*public function getItemStatus( $item_id, $course_id ) {
496 - $status = LP_User_Items_DB::getInstance()->get_item_status( $item_id, $course_id );
497 -
498 - return $status;
499 - }*/
500 -
501 - /**
502 - * Update viewing item data into database.
503 - *
504 - * @param int $item_id
505 - * @param int $course_id
506 - *
507 - * @return bool
508 - * @since 3.0.0
509 - * @version 4.0.1
510 - * @depecated 4.1.6.9
511 - */
512 - /*public function maybe_update_item( $item_id, $course_id ) {
513 - $return = false;
514 -
515 - try {
516 - $course_data = $this->get_course_data( $course_id );
517 -
518 - if ( $course_data ) {
519 - $item = $course_data->get_item( $item_id );
520 -
521 - if ( ! $item ) {
522 - $item = LP_User_Item::get_item_object( $item_id );
523 -
524 - if ( ! $item ) {
525 - return $return;
526 - }
527 -
528 - if ( $item instanceof LP_User_Item_Quiz ) {
529 - return $return;
530 - }
531 -
532 - $item->set_ref_id( $course_id );
533 - $item->set_parent_id( $course_data->get_user_item_id() );
534 -
535 - $return = $item->update();
536 - }
537 - }
538 - } catch ( Throwable $e ) {
539 - error_log( $e->getMessage() );
540 - }
541 -
542 - return $return;
543 - }*/
544 -
545 - /**
546 - * Get item user has accessed in last time.
547 - *
548 - * @param int $course_id
549 - * @param bool $permalink - Optional. TRUE will return permalink instead of ID.
550 - *
551 - * @return mixed
552 - * @depecated 4.1.6.9
553 - */
554 - public function get_current_item( $course_id, $permalink = false ) {
555 - _deprecated_function( __FUNCTION__, '4.1.6.9' );
556 - return 0;
557 - /*$course_data = $this->get_course_data( $course_id );
558 - if ( ! $course_data ) {
559 - return false;
560 - }
561 -
562 - $course = learn_press_get_course( $course_id );
563 - $id = learn_press_get_user_item_meta( $course_data->get_user_item_id(), '_current_item' );
564 - if ( ! $id || $this->has_completed_item( $id, $course_id ) ) {
565 - $items = $course->get_items( '', false );
566 - if ( $items ) {
567 - foreach ( $items as $item_id ) {
568 - if ( ! $this->has_completed_item( $item_id, $course_id ) ) {
569 - $id = $item_id;
570 - break;
571 - }
572 - }
573 -
574 - if ( ! $id ) {
575 - $id = reset( $items );
576 - }
577 - }
578 -
579 - if ( $id ) {
580 - learn_press_update_user_item_meta( $course_data->get_user_item_id(), '_current_item', $id );
581 - }
582 - }
583 -
584 - if ( $permalink && $id ) {
585 - return apply_filters(
586 - 'learn-press/current-course-item-permalink',
587 - $course->get_item_link( $id ),
588 - $course_id,
589 - $this->get_id()
590 - );
591 - } else {
592 - return apply_filters( 'learn-press/current-course-item', $id, $course_id, $this->get_id() );
593 - }*/
594 - }
595 -
596 - /**
597 - * Get current question's ID/Permalink inside quiz.
598 - *
599 - * @param int $quiz_id
600 - * @param int $course_id
601 - * @param bool $permalink
602 - *
603 - * @return bool|int|string
604 - * @depecated 4.1.6.9
605 - */
606 - /*public function get_current_question( $quiz_id, $course_id, $permalink = false ) {
607 - _deprecated_function( sprintf( '%s::%s', __CLASS__, __FUNCTION__ ), '4.0.0' );
608 - }*/
609 -
610 - /**
611 - * Get previous Question
612 - *
613 - * @param null $quiz_id
614 - * @param int $course_id
615 - * @param false $permalink
616 - * @depecated 4.1.6.9
617 - */
618 - /*public function get_prev_question( $quiz_id = null, $course_id = 0, $permalink = false ) {
619 - _deprecated_function( sprintf( '%s::%s', __CLASS__, __FUNCTION__ ), '4.0.0' );
620 - }*/
621 -
622 - /**
623 - * Get next Question
624 - *
625 - * @param null $quiz_id
626 - * @param int $course_id
627 - * @param false $permalink
628 - * @depecated 4.1.6.9
629 - */
630 - /*public function get_next_question( $quiz_id = null, $course_id = 0, $permalink = false ) {
631 - _deprecated_function( sprintf( '%s::%s', __CLASS__, __FUNCTION__ ), '4.0.0' );
632 - }*/
633 -
634 - /**
635 483 * Checks if has status of a quiz for user
636 484 *
637 485 * @param string|array $statuses
638 486 * @param int $quiz_id
@@ -690,135 +538,8 @@
690 538 return $result;
691 539 }
692 540
693 541 /**
694 - * Mark question that user has checked.
695 - *
696 - * @param int $question_id
697 - * @param int $quiz_id
698 - * @param int $course_id
699 - *
700 - * @return WP_Error|mixed
701 - * @since 3.0.0
702 - * @editor tungnx
703 - * @modify 4.1.4.1 - comment - not use
704 - */
705 - /*public function check_question( $question_id, $quiz_id, $course_id ) {
706 - if ( ! $course = learn_press_get_course( $course_id ) ) {
707 - return false;
708 - }
709 -
710 - if ( ! $course->has_item( $quiz_id ) ) {
711 - return false;
712 - }
713 -
714 - $quiz = $course->get_item( $quiz_id );
715 -
716 - if ( ! $quiz->has_question( $question_id ) ) {
717 - return false;
718 - }
719 -
720 - $quiz_data = $this->get_item_data( $quiz_id, $course_id );
721 -
722 - return $quiz_data->check_question( $question_id );
723 - }*/
724 -
725 - /**
726 - * Mark question that user has checked.
727 - *
728 - * @param int $question_id
729 - * @param int $quiz_id
730 - * @param int $course_id
731 - *
732 - * @return WP_Error|mixed
733 - * @since 3.0.0
734 - */
735 - public function hint( $question_id, $quiz_id, $course_id ) {
736 - $course = learn_press_get_course( $course_id );
737 - if ( ! $course ) {
738 - return false;
739 - }
740 -
741 - if ( ! $course->has_item( $quiz_id ) ) {
742 - return false;
743 - }
744 -
745 - /**
746 - * @var $quiz LP_Quiz
747 - */
748 - $quiz = $course->get_item( $quiz_id );
749 - if ( ! $quiz instanceof LP_Course_Item_Quiz ) {
750 - return false;
751 - }
752 -
753 - if ( ! $quiz->has_question( $question_id ) ) {
754 - return false;
755 - }
756 -
757 - $quiz_data = $this->get_item_data( $quiz_id, $course_id );
758 - $remain = $quiz_data->hint( $question_id );
759 - if ( false === $remain ) {
760 - return new WP_Error( 1001, __( 'You can not hint question.', 'learnpress' ) );
761 - }
762 -
763 - return $remain;
764 - }
765 -
766 - /**
767 - * Return true if check answer is enabled.
768 - *
769 - * @param int $quiz_id
770 - * @param int $course_id
771 - *
772 - * @return bool
773 - * @deprecated 4.1.4.1
774 - */
775 - /*public function can_check_answer( $quiz_id, $course_id = 0 ) {
776 - _deprecated_function( __FUNCTION__, '4.1.4.1' );
777 - if ( ! $course_id ) {
778 - $course_id = get_the_ID();
779 - }
780 -
781 - if ( $quiz_data = $this->get_item_data( $quiz_id, $course_id ) ) {
782 - return $quiz_data->can_check_answer();
783 - }
784 -
785 - return false;
786 - }*/
787 -
788 - /**
789 - * Return true if check answer is enabled.
790 - *
791 - * @param int $quiz_id
792 - * @param int $course_id
793 - *
794 - * @return bool
795 - * @depecated 4.1.6.9
796 - */
797 - /*public function can_hint_answer( $quiz_id, $course_id = 0 ) {
798 -
799 - if ( ! $course_id ) {
800 - $course_id = get_the_ID();
801 - }
802 -
803 - if ( $quiz_data = $this->get_item_data( $quiz_id, $course_id ) ) {
804 - return $quiz_data->can_hint_answer();
805 - }
806 -
807 - return false;
808 - }*/
809 -
810 -
811 - public function get_quiz_last_results( $quiz_id ) {
812 - $results = $this->get_course_info( $quiz_id );
813 - if ( $results ) {
814 - $results = reset( $results );
815 - }
816 -
817 - return apply_filters( 'learn_press_user_quiz_last_results', $results, $quiz_id, $this );
818 - }
819 -
820 - /**
821 542 * Check if user has at least one role.
822 543 *
823 544 * @param array|string $roles
824 545 *
@@ -850,30 +571,8 @@
850 571
851 572 return $is;
852 573 }
853 574
854 - /**
855 - *
856 - * Check what the user can do
857 - *
858 - * @param $role
859 - *
860 - * @return mixed
861 - * @throws Exception
862 - */
863 - public function can( $role ) {
864 - _deprecated_function( __FUNCTION__, '3.0.8' );
865 - $args = func_get_args();
866 - unset( $args[0] );
867 - $method = 'can_' . preg_replace( '!-!', '_', $role );
868 - $callback = array( $this, $method );
869 - if ( is_callable( $callback ) ) {
870 - return call_user_func_array( $callback, $args );
871 - } else {
872 - throw new Exception( sprintf( __( 'The role %s for user doesn\'t exist', 'learnpress' ), $role ) );
873 - }
874 - }
875 -
876 575 public function can_edit_item( $item_id, $course_id = 0 ) {
877 576 $return = $this->is_admin();
878 577
879 578 if ( ! $return ) {
@@ -888,24 +587,8 @@
888 587 return apply_filters( 'learn_press_user_can_edit_item', $return, $item_id, $course_id, $this->get_id() );
889 588 }
890 589
891 590 /**
892 - * Check if user can finish course by getting current progress
893 - * and compares with course passing condition.
894 - *
895 - * @param int $course_id
896 - *
897 - * @return bool
898 - * @editor tungnx
899 - * @modify 4.1.3
900 - */
901 - public function can_finish_course( int $course_id ) {
902 - _deprecated_function( __FUNCTION__, '4.1.3', 'is_course_finished' );
903 -
904 - return true;
905 - }
906 -
907 - /**
908 591 * Check if course has any passed status for an user.
909 592 * Statuses: depending on value of column `status` in user_items.
910 593 * - purchased: bought and order is completed, `start_date` and `end_date` is null
911 594 * - enrolled: value of column `status` in user_items is enrolled
@@ -930,17 +613,8 @@
930 613 return false;
931 614 }
932 615
933 616 /**
934 - * @depecated 4.1.6.9.1
935 - */
936 - /*public function get_completed_items( $course_id ) {
937 - $this->_curd->get_user_items( $this->get_id(), $course_id );
938 -
939 - return $this->_curd->get_user_completed_items( $this->get_id(), $course_id );
940 - }*/
941 -
942 - /**
943 617 * Finish course
944 618 *
945 619 * @param int $course_id
946 620 *
@@ -951,8 +625,11 @@
951 625 $course = learn_press_get_course( $course_id );
952 626
953 627 if ( $course ) {
954 628 $user_course = $this->get_course_data( $course_id );
629 + if ( ! $user_course ) {
630 + return $return;
631 + }
955 632
956 633 $result = $user_course->calculate_course_results();
957 634
958 635 // Save result for course
@@ -964,13 +641,24 @@
964 641 $graduation = LP_COURSE_GRADUATION_FAILED;
965 642 }
966 643
967 644 $user_course->set_graduation( $graduation );
968 - $user_course->save();
645 + //$user_course->save();
646 + $return = $user_course->complete( LP_COURSE_FINISHED );
969 647
970 - $return = $user_course->complete( 'finished' );
648 + if ( $return ) {
649 + /**
650 + * LP_User_Item::complete() writes straight to the table, so it never runs
651 + * UserCourseModel::clean_caches() the way UserItemModel::save() does. The
652 + * cached model still reports the enrollment as in progress, and that cache
653 + * outlives the request wherever a persistent object cache is installed - the
654 + * course then reads back unfinished and keeps offering "Finish course".
655 + */
656 + $userCourseModel = UserCourseModel::find( $this->get_id(), $course_id );
657 + if ( $userCourseModel instanceof UserCourseModel ) {
658 + $userCourseModel->clean_caches();
659 + }
971 660
972 - if ( $return ) {
973 661 do_action( 'learn-press/user-course-finished', $course_id, $this->get_id(), $return );
974 662 }
975 663 }
976 664
@@ -1016,22 +704,8 @@
1016 704 public function is_author_of( $post_id ) {
1017 705 return absint( get_post_field( 'post_author', $post_id ) ) === $this->get_id();
1018 706 }
1019 707
1020 - public function has( $role ) {
1021 - _deprecated_function( __FUNCTION__, '3.0.8' );
1022 -
1023 - $args = func_get_args();
1024 - unset( $args[0] );
1025 - $method = 'has_' . preg_replace( '!-!', '_', $role );
1026 - $callback = array( $this, $method );
1027 - if ( is_callable( $callback ) ) {
1028 - return call_user_func_array( $callback, $args );
1029 - } else {
1030 - throw new Exception( sprintf( __( 'The role %s for user doesn\'t exist', 'learnpress' ), $role ) );
1031 - }
1032 - }
1033 -
1034 708 public function get( $role ) {
1035 709 $args = func_get_args();
1036 710 unset( $args[0] );
1037 711 $method = 'get_' . preg_replace( '!-!', '_', $role );
@@ -1038,9 +712,9 @@
1038 712 $callback = array( $this, $method );
1039 713 if ( is_callable( $callback ) ) {
1040 714 return call_user_func_array( $callback, $args );
1041 715 } else {
1042 - throw new Exception( sprintf( __( 'The role %s for user doesn\'t exist', 'learnpress' ), $role ) );
716 + throw new Exception( sprintf( __( 'The role %s for the user doesn\'t exist', 'learnpress' ), $role ) );
1043 717 }
1044 718 }
1045 719
1046 720 /**
@@ -1080,9 +754,9 @@
1080 754 * @param int $quiz_id
1081 755 * @param int $course_id
1082 756 *
1083 757 * @return bool
1084 - * @depecated 4.1.6.9
758 + * @deprecated 4.1.6.9
1085 759 */
1086 760 /*public function has_completed_quiz( $quiz_id, $course_id = 0 ): bool {
1087 761 return $this->get_item_status( $quiz_id, $course_id ) == 'completed';
1088 762 }*/
@@ -1091,48 +765,43 @@
1091 765 * Mark a lesson is completed for user
1092 766 *
1093 767 * @param int $lesson_id
1094 768 * @param int $course_id
1095 - * @param bool $return_wp_error
1096 769 *
1097 770 * @return bool|WP_Error
1098 771 */
1099 - public function complete_lesson( $lesson_id, $course_id = 0, $return_wp_error = true ) {
772 + public function complete_lesson( $lesson_id = 0, $course_id = 0 ) {
773 + $result = true;
774 +
1100 775 try {
1101 - $course_id = $this->_get_course( $course_id );
776 + $course = learn_press_get_course( $course_id );
777 + if ( ! $course ) {
778 + throw new Exception( __( 'Invalid course', 'learnpress' ) );
779 + }
1102 780
1103 781 $course_data = $this->get_course_data( $course_id );
782 + if ( ! $course_data ) {
783 + throw new Exception( __( 'You must enroll course!', 'learnpress' ) );
784 + }
1104 785
1105 - $result = false;
1106 -
1107 786 /**
1108 787 * If user has stared a lesson, get user lesson information
1109 788 */
1110 789 $item = $course_data->get_item( $lesson_id );
1111 - if ( $item ) {
1112 - if ( $item->is_completed() ) {
1113 - throw new Exception(
1114 - __( 'You have already completed this lesson.', 'learnpress' ),
1115 - LP_COMPLETE_ITEM_FAIL
1116 - );
1117 - }
790 + if ( ! $item ) {
791 + throw new Exception( __( 'Invalid lesson', 'learnpress' ) );
792 + }
1118 793
1119 - $item->set_end_time( current_time( 'mysql', 1 ) );
1120 - $item->set_status( 'completed' );
1121 - $item->set_graduation( 'passed' );
794 + if ( $item->is_completed() ) {
795 + throw new Exception( __( 'You have already completed this lesson.', 'learnpress' ) );
796 + }
1122 797
1123 - $updated = $item->update();
798 + $item->set_graduation( 'passed' );
799 + $updated = $item->complete();
1124 800
1125 - if ( is_wp_error( $updated ) ) {
1126 - return $return_wp_error ? $updated : false;
1127 - } else {
1128 - $result = true;
1129 - }
1130 - }
1131 -
1132 801 do_action( 'learn-press/user-completed-lesson', $lesson_id, $course_id, $this->get_id() );
1133 - } catch ( Exception $ex ) {
1134 - $result = $return_wp_error ? new WP_Error( $ex->getCode(), $ex->getMessage() ) : false;
802 + } catch ( Throwable $e ) {
803 + $result = new WP_Error( 'error_lesson_complete', $e->getMessage() );
1135 804 }
1136 805
1137 806 return $result;
1138 807 }
@@ -1143,9 +812,9 @@
1143 812 * @param int $lesson_id Lesson id.
1144 813 * @param null $course_id Course id.
1145 814 *
1146 815 * @return bool
1147 - * @depecated 4.1.6.9
816 + * @deprecated 4.1.6.9
1148 817 */
1149 818 public function has_completed_lesson( $lesson_id = 0, $course_id = null ): bool {
1150 819 return 'completed' === $this->get_item_status( $lesson_id, $course_id );
1151 820 }
@@ -1171,9 +840,9 @@
1171 840 /**
1172 841 * @param $course_id
1173 842 *
1174 843 * @return int
1175 - * @depecated 4.1.6.9
844 + * @deprecated 4.1.6.9
1176 845 */
1177 846 public function get_course_history_id( $course_id ) {
1178 847 $history = $this->get_course_info( $course_id );
1179 848
@@ -1208,216 +877,8 @@
1208 877 return apply_filters( 'learn-press/user-course-status', $status, $course_id, $this->get_id() );
1209 878 }
1210 879
1211 880 /**
1212 - * Controls what this user can do with a course.
1213 - *
1214 - * 0 => No accessible
1215 - * 10 => Normal users (like not logged in)
1216 - * 20 => Author of course
1217 - * 30 => Admin site
1218 - * 35 => No require enrollment
1219 - * 40 => Ordered but not completed
1220 - * 50 => Order is completed but not enrolled
1221 - * 60 => User has already enrolled course
1222 - * 70 => User has already finished course
1223 - *
1224 - * @param int $course_id
1225 - *
1226 - * @return int
1227 - * @since 3.1.0
1228 - * @editor tungnx
1229 - * @modify 4.1.3 - comment - not use
1230 - */
1231 - /*public function get_course_access_level( $course_id ) {
1232 - $access_level = LP_Object_Cache::get(
1233 - 'course-' . $course_id . '-' . $this->get_id(),
1234 - 'learn-press/course-access-levels'
1235 - );
1236 -
1237 - if ( false === $access_level ) {
1238 - $course = learn_press_get_course( $course_id );
1239 -
1240 - if ( ! $course ) {
1241 - $access_level = LP_COURSE_ACCESS_LEVEL_0;
1242 - } elseif ( $this->is_admin() ) {
1243 - $access_level = LP_COURSE_ACCESS_LEVEL_30;
1244 - } elseif ( $this->is_author_of( $course_id ) ) {
1245 - $access_level = LP_COURSE_ACCESS_LEVEL_20;
1246 - } else {
1247 - $access_level = LP_COURSE_ACCESS_LEVEL_10;
1248 - }
1249 -
1250 - // Default level
1251 - $access_level = apply_filters(
1252 - 'learn-press/course-access-level-default',
1253 - $access_level,
1254 - $course_id,
1255 - $this->get_id()
1256 - );
1257 - $course_data = $this->get_course_data( $course_id );
1258 -
1259 - if ( $course_data && $course_data->get_user_item_id() ) {
1260 - // if ( $course_data->get_access_level() >= 50 ) {
1261 - switch ( $course_data->get_status() ) {
1262 - case 'completed':
1263 - case 'failed':
1264 - $access_level = LP_COURSE_ACCESS_LEVEL_60;
1265 - break;
1266 - case 'in-progress':
1267 - case 'enrolled':
1268 - $access_level = LP_COURSE_ACCESS_LEVEL_70;
1269 - break;
1270 - }
1271 - // }
1272 - } else {
1273 - $order = $this->get_course_order( $course_id );
1274 -
1275 - if ( $order ) {
1276 - switch ( $order->get_status() ) {
1277 - case 'completed':
1278 - $access_level = LP_COURSE_ACCESS_LEVEL_50;
1279 - break;
1280 - default:
1281 - $access_level = LP_COURSE_ACCESS_LEVEL_40;
1282 - }
1283 - }
1284 - }
1285 -
1286 - LP_Object_Cache::set(
1287 - 'course-' . $course_id . '-' . $this->get_id(),
1288 - $access_level,
1289 - 'learn-press/course-access-levels'
1290 - );
1291 - }
1292 -
1293 - return apply_filters( 'learn-press/course-access-level', $access_level, $course_id, $this->get_id() );
1294 - }*/
1295 -
1296 - /**
1297 - * @editor tungnx
1298 - * @reason comment - not use
1299 - * @modify 4.1.2
1300 - */
1301 - /*public function get_item_access_level( $item_id, $course_id ) {
1302 - $access_level = 0;
1303 -
1304 - if ( $course = learn_press_get_course( $course_id ) ) {
1305 - if ( $course->has_item( $item_id ) ) {
1306 - if ( 10 < $this->get_course_access_level( $course_id ) ) {
1307 - $access_level = 10;
1308 - } else {
1309 - $item = $course->get_item( $item_id );
1310 - if ( $item->is_preview() ) {
1311 - $access_level = 10;
1312 - }
1313 - }
1314 - }
1315 - }
1316 -
1317 - return apply_filters(
1318 - 'learn-press/course-item-access-level',
1319 - $access_level,
1320 - $item_id,
1321 - $course_id,
1322 - $this->get_id()
1323 - );
1324 - }*/
1325 -
1326 - /**
1327 - * Set new access-level of an user with a course.
1328 - *
1329 - * @param int $access_level
1330 - * @param int $course_id
1331 - *
1332 - * @return mixed
1333 - * @since 3.1.0
1334 - * @editor tungnx
1335 - * @reason comment - not use
1336 - * @modify 4.1.2
1337 - */
1338 - /*public function set_course_access_level( $access_level, $course_id ) {
1339 - if ( $access_level !== $this->get_course_access_level( $course_id ) ) {
1340 - LP_Object_Cache::set(
1341 - 'course-' . $course_id . '-' . $this->get_id(),
1342 - $access_level,
1343 - 'learn-press/course-access-levels'
1344 - );
1345 - }
1346 -
1347 - return $access_level;
1348 - }*/
1349 -
1350 - /**
1351 - * Check if user have an access-level.
1352 - * Consider the passed access-level is max level user have.
1353 - *
1354 - * @param int[] $access_level
1355 - * @param int $course_id
1356 - * @param string $compare
1357 - *
1358 - * @return bool
1359 - * @since 3.1.0
1360 - * @editor tungnx
1361 - * @modify 4.1.3 - not - use
1362 - */
1363 - /*public function has_course_access_level( $access_level, $course_id, $compare = '<=' ) {
1364 - $user_access_level = $this->get_course_access_level( $course_id );
1365 -
1366 - switch ( $compare ) {
1367 - case 'any':
1368 - settype( $access_level, 'array' );
1369 - $has = in_array( $user_access_level, $access_level );
1370 - break;
1371 - default:
1372 - $has = version_compare( $user_access_level, $access_level );
1373 - }
1374 -
1375 - return $has;
1376 - }*/
1377 -
1378 - /**
1379 - * Check if user has an access-level with a course.
1380 - *
1381 - * @param int $access_level
1382 - * @param int $course_id
1383 - *
1384 - * @return bool
1385 - * @since 3.1.0
1386 - * @editor tungnx
1387 - * @modify 4.1.2
1388 - * @reason comment - not use
1389 - */
1390 - /*public function is_access_level( $access_level, $course_id ) {
1391 - $user_access_level = $this->get_course_access_level( $course_id );
1392 -
1393 - return $user_access_level === $access_level;
1394 - }*/
1395 -
1396 - /**
1397 - * Check if user is already ordered a course.
1398 - *
1399 - * @param int $course_id
1400 - *
1401 - * @return mixed|LP_Order
1402 - * @editor tungnx
1403 - * @modify 4.1.3 - comment - not use
1404 - */
1405 - /*public function has_ordered_course( $course_id ) {
1406 - $return = apply_filters(
1407 - 'learn-press/user-has-ordered-course',
1408 - $this->get_course_order( $course_id ),
1409 - $course_id,
1410 - $this->get_id()
1411 - );
1412 -
1413 - // Deprecated since 3.0.0
1414 - $return = apply_filters( 'learn_press_user_has_ordered_course', $return, $course_id, $this->get_id() );
1415 -
1416 - return $return;
1417 - }*/
1418 -
1419 - /**
1420 881 * Get order status of a course.
1421 882 *
1422 883 * @param int $course_id
1423 884 *
@@ -1476,29 +937,8 @@
1476 937 return apply_filters( 'learn_press_user_has_completed_item', $return, $item );
1477 938 }
1478 939
1479 940 /**
1480 - * Get the remaining time of a course for the user.
1481 - *
1482 - * @param int $course_id
1483 - *
1484 - * @return bool|int|string
1485 - */
1486 - public function get_course_remaining_time( $course_id ) {
1487 - $course = learn_press_get_course( $course_id );
1488 - $remain = false;
1489 -
1490 - if ( $course && $course->get_id() ) {
1491 - $course_data = $this->get_course_data( $course_id, true );
1492 - if ( $course_data ) {
1493 - $remain = $course_data->is_exceeded();
1494 - }
1495 - }
1496 -
1497 - return $remain > 0 ? learn_press_seconds_to_weeks( $remain ) : false;
1498 - }
1499 -
1500 - /**
1501 941 * Get the order that contains the course.
1502 942 *
1503 943 * @param int $course_id
1504 944 *
@@ -1520,142 +960,8 @@
1520 960 return $lp_order;
1521 961 }
1522 962
1523 963 /**
1524 - * Enroll this user to a course.
1525 - *
1526 - * @param int $course_id
1527 - * @param int $order_id - Optional. An user can be enrolled to a course
1528 - *
1529 - * @return bool|WP_Error
1530 - * @throws Exception
1531 - * @since 3.3.0
1532 - * @editor tungnx
1533 - * @version 3.3.1
1534 - * @modify 4.1.3 - comment - not use
1535 - */
1536 - // public function enroll_course( int $course_id = 0, int $order_id = 0 ) {
1537 - // $lp_user_items_db = LP_User_Items_DB::getInstance();
1538 - //
1539 - // try {
1540 - // /*$user_item_api = new LP_User_Item_CURD();
1541 - // $find_query = array(
1542 - // 'item_id' => $course_id,
1543 - // 'user_id' => $this->get_id(),
1544 - // );
1545 - //
1546 - // if ( $order_id ) {
1547 - // $find_query['ref_id'] = $order_id;
1548 - // }*/
1549 - //
1550 - // $filter = new LP_User_Items_Filter();
1551 - // $filter->user_id = get_current_user_id();
1552 - // $filter->item_id = $course_id;
1553 - // $course_item = $lp_user_items_db->get_last_user_course( $filter );
1554 - //
1555 - // if ( ! $course_item ) {
1556 - // $course_item = LP_User_Item::get_empty_item();
1557 - // } else {
1558 - // $course_item = (array) $course_item;
1559 - // }
1560 - //
1561 - // $user_id = $this->get_id();
1562 - //
1563 - // $course_item['user_id'] = $user_id;
1564 - // $course_item['item_id'] = $course_id;
1565 - // $course_item['item_type'] = learn_press_get_post_type( $course_id );
1566 - // $course_item['ref_id'] = $order_id;
1567 - // $course_item['ref_type'] = ( $order_id != 0 ) ? learn_press_get_post_type( $order_id ) : '';
1568 - // $course_item['start_time'] = current_time( 'mysql', true );
1569 - // $course_item['access_level'] = 50;
1570 - //
1571 - // /**
1572 - // * @editor tungnx
1573 - // * @fixed: case no auto enroll
1574 - // */
1575 - // if ( 'yes' == LP_Settings::get_option( 'auto_enroll' ) ) {
1576 - // $course_item['graduation'] = 'in-progress';
1577 - // }
1578 - //
1579 - // $user_course = new LP_User_Item_Course( $course_item );
1580 - // $user_course->set_status( LP_COURSE_PURCHASED );
1581 - //
1582 - // if ( ! $user_course->update( true ) ) {
1583 - // throw new Exception( __( 'Update user item error.', 'learnpress' ) );
1584 - // }
1585 - //
1586 - // /*$user_id = is_user_logged_in() ? $this->get_id() : 0;
1587 - //
1588 - // global $wpdb;
1589 - // $query = $wpdb->prepare(
1590 - // "
1591 - // UPDATE {$wpdb->learnpress_user_items}
1592 - // SET access_level = %d
1593 - // WHERE user_id = %d
1594 - // AND item_id = %d
1595 - // AND user_item_id NOT IN(%d)
1596 - // ",
1597 - // 0,
1598 - // $user_id,
1599 - // $course_id,
1600 - // $user_course->get_user_item_id()
1601 - // );
1602 - // $wpdb->query( $query );*/
1603 - //
1604 - // $return = $user_course->get_user_item_id();
1605 - // } catch ( Exception $ex ) {
1606 - // error_log( $ex->getMessage() );
1607 - // return false;
1608 - // }
1609 - //
1610 - // return $return;
1611 - // }
1612 -
1613 - /**
1614 - * Enroll this user to a course.
1615 - *
1616 - * @param int $course_id
1617 - * @param int $order_id
1618 - * @param bool $force - Optional. Force create db record for preview quiz case
1619 - * @param bool $wp_error - Optional. TRUE will return WP_Error object if there is an error.
1620 - * @editor tungnx - comment - not use
1621 - * @return bool|mixed|WP_Error
1622 - */
1623 - /*public function enroll( $course_id, $order_id, $force = false, $wp_error = false ) {
1624 - global $wpdb;
1625 -
1626 - _deprecated_function( __FUNCTION__, '4.1.0' );
1627 -
1628 - try {
1629 - $course = learn_press_get_course( $course_id );
1630 - $user_id = $this->get_id();
1631 -
1632 - if ( $course->is_required_enroll() && ! $force ) {
1633 - $order = learn_press_get_order( $order_id );
1634 -
1635 - if ( ! $order ) {
1636 - throw new Exception( __( 'Failed to enroll course.', 'learnpress' ), 10000 );
1637 - }
1638 -
1639 - if ( ! $this->can_enroll_course( $course_id ) ) {
1640 - throw new Exception( __( 'Failed to enroll course.', 'learnpress' ), 10001 );
1641 - }
1642 -
1643 - if ( ! $this->get_id() ) {
1644 - throw new Exception( __( 'Please login to enroll course.', 'learnpress' ), 10002 );
1645 - }
1646 - }
1647 -
1648 - $return = $this->enroll_course( $course_id, $order_id, false, $wp_error );
1649 -
1650 - return $return;
1651 -
1652 - } catch ( Exception $ex ) {
1653 - return new WP_Error( $ex->getCode(), $ex->getMessage() );
1654 - }
1655 - }*/
1656 -
1657 - /**
1658 964 * @param $question_id
1659 965 *
1660 966 * @return null|string
1661 967 */
@@ -1674,89 +980,8 @@
1674 980 return $wpdb->get_var( $query );
1675 981 }
1676 982
1677 983 /**
1678 - * @param $question_id
1679 - * @param null $quiz_id
1680 - *
1681 - * @return bool
1682 - */
1683 - public function get_answer_results( $question_id, $quiz_id = null ) {
1684 -
1685 - _deprecated_function( __CLASS__ . '::' . __FUNCTION__, '3.0.0' );
1686 -
1687 - $data = false;
1688 - if ( ! $quiz_id ) {
1689 - $quiz_id = $this->get_quiz_by_question( $question_id );
1690 - }
1691 - if ( $quiz_id ) {
1692 - $question = LP_Question::get_question( $question_id );
1693 -
1694 - if ( $question ) {
1695 - $quiz_results = $this->get_quiz_results( $quiz_id );
1696 - if ( ! empty( $quiz_results->question_answers ) ) {
1697 - $question_answer = array_key_exists(
1698 - $question_id,
1699 - $quiz_results->question_answers
1700 - ) ? $quiz_results->question_answers[ $question_id ] : null;
1701 - $data = $question->check( $question_answer );
1702 - }
1703 - }
1704 - }
1705 -
1706 - return $data;
1707 - }
1708 -
1709 - /**
1710 - * @param $question_id
1711 - * @param null $quiz_id
1712 - *
1713 - * @return bool
1714 - */
1715 - public function is_answered_question( $question_id, $quiz_id = null ) {
1716 - if ( empty( $this->answered_questions ) ) {
1717 - $this->answered_questions = array();
1718 - }
1719 - if ( ! $quiz_id ) {
1720 - $quiz_id = $this->get_quiz_by_question( $question_id );
1721 - }
1722 -
1723 - $results = $this->get_quiz_results( $quiz_id );
1724 - $answered = ! empty( $results->question_answers ) ? $results->question_answers : array();
1725 -
1726 - return $answered ? array_key_exists( $question_id, $answered ) : false;
1727 - }
1728 -
1729 - /**
1730 - * @param array $args
1731 - *
1732 - * @return LP_Query_List_Table
1733 - * @editor tungnx
1734 - * @deprecated 4.1.6
1735 - */
1736 - /*public function get_purchased_courses( array $args = array() ): LP_Query_List_Table {
1737 - $filter = new LP_User_Items_Filter();
1738 - $filter->fields = array( 'item_id' );
1739 - $filter->user_id = $this->get_id();
1740 - $filter->status = $args['status'] ?? '';
1741 - $filter->page = $args['paged'] ?? 1;
1742 - $filter->limit = $args['limit'] ?? $filter->limit;
1743 - $total_rows = 0;
1744 - $result_courses = LP_User_Item_Course::get_user_courses( $filter, $total_rows );
1745 -
1746 - $course_ids = LP_Course::get_course_ids( $result_courses, 'item_id' );
1747 -
1748 - $courses = array(
1749 - 'total' => $total_rows,
1750 - 'paged' => $filter->page,
1751 - 'limit' => $filter->limit,
1752 - 'items' => $course_ids,
1753 - );
1754 -
1755 - return new LP_Query_List_Table( $courses );
1756 - }*/
1757 -
1758 - /**
1759 984 * @return array
1760 985 */
1761 986 public function get_roles() {
1762 987 return (array) $this->get_data( 'roles' );
@@ -1779,25 +1004,8 @@
1779 1004 return $quiz_data ? $quiz_data->has_checked_question( $question_id ) : false;
1780 1005 }
1781 1006
1782 1007 /**
1783 - * @param $question_id
1784 - * @param $quiz_id
1785 - * @param int $course_id
1786 - *
1787 - * @return bool
1788 - */
1789 - public function has_hinted_answer( $question_id, $quiz_id, $course_id = 0 ) {
1790 - if ( ! $course_id ) {
1791 - $course_id = get_the_ID();
1792 - }
1793 -
1794 - $quiz_data = $this->get_item_data( $quiz_id, $course_id );
1795 -
1796 - return $quiz_data ? $quiz_data->has_hinted_question( $question_id ) : false;
1797 - }
1798 -
1799 - /**
1800 1008 * Return TRUE if user is already exists.
1801 1009 *
1802 1010 * @return bool
1803 1011 */
@@ -1821,13 +1029,33 @@
1821 1029 * @param mixed $size
1822 1030 *
1823 1031 * @return string
1824 1032 */
1825 - public function get_upload_profile_src( $size = '' ) {
1826 - return LP_Profile::instance( $this->get_id() )->get_upload_profile_src( $size );
1033 + public function get_upload_profile_src() {
1034 + return LP_Profile::instance( $this->get_id() )->get_upload_profile_src();
1827 1035 }
1828 1036
1829 1037 /**
1038 + * Get profile avatar url
1039 + *
1040 + * @return string
1041 + * @since 4.2.7.2
1042 + * @version 1.0.0
1043 + */
1044 + public function get_profile_avatar_url(): string {
1045 + $avatar_url = $this->get_upload_profile_src();
1046 + if ( empty( $avatar_url ) ) {
1047 + $args = learn_press_get_avatar_thumb_size();
1048 + $avatar_url = get_avatar_url( $this->get_id(), $args );
1049 + if ( empty( $avatar_url ) ) {
1050 + $avatar_url = LP_PLUGIN_URL . 'assets/images/avatar-default.png';
1051 + }
1052 + }
1053 +
1054 + return $avatar_url;
1055 + }
1056 +
1057 + /**
1830 1058 * @param string $type
1831 1059 * @param int $size
1832 1060 * @param bool $src_only
1833 1061 *
@@ -1838,11 +1066,13 @@
1838 1066 }
1839 1067
1840 1068 /**
1841 1069 * Get links socials of use on Profile page
1070 + * Icon is font awesome
1842 1071 *
1843 1072 * @param int $user_id
1844 1073 * @return array
1074 + * @deprecated 4.2.3
1845 1075 */
1846 1076 public function get_profile_socials( int $user_id = 0 ): array {
1847 1077 $socials = array();
1848 1078 $extra_info = learn_press_get_user_extra_profile_info( $user_id );
@@ -1854,21 +1084,24 @@
1854 1084 }
1855 1085
1856 1086 switch ( $k ) {
1857 1087 case 'facebook':
1858 - $i = '<i class="fab fa-facebook-f"></i>';
1088 + $i = '<i class="lp-icon-facebook-f"></i>';
1859 1089 break;
1860 1090 case 'twitter':
1861 - $i = '<i class="fab fa-twitter"></i>';
1091 + $i = '<i class="lp-icon-twitter"></i>';
1862 1092 break;
1863 1093 case 'googleplus':
1864 - $i = '<i class="fab fa-google-plus-g"></i>';
1094 + $i = '<i class="lp-icon-google-plus"></i>';
1865 1095 break;
1866 1096 case 'youtube':
1867 - $i = '<i class="fab fa-youtube"></i>';
1097 + $i = '<i class="lp-icon-youtube-play"></i>';
1868 1098 break;
1099 + case 'linkedin':
1100 + $i = '<i class="lp-icon-linkedin"></i>';
1101 + break;
1869 1102 default:
1870 - $i = sprintf( '<i class="fab fa-%s"></i>', $k );
1103 + $i = sprintf( '<i class="lp-icon-%s"></i>', $k );
1871 1104 }
1872 1105
1873 1106 $icon = apply_filters(
1874 1107 'learn-press/user-profile-social-icon',
@@ -1884,37 +1117,57 @@
1884 1117 return apply_filters( 'learn-press/user-profile-socials', $socials, $this->get_id(), $this );
1885 1118 }
1886 1119
1887 1120 /**
1888 - * Check if user can access to a course.
1121 + * Get links socials of use on Profile page
1122 + * Icon is svg
1889 1123 *
1890 - * @param int $course_id
1891 - *
1892 - * @return mixed
1893 - * @editor tungnx
1894 - * @modify 4.1.3 - comment - not use
1124 + * @param int $user_id
1125 + * @return array
1126 + * @since 4.2.3
1127 + * @version 1.0.0
1895 1128 */
1896 - /*public function can_access_course( $course_id ) {
1129 + public function get_profile_social( int $user_id = 0 ): array {
1130 + $socials = array();
1131 + $extra_info = learn_press_get_user_extra_profile_info( $user_id );
1897 1132
1898 - $accessible = $this->has_course_access_level(
1899 - array(
1900 - LP_COURSE_ACCESS_LEVEL_60,
1901 - LP_COURSE_ACCESS_LEVEL_70,
1902 - ),
1903 - $course_id,
1904 - 'any'
1905 - );
1133 + if ( $extra_info ) {
1134 + foreach ( $extra_info as $k => $v ) {
1135 + if ( empty( $v ) ) {
1136 + continue;
1137 + }
1906 1138
1907 - $accessible = apply_filters(
1908 - 'learn-press/user-can-access-course',
1909 - $accessible,
1910 - $course_id,
1911 - $this->get_id()
1912 - );
1139 + switch ( $k ) {
1140 + case 'facebook':
1141 + $i = '<i class="lp-user-ico lp-icon-facebook"></i>';
1142 + break;
1143 + case 'twitter':
1144 + $i = '<i class="lp-user-ico lp-icon-twitter"></i>';
1145 + break;
1146 + case 'linkedin':
1147 + $i = '<i class="lp-user-ico lp-icon-linkedin"></i>';
1148 + break;
1149 + case 'youtube':
1150 + $i = '<i class="lp-user-ico lp-icon-youtube-play"></i>';
1151 + break;
1152 + default:
1153 + $i = sprintf( '<i class="lp-user-ico lp-icon-%s"></i>', esc_attr( $k ) );
1154 + }
1913 1155
1914 - return $accessible;
1915 - }*/
1156 + $icon = apply_filters(
1157 + 'learn-press/user-profile-social-icon',
1158 + $i,
1159 + $k,
1160 + $this->get_id(),
1161 + $this
1162 + );
1163 + $socials[ $k ] = sprintf( '<a href="%s">%s</a>', esc_url_raw( $v ), $icon );
1164 + }
1165 + }
1916 1166
1167 + return apply_filters( 'learn-press/user-profile-socials', $socials, $this->get_id(), $this );
1168 + }
1169 +
1917 1170 /**
1918 1171 * Check course of user has graduation is in-progress
1919 1172 *
1920 1173 * @param $course_id
@@ -1924,9 +1177,9 @@
1924 1177 public function is_course_in_progress( $course_id ): bool {
1925 1178 $user = learn_press_get_user( $this->get_id() );
1926 1179 $user_course = $user->get_course_data( $course_id );
1927 1180
1928 - return $user_course && LP_COURSE_GRADUATION_IN_PROGRESS === $user_course->get_graduation();
1181 + return $user_course && LP_COURSE_GRADUATION_IN_PROGRESS === $user_course->get_graduation();
1929 1182 }
1930 1183
1931 1184 /**
1932 1185 * Return TRUE if user can do a quiz
@@ -1939,13 +1192,10 @@
1939 1192 */
1940 1193 public function can_do_quiz( $quiz_id, $course_id = 0 ) {
1941 1194 $course = learn_press_get_course( $course_id );
1942 1195
1943 - if ( $course->is_required_enroll() ) {
1944 - $can = $this->has_course_status(
1945 - $course_id,
1946 - array( 'enrolled' )
1947 - ) && ! $this->has_started_quiz( $quiz_id, $course_id );
1196 + if ( ! $course->is_no_required_enroll() ) {
1197 + $can = $this->has_course_status( $course_id, array( 'enrolled' ) ) && ! $this->has_started_quiz( $quiz_id, $course_id );
1948 1198 } else {
1949 1199 $can = ! $this->has_started_quiz( $quiz_id, $course_id );
1950 1200 }
1951 1201
@@ -1952,28 +1202,8 @@
1952 1202 return apply_filters( 'learn_press_user_can_do_quiz', $can, $quiz_id, $this->get_id(), $course_id );
1953 1203 }
1954 1204
1955 1205 /**
1956 - * @depecated 4.1.6.9.2
1957 - */
1958 - /*public function evaluate_course_results( $course_id ) {
1959 - $user_course = $this->get_course_data( $course_id );
1960 -
1961 - return isset( $user_course ) ? $user_course->get_results( 'result' ) : 0;
1962 - }*/
1963 -
1964 - /**
1965 - * @editor tungnx
1966 - * @modify 4.1.4.1 - comment - not use
1967 - */
1968 - /*public function has_reached_passing_condition( $course_id ) {
1969 - $course = learn_press_get_course( $course_id );
1970 - $result = $this->evaluate_course_results( $course_id );
1971 -
1972 - return $return = $result >= $course->get_passing_condition();
1973 - }*/
1974 -
1975 - /**
1976 1206 * Check if all items in course completed.
1977 1207 *
1978 1208 * @return boolean
1979 1209 * @author Nhamdv <[email protected]>
@@ -1991,10 +1221,17 @@
1991 1221
1992 1222 return $course_results['completed_items'] >= $course->count_items();
1993 1223 }
1994 1224
1225 + /**
1226 + * Get role of user.
1227 + *
1228 + * @return string
1229 + * @since 3.0.0
1230 + * @version 1.0.1
1231 + */
1995 1232 public function get_role() {
1996 - return $this->is_admin() ? 'admin' : ( $this->is_instructor() ? 'instructor' : 'user' );
1233 + return $this->get_data( 'role' );
1997 1234 }
1998 1235
1999 1236 /**
2000 1237 * Get user course's grade.
@@ -2023,9 +1260,9 @@
2023 1260 *
2024 1261 * @return bool
2025 1262 */
2026 1263 public function is_guest(): bool {
2027 - return ! $this->get_id() || ! get_user_by( 'id', $this->get_id() );
1264 + return $this instanceof LP_User_Guest;
2028 1265 }
2029 1266
2030 1267 /**
2031 1268 * Check if user can edit a post.
@@ -2065,9 +1302,9 @@
2065 1302 *
2066 1303 * @return string
2067 1304 */
2068 1305 public function get_description(): string {
2069 - return $this->get_data( 'description', '' );
1306 + return get_the_author_meta( 'description', $this->get_id() );
2070 1307 }
2071 1308
2072 1309 /**
2073 1310 * Return user first name.