PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.1
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.1
4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 4.2.0 4.2.1 All 138 releases
learnpress / inc / custom-post-types / lesson.php

lesson.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.4.1, at inc/custom-post-types/lesson.php

359 lines 9.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Class LP_Lesson_Post_Type
4 *
5 * @author ThimPress
6 * @package LearnPress/Classes
7 * @version 3.0.0
8 */
9
10 /**
11 * Prevent loading this file directly
12 */
13
14 use LearnPress\Models\CoursePostModel;
15 use LearnPress\Models\CourseSectionItemModel;
16
17 defined( 'ABSPATH' ) || exit();
18
19 if ( ! class_exists( 'LP_Lesson_Post_Type' ) ) {
20
21 /**
22 * Class LP_Lesson_Post_Type
23 */
24 final class LP_Lesson_Post_Type extends LP_Abstract_Post_Type {
25 /**
26 * @var null
27 */
28 protected static $_instance = null;
29
30 /**
31 * @var string
32 */
33 protected $_post_type = LP_LESSON_CPT;
34
35 /**
36 * LP_Lesson_Post_Type constructor.
37 *
38 * @param $post_type
39 */
40 public function __construct() {
41
42 // $this->add_map_method( 'before_delete', 'before_delete_lesson' );
43 // hide View Lesson link if not assigned to course
44
45 add_filter( 'views_edit-' . LP_LESSON_CPT, array( $this, 'views_pages' ), 10 );
46
47 parent::__construct();
48 }
49
50 /**
51 * Handle when save post.
52 *
53 * @param int $post_id
54 * @param WP_Post|null $post
55 * @param bool $is_update
56 *
57 * @return void
58 * @throws Exception
59 * @version 1.0.1
60 * @since 4.2.7.6
61 */
62 public function save_post( int $post_id, ?WP_Post $post = null, bool $is_update = false ) {
63 // Clear cache
64 $lpCache = new LP_Cache();
65 $lpCache->clear( "lessonPostModel/find/{$post_id}" );
66 $lpCache->clear( "lessonModel/find/{$post_id}" );
67
68 // Find courses have this lesson
69 $obj_course_ids = CourseSectionItemModel::get_courses_from_item_id( $post_id, LP_LESSON_CPT );
70 if ( ! empty( $obj_course_ids ) ) {
71 foreach ( $obj_course_ids as $obj_course_id ) {
72 $course_id = $obj_course_id->section_course_id;
73 $coursePostModel = CoursePostModel::find( $course_id, true );
74 if ( $coursePostModel ) {
75 $coursePostModel->save();
76 }
77 }
78 }
79 }
80
81 /**
82 * Filter items unassigned.
83 *
84 * @param string $where
85 *
86 * @return string
87 */
88 public function posts_where_paged( $where ): string {
89
90 if ( ! $this->is_page_list_posts_on_backend() ) {
91 return $where;
92 }
93
94 global $wpdb;
95
96 if ( 'yes' === LP_Request::get( 'unassigned' ) ) {
97 $where .= $wpdb->prepare(
98 "
99 AND {$wpdb->posts}.ID NOT IN(
100 SELECT si.item_id
101 FROM {$wpdb->learnpress_section_items} si
102 INNER JOIN {$wpdb->posts} p ON p.ID = si.item_id
103 WHERE p.post_type = %s
104 )
105 ",
106 LP_LESSON_CPT
107 );
108 }
109
110 $preview = LP_Request::get( 'preview' );
111
112 if ( $preview ) {
113 $clause = $wpdb->prepare(
114 "
115 SELECT ID
116 FROM {$wpdb->posts} p
117 INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = %s
118 WHERE pm.meta_value = %s
119 AND p.post_type = %s",
120 '_lp_preview',
121 'yes',
122 LP_LESSON_CPT
123 );
124
125 $in = '';
126 if ( 'no' === $preview ) {
127 $in = 'NOT';
128 }
129
130 $where .= " AND {$wpdb->posts}.ID {$in} IN({$clause})";
131 }
132
133 return $where;
134 }
135
136 /**
137 * Add filters to lesson view.
138 *
139 * @param array $views
140 *
141 * @return array
142 * @since 3.0.0
143 * @editor tungnx
144 * @modify 4.1.4.1
145 */
146 public function views_pages( array $views ): array {
147 $count_unassigned_lesson = LP_Course_DB::getInstance()->get_total_item_unassigned( LP_LESSON_CPT );
148
149 if ( $count_unassigned_lesson > 0 ) {
150 $views['unassigned'] = sprintf(
151 '<a href="%s" class="%s">%s <span class="count">(%d)</span></a>',
152 admin_url( 'edit.php?post_type=' . LP_LESSON_CPT . '&unassigned=yes' ),
153 isset( $_GET['unassigned'] ) ? 'current' : '',
154 __( 'Unassigned', 'learnpress' ),
155 $count_unassigned_lesson
156 );
157 }
158
159 $total_preview_items = LP_Lesson_DB::getInstance()->get_total_preview_items();
160 if ( $total_preview_items > 0 ) {
161 $views['lesson-preview'] = sprintf(
162 '<a href="%s" class="%s">%s <span class="count">(%d)</span></a>',
163 admin_url( 'edit.php?post_type=' . LP_LESSON_CPT . '&preview=yes' ),
164 isset( $_GET['preview'] ) && $_GET['preview'] === 'yes' ? 'current' : '',
165 __( 'Preview', 'learnpress' ),
166 $total_preview_items
167 );
168 }
169
170 $total_no_preview_items = LP_Lesson_DB::getInstance()->get_total_no_preview_items( $total_preview_items );
171 if ( $total_no_preview_items > 0 ) {
172 $views['lesson-no-preview'] = sprintf(
173 '<a href="%s" class="%s">%s <span class="count">(%d)</span></a>',
174 admin_url( 'edit.php?post_type=' . LP_LESSON_CPT . '&preview=no' ),
175 isset( $_GET['preview'] ) && $_GET['preview'] === 'no' ? 'current' : '',
176 __( 'No Preview', 'learnpress' ),
177 $total_no_preview_items
178 );
179 }
180
181 return $views;
182 }
183
184 /**
185 * Register lesson post type.
186 */
187 public function args_register_post_type(): array {
188
189 return array(
190 'labels' => array(
191 'name' => esc_html__( 'Lessons', 'learnpress' ),
192 'menu_name' => esc_html__( 'Lessons', 'learnpress' ),
193 'singular_name' => esc_html__( 'Lesson', 'learnpress' ),
194 'add_new_item' => esc_html__( 'Add A New Lesson', 'learnpress' ),
195 'all_items' => esc_html__( 'Lessons', 'learnpress' ),
196 'view_item' => esc_html__( 'View Lesson', 'learnpress' ),
197 'add_new' => esc_html__( 'Add New', 'learnpress' ),
198 'edit_item' => esc_html__( 'Edit Lesson', 'learnpress' ),
199 'update_item' => esc_html__( 'Update Lesson', 'learnpress' ),
200 'search_items' => esc_html__( 'Search Lessons', 'learnpress' ),
201 'not_found' => esc_html__( 'No lesson found', 'learnpress' ),
202 'not_found_in_trash' => esc_html__( 'There was no lesson found in the trash', 'learnpress' ),
203 ),
204 'public' => true,
205 'query_var' => true,
206 'taxonomies' => array( 'lesson_tag' ),
207 'publicly_queryable' => true,
208 'show_ui' => true,
209 'has_archive' => false,
210 'capability_type' => LP_LESSON_CPT,
211 'map_meta_cap' => true,
212 'show_in_menu' => 'learn_press',
213 'show_in_admin_bar' => true,
214 'show_in_nav_menus' => true,
215 'show_in_rest' => learn_press_user_maybe_is_a_teacher(),
216 'supports' => array(
217 'title',
218 'editor',
219 'revisions',
220 'comments',
221 ),
222 'hierarchical' => true,
223 'rewrite' => array(
224 'slug' => 'lessons',
225 'hierarchical' => true,
226 'with_front' => false,
227 ),
228 'exclude_from_search' => true,
229 );
230 }
231
232 /**
233 * Remove lesson form course items.
234 *
235 * @param int $post_id
236 *
237 * @since 3.0.0
238 */
239 /*public function before_delete( int $post_id = 0 ) {
240 $curd = new LP_Lesson_CURD();
241 $curd->delete( $post_id );
242 }*/
243
244 /**
245 * Add columns to admin manage lesson page
246 *
247 * @param array $columns
248 *
249 * @return array
250 */
251 public function columns_head( $columns ) {
252 // append new column after title column
253 $pos = array_search( 'title', array_keys( $columns ) );
254 $new_columns = array(
255 'instructor' => esc_html__( 'Author', 'learnpress' ),
256 LP_COURSE_CPT => $this->_get_course_column_title(),
257 );
258
259 if ( current_theme_supports( 'post-formats' ) ) {
260 $new_columns['format'] = esc_html__( 'Format', 'learnpress' );
261 $new_columns['duration'] = esc_html__( 'Duration', 'learnpress' );
262 }
263
264 $new_columns['preview'] = esc_html__( 'Preview', 'learnpress' );
265
266 if ( false !== $pos && ! array_key_exists( LP_COURSE_CPT, $columns ) ) {
267 $columns = array_merge(
268 array_slice( $columns, 0, $pos + 1 ),
269 $new_columns,
270 array_slice( $columns, $pos + 1 )
271 );
272
273 }
274
275 unset( $columns['taxonomy-lesson-tag'] );
276 $user = wp_get_current_user();
277
278 if ( in_array( LP_TEACHER_ROLE, $user->roles ) ) {
279 unset( $columns['instructor'] );
280 }
281
282 if ( ! empty( $columns['author'] ) ) {
283 unset( $columns['author'] );
284 }
285
286 return $columns;
287 }
288
289 /**
290 * Display content for custom column
291 *
292 * @param string $name
293 * @param int $post_id
294 */
295 public function columns_content( $name, $post_id = 0 ) {
296 switch ( $name ) {
297 case 'instructor':
298 $this->column_instructor( $post_id );
299 break;
300 case LP_COURSE_CPT:
301 $this->_get_item_course( $post_id );
302 break;
303 case 'preview':
304 $lesson_is_preview = 'yes' === get_post_meta( $post_id, '_lp_preview', true );
305 echo $lesson_is_preview ? '<span class="dashicons dashicons-saved" style="color: #00c700"></span>' : '';
306 break;
307 case 'format':
308 learn_press_item_meta_format( $post_id, __( 'Standard', 'learnpress' ) );
309 break;
310 }
311 }
312
313 /**
314 * @param $columns
315 *
316 * @return mixed
317 */
318 public function sortable_columns( $columns ) {
319 $columns[ LP_COURSE_CPT ] = 'course-name';
320 $columns['author'] = 'author';
321
322 return $columns;
323 }
324
325 /**
326 * Lesson assigned view.
327 *
328 * @since 3.0.0
329 */
330 public function lesson_assigned() {
331 learn_press_admin_view( 'meta-boxes/course/assigned.php' );
332 }
333
334 public function meta_boxes() {
335 return array(
336 'lesson_assigned' => array(
337 'title' => esc_html__( 'Assigned', 'learnpress' ),
338 'callback' => array( $this, 'lesson_assigned' ),
339 'context' => 'side',
340 'priority' => 'high',
341 ),
342 );
343 }
344
345 /**
346 * @return LP_Lesson_Post_Type|null
347 */
348 public static function instance() {
349 if ( ! self::$_instance ) {
350 self::$_instance = new self();
351 }
352
353 return self::$_instance;
354 }
355 }
356
357 $lesson_post_type = LP_Lesson_Post_Type::instance();
358 }
359