PageRenderTime 47ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/wp-content/plugins/learnpress/inc/user/lp-user-functions.php

https://gitlab.com/gregtyka/lfmawordpress
PHP | 384 lines | 276 code | 48 blank | 60 comment | 44 complexity | 45566acc2e974b2e94a12973e42253e0 MD5 | raw file
  1. <?php
  2. /**
  3. * Common functions to process actions about user
  4. *
  5. * @author ThimPress
  6. * @package LearnPress/Functions/User
  7. * @version 1.0
  8. */
  9. add_action( 'learn_press_user_finished_course', 'learn_press_user_finished_course_send_email', 999, 2 );
  10. function learn_press_user_finished_course_send_email( $course_id = null, $user_id = null ) {
  11. $course_id = learn_press_get_course_id( $course_id );
  12. if ( !$user_id ) $user_id = get_current_user_id();
  13. $user = get_user_by( 'id', $user_id );
  14. if ( empty( $user->ID ) || !$course_id ) return false;
  15. $mail_to = $user->user_email;
  16. $assessment = get_post_meta( $course_id, '_lpr_course_final', true );
  17. if ( 'yes' == $assessment ) {
  18. $quiz_id = lpr_get_final_quiz( $course_id );
  19. $quiz_result = learn_press_get_quiz_result( $user_id, $quiz_id );
  20. $course_result = $quiz_result['mark_percent'] * 100;
  21. } else {
  22. $course_result = 100;
  23. }
  24. $args = apply_filters(
  25. 'learn_press_vars_passed_course',
  26. array(
  27. 'user_name' => !empty( $user->display_name ) ? $user->display_name : $user->user_nicename,
  28. 'course_name' => get_the_title( $course_id ),
  29. 'course_link' => get_permalink( $course_id ),
  30. 'course_result' => sprintf( __( '%d%% of total', 'learnpress' ), intval( $course_result ) )
  31. )
  32. );
  33. learn_press_send_mail(
  34. $mail_to,
  35. 'passed_course',
  36. $args
  37. );
  38. }
  39. /**
  40. * @return int
  41. */
  42. function learn_press_get_current_user_id() {
  43. $user = learn_press_get_current_user();
  44. return $user->id;
  45. }
  46. /**
  47. * Get current user
  48. * @return LP_User
  49. */
  50. function learn_press_get_current_user() {
  51. $user_id = get_current_user_id();
  52. $current_user = false;
  53. if ( $user_id ) {
  54. $current_user = learn_press_get_user( $user_id );
  55. } else {
  56. $current_user = LP_User_Guest::instance();
  57. }
  58. return $current_user;
  59. }
  60. /**
  61. * @param $user_id
  62. *
  63. * @param bool $force
  64. *
  65. * @return LP_User_Guest|mixed
  66. */
  67. function learn_press_get_user( $user_id, $force = false ) {
  68. if ( $user_id ) {
  69. return LP_User::get_user( $user_id, $force );
  70. }
  71. return LP_User_Guest::instance();
  72. }
  73. /**
  74. * Get all prerequisite courses that user need to pass before take a course
  75. *
  76. * @param bool $user_id
  77. * @param $course_id -=90a4
  78. *
  79. * @return array|bool
  80. */
  81. function learn_press_user_prerequisite_courses( $user_id = false, $course_id ) {
  82. if ( !$user_id ) {
  83. $user = learn_press_get_current_user();
  84. $user_id = $user->ID;
  85. }
  86. $prerequisite = (array) get_post_meta( $course_id, '_lpr_course_prerequisite', true );
  87. $courses = false;
  88. if ( $prerequisite ) {
  89. $course_completed = get_user_meta( $user_id, '_lpr_course_completed', true );
  90. foreach ( $prerequisite as $course ) {
  91. if ( $course && $course_completed ) {
  92. if ( !array_key_exists( $course, $course_completed ) ) {
  93. if ( !$courses ) $courses = array();
  94. $courses[] = $course;
  95. }
  96. }
  97. }
  98. }
  99. return $courses;
  100. }
  101. function learn_press_before_take_course_prerequisite( $can_take, $user_id, $course_id ) {
  102. return false == learn_press_user_prerequisite_courses( $user_id, $course_id );
  103. }
  104. //add_filter( 'learn_press_before_take_course', 'learn_press_before_take_course_prerequisite', 5, 3 );
  105. function learn_press_send_user_email_order( $status, $order_id ) {
  106. return;
  107. $status = strtolower( $status );
  108. if ( 'completed' == $status ) {
  109. $order = new LP_Order( $order_id );
  110. $mail_to = $order->get_user( 'email' );
  111. $instructors = array();
  112. $course_title = '';
  113. $transaction_object = $order->get_items();
  114. $items = $transaction_object->products;
  115. $item = array_shift( $items );
  116. $course = get_post( $item['id'] );
  117. $course_title = get_the_title( $item['id'] );
  118. $instructor = LP_User::get_user( $course->post_author );
  119. $instructors[$instructor->ID] = $instructor->data->display_name;
  120. learn_press_send_mail(
  121. $mail_to,
  122. 'enrolled_course',
  123. apply_filters(
  124. 'learn_press_vars_enrolled_course',
  125. array(
  126. 'user_name' => $order->get_user( 'display_name' ),
  127. 'course_name' => $course_title,
  128. 'course_link' => get_permalink( $item['id'] )
  129. ),
  130. $course,
  131. $instructor
  132. )
  133. );
  134. }
  135. }
  136. add_action( 'learn_press_update_order_status', 'learn_press_send_user_email_order', 5, 2 );
  137. /**
  138. * Add more 2 user roles teacher and student
  139. *
  140. * @access public
  141. * @return void
  142. */
  143. function learn_press_add_user_roles() {
  144. $settings = LP()->settings;
  145. /* translators: user role */
  146. _x( 'Instructor', 'User role' );
  147. add_role(
  148. LP()->teacher_role,
  149. 'Instructor',
  150. array()
  151. );
  152. $course_cap = LP()->course_post_type . 's';
  153. $lesson_cap = LP()->lesson_post_type . 's';
  154. $order_cap = LP()->order_post_type . 's';
  155. // teacher
  156. $teacher = get_role( LP()->teacher_role );
  157. $teacher->add_cap( 'delete_published_' . $course_cap );
  158. $teacher->add_cap( 'edit_published_' . $course_cap );
  159. $teacher->add_cap( 'edit_' . $course_cap );
  160. $teacher->add_cap( 'delete_' . $course_cap );
  161. $settings->get( 'required_review' );
  162. if ( $settings->get( 'required_review' ) == 'yes' ) {
  163. $teacher->remove_cap( 'publish_' . $course_cap );
  164. } else {
  165. $teacher->add_cap( 'publish_' . $course_cap );
  166. }
  167. //
  168. $teacher->add_cap( 'delete_published_' . $lesson_cap );
  169. $teacher->add_cap( 'edit_published_' . $lesson_cap );
  170. $teacher->add_cap( 'edit_' . $lesson_cap );
  171. $teacher->add_cap( 'delete_' . $lesson_cap );
  172. $teacher->add_cap( 'publish_' . $lesson_cap );
  173. $teacher->add_cap( 'upload_files' );
  174. $teacher->add_cap( 'read' );
  175. $teacher->add_cap( 'edit_posts' );
  176. // administrator
  177. $admin = get_role( 'administrator' );
  178. $admin->add_cap( 'delete_' . $course_cap );
  179. $admin->add_cap( 'delete_published_' . $course_cap );
  180. $admin->add_cap( 'edit_' . $course_cap );
  181. $admin->add_cap( 'edit_published_' . $course_cap );
  182. $admin->add_cap( 'publish_' . $course_cap );
  183. $admin->add_cap( 'delete_private_' . $course_cap );
  184. $admin->add_cap( 'edit_private_' . $course_cap );
  185. $admin->add_cap( 'delete_others_' . $course_cap );
  186. $admin->add_cap( 'edit_others_' . $course_cap );
  187. $admin->add_cap( 'delete_' . $lesson_cap );
  188. $admin->add_cap( 'delete_published_' . $lesson_cap );
  189. $admin->add_cap( 'edit_' . $lesson_cap );
  190. $admin->add_cap( 'edit_published_' . $lesson_cap );
  191. $admin->add_cap( 'publish_' . $lesson_cap );
  192. $admin->add_cap( 'delete_private_' . $lesson_cap );
  193. $admin->add_cap( 'edit_private_' . $lesson_cap );
  194. $admin->add_cap( 'delete_others_' . $lesson_cap );
  195. $admin->add_cap( 'edit_others_' . $lesson_cap );
  196. $admin->add_cap( 'delete_' . $order_cap );
  197. $admin->add_cap( 'delete_published_' . $order_cap );
  198. $admin->add_cap( 'edit_' . $order_cap );
  199. $admin->add_cap( 'edit_published_' . $order_cap );
  200. $admin->add_cap( 'publish_' . $order_cap );
  201. $admin->add_cap( 'delete_private_' . $order_cap );
  202. $admin->add_cap( 'edit_private_' . $order_cap );
  203. $admin->add_cap( 'delete_others_' . $order_cap );
  204. $admin->add_cap( 'edit_others_' . $order_cap );
  205. }
  206. add_action( 'init', 'learn_press_add_user_roles' );
  207. function learn_press_get_user_questions( $user_id = null, $args = array() ) {
  208. if ( !$user_id ) {
  209. $user_id = get_current_user_id();
  210. }
  211. return learn_press_get_user( $user_id )->get_questions( $args );
  212. }
  213. /**
  214. * Get the type of current user
  215. *
  216. * @param null $check_type
  217. *
  218. * @return bool|string
  219. */
  220. function learn_press_current_user_is( $check_type = null ) {
  221. global $current_user;
  222. $user_roles = $current_user->roles;
  223. $user_type = '';
  224. // backward compatible
  225. if ( in_array( 'lpr_teacher', $user_roles ) ) {
  226. $user_type = 'instructor';
  227. } elseif ( in_array( 'lp_teacher', $user_roles ) ) {
  228. $user_type = 'instructor';
  229. } elseif ( in_array( 'administrator', $user_roles ) ) {
  230. $user_type = 'administrator';
  231. }
  232. return $check_type ? $check_type == $user_type : $user_type;
  233. }
  234. function learn_press_user_has_roles( $roles, $user_id = null ) {
  235. $has_role = false;
  236. if ( !$user_id ) {
  237. $user = wp_get_current_user();
  238. } else {
  239. $user = get_user_by( 'id', $user_id );
  240. }
  241. $available_roles = (array) $user->roles;
  242. if ( is_array( $roles ) ) {
  243. foreach ( $roles as $role ) {
  244. if ( in_array( $role, $available_roles ) ) {
  245. $has_role = true;
  246. break; // only need one of roles is in available
  247. }
  248. }
  249. } else {
  250. if ( in_array( $roles, $available_roles ) ) {
  251. $has_role = true;
  252. }
  253. }
  254. return $has_role;
  255. }
  256. function learn_press_edit_admin_bar() {
  257. global $wp_admin_bar;
  258. if ( ( $profile = learn_press_get_page_id( 'profile' ) ) && get_post_type( $profile ) == 'page' && ( LP()->settings->get( 'admin_bar_link' ) == 'yes' ) ) {
  259. $text = LP()->settings->get( 'admin_bar_link_text' );
  260. $course_profile = array();
  261. $course_profile['id'] = 'course_profile';
  262. $course_profile['parent'] = 'user-actions';
  263. $course_profile['title'] = $text ? $text : get_the_title( $profile );
  264. $course_profile['href'] = learn_press_get_page_link( 'profile' );
  265. $course_profile['meta']['target'] = LP()->settings->get( 'admin_bar_link_target' );
  266. $wp_admin_bar->add_menu( $course_profile );
  267. }
  268. $current_user = wp_get_current_user();
  269. // add `be teacher` link
  270. if ( in_array( LP()->teacher_role, $current_user->roles ) || in_array( 'administrator', $current_user->roles ) ) {
  271. return;
  272. }
  273. //if ( !class_exists( 'LP_Admin_Settings' ) ) return;
  274. /**
  275. * $settings = LP_Admin_Settings::instance( 'general' );
  276. * if ( $settings->get( 'instructor_registration' ) ) {
  277. * $be_teacher = array();
  278. * $be_teacher['id'] = 'be_teacher';
  279. * $be_teacher['parent'] = 'user-actions';
  280. * $be_teacher['title'] = __( 'Become An Instructor', 'learnpress' );
  281. * $be_teacher['href'] = '#';
  282. * $wp_admin_bar->add_menu( $be_teacher );
  283. * }*/
  284. }
  285. add_action( 'admin_bar_menu', 'learn_press_edit_admin_bar' );
  286. function learn_press_current_user_can_view_profile_section( $section, $user ) {
  287. $current_user = wp_get_current_user();
  288. $view = true;
  289. if ( $user->user_login != $current_user->user_login && $section == LP()->settings->get( 'profile_endpoints.profile-orders', 'profile-orders' ) ) {
  290. $view = false;
  291. }
  292. return apply_filters( 'learn_press_current_user_can_view_profile_section', $view, $section, $user );
  293. }
  294. function learn_press_profile_tab_courses_content( $current, $tab, $user ) {
  295. learn_press_get_template( 'profile/tabs/courses.php', array( 'user' => $user, 'current' => $current, 'tab' => $tab ) );
  296. }
  297. function learn_press_profile_tab_quizzes_content( $current, $tab, $user ) {
  298. learn_press_get_template( 'profile/tabs/quizzes.php', array( 'user' => $user, 'current' => $current, 'tab' => $tab ) );
  299. }
  300. function learn_press_profile_tab_orders_content( $current, $tab, $user ) {
  301. learn_press_get_template( 'profile/tabs/orders.php', array( 'user' => $user, 'current' => $current, 'tab' => $tab ) );
  302. }
  303. function learn_press_after_logged_in() {
  304. }
  305. add_action( 'wp_login', 'learn_press_after_logged_in' );
  306. function head_head_head() {
  307. }
  308. add_action( 'admin_head', 'head_head_head' );
  309. function learn_press_update_user_lesson_start_time() {
  310. global $course, $wpdb;
  311. if ( !$course->id || !( $lesson = $course->current_lesson ) ) {
  312. return;
  313. }
  314. $query = $wpdb->prepare( "
  315. SELECT user_lesson_id FROM {$wpdb->prefix}learnpress_user_lessons WHERE user_id = %d AND lesson_id = %d AND course_id = %d
  316. ", get_current_user_id(), $lesson->id, $course->id );
  317. if ( $wpdb->get_row( $query ) ) {
  318. return;
  319. }
  320. $wpdb->insert(
  321. $wpdb->prefix . 'learnpress_user_lessons',
  322. array(
  323. 'user_id' => get_current_user_id(),
  324. 'lesson_id' => $lesson->id,
  325. 'start_time' => current_time( 'mysql' ),
  326. 'status' => 'stared',
  327. 'course_id' => $course->id
  328. ),
  329. array( '%d', '%d', '%s', '%s', '%d' )
  330. );
  331. }
  332. add_action( 'learn_press_course_content_lesson', 'learn_press_update_user_lesson_start_time' );
  333. function learn_press_get_profile_user() {
  334. global $wp;
  335. return !empty( $wp->query_vars['user'] ) ? get_user_by( 'login', $wp->query_vars['user'] ) : false;
  336. }