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.1 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 All 141 releases
← All changes | inc/user/abstract-lp-user.php +171 -1104 4.1.6.9 → 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,293 +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 - * Get history of a quiz for an user
822 - *
823 - * @param int $quiz_id
824 - * @param int $course_id
825 - * @param int $history_id
826 - * @param bool $force
827 - *
828 - * @return mixed|null|void
829 - * @editor tungnx
830 - * @modify 4.1.4.1 - comment - not use
831 - */
832 - /*public function get_quiz_history( $quiz_id, $course_id = 0, $history_id = null, $force = false ) {
833 - $course_id = $this->_get_course( $course_id );
834 -
835 - $course = learn_press_get_course( $course_id );
836 - if ( $course ) {
837 - $quizzes = $course->get_quizzes( 'ID' );
838 - } else {
839 - $quizzes = array();
840 - }
841 - $key = $this->get_id() . '-' . $course_id . '-' . $quiz_id;
842 -
843 - $cached = LP_Cache::get_quiz_history( false, array() );
844 -
845 - if ( ( ! array_key_exists( $key, $cached ) || $force ) && $quizzes && in_array( $quiz_id, $quizzes ) ) {
846 - global $wpdb;
847 - $t1 = $wpdb->learnpress_user_items;
848 - $t2 = $wpdb->learnpress_user_itemmeta;
849 - $in = array_fill( 0, sizeof( $quizzes ), '%d' );
850 - $prepare_params = array_merge(
851 - array( 'lp_quiz', $this->get_id(), $course_id ),
852 - $quizzes
853 - );
854 - $query = $wpdb->prepare(
855 - "
856 - SELECT *
857 - FROM $t1 uq
858 - WHERE uq.item_type = %s
859 - AND uq.user_id = %d
860 - AND uq.ref_id = %d
861 - AND uq.item_id IN(" . join( ',', $in ) . ')
862 - ORDER BY uq.user_item_id DESC
863 - ',
864 - $prepare_params
865 - );
866 -
867 - $history = array();
868 - foreach ( $quizzes as $_quiz_id ) {
869 - $history[ $this->get_id() . '-' . $course_id . '-' . $_quiz_id ] = array();
870 - }
871 - if ( $results = $wpdb->get_results( $query ) ) {
872 - $item_ids = array();
873 - foreach ( $results as $result ) {
874 - $item_ids[] = $result->user_item_id;
875 - $cache_key = $this->get_id() . '-' . $course_id . '-' . $result->item_id;
876 - if ( empty( $history[ $cache_key ] ) ) {
877 - $history[ $cache_key ] = array();
878 - }
879 - // limit newest 10 items
880 - if ( sizeof( $history[ $cache_key ] ) >= 10 ) {
881 - // break;
882 - }
883 -
884 - $history[ $cache_key ][ $result->user_item_id ] = (object) array(
885 - 'history_id' => $result->user_item_id,
886 - 'start' => $result->start_time,
887 - 'end' => $result->end_time,
888 - 'status' => $result->status,
889 - 'question' => '',
890 - 'questions' => array(),
891 - 'question_answers' => array(),
892 - );
893 - }
894 - if ( $item_ids && $meta = $this->_get_quiz_meta( $item_ids ) ) {
895 - $maps = array(
896 - 'questions' => 'questions',
897 - 'current_question' => 'question',
898 - 'question_answers' => 'question_answers',
899 - 'question_checked' => 'question_checked',
900 - );
901 - foreach ( $meta as $k => $v ) {
902 - $_key = $this->get_id() . '-' . $course_id . '-' . $v->item_id;
903 - if ( empty( $history[ $_key ] ) ) {
904 - continue;
905 - }
906 - if ( empty( $history[ $_key ][ $v->user_item_id ] ) ) {
907 - continue;
908 - }
909 - $obj_key = ! empty( $maps[ $v->meta_key ] ) ? $maps[ $v->meta_key ] : $v->meta_key;
910 - if ( ! $obj_key ) {
911 - continue;
912 - }
913 - $history[ $_key ][ $v->user_item_id ]->{$obj_key} = LP_Helper::maybe_unserialize( $v->meta_value );
914 - }
915 - }
916 - }
917 -
918 - if ( $history ) {
919 - foreach ( $history as $k1 => $v1 ) {
920 - if ( empty( $cached[ $k1 ] ) ) {
921 - $cached[ $k1 ] = $v1;
922 - continue;
923 - }
924 - foreach ( $v1 as $k2 => $v2 ) {
925 - $cached[ $k1 ][ $k2 ] = $v2;
926 - }
927 - }
928 - }
929 - LP_Cache::set_quiz_history( $cached );
930 - }
931 -
932 - return apply_filters(
933 - 'learn_press_user_quiz_history',
934 - isset( $cached[ $key ] ) ? $cached[ $key ] : array(),
935 - $this,
936 - $quiz_id
937 - );
938 - }*/
939 -
940 - /**
941 - * @editor tungnx
942 - * @modify 4.1.4.1 - comment - not use
943 - */
944 - /*private function _get_quiz_meta( $user_item_id ) {
945 - global $wpdb;
946 - settype( $user_item_id, 'array' );
947 - $in = array_fill( 0, sizeof( $user_item_id ), '%d' );
948 -
949 - $query = $wpdb->prepare(
950 - "
951 - SELECT learnpress_user_item_id as user_item_id, meta_key, meta_value, item_id
952 - FROM {$wpdb->prefix}learnpress_user_itemmeta im
953 - INNER JOIN {$wpdb->prefix}learnpress_user_items i ON i.user_item_id = im.learnpress_user_item_id
954 - WHERE learnpress_user_item_id IN(" . join( ',', $in ) . ')
955 - ',
956 - $user_item_id
957 - );
958 -
959 - return $wpdb->get_results( $query );
960 - }*/
961 -
962 - /**
963 - * @editor tungnx
964 - * @modify 4.1.4.1 comment - not use
965 - */
966 - /*public function get_current_results( $quiz_id, $course_id = 0 ) {
967 - $course_id = $this->_get_course( $course_id );
968 -
969 - $history = $this->get_quiz_history( $quiz_id, $course_id );
970 - $current = false;
971 - if ( $history ) {
972 - $current = reset( $history );
973 - }
974 -
975 - return $current;
976 - }*/
977 -
978 - /**
979 542 * Check if user has at least one role.
980 543 *
981 544 * @param array|string $roles
982 545 *
@@ -1008,30 +571,8 @@
1008 571
1009 572 return $is;
1010 573 }
1011 574
1012 - /**
1013 - *
1014 - * Check what the user can do
1015 - *
1016 - * @param $role
1017 - *
1018 - * @return mixed
1019 - * @throws Exception
1020 - */
1021 - public function can( $role ) {
1022 - _deprecated_function( __FUNCTION__, '3.0.8' );
1023 - $args = func_get_args();
1024 - unset( $args[0] );
1025 - $method = 'can_' . 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 575 public function can_edit_item( $item_id, $course_id = 0 ) {
1035 576 $return = $this->is_admin();
1036 577
1037 578 if ( ! $return ) {
@@ -1046,24 +587,8 @@
1046 587 return apply_filters( 'learn_press_user_can_edit_item', $return, $item_id, $course_id, $this->get_id() );
1047 588 }
1048 589
1049 590 /**
1050 - * Check if user can finish course by getting current progress
1051 - * and compares with course passing condition.
1052 - *
1053 - * @param int $course_id
1054 - *
1055 - * @return bool
1056 - * @editor tungnx
1057 - * @modify 4.1.3
1058 - */
1059 - public function can_finish_course( int $course_id ) {
1060 - _deprecated_function( __FUNCTION__, '4.1.3', 'is_course_finished' );
1061 -
1062 - return true;
1063 - }
1064 -
1065 - /**
1066 591 * Check if course has any passed status for an user.
1067 592 * Statuses: depending on value of column `status` in user_items.
1068 593 * - purchased: bought and order is completed, `start_date` and `end_date` is null
1069 594 * - enrolled: value of column `status` in user_items is enrolled
@@ -1087,14 +612,8 @@
1087 612
1088 613 return false;
1089 614 }
1090 615
1091 - public function get_completed_items( $course_id ) {
1092 - $this->_curd->get_user_items( $this->get_id(), $course_id );
1093 -
1094 - return $this->_curd->get_user_completed_items( $this->get_id(), $course_id );
1095 - }
1096 -
1097 616 /**
1098 617 * Finish course
1099 618 *
1100 619 * @param int $course_id
@@ -1106,8 +625,11 @@
1106 625 $course = learn_press_get_course( $course_id );
1107 626
1108 627 if ( $course ) {
1109 628 $user_course = $this->get_course_data( $course_id );
629 + if ( ! $user_course ) {
630 + return $return;
631 + }
1110 632
1111 633 $result = $user_course->calculate_course_results();
1112 634
1113 635 // Save result for course
@@ -1119,13 +641,24 @@
1119 641 $graduation = LP_COURSE_GRADUATION_FAILED;
1120 642 }
1121 643
1122 644 $user_course->set_graduation( $graduation );
1123 - $user_course->save();
645 + //$user_course->save();
646 + $return = $user_course->complete( LP_COURSE_FINISHED );
1124 647
1125 - $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 + }
1126 660
1127 - if ( $return ) {
1128 661 do_action( 'learn-press/user-course-finished', $course_id, $this->get_id(), $return );
1129 662 }
1130 663 }
1131 664
@@ -1171,22 +704,8 @@
1171 704 public function is_author_of( $post_id ) {
1172 705 return absint( get_post_field( 'post_author', $post_id ) ) === $this->get_id();
1173 706 }
1174 707
1175 - public function has( $role ) {
1176 - _deprecated_function( __FUNCTION__, '3.0.8' );
1177 -
1178 - $args = func_get_args();
1179 - unset( $args[0] );
1180 - $method = 'has_' . preg_replace( '!-!', '_', $role );
1181 - $callback = array( $this, $method );
1182 - if ( is_callable( $callback ) ) {
1183 - return call_user_func_array( $callback, $args );
1184 - } else {
1185 - throw new Exception( sprintf( __( 'The role %s for user doesn\'t exist', 'learnpress' ), $role ) );
1186 - }
1187 - }
1188 -
1189 708 public function get( $role ) {
1190 709 $args = func_get_args();
1191 710 unset( $args[0] );
1192 711 $method = 'get_' . preg_replace( '!-!', '_', $role );
@@ -1193,9 +712,9 @@
1193 712 $callback = array( $this, $method );
1194 713 if ( is_callable( $callback ) ) {
1195 714 return call_user_func_array( $callback, $args );
1196 715 } else {
1197 - 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 ) );
1198 717 }
1199 718 }
1200 719
1201 720 /**
@@ -1207,13 +726,9 @@
1207 726 */
1208 727 public function has_passed_course( $course_id ) {
1209 728 $user_course = $this->get_course_data( $course_id );
1210 729
1211 - if ( $user_course && $user_course->is_passed() ) {
1212 - return true;
1213 - } else {
1214 - return false;
1215 - }
730 + return $user_course && $user_course->is_passed();
1216 731 }
1217 732
1218 733 /**
1219 734 * Checks if user has started a quiz
@@ -1239,9 +754,9 @@
1239 754 * @param int $quiz_id
1240 755 * @param int $course_id
1241 756 *
1242 757 * @return bool
1243 - * @depecated 4.1.6.9
758 + * @deprecated 4.1.6.9
1244 759 */
1245 760 /*public function has_completed_quiz( $quiz_id, $course_id = 0 ): bool {
1246 761 return $this->get_item_status( $quiz_id, $course_id ) == 'completed';
1247 762 }*/
@@ -1250,55 +765,43 @@
1250 765 * Mark a lesson is completed for user
1251 766 *
1252 767 * @param int $lesson_id
1253 768 * @param int $course_id
1254 - * @param bool $return_wp_error
1255 769 *
1256 770 * @return bool|WP_Error
1257 771 */
1258 - public function complete_lesson( $lesson_id, $course_id = 0, $return_wp_error = true ) {
1259 - global $wpdb;
772 + public function complete_lesson( $lesson_id = 0, $course_id = 0 ) {
773 + $result = true;
1260 774
1261 775 try {
1262 - do_action( 'learn-press/before-complete-lesson', $lesson_id, $course_id, $this->get_id() );
1263 - $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 + }
1264 780
1265 781 $course_data = $this->get_course_data( $course_id );
782 + if ( ! $course_data ) {
783 + throw new Exception( __( 'You must enroll course!', 'learnpress' ) );
784 + }
1266 785
1267 - $result = false;
1268 -
1269 786 /**
1270 787 * If user has stared a lesson, get user lesson information
1271 788 */
1272 789 $item = $course_data->get_item( $lesson_id );
1273 - if ( $item ) {
790 + if ( ! $item ) {
791 + throw new Exception( __( 'Invalid lesson', 'learnpress' ) );
792 + }
1274 793
1275 - if ( $item->is_completed() ) {
1276 - throw new Exception(
1277 - __( 'You have already completed this lesson.', 'learnpress' ),
1278 - LP_COMPLETE_ITEM_FAIL
1279 - );
1280 - }
1281 - // TODO: conflict???
1282 - //$time = new LP_Datetime();
1283 - $item->set_end_time( current_time( 'mysql', 1 ) );
1284 - $item->set_status( 'completed' );
1285 - $item->set_graduation( apply_filters( 'learn-press/complete-lesson-graduation', 'passed' ) );
794 + if ( $item->is_completed() ) {
795 + throw new Exception( __( 'You have already completed this lesson.', 'learnpress' ) );
796 + }
1286 797
1287 - $updated = $item->update( true, true );
798 + $item->set_graduation( 'passed' );
799 + $updated = $item->complete();
1288 800
1289 - if ( is_wp_error( $updated ) ) {
1290 - return $return_wp_error ? $updated : false;
1291 - } else {
1292 - $result = true;
1293 - }
1294 -
1295 - //$result = $this->evaluate_course_results( $this->get_id() );
1296 - }
1297 -
1298 801 do_action( 'learn-press/user-completed-lesson', $lesson_id, $course_id, $this->get_id() );
1299 - } catch ( Exception $ex ) {
1300 - $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() );
1301 804 }
1302 805
1303 806 return $result;
1304 807 }
@@ -1309,9 +812,9 @@
1309 812 * @param int $lesson_id Lesson id.
1310 813 * @param null $course_id Course id.
1311 814 *
1312 815 * @return bool
1313 - * @depecated 4.1.6.9
816 + * @deprecated 4.1.6.9
1314 817 */
1315 818 public function has_completed_lesson( $lesson_id = 0, $course_id = null ): bool {
1316 819 return 'completed' === $this->get_item_status( $lesson_id, $course_id );
1317 820 }
@@ -1337,9 +840,9 @@
1337 840 /**
1338 841 * @param $course_id
1339 842 *
1340 843 * @return int
1341 - * @depecated 4.1.6.9
844 + * @deprecated 4.1.6.9
1342 845 */
1343 846 public function get_course_history_id( $course_id ) {
1344 847 $history = $this->get_course_info( $course_id );
1345 848
@@ -1374,216 +877,8 @@
1374 877 return apply_filters( 'learn-press/user-course-status', $status, $course_id, $this->get_id() );
1375 878 }
1376 879
1377 880 /**
1378 - * Controls what this user can do with a course.
1379 - *
1380 - * 0 => No accessible
1381 - * 10 => Normal users (like not logged in)
1382 - * 20 => Author of course
1383 - * 30 => Admin site
1384 - * 35 => No require enrollment
1385 - * 40 => Ordered but not completed
1386 - * 50 => Order is completed but not enrolled
1387 - * 60 => User has already enrolled course
1388 - * 70 => User has already finished course
1389 - *
1390 - * @param int $course_id
1391 - *
1392 - * @return int
1393 - * @since 3.1.0
1394 - * @editor tungnx
1395 - * @modify 4.1.3 - comment - not use
1396 - */
1397 - /*public function get_course_access_level( $course_id ) {
1398 - $access_level = LP_Object_Cache::get(
1399 - 'course-' . $course_id . '-' . $this->get_id(),
1400 - 'learn-press/course-access-levels'
1401 - );
1402 -
1403 - if ( false === $access_level ) {
1404 - $course = learn_press_get_course( $course_id );
1405 -
1406 - if ( ! $course ) {
1407 - $access_level = LP_COURSE_ACCESS_LEVEL_0;
1408 - } elseif ( $this->is_admin() ) {
1409 - $access_level = LP_COURSE_ACCESS_LEVEL_30;
1410 - } elseif ( $this->is_author_of( $course_id ) ) {
1411 - $access_level = LP_COURSE_ACCESS_LEVEL_20;
1412 - } else {
1413 - $access_level = LP_COURSE_ACCESS_LEVEL_10;
1414 - }
1415 -
1416 - // Default level
1417 - $access_level = apply_filters(
1418 - 'learn-press/course-access-level-default',
1419 - $access_level,
1420 - $course_id,
1421 - $this->get_id()
1422 - );
1423 - $course_data = $this->get_course_data( $course_id );
1424 -
1425 - if ( $course_data && $course_data->get_user_item_id() ) {
1426 - // if ( $course_data->get_access_level() >= 50 ) {
1427 - switch ( $course_data->get_status() ) {
1428 - case 'completed':
1429 - case 'failed':
1430 - $access_level = LP_COURSE_ACCESS_LEVEL_60;
1431 - break;
1432 - case 'in-progress':
1433 - case 'enrolled':
1434 - $access_level = LP_COURSE_ACCESS_LEVEL_70;
1435 - break;
1436 - }
1437 - // }
1438 - } else {
1439 - $order = $this->get_course_order( $course_id );
1440 -
1441 - if ( $order ) {
1442 - switch ( $order->get_status() ) {
1443 - case 'completed':
1444 - $access_level = LP_COURSE_ACCESS_LEVEL_50;
1445 - break;
1446 - default:
1447 - $access_level = LP_COURSE_ACCESS_LEVEL_40;
1448 - }
1449 - }
1450 - }
1451 -
1452 - LP_Object_Cache::set(
1453 - 'course-' . $course_id . '-' . $this->get_id(),
1454 - $access_level,
1455 - 'learn-press/course-access-levels'
1456 - );
1457 - }
1458 -
1459 - return apply_filters( 'learn-press/course-access-level', $access_level, $course_id, $this->get_id() );
1460 - }*/
1461 -
1462 - /**
1463 - * @editor tungnx
1464 - * @reason comment - not use
1465 - * @modify 4.1.2
1466 - */
1467 - /*public function get_item_access_level( $item_id, $course_id ) {
1468 - $access_level = 0;
1469 -
1470 - if ( $course = learn_press_get_course( $course_id ) ) {
1471 - if ( $course->has_item( $item_id ) ) {
1472 - if ( 10 < $this->get_course_access_level( $course_id ) ) {
1473 - $access_level = 10;
1474 - } else {
1475 - $item = $course->get_item( $item_id );
1476 - if ( $item->is_preview() ) {
1477 - $access_level = 10;
1478 - }
1479 - }
1480 - }
1481 - }
1482 -
1483 - return apply_filters(
1484 - 'learn-press/course-item-access-level',
1485 - $access_level,
1486 - $item_id,
1487 - $course_id,
1488 - $this->get_id()
1489 - );
1490 - }*/
1491 -
1492 - /**
1493 - * Set new access-level of an user with a course.
1494 - *
1495 - * @param int $access_level
1496 - * @param int $course_id
1497 - *
1498 - * @return mixed
1499 - * @since 3.1.0
1500 - * @editor tungnx
1501 - * @reason comment - not use
1502 - * @modify 4.1.2
1503 - */
1504 - /*public function set_course_access_level( $access_level, $course_id ) {
1505 - if ( $access_level !== $this->get_course_access_level( $course_id ) ) {
1506 - LP_Object_Cache::set(
1507 - 'course-' . $course_id . '-' . $this->get_id(),
1508 - $access_level,
1509 - 'learn-press/course-access-levels'
1510 - );
1511 - }
1512 -
1513 - return $access_level;
1514 - }*/
1515 -
1516 - /**
1517 - * Check if user have an access-level.
1518 - * Consider the passed access-level is max level user have.
1519 - *
1520 - * @param int[] $access_level
1521 - * @param int $course_id
1522 - * @param string $compare
1523 - *
1524 - * @return bool
1525 - * @since 3.1.0
1526 - * @editor tungnx
1527 - * @modify 4.1.3 - not - use
1528 - */
1529 - /*public function has_course_access_level( $access_level, $course_id, $compare = '<=' ) {
1530 - $user_access_level = $this->get_course_access_level( $course_id );
1531 -
1532 - switch ( $compare ) {
1533 - case 'any':
1534 - settype( $access_level, 'array' );
1535 - $has = in_array( $user_access_level, $access_level );
1536 - break;
1537 - default:
1538 - $has = version_compare( $user_access_level, $access_level );
1539 - }
1540 -
1541 - return $has;
1542 - }*/
1543 -
1544 - /**
1545 - * Check if user has an access-level with a course.
1546 - *
1547 - * @param int $access_level
1548 - * @param int $course_id
1549 - *
1550 - * @return bool
1551 - * @since 3.1.0
1552 - * @editor tungnx
1553 - * @modify 4.1.2
1554 - * @reason comment - not use
1555 - */
1556 - /*public function is_access_level( $access_level, $course_id ) {
1557 - $user_access_level = $this->get_course_access_level( $course_id );
1558 -
1559 - return $user_access_level === $access_level;
1560 - }*/
1561 -
1562 - /**
1563 - * Check if user is already ordered a course.
1564 - *
1565 - * @param int $course_id
1566 - *
1567 - * @return mixed|LP_Order
1568 - * @editor tungnx
1569 - * @modify 4.1.3 - comment - not use
1570 - */
1571 - /*public function has_ordered_course( $course_id ) {
1572 - $return = apply_filters(
1573 - 'learn-press/user-has-ordered-course',
1574 - $this->get_course_order( $course_id ),
1575 - $course_id,
1576 - $this->get_id()
1577 - );
1578 -
1579 - // Deprecated since 3.0.0
1580 - $return = apply_filters( 'learn_press_user_has_ordered_course', $return, $course_id, $this->get_id() );
1581 -
1582 - return $return;
1583 - }*/
1584 -
1585 - /**
1586 881 * Get order status of a course.
1587 882 *
1588 883 * @param int $course_id
1589 884 *
@@ -1610,16 +905,19 @@
1610 905 return $order_status;
1611 906 }
1612 907
1613 908 /**
909 + * Check item completed.
910 + *
1614 911 * @param $item
1615 912 * @param int $course_id
1616 913 * @param bool $force
1617 914 *
1618 915 * @return mixed|void
916 + * @version 3.0.1
917 + * @since 3.0.0
1619 918 */
1620 919 public function has_completed_item( $item, $course_id = 0, $force = false ) {
1621 -
1622 920 $course_id = $this->_get_course( $course_id );
1623 921
1624 922 $return = false;
1625 923 $item_id = 0;
@@ -1630,21 +928,11 @@
1630 928 if ( ! empty( $item['ID'] ) ) {
1631 929 $item_id = absint( $item['ID'] );
1632 930 }
1633 931 }
932 +
1634 933 if ( $item_id ) {
1635 - if ( empty( $item['item_type'] ) ) {
1636 - $type = learn_press_get_post_type( $item_id );
1637 - } else {
1638 - $type = $item['item_type'];
1639 - }
1640 - if ( ! $type ) {
1641 - $type = learn_press_get_post_type( $item_id );
1642 - }
1643 -
1644 - if ( $type == 'lp_lesson' || $type == 'lp_quiz' ) {
1645 - $return = 'completed' === $this->get_item_status( $item_id, $course_id );
1646 - }
934 + $return = 'completed' === $this->get_item_status( $item_id, $course_id );
1647 935 }
1648 936
1649 937 return apply_filters( 'learn_press_user_has_completed_item', $return, $item );
1650 938 }
@@ -1649,29 +937,8 @@
1649 937 return apply_filters( 'learn_press_user_has_completed_item', $return, $item );
1650 938 }
1651 939
1652 940 /**
1653 - * Get the remaining time of a course for the user.
1654 - *
1655 - * @param int $course_id
1656 - *
1657 - * @return bool|int|string
1658 - */
1659 - public function get_course_remaining_time( $course_id ) {
1660 - $course = learn_press_get_course( $course_id );
1661 - $remain = false;
1662 -
1663 - if ( $course && $course->get_id() ) {
1664 - $course_data = $this->get_course_data( $course_id, true );
1665 - if ( $course_data ) {
1666 - $remain = $course_data->is_exceeded();
1667 - }
1668 - }
1669 -
1670 - return $remain > 0 ? learn_press_seconds_to_weeks( $remain ) : false;
1671 - }
1672 -
1673 - /**
1674 941 * Get the order that contains the course.
1675 942 *
1676 943 * @param int $course_id
1677 944 *
@@ -1693,142 +960,8 @@
1693 960 return $lp_order;
1694 961 }
1695 962
1696 963 /**
1697 - * Enroll this user to a course.
1698 - *
1699 - * @param int $course_id
1700 - * @param int $order_id - Optional. An user can be enrolled to a course
1701 - *
1702 - * @return bool|WP_Error
1703 - * @throws Exception
1704 - * @since 3.3.0
1705 - * @editor tungnx
1706 - * @version 3.3.1
1707 - * @modify 4.1.3 - comment - not use
1708 - */
1709 - // public function enroll_course( int $course_id = 0, int $order_id = 0 ) {
1710 - // $lp_user_items_db = LP_User_Items_DB::getInstance();
1711 - //
1712 - // try {
1713 - // /*$user_item_api = new LP_User_Item_CURD();
1714 - // $find_query = array(
1715 - // 'item_id' => $course_id,
1716 - // 'user_id' => $this->get_id(),
1717 - // );
1718 - //
1719 - // if ( $order_id ) {
1720 - // $find_query['ref_id'] = $order_id;
1721 - // }*/
1722 - //
1723 - // $filter = new LP_User_Items_Filter();
1724 - // $filter->user_id = get_current_user_id();
1725 - // $filter->item_id = $course_id;
1726 - // $course_item = $lp_user_items_db->get_last_user_course( $filter );
1727 - //
1728 - // if ( ! $course_item ) {
1729 - // $course_item = LP_User_Item::get_empty_item();
1730 - // } else {
1731 - // $course_item = (array) $course_item;
1732 - // }
1733 - //
1734 - // $user_id = $this->get_id();
1735 - //
1736 - // $course_item['user_id'] = $user_id;
1737 - // $course_item['item_id'] = $course_id;
1738 - // $course_item['item_type'] = learn_press_get_post_type( $course_id );
1739 - // $course_item['ref_id'] = $order_id;
1740 - // $course_item['ref_type'] = ( $order_id != 0 ) ? learn_press_get_post_type( $order_id ) : '';
1741 - // $course_item['start_time'] = current_time( 'mysql', true );
1742 - // $course_item['access_level'] = 50;
1743 - //
1744 - // /**
1745 - // * @editor tungnx
1746 - // * @fixed: case no auto enroll
1747 - // */
1748 - // if ( 'yes' == LP_Settings::get_option( 'auto_enroll' ) ) {
1749 - // $course_item['graduation'] = 'in-progress';
1750 - // }
1751 - //
1752 - // $user_course = new LP_User_Item_Course( $course_item );
1753 - // $user_course->set_status( LP_COURSE_PURCHASED );
1754 - //
1755 - // if ( ! $user_course->update( true ) ) {
1756 - // throw new Exception( __( 'Update user item error.', 'learnpress' ) );
1757 - // }
1758 - //
1759 - // /*$user_id = is_user_logged_in() ? $this->get_id() : 0;
1760 - //
1761 - // global $wpdb;
1762 - // $query = $wpdb->prepare(
1763 - // "
1764 - // UPDATE {$wpdb->learnpress_user_items}
1765 - // SET access_level = %d
1766 - // WHERE user_id = %d
1767 - // AND item_id = %d
1768 - // AND user_item_id NOT IN(%d)
1769 - // ",
1770 - // 0,
1771 - // $user_id,
1772 - // $course_id,
1773 - // $user_course->get_user_item_id()
1774 - // );
1775 - // $wpdb->query( $query );*/
1776 - //
1777 - // $return = $user_course->get_user_item_id();
1778 - // } catch ( Exception $ex ) {
1779 - // error_log( $ex->getMessage() );
1780 - // return false;
1781 - // }
1782 - //
1783 - // return $return;
1784 - // }
1785 -
1786 - /**
1787 - * Enroll this user to a course.
1788 - *
1789 - * @param int $course_id
1790 - * @param int $order_id
1791 - * @param bool $force - Optional. Force create db record for preview quiz case
1792 - * @param bool $wp_error - Optional. TRUE will return WP_Error object if there is an error.
1793 - * @editor tungnx - comment - not use
1794 - * @return bool|mixed|WP_Error
1795 - */
1796 - /*public function enroll( $course_id, $order_id, $force = false, $wp_error = false ) {
1797 - global $wpdb;
1798 -
1799 - _deprecated_function( __FUNCTION__, '4.1.0' );
1800 -
1801 - try {
1802 - $course = learn_press_get_course( $course_id );
1803 - $user_id = $this->get_id();
1804 -
1805 - if ( $course->is_required_enroll() && ! $force ) {
1806 - $order = learn_press_get_order( $order_id );
1807 -
1808 - if ( ! $order ) {
1809 - throw new Exception( __( 'Failed to enroll course.', 'learnpress' ), 10000 );
1810 - }
1811 -
1812 - if ( ! $this->can_enroll_course( $course_id ) ) {
1813 - throw new Exception( __( 'Failed to enroll course.', 'learnpress' ), 10001 );
1814 - }
1815 -
1816 - if ( ! $this->get_id() ) {
1817 - throw new Exception( __( 'Please login to enroll course.', 'learnpress' ), 10002 );
1818 - }
1819 - }
1820 -
1821 - $return = $this->enroll_course( $course_id, $order_id, false, $wp_error );
1822 -
1823 - return $return;
1824 -
1825 - } catch ( Exception $ex ) {
1826 - return new WP_Error( $ex->getCode(), $ex->getMessage() );
1827 - }
1828 - }*/
1829 -
1830 - /**
1831 964 * @param $question_id
1832 965 *
1833 966 * @return null|string
1834 967 */
@@ -1847,89 +980,8 @@
1847 980 return $wpdb->get_var( $query );
1848 981 }
1849 982
1850 983 /**
1851 - * @param $question_id
1852 - * @param null $quiz_id
1853 - *
1854 - * @return bool
1855 - */
1856 - public function get_answer_results( $question_id, $quiz_id = null ) {
1857 -
1858 - _deprecated_function( __CLASS__ . '::' . __FUNCTION__, '3.0.0' );
1859 -
1860 - $data = false;
1861 - if ( ! $quiz_id ) {
1862 - $quiz_id = $this->get_quiz_by_question( $question_id );
1863 - }
1864 - if ( $quiz_id ) {
1865 - $question = LP_Question::get_question( $question_id );
1866 -
1867 - if ( $question ) {
1868 - $quiz_results = $this->get_quiz_results( $quiz_id );
1869 - if ( ! empty( $quiz_results->question_answers ) ) {
1870 - $question_answer = array_key_exists(
1871 - $question_id,
1872 - $quiz_results->question_answers
1873 - ) ? $quiz_results->question_answers[ $question_id ] : null;
1874 - $data = $question->check( $question_answer );
1875 - }
1876 - }
1877 - }
1878 -
1879 - return $data;
1880 - }
1881 -
1882 - /**
1883 - * @param $question_id
1884 - * @param null $quiz_id
1885 - *
1886 - * @return bool
1887 - */
1888 - public function is_answered_question( $question_id, $quiz_id = null ) {
1889 - if ( empty( $this->answered_questions ) ) {
1890 - $this->answered_questions = array();
1891 - }
1892 - if ( ! $quiz_id ) {
1893 - $quiz_id = $this->get_quiz_by_question( $question_id );
1894 - }
1895 -
1896 - $results = $this->get_quiz_results( $quiz_id );
1897 - $answered = ! empty( $results->question_answers ) ? $results->question_answers : array();
1898 -
1899 - return $answered ? array_key_exists( $question_id, $answered ) : false;
1900 - }
1901 -
1902 - /**
1903 - * @param array $args
1904 - *
1905 - * @return LP_Query_List_Table
1906 - * @editor tungnx
1907 - * @deprecated 4.1.6
1908 - */
1909 - /*public function get_purchased_courses( array $args = array() ): LP_Query_List_Table {
1910 - $filter = new LP_User_Items_Filter();
1911 - $filter->fields = array( 'item_id' );
1912 - $filter->user_id = $this->get_id();
1913 - $filter->status = $args['status'] ?? '';
1914 - $filter->page = $args['paged'] ?? 1;
1915 - $filter->limit = $args['limit'] ?? $filter->limit;
1916 - $total_rows = 0;
1917 - $result_courses = LP_User_Item_Course::get_user_courses( $filter, $total_rows );
1918 -
1919 - $course_ids = LP_Course::get_course_ids( $result_courses, 'item_id' );
1920 -
1921 - $courses = array(
1922 - 'total' => $total_rows,
1923 - 'paged' => $filter->page,
1924 - 'limit' => $filter->limit,
1925 - 'items' => $course_ids,
1926 - );
1927 -
1928 - return new LP_Query_List_Table( $courses );
1929 - }*/
1930 -
1931 - /**
1932 984 * @return array
1933 985 */
1934 986 public function get_roles() {
1935 987 return (array) $this->get_data( 'roles' );
@@ -1952,25 +1004,8 @@
1952 1004 return $quiz_data ? $quiz_data->has_checked_question( $question_id ) : false;
1953 1005 }
1954 1006
1955 1007 /**
1956 - * @param $question_id
1957 - * @param $quiz_id
1958 - * @param int $course_id
1959 - *
1960 - * @return bool
1961 - */
1962 - public function has_hinted_answer( $question_id, $quiz_id, $course_id = 0 ) {
1963 - if ( ! $course_id ) {
1964 - $course_id = get_the_ID();
1965 - }
1966 -
1967 - $quiz_data = $this->get_item_data( $quiz_id, $course_id );
1968 -
1969 - return $quiz_data ? $quiz_data->has_hinted_question( $question_id ) : false;
1970 - }
1971 -
1972 - /**
1973 1008 * Return TRUE if user is already exists.
1974 1009 *
1975 1010 * @return bool
1976 1011 */
@@ -1994,13 +1029,33 @@
1994 1029 * @param mixed $size
1995 1030 *
1996 1031 * @return string
1997 1032 */
1998 - public function get_upload_profile_src( $size = '' ) {
1999 - 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();
2000 1035 }
2001 1036
2002 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 + /**
2003 1058 * @param string $type
2004 1059 * @param int $size
2005 1060 * @param bool $src_only
2006 1061 *
@@ -2011,11 +1066,13 @@
2011 1066 }
2012 1067
2013 1068 /**
2014 1069 * Get links socials of use on Profile page
1070 + * Icon is font awesome
2015 1071 *
2016 1072 * @param int $user_id
2017 1073 * @return array
1074 + * @deprecated 4.2.3
2018 1075 */
2019 1076 public function get_profile_socials( int $user_id = 0 ): array {
2020 1077 $socials = array();
2021 1078 $extra_info = learn_press_get_user_extra_profile_info( $user_id );
@@ -2027,21 +1084,24 @@
2027 1084 }
2028 1085
2029 1086 switch ( $k ) {
2030 1087 case 'facebook':
2031 - $i = '<i class="fab fa-facebook-f"></i>';
1088 + $i = '<i class="lp-icon-facebook-f"></i>';
2032 1089 break;
2033 1090 case 'twitter':
2034 - $i = '<i class="fab fa-twitter"></i>';
1091 + $i = '<i class="lp-icon-twitter"></i>';
2035 1092 break;
2036 1093 case 'googleplus':
2037 - $i = '<i class="fab fa-google-plus-g"></i>';
1094 + $i = '<i class="lp-icon-google-plus"></i>';
2038 1095 break;
2039 1096 case 'youtube':
2040 - $i = '<i class="fab fa-youtube"></i>';
1097 + $i = '<i class="lp-icon-youtube-play"></i>';
2041 1098 break;
1099 + case 'linkedin':
1100 + $i = '<i class="lp-icon-linkedin"></i>';
1101 + break;
2042 1102 default:
2043 - $i = sprintf( '<i class="fab fa-%s"></i>', $k );
1103 + $i = sprintf( '<i class="lp-icon-%s"></i>', $k );
2044 1104 }
2045 1105
2046 1106 $icon = apply_filters(
2047 1107 'learn-press/user-profile-social-icon',
@@ -2057,37 +1117,57 @@
2057 1117 return apply_filters( 'learn-press/user-profile-socials', $socials, $this->get_id(), $this );
2058 1118 }
2059 1119
2060 1120 /**
2061 - * Check if user can access to a course.
1121 + * Get links socials of use on Profile page
1122 + * Icon is svg
2062 1123 *
2063 - * @param int $course_id
2064 - *
2065 - * @return mixed
2066 - * @editor tungnx
2067 - * @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
2068 1128 */
2069 - /*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 );
2070 1132
2071 - $accessible = $this->has_course_access_level(
2072 - array(
2073 - LP_COURSE_ACCESS_LEVEL_60,
2074 - LP_COURSE_ACCESS_LEVEL_70,
2075 - ),
2076 - $course_id,
2077 - 'any'
2078 - );
1133 + if ( $extra_info ) {
1134 + foreach ( $extra_info as $k => $v ) {
1135 + if ( empty( $v ) ) {
1136 + continue;
1137 + }
2079 1138
2080 - $accessible = apply_filters(
2081 - 'learn-press/user-can-access-course',
2082 - $accessible,
2083 - $course_id,
2084 - $this->get_id()
2085 - );
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 + }
2086 1155
2087 - return $accessible;
2088 - }*/
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 + }
2089 1166
1167 + return apply_filters( 'learn-press/user-profile-socials', $socials, $this->get_id(), $this );
1168 + }
1169 +
2090 1170 /**
2091 1171 * Check course of user has graduation is in-progress
2092 1172 *
2093 1173 * @param $course_id
@@ -2097,9 +1177,9 @@
2097 1177 public function is_course_in_progress( $course_id ): bool {
2098 1178 $user = learn_press_get_user( $this->get_id() );
2099 1179 $user_course = $user->get_course_data( $course_id );
2100 1180
2101 - 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();
2102 1182 }
2103 1183
2104 1184 /**
2105 1185 * Return TRUE if user can do a quiz
@@ -2112,13 +1192,10 @@
2112 1192 */
2113 1193 public function can_do_quiz( $quiz_id, $course_id = 0 ) {
2114 1194 $course = learn_press_get_course( $course_id );
2115 1195
2116 - if ( $course->is_required_enroll() ) {
2117 - $can = $this->has_course_status(
2118 - $course_id,
2119 - array( 'enrolled' )
2120 - ) && ! $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 );
2121 1198 } else {
2122 1199 $can = ! $this->has_started_quiz( $quiz_id, $course_id );
2123 1200 }
2124 1201
@@ -2124,26 +1201,9 @@
2124 1201
2125 1202 return apply_filters( 'learn_press_user_can_do_quiz', $can, $quiz_id, $this->get_id(), $course_id );
2126 1203 }
2127 1204
2128 - public function evaluate_course_results( $course_id ) {
2129 - $user_course = $this->get_course_data( $course_id );
2130 -
2131 - return isset( $user_course ) ? $user_course->get_results( 'result' ) : 0;
2132 - }
2133 -
2134 1205 /**
2135 - * @editor tungnx
2136 - * @modify 4.1.4.1 - comment - not use
2137 - */
2138 - /*public function has_reached_passing_condition( $course_id ) {
2139 - $course = learn_press_get_course( $course_id );
2140 - $result = $this->evaluate_course_results( $course_id );
2141 -
2142 - return $return = $result >= $course->get_passing_condition();
2143 - }*/
2144 -
2145 - /**
2146 1206 * Check if all items in course completed.
2147 1207 *
2148 1208 * @return boolean
2149 1209 * @author Nhamdv <[email protected]>
@@ -2161,10 +1221,17 @@
2161 1221
2162 1222 return $course_results['completed_items'] >= $course->count_items();
2163 1223 }
2164 1224
1225 + /**
1226 + * Get role of user.
1227 + *
1228 + * @return string
1229 + * @since 3.0.0
1230 + * @version 1.0.1
1231 + */
2165 1232 public function get_role() {
2166 - return $this->is_admin() ? 'admin' : ( $this->is_instructor() ? 'instructor' : 'user' );
1233 + return $this->get_data( 'role' );
2167 1234 }
2168 1235
2169 1236 /**
2170 1237 * Get user course's grade.
@@ -2193,9 +1260,9 @@
2193 1260 *
2194 1261 * @return bool
2195 1262 */
2196 1263 public function is_guest(): bool {
2197 - return ! $this->get_id() || ! get_user_by( 'id', $this->get_id() );
1264 + return $this instanceof LP_User_Guest;
2198 1265 }
2199 1266
2200 1267 /**
2201 1268 * Check if user can edit a post.
@@ -2235,9 +1302,9 @@
2235 1302 *
2236 1303 * @return string
2237 1304 */
2238 1305 public function get_description(): string {
2239 - return $this->get_data( 'description', '' );
1306 + return get_the_author_meta( 'description', $this->get_id() );
2240 1307 }
2241 1308
2242 1309 /**
2243 1310 * Return user first name.