1: <?php
2: if ( ! defined( 'ABSPATH' ) ) exit;
3:
4: 5: 6: 7: 8: 9: 10: 11: 12:
13: class Sensei_Teacher {
14:
15: 16: 17: 18: 19: 20: 21: 22:
23: protected $teacher_role;
24:
25: 26: 27: 28: 29: 30: 31: 32:
33: public $token;
34:
35: 36: 37: 38: 39: 40: 41: 42:
43: public function __construct ( ) {
44:
45: add_action( 'add_meta_boxes', array( $this , 'add_teacher_meta_boxes' ) , 10, 2 );
46: add_action( 'save_post', array( $this, 'save_teacher_meta_box' ) );
47: add_filter( 'parse_query', array( $this, 'limit_teacher_edit_screen_post_types' ));
48: add_filter( 'pre_get_posts', array( $this, 'course_analysis_teacher_access_limit' ) );
49: add_filter( 'wp_count_posts', array( $this, 'list_table_counts' ), 10, 3 );
50:
51: add_action( 'pre_get_posts', array( $this, 'filter_queries' ) );
52:
53:
54: add_filter( 'sensei_check_for_activity' , array( $this, 'filter_grading_activity_queries') );
55:
56:
57: add_filter('sensei_count_statuses_args', array( $this, 'limit_grading_totals' ) );
58:
59:
60: add_filter( 'pre_get_posts', array( $this, 'add_courses_to_author_archive' ) );
61:
62:
63: add_action( 'transition_post_status',array( $this, 'notify_admin_teacher_course_creation' ), 10, 3 );
64:
65:
66: add_filter( 'sensei_analysis_overview_filter_users',array( $this, 'limit_analysis_learners' ) , 5, 1 );
67:
68:
69: add_filter( 'sensei_lesson_quiz_questions', array( $this, 'allow_teacher_access_to_questions' ), 20, 2 );
70:
71:
72: add_filter('manage_edit-course_columns' , array( $this, 'course_column_heading'), 10,1 );
73: add_filter('manage_course_posts_custom_column' , array( $this, 'course_column_data'), 10,2 );
74:
75:
76: add_filter( 'pre_get_posts', array( $this, 'limit_edit_messages_query' ) );
77:
78:
79: add_action( 'restrict_manage_posts', array( $this, 'course_teacher_filter_options' ) );
80: add_filter( 'request', array( $this, 'teacher_filter_query_modify' ) );
81:
82:
83: add_filter( 'request', array( $this, 'restrict_media_library' ), 10, 1 );
84: add_filter( 'ajax_query_attachments_args', array( $this, 'restrict_media_library_modal' ), 10, 1 );
85:
86:
87: add_action( 'save_post', array( $this, 'update_lesson_teacher' ) );
88:
89:
90: add_filter( 'wp_login', array( $this, 'teacher_login_redirect') , 10, 2 );
91:
92:
93: add_action( 'admin_menu', array( $this, 'restrict_posts_menu_page'), 10);
94: add_filter('pre_get_comments', array ($this, 'restrict_comment_moderation'), 10, 1);
95:
96:
97: }
98:
99: 100: 101: 102: 103: 104: 105: 106: 107: 108:
109: public function create_role ( ) {
110:
111:
112: $this->teacher_role = get_role( 'teacher' );
113:
114:
115: if ( ! is_a( $this->teacher_role, 'WP_Role' ) ) {
116:
117: $this->teacher_role = add_role( 'teacher', __( 'Teacher', 'woothemes-sensei' ) );
118: }
119:
120:
121: $this->add_capabilities();
122:
123: }
124:
125: 126: 127: 128: 129: 130:
131: protected function add_capabilities ( ) {
132:
133:
134: if( ! is_a( $this->teacher_role, 'WP_Role' ) || empty( $this->teacher_role ) ) {
135: return;
136: }
137:
138: 139: 140: 141: 142: 143: 144:
145: $caps = apply_filters( 'sensei_teacher_role_capabilities', array(
146:
147: 'read' => true,
148: 'manage_sensei_grades' => true,
149: 'moderate_comments'=> true,
150: 'upload_files' => true,
151: 'edit_files' => true,
152:
153:
154: 'publish_lessons' => true,
155: 'manage_lesson_categories' => true,
156: 'edit_lessons' => true,
157: 'edit_published_lessons' => true,
158: 'edit_private_lessons' => true,
159: 'read_private_lessons' => true,
160: 'delete_published_lessons' => true,
161:
162:
163: 'create_courses' => true,
164: 'publish_courses' => false,
165: 'manage_course_categories' => true,
166: 'edit_courses' => true,
167: 'edit_published_courses' => true,
168: 'edit_private_courses' => true,
169: 'read_private_courses' => true,
170: 'delete_published_courses' => true,
171:
172:
173: 'publish_quizzes' => true,
174: 'edit_quizzes' => true,
175: 'edit_published_quizzes' => true,
176: 'edit_private_quizzes' => true,
177: 'read_private_quizzes' => true,
178:
179:
180: 'publish_questions' => true,
181: 'edit_questions' => true,
182: 'edit_published_questions' => true,
183: 'edit_private_questions' => true,
184: 'read_private_questions' => true,
185:
186:
187: 'publish_sensei_messages' => true,
188: 'edit_sensei_messages' => true,
189: 'edit_published_sensei_messages' => true,
190: 'edit_private_sensei_messages' => true,
191: 'read_private_sensei_messages' => true,
192:
193:
194:
195:
196:
197:
198: 'edit_posts' => true,
199:
200: ));
201:
202: foreach ( $caps as $cap => $grant ) {
203:
204:
205: $this->teacher_role->add_cap($cap, $grant);
206:
207: }
208:
209: }
210:
211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221:
222: public function add_teacher_meta_boxes ( $post ) {
223:
224: if( !current_user_can('manage_options') ){
225: return;
226: }
227: add_meta_box( 'sensei-teacher', __( 'Teacher' , 'woothemes-sensei'), array( $this , 'teacher_meta_box_content' ),
228: 'course',
229: 'side',
230: 'core'
231: );
232:
233: }
234:
235: 236: 237: 238: 239: 240: 241: 242: 243:
244: public function teacher_meta_box_content ( $post ) {
245:
246:
247: $current_author = $post->post_author;
248:
249:
250: $users = $this->get_teachers_and_authors();
251:
252: ?>
253: <select name="sensei-course-teacher-author" class="sensei course teacher">
254:
255: <?php foreach ( $users as $user_id ) { ?>
256:
257: <?php
258: $user = get_user_by('id', $user_id);
259: ?>
260: <option <?php selected( $current_author , $user_id , true ); ?> value="<?php echo $user_id; ?>" >
261: <?php echo $user->display_name; ?>
262: </option>
263:
264: <?php }
265:
266: </select>
267:
268: <?php
269:
270: }
271:
272: 273: 274: 275: 276: 277: 278: 279: 280: 281:
282: public function get_teachers_and_authors ( ){
283:
284: $author_query_args = array(
285: 'blog_id' => $GLOBALS['blog_id'],
286: 'fields' => 'any',
287: 'who' => 'authors'
288: );
289:
290: $authors = get_users( $author_query_args );
291:
292: $teacher_query_args = array(
293: 'blog_id' => $GLOBALS['blog_id'],
294: 'fields' => 'any',
295: 'role' => 'teacher',
296: );
297:
298: $teachers = get_users( $teacher_query_args );
299:
300: return array_unique( array_merge( $teachers, $authors ) );
301:
302: }
303:
304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315:
316: public function save_teacher_meta_box ( $course_id ){
317:
318:
319: if(! isset( $_POST[ 'sensei-course-teacher-author' ] ) || ! isset( $_POST['post_ID'] ) ){
320: return;
321: }
322:
323:
324: remove_action('save_post', array( $this, 'save_teacher_meta_box' ) );
325:
326:
327: $post = get_post( $course_id );
328:
329:
330: $current_author = absint( $post->post_author );
331: $new_author = absint( $_POST[ 'sensei-course-teacher-author' ] );
332:
333:
334: $this->update_course_lessons_author( $course_id , $new_author );
335:
336:
337: if( $current_author == $new_author ){
338: return;
339: }
340:
341:
342: $post_updates = array(
343: 'ID' => $post->ID ,
344: 'post_author' => $new_author
345: );
346: wp_update_post( $post_updates );
347:
348:
349: Sensei_Teacher::update_course_modules_author( $course_id, $new_author );
350:
351:
352: $this->teacher_course_assigned_notification( $new_author, $course_id );
353:
354: }
355:
356: 357: 358: 359: 360: 361: 362: 363: 364: 365:
366: public static function update_course_modules_author( $course_id ,$new_teacher_id ){
367:
368: if( empty( $course_id ) || empty( $new_teacher_id ) ){
369: return;
370: }
371:
372: $terms_selected_on_course = wp_get_object_terms( $course_id, 'module' );
373:
374: if( empty( $terms_selected_on_course ) ){
375: return;
376: }
377:
378: foreach( $terms_selected_on_course as $term ){
379:
380: $term_author = Sensei_Core_Modules::get_term_author( $term->slug );
381: if( $new_teacher_id != $term_author->ID ){
382:
383: $new_term = '';
384:
385:
386: if( user_can( $new_teacher_id, 'manage_options' ) ){
387:
388: $slug_without_teacher_id = str_ireplace(' ', '-', trim( $term->name ) );
389: $term_args = array( 'slug'=> $slug_without_teacher_id, 'hide_empty' => false, );
390: $existing_admin_terms = get_terms( 'module', $term_args );
391: if( !empty( $existing_admin_terms ) ){
392:
393: $new_term = get_term( $existing_admin_terms[0]->term_id, 'module', ARRAY_A );
394: }
395: }
396:
397: if( empty ( $new_term ) ){
398:
399:
400: $new_author_term_slug = $new_teacher_id . '-' . str_ireplace(' ', '-', trim( $term->name ) );
401:
402:
403: $new_term = wp_insert_term( $term->name,'module', array('slug'=> $new_author_term_slug ) );
404:
405: }
406:
407:
408:
409:
410: if( is_wp_error( $new_term ) && isset( $new_term->errors['term_exists'] ) ){
411:
412: $existing_term = get_term_by( 'slug', $new_author_term_slug, 'module');
413: $term_id = $existing_term->term_id;
414:
415: }else{
416:
417:
418: $term_id = $new_term['term_id'];
419:
420: }
421:
422:
423: wp_set_object_terms( $course_id, $term_id , 'module', true );
424:
425:
426: wp_remove_object_terms( $course_id, $term->term_id, 'module' );
427:
428:
429: $lessons = Sensei()->course->course_lessons( $course_id );
430: foreach( $lessons as $lesson ){
431:
432: if( has_term( $term->slug, 'module', $lesson ) ){
433:
434:
435:
436: wp_set_object_terms( $lesson->ID, $term_id , 'module', false );
437: update_post_meta( $lesson->ID, '_order_module_' . intval( $term_id ), 0 );
438: }
439:
440: }
441:
442: }
443: }
444:
445: }
446:
447: 448: 449: 450: 451: 452: 453: 454: 455: 456:
457: public function update_course_lessons_author ( $course_id, $new_author ){
458:
459:
460: if( empty( $course_id ) || empty( $new_author ) ){
461: return false;
462: }
463:
464:
465: $lessons = Sensei()->course->course_lessons( $course_id );
466:
467: if( empty( $lessons ) || ! is_array( $lessons ) ){
468: return false;
469: }
470:
471:
472: foreach( $lessons as $lesson ){
473:
474:
475: if( $new_author == $lesson->post_author ){
476: continue;
477: }
478:
479:
480: wp_update_post( array(
481: 'ID'=> $lesson->ID,
482: 'post_author' => $new_author
483: ) );
484:
485:
486:
487: $lesson_quizzes = Sensei()->lesson->lesson_quizzes( $lesson->ID );
488: if( is_array( $lesson_quizzes ) ){
489: foreach ( $lesson_quizzes as $quiz_id ) {
490:
491: wp_update_post( array(
492: 'ID' => $quiz_id,
493: 'post_author' => $new_author
494: ) );
495: }
496: }else{
497: wp_update_post( array(
498: 'ID' => $lesson_quizzes,
499: 'post_author' => $new_author
500: ) );
501: }
502:
503: }
504:
505: return true;
506:
507: }
508:
509:
510:
511: 512: 513: 514: 515: 516: 517: 518: 519: 520:
521: public function course_analysis_teacher_access_limit ( $query ) {
522:
523: if( ! is_admin() || ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
524: return $query;
525: }
526:
527: if ( ! function_exists( 'get_current_screen' ) ) {
528: return $query;
529: }
530:
531: $screen = get_current_screen();
532: $sensei_post_types = array('course', 'lesson', 'question' );
533:
534:
535: $limit_screen_ids = array( 'sensei_page_sensei_analysis', 'course_page_module-order' );
536:
537: if( ! $this->is_admin_teacher() || empty( $screen ) || ! in_array( $screen->id ,$limit_screen_ids )
538: || ! in_array( $query->query['post_type'], $sensei_post_types ) ){
539: return $query;
540: }
541:
542: global $current_user;
543:
544: $query->set( 'author', $current_user->ID );
545: return $query;
546:
547: }
548:
549:
550: 551: 552: 553: 554: 555: 556: 557: 558: 559:
560: public function is_admin_teacher ( ){
561:
562: if( ! is_user_logged_in()){
563: return false;
564: }
565: $is_admin_teacher = false;
566:
567: if( is_admin() && Sensei_Teacher::is_a_teacher( get_current_user_id() ) ){
568:
569: $is_admin_teacher = true;
570:
571: }
572:
573: return $is_admin_teacher;
574:
575: }
576:
577: 578: 579: 580: 581: 582: 583: 584: 585: 586:
587: public function list_table_counts( $counts, $type, $perm ) {
588: global $current_user;
589:
590: if( ! in_array( $type, array( 'course', 'lesson', 'question' ) ) ) {
591: return $counts;
592: }
593:
594: if( ! $this->is_admin_teacher() ) {
595: return $counts;
596: }
597:
598: $args = array(
599: 'post_type' => $type,
600: 'author' => $current_user->ID,
601: 'posts_per_page' => -1
602: );
603:
604:
605: $stati = get_post_stati();
606:
607:
608: foreach( $stati as $status ) {
609: $args['post_status'] = $status;
610: $posts = get_posts( $args );
611: $counts->$status = count( $posts );
612: }
613:
614: return $counts;
615: }
616:
617: 618: 619: 620: 621: 622: 623: 624:
625: public function filter_queries ( $query ) {
626: global $current_user;
627:
628: if( ! $this->is_admin_teacher() ) {
629: return;
630: }
631:
632: if ( ! function_exists( 'get_current_screen' ) ) {
633: return;
634: }
635:
636: $screen = get_current_screen();
637: if( empty( $screen ) ) {
638: return $query;
639: }
640: switch( $screen->id ) {
641: case 'sensei_page_sensei_grading':
642: case 'sensei_page_sensei_analysis':
643: case 'sensei_page_sensei_learners':
644: case 'lesson':
645: case 'course':
646: case 'question':
647: case 'lesson_page_module-order':
648:
649: 650: 651: 652: 653: 654: 655: 656: 657: 658:
659: $query->set( 'author', apply_filters( 'sensei_filter_queries_set_author', $current_user->ID, $screen->id ) );
660: break;
661: }
662: }
663:
664: 665: 666: 667: 668: 669: 670: 671: 672: 673:
674: public function filter_grading_activity_queries( $comments ){
675:
676: if( !is_admin() || ! $this->is_admin_teacher() || is_numeric( $comments ) || ! is_array( $comments ) ){
677: return $comments ;
678: }
679:
680:
681: $screen = get_current_screen();
682:
683: if( empty( $screen ) || 'sensei_page_sensei_grading' != $screen->id ){
684: return $comments;
685: }
686:
687:
688:
689: foreach( $comments as $key => $comment){
690: $lesson = get_post( $comment->comment_post_ID );
691: $course_id = Sensei()->lesson->get_course_id( $lesson->ID );
692: $course = get_post( $course_id );
693: if( ! isset( $course->post_author ) || intval( $course->post_author) != intval( get_current_user_id() ) ){
694:
695: unset( $comments[ $key ] );
696: }
697: }
698: return $comments ;
699:
700: }
701:
702: 703: 704: 705: 706: 707: 708: 709: 710: 711: 712: 713:
714: public function limit_grading_totals( $args ){
715:
716: if( !is_admin() || ! $this->is_admin_teacher() || ! is_array( $args ) ){
717: return $args ;
718: }
719:
720:
721:
722: $courses = Sensei()->course->get_all_courses();
723:
724: if( empty( $courses ) || ! is_array( $courses ) ){
725: return $args;
726: }
727:
728:
729: $quiz_scope = array();
730: foreach( $courses as $course ){
731:
732: $course_lessons = Sensei()->course->course_lessons( $course->ID );
733:
734: if( ! empty( $course_lessons ) && is_array( $course_lessons ) ){
735:
736: foreach( $course_lessons as $lesson ){
737:
738: $quiz_id = Sensei()->lesson->lesson_quizzes( $lesson->ID );
739: if( !empty( $quiz_id ) ) {
740:
741: array_push( $quiz_scope, $quiz_id );
742:
743: }
744:
745: }
746:
747: }
748:
749: }
750:
751: $args['post__in'] = $quiz_scope;
752:
753: return $args;
754: }
755:
756: 757: 758: 759: 760: 761: 762: 763:
764: public function add_courses_to_author_archive( $query ) {
765:
766: if ( is_admin() || ! $query->is_author() ){
767: return $query;
768: }
769:
770:
771: $current_page_user = get_user_by('login', $query->get('author_name') );
772: if( ! $current_page_user || ! in_array('teacher', $current_page_user->roles ) ) {
773:
774: return $query;
775:
776: }
777:
778:
779: $current_post_types = $query->get( 'post_type' );
780: if( empty( $current_post_types ) ){
781:
782:
783: $new_post_types = array( 'post', 'course' );
784:
785: } elseif( is_array( $current_post_types ) ) {
786:
787:
788: $new_post_types = array_merge( $current_post_types, array( 'course' ) );
789:
790: }else{
791:
792:
793: $new_post_types = array( $current_post_types , 'course');
794:
795: }
796:
797:
798: $query->set('post_type', $new_post_types );
799:
800: 801: 802: 803: 804: 805:
806: return apply_filters( 'sensei_teacher_archive_query', $query );
807:
808: }
809:
810: 811: 812: 813: 814: 815: 816: 817: 818:
819: public function teacher_course_assigned_notification( $teacher_id, $course_id ){
820:
821: if( 'course' != get_post_type( $course_id ) || ! get_userdata( $teacher_id ) ){
822: return false;
823: }
824:
825:
826: if( $teacher_id == get_current_user_id() ){
827: return true;
828: }
829:
830:
831: include('emails/class-sensei-email-teacher-new-course-assignment.php');
832: $email = new Sensei_Email_Teacher_New_Course_Assignment();
833: $email->trigger( $teacher_id, $course_id );
834:
835: return true;
836: }
837:
838: 839: 840: 841: 842: 843: 844: 845: 846:
847: public function notify_admin_teacher_course_creation( $new_status, $old_status, $post ){
848:
849: $course_id = $post->ID;
850:
851: if( 'publish'== $old_status || 'course' != get_post_type( $course_id ) || 'auto-draft' == get_post_status( $course_id )
852: || 'trash' == get_post_status( $course_id ) || 'draft' == get_post_status( $course_id ) ) {
853:
854: return false;
855:
856: }
857:
858: 859: 860: 861: 862: 863: 864: 865:
866: if( ! apply_filters('sensei_notify_admin_new_course_creation', true ) ){
867: return false;
868: }
869:
870:
871: global $sensei_email_data;
872: $template = 'admin-teacher-new-course-created';
873: $course = get_post( $course_id );
874: $teacher = new WP_User( $course->post_author );
875: $recipient = get_option('admin_email', true);
876:
877:
878: if( $recipient == $teacher->user_email || current_user_can( 'manage_options' )){
879: return false;
880: }
881:
882: 883: 884: 885: 886: 887:
888: $heading = apply_filters( 'sensei_email_heading', __( 'New course created.', 'woothemes-sensei' ), $template );
889:
890: 891: 892: 893: 894: 895: 896: 897:
898: $subject = apply_filters('sensei_email_subject',
899: '['. get_bloginfo( 'name', 'display' ) .'] '. __( 'New course created by', 'woothemes-sensei' ) . ' ' . $teacher->display_name ,
900: $template );
901:
902:
903: $course_edit_link = admin_url('post.php?post=' . $course_id . '&action=edit' );
904:
905:
906: $email_data = array(
907: 'template' => $template,
908: 'heading' => $heading,
909: 'teacher' => $teacher,
910: 'course_id' => $course_id,
911: 'course_name' => $course->post_title,
912: 'course_edit_link' => $course_edit_link,
913: );
914:
915: 916: 917: 918: 919: 920: 921:
922: $sensei_email_data = apply_filters( 'sensei_email_data', $email_data , $template );
923:
924:
925: Sensei()->emails->send( $recipient, $subject , Sensei()->emails->get_content( $template ) );
926:
927: }
928:
929: 930: 931: 932: 933: 934: 935:
936: public function limit_analysis_learners( $args ){
937:
938:
939: if( ! Sensei()->teacher->is_admin_teacher() ) {
940: return $args;
941: }
942:
943:
944:
945: $teacher_courses = Sensei()->course->get_all_courses();
946:
947:
948: if( empty( $teacher_courses ) || ! is_array( $teacher_courses ) ){
949:
950: $args[ 'include'] = array( 0 );
951: return $args;
952:
953: }
954:
955: $learner_ids_for_teacher_courses = array();
956: foreach( $teacher_courses as $course ){
957:
958: $course_learner_ids = array();
959: $activity_comments = Sensei_Utils::sensei_check_for_activity( array( 'post_id' => $course->ID, 'type' => 'sensei_course_status', 'field' => 'user_id' ), true );
960:
961: if( empty( $activity_comments ) || ( is_array( $activity_comments ) && ! ( count( $activity_comments ) > 0 ) ) ){
962: continue;
963: }
964:
965:
966: if( is_array( $activity_comments ) ){
967:
968: foreach( $activity_comments as $comment ){
969:
970: $user = get_userdata( $comment->user_id );
971:
972: if( empty( $user ) ){
973:
974: continue;
975: }
976:
977: $course_learner_ids[] = $user->ID;
978: }
979:
980: }else{
981:
982: $user = get_userdata( $activity_comments->user_id );
983: $course_learner_ids[] = $user->ID;
984:
985: }
986:
987:
988: $learner_ids_for_teacher_courses = array_merge( $learner_ids_for_teacher_courses, $course_learner_ids );
989:
990: }
991:
992:
993: if( empty( $learner_ids_for_teacher_courses ) ){
994:
995: $args[ 'include'] = array( 0 );
996:
997: }else{
998:
999: $args[ 'include'] = $learner_ids_for_teacher_courses;
1000:
1001: }
1002:
1003:
1004: return $args;
1005:
1006: }
1007:
1008: 1009: 1010: 1011: 1012: 1013: 1014: 1015:
1016: public function allow_teacher_access_to_questions( $questions, $quiz_id ){
1017:
1018: if( ! $this->is_admin_teacher() ){
1019: return $questions;
1020: }
1021:
1022: $screen = get_current_screen();
1023:
1024:
1025: remove_filter( 'sensei_lesson_quiz_questions', array( $this, 'allow_teacher_access_to_questions' ), 20 );
1026:
1027: if( ! empty( $screen ) && 'lesson'== $screen->post_type ){
1028:
1029: $admin_user = get_user_by('email', get_bloginfo('admin_email'));
1030: if( ! empty($admin_user) ){
1031:
1032: $current_teacher_id = get_current_user_id();
1033:
1034:
1035: wp_set_current_user( $admin_user->ID );
1036: $questions = Sensei()->lesson->lesson_quiz_questions( $quiz_id );
1037:
1038:
1039: wp_set_current_user( $current_teacher_id );
1040: }
1041:
1042: }
1043:
1044: add_filter( 'sensei_lesson_quiz_questions', array( $this, 'allow_teacher_access_to_questions' ), 20,2 );
1045:
1046: return $questions;
1047: }
1048:
1049: 1050: 1051: 1052: 1053: 1054: 1055:
1056: public function give_access_to_all_questions( $wp_query ){
1057:
1058: if( ! $this->is_admin_teacher() || !function_exists( 'get_current_screen') || 'question' != $wp_query->get('post_type') ){
1059:
1060: return $wp_query;
1061: }
1062:
1063: $screen = get_current_screen();
1064: if( ( isset($screen->id) && 'lesson' == $screen->id )
1065: || ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ){
1066:
1067: $admin_user = get_user_by('email', get_bloginfo('admin_email'));
1068: if( ! empty($admin_user) ){
1069:
1070: $current_teacher_id = get_current_user_id();
1071:
1072:
1073: wp_set_current_user( $admin_user->ID );
1074:
1075:
1076: $wp_query = new WP_Query( $wp_query->query );
1077:
1078:
1079: wp_set_current_user( $current_teacher_id );
1080:
1081: }
1082: }
1083:
1084: return $wp_query;
1085: }
1086:
1087: 1088: 1089: 1090: 1091: 1092: 1093:
1094: public function course_column_heading($columns) {
1095:
1096: if( $this->is_admin_teacher() ){
1097: return $columns;
1098: }
1099: $new_columns = array(
1100: 'teacher' => __('Teacher', 'woothemes-sensei'),
1101: );
1102: return array_merge($columns, $new_columns);
1103:
1104: }
1105:
1106: 1107: 1108: 1109: 1110: 1111: 1112:
1113: public function course_column_data( $column, $course_id ){
1114:
1115: if( $this->is_admin_teacher() || 'teacher' != $column ){
1116: return;
1117: }
1118:
1119: $course = get_post( $course_id );
1120: $teacher = get_userdata( $course->post_author );
1121:
1122: if( !$teacher ){
1123: return;
1124: }
1125:
1126: echo '<a href="'. get_edit_user_link( $teacher->ID ) .'" >'. $teacher->display_name.'</a>';
1127:
1128: }
1129:
1130: 1131: 1132: 1133: 1134: 1135: 1136: 1137: 1138: 1139: 1140:
1141: public function get_teacher_courses( $teacher_id, $return_ids_only= false){
1142:
1143: $teachers_courses = array();
1144:
1145: if( empty( $teacher_id ) ){
1146: $teacher_id = get_current_user_id();
1147: }
1148:
1149: $all_courses = Sensei()->course->get_all_courses();
1150:
1151: if( empty( $all_courses ) ){
1152: return $all_courses;
1153: }
1154:
1155: foreach( $all_courses as $course ){
1156:
1157: if( $course->post_author != $teacher_id ){
1158: continue;
1159: }
1160:
1161: if( $return_ids_only ){
1162:
1163: $teachers_courses[] = $course->ID;
1164:
1165: }else{
1166:
1167: $teachers_courses[] = $course;
1168:
1169: }
1170:
1171: }
1172:
1173: return $teachers_courses;
1174:
1175: }
1176:
1177: 1178: 1179: 1180: 1181: 1182: 1183: 1184:
1185: public function limit_edit_messages_query( $query ){
1186: if( ! $this->is_admin_teacher() || 'sensei_message' != $query->get('post_type') ){
1187: return $query;
1188: }
1189:
1190: $teacher = wp_get_current_user();
1191:
1192: $query->set( 'meta_key', '_receiver' );
1193: $meta_query_args = array(
1194: 'key' => '_receiver',
1195: 'value' => $teacher->get('user_login') ,
1196: 'compare' => '='
1197: );
1198:
1199: $query->set('meta_query', $meta_query_args );
1200:
1201: return $query;
1202: }
1203:
1204:
1205: 1206: 1207: 1208: 1209: 1210: 1211:
1212: public function course_teacher_filter_options() {
1213: global $typenow;
1214:
1215: if( ! is_admin() || 'course' != $typenow || ! current_user_can('manage_sensei') ) {
1216: return;
1217: }
1218:
1219:
1220: $roles = get_editable_roles();
1221:
1222:
1223:
1224: $users_who_can_edit_courses = array();
1225: foreach( $roles as $role_item ){
1226:
1227: $role = get_role( strtolower( $role_item['name'] ) );
1228:
1229: if( is_a( $role, 'WP_Role' ) && $role->has_cap('edit_courses') ){
1230:
1231: $user_query_args = array( 'role' => $role->name, 'fields' => array( 'ID', 'display_name' ) );
1232: $role_users_who_can_edit_courses = get_users( $user_query_args );
1233:
1234:
1235: $users_who_can_edit_courses = array_merge( $users_who_can_edit_courses, $role_users_who_can_edit_courses );
1236:
1237: }
1238:
1239: }
1240:
1241:
1242: $selected = isset( $_GET['course_teacher'] ) ? $_GET['course_teacher'] : '';
1243: $course_options = '';
1244: foreach( $users_who_can_edit_courses as $user ) {
1245: $course_options .= '<option value="' . esc_attr( $user->ID ) . '" ' . selected( $selected, $user->ID, false ) . '>' . $user->display_name . '</option>';
1246: }
1247:
1248: $output = '<select name="course_teacher" id="dropdown_course_teachers">';
1249: $output .= '<option value="">'.__( 'Show all teachers', 'woothemes-sensei' ).'</option>';
1250: $output .= $course_options;
1251: $output .= '</select>';
1252:
1253: echo $output;
1254: }
1255:
1256: 1257: 1258: 1259: 1260: 1261: 1262: 1263:
1264: public function teacher_filter_query_modify( $query ){
1265: global $typenow;
1266:
1267: if( ! is_admin() && 'course' != $typenow || ! current_user_can('manage_sensei') ) {
1268: return $query;
1269: }
1270: $course_teacher = isset( $_GET['course_teacher'] ) ? $_GET['course_teacher'] : '';
1271:
1272: if( empty( $course_teacher ) ) {
1273: return $query;
1274: }
1275:
1276: $query['author'] = $course_teacher;
1277: return $query;
1278: }
1279:
1280: 1281: 1282: 1283: 1284:
1285: public function restrict_media_library( $request = array() ) {
1286:
1287: if( ! is_admin() ) {
1288: return $request;
1289: }
1290:
1291: if( ! $this->is_admin_teacher() ) {
1292: return $request;
1293: }
1294:
1295: $screen = get_current_screen();
1296:
1297: if( in_array( $screen->id, array( 'upload', 'course', 'lesson', 'question' ) ) ) {
1298: $teacher = intval( get_current_user_id() );
1299:
1300: if( $teacher ) {
1301: $request['author__in'] = array( $teacher );
1302: }
1303: }
1304:
1305: return $request;
1306: }
1307:
1308: 1309: 1310: 1311: 1312:
1313: public function restrict_media_library_modal( $query = array() ) {
1314:
1315: if( ! is_admin() ) {
1316: return $query;
1317: }
1318:
1319: if( ! $this->is_admin_teacher() ) {
1320: return $query;
1321: }
1322:
1323: $teacher = intval( get_current_user_id() );
1324:
1325: if( $teacher ) {
1326: $query['author__in'] = array( $teacher );
1327: }
1328:
1329: return $query;
1330: }
1331:
1332: 1333: 1334: 1335: 1336: 1337: 1338:
1339: public function update_lesson_teacher( $lesson_id ){
1340:
1341: if( 'lesson'!= get_post_type() ){
1342: return;
1343: }
1344:
1345:
1346: remove_action( 'save_post', array( $this, 'update_lesson_teacher' ) );
1347:
1348: $course_id = Sensei()->lesson->get_course_id( $lesson_id );
1349:
1350: if( empty( $course_id ) || ! $course_id ){
1351: return;
1352: }
1353:
1354: $course = get_post( $course_id );
1355:
1356: $lesson_update_args= array(
1357: 'ID' => $lesson_id ,
1358: 'post_author' => $course->post_author
1359: );
1360: wp_update_post( $lesson_update_args );
1361:
1362: }
1363:
1364: 1365: 1366: 1367: 1368: 1369: 1370: 1371: 1372: 1373:
1374: public function limit_teacher_edit_screen_post_types( $wp_query ) {
1375: global $current_user;
1376:
1377:
1378: if( ! $this->is_admin_teacher() ){
1379: return $wp_query;
1380: }
1381:
1382: if ( ! function_exists( 'get_current_screen' ) ) {
1383: return $wp_query;
1384: }
1385:
1386: $screen = get_current_screen();
1387:
1388: if( empty( $screen ) ){
1389: return $wp_query;
1390: }
1391:
1392:
1393: $limit_screens = array(
1394: 'edit-lesson',
1395: 'edit-course',
1396: 'edit-question',
1397: 'course_page_course-order',
1398: 'lesson_page_lesson-order',
1399: );
1400:
1401: if( in_array($screen->id , $limit_screens ) ) {
1402:
1403:
1404: $wp_query->set( 'author', $current_user->ID );
1405: }
1406:
1407: return $wp_query;
1408:
1409: }
1410:
1411:
1412: 1413: 1414: 1415: 1416: 1417: 1418: 1419: 1420: 1421: 1422:
1423:
1424: public function teacher_login_redirect( $user_login, $user ) {
1425:
1426: if (user_can($user, 'edit_courses')) {
1427:
1428: if (isset($_POST['redirect_to'])) {
1429:
1430: wp_redirect($_POST['redirect_to'], 303);
1431:
1432: exit;
1433:
1434: } else {
1435:
1436: wp_redirect(admin_url(), 303);
1437:
1438: exit;
1439:
1440: }
1441: }
1442:
1443: }
1444:
1445:
1446:
1447: 1448: 1449: 1450: 1451: 1452: 1453: 1454: 1455: 1456: 1457: 1458:
1459:
1460: public function restrict_posts_menu_page() {
1461:
1462: global $pagenow, $typenow;
1463:
1464: $user = wp_get_current_user();
1465:
1466: 1467: 1468: 1469: 1470: 1471: 1472:
1473:
1474: $restrict = apply_filters('sensei_restrict_posts_menu_page', true );
1475:
1476: if ( in_array( 'teacher', (array) $user->roles ) && !current_user_can('delete_posts') && $restrict) {
1477:
1478: remove_menu_page('edit.php');
1479:
1480: if ($pagenow == "edit.php" || $pagenow == "post-new.php") {
1481:
1482: if ($typenow == '' || $typenow == 'post' || $typenow == 'page') {
1483:
1484: wp_die('You do not have sufficient permissions to access this page.');
1485:
1486: }
1487:
1488: }
1489:
1490: }
1491:
1492: }
1493:
1494: 1495: 1496: 1497: 1498: 1499: 1500: 1501: 1502: 1503: 1504:
1505:
1506: public function restrict_comment_moderation ( $clauses ) {
1507:
1508: global $pagenow;
1509:
1510: if( self::is_a_teacher( get_current_user_id() ) && $pagenow == "edit-comments.php") {
1511:
1512: $clauses->query_vars['post_author'] = get_current_user_id();
1513:
1514: }
1515:
1516: return $clauses;
1517:
1518: }
1519:
1520: 1521: 1522: 1523: 1524: 1525: 1526:
1527: public static function is_a_teacher( $user_id ){
1528:
1529: $user = get_user_by('id', $user_id);
1530:
1531: if( isset( $user->roles ) && in_array( 'teacher', $user->roles ) ){
1532:
1533: return true;
1534:
1535: }else{
1536:
1537: return false;
1538:
1539: }
1540:
1541: }
1542:
1543: 1544: 1545: 1546: 1547:
1548: public static function archive_title(){
1549:
1550: $author = get_user_by( 'id', get_query_var( 'author' ) );
1551: $author_name = $author->display_name;
1552: ?>
1553: <h2 class="teacher-archive-title">
1554:
1555: <?php echo sprintf( __( 'All courses by %s', 'woothemes-sensei') , $author_name ); ?>
1556:
1557: </h2>
1558: <?php
1559:
1560: }
1561:
1562: 1563: 1564: 1565: 1566:
1567: public static function remove_course_meta_on_teacher_archive(){
1568:
1569: remove_action('sensei_course_content_inside_before', array( Sensei()->course, 'the_course_meta' ) );
1570:
1571: }
1572:
1573: }
1574: