add_map_method( 'before_delete', 'before_delete_lesson' ); // hide View Lesson link if not assigned to course add_filter( 'views_edit-' . LP_LESSON_CPT, array( $this, 'views_pages' ), 10 ); parent::__construct(); } /** * Handle when save post. * * @param int $post_id * @param WP_Post|null $post * @param bool $is_update * * @return void * @throws Exception * @version 1.0.1 * @since 4.2.7.6 */ public function save_post( int $post_id, ?WP_Post $post = null, bool $is_update = false ) { // Clear cache $lpCache = new LP_Cache(); $lpCache->clear( "lessonPostModel/find/{$post_id}" ); $lpCache->clear( "lessonModel/find/{$post_id}" ); // Find courses have this lesson $obj_course_ids = CourseSectionItemModel::get_courses_from_item_id( $post_id, LP_LESSON_CPT ); if ( ! empty( $obj_course_ids ) ) { foreach ( $obj_course_ids as $obj_course_id ) { $course_id = $obj_course_id->section_course_id; $coursePostModel = CoursePostModel::find( $course_id, true ); if ( $coursePostModel ) { $coursePostModel->save(); } } } } /** * Filter items unassigned. * * @param string $where * * @return string */ public function posts_where_paged( $where ): string { if ( ! $this->is_page_list_posts_on_backend() ) { return $where; } global $wpdb; if ( 'yes' === LP_Request::get( 'unassigned' ) ) { $where .= $wpdb->prepare( " AND {$wpdb->posts}.ID NOT IN( SELECT si.item_id FROM {$wpdb->learnpress_section_items} si INNER JOIN {$wpdb->posts} p ON p.ID = si.item_id WHERE p.post_type = %s ) ", LP_LESSON_CPT ); } $preview = LP_Request::get( 'preview' ); if ( $preview ) { $clause = $wpdb->prepare( " SELECT ID FROM {$wpdb->posts} p INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = %s WHERE pm.meta_value = %s AND p.post_type = %s", '_lp_preview', 'yes', LP_LESSON_CPT ); $in = ''; if ( 'no' === $preview ) { $in = 'NOT'; } $where .= " AND {$wpdb->posts}.ID {$in} IN({$clause})"; } return $where; } /** * Add filters to lesson view. * * @param array $views * * @return array * @since 3.0.0 * @editor tungnx * @modify 4.1.4.1 */ public function views_pages( array $views ): array { $count_unassigned_lesson = LP_Course_DB::getInstance()->get_total_item_unassigned( LP_LESSON_CPT ); if ( $count_unassigned_lesson > 0 ) { $views['unassigned'] = sprintf( '%s (%d)', admin_url( 'edit.php?post_type=' . LP_LESSON_CPT . '&unassigned=yes' ), isset( $_GET['unassigned'] ) ? 'current' : '', __( 'Unassigned', 'learnpress' ), $count_unassigned_lesson ); } $total_preview_items = LP_Lesson_DB::getInstance()->get_total_preview_items(); if ( $total_preview_items > 0 ) { $views['lesson-preview'] = sprintf( '%s (%d)', admin_url( 'edit.php?post_type=' . LP_LESSON_CPT . '&preview=yes' ), isset( $_GET['preview'] ) && $_GET['preview'] === 'yes' ? 'current' : '', __( 'Preview', 'learnpress' ), $total_preview_items ); } $total_no_preview_items = LP_Lesson_DB::getInstance()->get_total_no_preview_items( $total_preview_items ); if ( $total_no_preview_items > 0 ) { $views['lesson-no-preview'] = sprintf( '%s (%d)', admin_url( 'edit.php?post_type=' . LP_LESSON_CPT . '&preview=no' ), isset( $_GET['preview'] ) && $_GET['preview'] === 'no' ? 'current' : '', __( 'No Preview', 'learnpress' ), $total_no_preview_items ); } return $views; } /** * Register lesson post type. */ public function args_register_post_type(): array { return array( 'labels' => array( 'name' => esc_html__( 'Lessons', 'learnpress' ), 'menu_name' => esc_html__( 'Lessons', 'learnpress' ), 'singular_name' => esc_html__( 'Lesson', 'learnpress' ), 'add_new_item' => esc_html__( 'Add A New Lesson', 'learnpress' ), 'all_items' => esc_html__( 'Lessons', 'learnpress' ), 'view_item' => esc_html__( 'View Lesson', 'learnpress' ), 'add_new' => esc_html__( 'Add New', 'learnpress' ), 'edit_item' => esc_html__( 'Edit Lesson', 'learnpress' ), 'update_item' => esc_html__( 'Update Lesson', 'learnpress' ), 'search_items' => esc_html__( 'Search Lessons', 'learnpress' ), 'not_found' => esc_html__( 'No lesson found', 'learnpress' ), 'not_found_in_trash' => esc_html__( 'There was no lesson found in the trash', 'learnpress' ), ), 'public' => true, 'query_var' => true, 'taxonomies' => array( 'lesson_tag' ), 'publicly_queryable' => true, 'show_ui' => true, 'has_archive' => false, 'capability_type' => LP_LESSON_CPT, 'map_meta_cap' => true, 'show_in_menu' => 'learn_press', 'show_in_admin_bar' => true, 'show_in_nav_menus' => true, 'show_in_rest' => learn_press_user_maybe_is_a_teacher(), 'supports' => array( 'title', 'editor', 'revisions', 'comments', ), 'hierarchical' => true, 'rewrite' => array( 'slug' => 'lessons', 'hierarchical' => true, 'with_front' => false, ), 'exclude_from_search' => true, ); } /** * Remove lesson form course items. * * @param int $post_id * * @since 3.0.0 */ /*public function before_delete( int $post_id = 0 ) { $curd = new LP_Lesson_CURD(); $curd->delete( $post_id ); }*/ /** * Add columns to admin manage lesson page * * @param array $columns * * @return array */ public function columns_head( $columns ) { // append new column after title column $pos = array_search( 'title', array_keys( $columns ) ); $new_columns = array( 'instructor' => esc_html__( 'Author', 'learnpress' ), LP_COURSE_CPT => $this->_get_course_column_title(), ); if ( current_theme_supports( 'post-formats' ) ) { $new_columns['format'] = esc_html__( 'Format', 'learnpress' ); $new_columns['duration'] = esc_html__( 'Duration', 'learnpress' ); } $new_columns['preview'] = esc_html__( 'Preview', 'learnpress' ); if ( false !== $pos && ! array_key_exists( LP_COURSE_CPT, $columns ) ) { $columns = array_merge( array_slice( $columns, 0, $pos + 1 ), $new_columns, array_slice( $columns, $pos + 1 ) ); } unset( $columns['taxonomy-lesson-tag'] ); $user = wp_get_current_user(); if ( in_array( LP_TEACHER_ROLE, $user->roles ) ) { unset( $columns['instructor'] ); } if ( ! empty( $columns['author'] ) ) { unset( $columns['author'] ); } return $columns; } /** * Display content for custom column * * @param string $name * @param int $post_id */ public function columns_content( $name, $post_id = 0 ) { switch ( $name ) { case 'instructor': $this->column_instructor( $post_id ); break; case LP_COURSE_CPT: $this->_get_item_course( $post_id ); break; case 'preview': $lesson_is_preview = 'yes' === get_post_meta( $post_id, '_lp_preview', true ); echo $lesson_is_preview ? '' : ''; break; case 'format': learn_press_item_meta_format( $post_id, __( 'Standard', 'learnpress' ) ); break; } } /** * @param $columns * * @return mixed */ public function sortable_columns( $columns ) { $columns[ LP_COURSE_CPT ] = 'course-name'; $columns['author'] = 'author'; return $columns; } /** * Lesson assigned view. * * @since 3.0.0 */ public function lesson_assigned() { learn_press_admin_view( 'meta-boxes/course/assigned.php' ); } public function meta_boxes() { return array( 'lesson_assigned' => array( 'title' => esc_html__( 'Assigned', 'learnpress' ), 'callback' => array( $this, 'lesson_assigned' ), 'context' => 'side', 'priority' => 'high', ), ); } /** * @return LP_Lesson_Post_Type|null */ public static function instance() { if ( ! self::$_instance ) { self::$_instance = new self(); } return self::$_instance; } } $lesson_post_type = LP_Lesson_Post_Type::instance(); }