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 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 4.1.7.3.2 All 140 releases
← All changes | inc/custom-post-types/lesson.php +244 -131 4.1.7.2 → 4.4.9 View file →
@@ -9,8 +9,17 @@
9 9
10 10 /**
11 11 * Prevent loading this file directly
12 12 */
13 +
14 +use LearnPress\Databases\PostDB;
15 +use LearnPress\Filters\LessonPostFilter;
16 +use LearnPress\Filters\PostFilter;
17 +use LearnPress\Models\CoursePostModel;
18 +use LearnPress\Models\CourseSectionItemModel;
19 +use LearnPress\Models\PostModel;
20 +use LearnPress\Models\WPTables\LessonsTable;
21 +
13 22 defined( 'ABSPATH' ) || exit();
14 23
15 24 if ( ! class_exists( 'LP_Lesson_Post_Type' ) ) {
16 25
@@ -28,8 +37,13 @@
28 37 */
29 38 protected $_post_type = LP_LESSON_CPT;
30 39
31 40 /**
41 + * @var string
42 + */
43 + protected $_screen_list = 'edit-' . LP_LESSON_CPT;
44 +
45 + /**
32 46 * LP_Lesson_Post_Type constructor.
33 47 *
34 48 * @param $post_type
35 49 */
@@ -38,21 +52,214 @@
38 52 // $this->add_map_method( 'before_delete', 'before_delete_lesson' );
39 53 // hide View Lesson link if not assigned to course
40 54
41 55 add_filter( 'views_edit-' . LP_LESSON_CPT, array( $this, 'views_pages' ), 10 );
56 + add_filter( 'posts_pre_query', array( $this, 'posts_pre_query' ), 999, 2 );
57 + // add_filter( 'posts_where_paged', array( $this, 'posts_where_paged' ), 10 );
42 58
43 59 parent::__construct();
44 60 }
45 61
46 62 /**
47 - * Filter items unassigned.
63 + * Handle when save post.
48 64 *
49 - * @param string $where
65 + * @param int $post_id
66 + * @param WP_Post|null $post
67 + * @param bool $is_update
50 68 *
69 + * @return void
70 + * @throws Exception
71 + * @version 1.0.1
72 + * @since 4.2.7.6
73 + */
74 + public function save_post( int $post_id, ?WP_Post $post = null, bool $is_update = false ) {
75 + // Clear cache
76 + $lpCache = new LP_Cache();
77 + $lpCache->clear( "lessonPostModel/find/{$post_id}" );
78 + $lpCache->clear( "lessonModel/find/{$post_id}" );
79 +
80 + // Find courses have this lesson
81 + $obj_course_ids = CourseSectionItemModel::get_courses_from_item_id( $post_id, LP_LESSON_CPT );
82 + if ( ! empty( $obj_course_ids ) ) {
83 + foreach ( $obj_course_ids as $obj_course_id ) {
84 + $course_id = $obj_course_id->section_course_id;
85 + $coursePostModel = CoursePostModel::find( $course_id, true );
86 + if ( $coursePostModel ) {
87 + $coursePostModel->save();
88 + }
89 + }
90 + }
91 + }
92 +
93 + /**
94 + * Declare class name of table list lessons.
95 + *
96 + * @param string $class_name
97 + * @param array $args
98 + *
51 99 * @return string
100 + * @since 4.2.9.5
52 101 */
53 - public function posts_where_paged( $where ): string {
102 + public function wp_list_table_class_name( $class_name, $args ) {
103 + if ( $this->check_class_name_handle_table( $args['screen'] ) ) {
104 + $class_name = LessonsTable::class;
105 + }
54 106
107 + return $class_name;
108 + }
109 +
110 + /**
111 + * Query lp lessons in admin via Post DB
112 + *
113 + * @param array $posts
114 + * @param WP_Query $wp_query
115 + *
116 + * @return array|WP_Query
117 + * @since 4.4.8
118 + * @version 1.0.0
119 + */
120 + public function posts_pre_query( $posts, $wp_query ) {
121 + try {
122 + if ( ! is_admin() ) {
123 + return $posts;
124 + }
125 +
126 + // Check screen
127 + if ( ! function_exists( 'get_current_screen' ) ) {
128 + return $posts;
129 + }
130 +
131 + $curren_screen = get_current_screen();
132 + if ( ! $curren_screen || $curren_screen->id !== 'edit-' . LP_LESSON_CPT ) {
133 + return $posts;
134 + }
135 +
136 + $post_type = $wp_query->get( 'post_type' );
137 + if ( empty( $post_type ) || $post_type !== LP_LESSON_CPT ) {
138 + return $posts;
139 + }
140 +
141 + $posts_per_page = get_user_option( "edit_{$post_type}_per_page", get_current_user_id() );
142 + if ( empty( $posts_per_page ) ) {
143 + $posts_per_page = 20;
144 + }
145 +
146 + $paged = max( 1, get_query_var( 'paged' ) );
147 + $author = $wp_query->get( 'author' );
148 + $status = $wp_query->get( 'post_status' );
149 + $search = $wp_query->get( 's' );
150 + $month = $wp_query->get( 'm' );
151 + $orderby = LP_Request::get_param( 'orderby', '', 'key' );
152 + $order = LP_Request::get_param( 'order', '', 'key' );
153 + $preview = LP_Request::get_param( 'preview', '', 'key' );
154 + $course_id = LP_Request::get_param( 'course', '', 'int' );
155 +
156 + $filter = new LessonPostFilter();
157 + $filter->page = $paged;
158 + $filter->limit = $posts_per_page;
159 + $filter->only_fields = array_map(
160 + function ( $field ) {
161 + return "p.{$field}";
162 + },
163 + $filter->all_fields
164 + );
165 + $filter->field_count = 'p.ID';
166 + $post_db = PostDB::getInstance();
167 +
168 + if ( ! empty( $status ) ) {
169 + $filter->post_status = array( $status );
170 + }
171 +
172 + if ( ! empty( $author ) ) {
173 + $filter->post_author = absint( $author );
174 + }
175 +
176 + if ( ! empty( $search ) ) {
177 + $filter->post_title = sanitize_text_field( wp_unslash( $search ) );
178 + }
179 +
180 + // Find lesson assign by course_id
181 + if ( ! empty( $course_id ) ) {
182 + $filter->join[] = "INNER JOIN {$post_db->tb_lp_section_items} si ON p.ID = si.item_id";
183 + $filter->join[] = "INNER JOIN {$post_db->tb_lp_sections} st ON st.section_id = si.section_id";
184 + $filter->where[] = $post_db->wpdb->prepare( 'AND st.section_course_id = %d', $course_id );
185 + }
186 +
187 + if ( ! empty( $month ) && is_numeric( $month ) && strlen( (string) $month ) === 6 ) {
188 + $filter->where[] = $post_db->wpdb->prepare(
189 + 'AND YEAR(p.post_date) = %d AND MONTH(p.post_date) = %d',
190 + substr( $month, 0, 4 ),
191 + substr( $month, 4, 2 )
192 + );
193 + }
194 +
195 + // Exclude status auto-draft
196 + $filter->where[] = $post_db->wpdb->prepare( 'AND p.post_status != %s', PostModel::STATUS_AUTO_DRAFT );
197 +
198 + // Join sections/courses when sorting by course-name
199 + if ( $orderby === 'course-name' ) {
200 + $filter->join[] = "LEFT JOIN {$post_db->wpdb->prefix}learnpress_section_items si ON p.ID = si.item_id";
201 + $filter->join[] = "LEFT JOIN {$post_db->wpdb->prefix}learnpress_sections s ON s.section_id = si.section_id";
202 + $filter->join[] = "LEFT JOIN {$post_db->wpdb->posts} c ON c.ID = s.section_course_id";
203 + }
204 +
205 + // Filter unassigned
206 + if ( 'yes' === LP_Request::get_param( 'unassigned', '', 'key' ) ) {
207 + $filter->where[] = "AND p.ID NOT IN(
208 + SELECT si.item_id
209 + FROM {$post_db->wpdb->learnpress_section_items} si
210 + )";
211 + }
212 +
213 + // Filter preview.
214 + // Non-preview lessons include those that do not have `_lp_preview` meta key.
215 + if ( $preview ) {
216 + $filter_preview = new LessonPostFilter();
217 + $filter_preview->limit = -1;
218 + $filter_preview->only_fields = [ PostFilter::COL_ID ];
219 + $filter_preview->join[] = "INNER JOIN {$post_db->wpdb->postmeta} pm ON p.ID = pm.post_id";
220 + $filter_preview->where[] = $post_db->wpdb->prepare(
221 + 'AND pm.meta_key = %s AND pm.meta_value = %s',
222 + '_lp_preview',
223 + 'yes'
224 + );
225 + $filter_preview->return_string_query = true;
226 +
227 + $preview_rows = $post_db->get_posts( $filter_preview );
228 +
229 + $in = 'no' === $preview ? 'NOT' : '';
230 + $filter->where[] = "AND p.ID {$in} IN({$preview_rows})";
231 + }
232 +
233 + if ( $orderby === 'course-name' ) {
234 + $filter->order_by = 'c.post_title';
235 + } elseif ( $orderby === 'title' ) {
236 + $filter->order_by = 'p.post_title';
237 + } elseif ( $orderby === 'author' ) {
238 + $filter->order_by = 'p.post_author';
239 + } elseif ( $orderby === 'date' ) {
240 + $filter->order_by = 'p.post_date';
241 + } else {
242 + $filter->order_by = 'p.menu_order';
243 + }
244 +
245 + $filter->order = strtolower( $order ) === 'asc' ? 'ASC' : 'DESC';
246 +
247 + // Get lp lessons
248 + $total_rows = 0;
249 + $lp_lessons = $post_db->get_posts( $filter, $total_rows );
250 +
251 + $wp_query->post_count = count( $lp_lessons );
252 + $wp_query->found_posts = $total_rows;
253 + $posts = $lp_lessons;
254 + } catch ( Throwable $e ) {
255 + LP_Debug::error_log( $e );
256 + }
257 +
258 + return $posts;
259 + }
260 +
261 + /*public function posts_where_paged( $where ): string {
55 262 if ( ! $this->is_page_list_posts_on_backend() ) {
56 263 return $where;
57 264 }
58 265
@@ -60,15 +267,15 @@
60 267
61 268 if ( 'yes' === LP_Request::get( 'unassigned' ) ) {
62 269 $where .= $wpdb->prepare(
63 270 "
64 - AND {$wpdb->posts}.ID NOT IN(
65 - SELECT si.item_id
66 - FROM {$wpdb->learnpress_section_items} si
67 - INNER JOIN {$wpdb->posts} p ON p.ID = si.item_id
68 - WHERE p.post_type = %s
69 - )
70 - ",
271 + AND {$wpdb->posts}.ID NOT IN(
272 + SELECT si.item_id
273 + FROM {$wpdb->learnpress_section_items} si
274 + INNER JOIN {$wpdb->posts} p ON p.ID = si.item_id
275 + WHERE p.post_type = %s
276 + )
277 + ",
71 278 LP_LESSON_CPT
72 279 );
73 280 }
74 281
@@ -76,13 +283,13 @@
76 283
77 284 if ( $preview ) {
78 285 $clause = $wpdb->prepare(
79 286 "
80 - SELECT ID
81 - FROM {$wpdb->posts} p
82 - INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = %s
83 - WHERE pm.meta_value = %s
84 - AND p.post_type = %s",
287 + SELECT ID
288 + FROM {$wpdb->posts} p
289 + INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = %s
290 + WHERE pm.meta_value = %s
291 + AND p.post_type = %s",
85 292 '_lp_preview',
86 293 'yes',
87 294 LP_LESSON_CPT
88 295 );
@@ -95,9 +302,9 @@
95 302 $where .= " AND {$wpdb->posts}.ID {$in} IN({$clause})";
96 303 }
97 304
98 305 return $where;
99 - }
306 + }*/
100 307
101 308 /**
102 309 * Add filters to lesson view.
103 310 *
@@ -103,11 +310,12 @@
103 310 *
104 311 * @param array $views
105 312 *
106 313 * @return array
314 + * @throws Exception
107 315 * @since 3.0.0
108 316 * @editor tungnx
109 - * @modify 4.1.4.1
317 + * @version 1.0.2
110 318 */
111 319 public function views_pages( array $views ): array {
112 320 $count_unassigned_lesson = LP_Course_DB::getInstance()->get_total_item_unassigned( LP_LESSON_CPT );
113 321
@@ -151,13 +359,13 @@
151 359 */
152 360 public function args_register_post_type(): array {
153 361
154 362 return array(
155 - 'labels' => array(
363 + 'labels' => array(
156 364 'name' => esc_html__( 'Lessons', 'learnpress' ),
157 365 'menu_name' => esc_html__( 'Lessons', 'learnpress' ),
158 366 'singular_name' => esc_html__( 'Lesson', 'learnpress' ),
159 - 'add_new_item' => esc_html__( 'Add New Lesson', 'learnpress' ),
367 + 'add_new_item' => esc_html__( 'Add A New Lesson', 'learnpress' ),
160 368 'all_items' => esc_html__( 'Lessons', 'learnpress' ),
161 369 'view_item' => esc_html__( 'View Lesson', 'learnpress' ),
162 370 'add_new' => esc_html__( 'Add New', 'learnpress' ),
163 371 'edit_item' => esc_html__( 'Edit Lesson', 'learnpress' ),
@@ -163,37 +371,36 @@
163 371 'edit_item' => esc_html__( 'Edit Lesson', 'learnpress' ),
164 372 'update_item' => esc_html__( 'Update Lesson', 'learnpress' ),
165 373 'search_items' => esc_html__( 'Search Lessons', 'learnpress' ),
166 374 'not_found' => esc_html__( 'No lesson found', 'learnpress' ),
167 - 'not_found_in_trash' => esc_html__( 'No lesson found in Trash', 'learnpress' ),
375 + 'not_found_in_trash' => esc_html__( 'There was no lesson found in the trash', 'learnpress' ),
168 376 ),
169 - 'public' => true,
170 - 'query_var' => true,
171 - 'taxonomies' => array( 'lesson_tag' ),
172 - 'publicly_queryable' => true,
173 - 'show_ui' => true,
174 - 'has_archive' => false,
175 - 'capability_type' => LP_LESSON_CPT,
176 - 'map_meta_cap' => true,
177 - 'show_in_menu' => 'learn_press',
178 - 'show_in_admin_bar' => true,
179 - 'show_in_nav_menus' => true,
180 - 'show_in_rest' => learn_press_user_maybe_is_a_teacher(),
181 - 'supports' => array(
377 + 'public' => true,
378 + 'query_var' => true,
379 + 'taxonomies' => array( 'lesson_tag' ),
380 + 'publicly_queryable' => true,
381 + 'show_ui' => true,
382 + 'has_archive' => false,
383 + 'capability_type' => LP_LESSON_CPT,
384 + 'map_meta_cap' => true,
385 + 'show_in_menu' => 'learn_press',
386 + 'show_in_admin_bar' => true,
387 + 'show_in_nav_menus' => true,
388 + 'show_in_rest' => learn_press_user_maybe_is_a_teacher(),
389 + 'supports' => array(
182 390 'title',
183 391 'editor',
184 - 'post-formats',
185 392 'revisions',
186 393 'comments',
187 394 ),
188 - 'hierarchical' => true,
189 - 'rewrite' => array(
395 + 'hierarchical' => false, // Lessons have no parent-child hierarchy.
396 + 'rewrite' => array(
190 397 'slug' => 'lessons',
191 398 'hierarchical' => true,
192 399 'with_front' => false,
193 400 ),
401 + 'exclude_from_search' => true,
194 402 );
195 -
196 403 }
197 404
198 405 /**
199 406 * Remove lesson form course items.
@@ -205,102 +412,8 @@
205 412 /*public function before_delete( int $post_id = 0 ) {
206 413 $curd = new LP_Lesson_CURD();
207 414 $curd->delete( $post_id );
208 415 }*/
209 -
210 - /**
211 - * Add columns to admin manage lesson page
212 - *
213 - * @param array $columns
214 - *
215 - * @return array
216 - */
217 - public function columns_head( $columns ) {
218 - // append new column after title column
219 - $pos = array_search( 'title', array_keys( $columns ) );
220 - $new_columns = array(
221 - 'instructor' => esc_html__( 'Author', 'learnpress' ),
222 - LP_COURSE_CPT => $this->_get_course_column_title(),
223 - );
224 -
225 - if ( current_theme_supports( 'post-formats' ) ) {
226 - $new_columns['format'] = esc_html__( 'Format', 'learnpress' );
227 - $new_columns['duration'] = esc_html__( 'Duration', 'learnpress' );
228 - }
229 -
230 - $new_columns['preview'] = esc_html__( 'Preview', 'learnpress' );
231 -
232 - if ( false !== $pos && ! array_key_exists( LP_COURSE_CPT, $columns ) ) {
233 - $columns = array_merge(
234 - array_slice( $columns, 0, $pos + 1 ),
235 - $new_columns,
236 - array_slice( $columns, $pos + 1 )
237 - );
238 -
239 - }
240 -
241 - unset( $columns['taxonomy-lesson-tag'] );
242 - $user = wp_get_current_user();
243 -
244 - if ( in_array( LP_TEACHER_ROLE, $user->roles ) ) {
245 - unset( $columns['instructor'] );
246 - }
247 -
248 - if ( ! empty( $columns['author'] ) ) {
249 - unset( $columns['author'] );
250 - }
251 -
252 - return $columns;
253 - }
254 -
255 - /**
256 - * Display content for custom column
257 - *
258 - * @param string $name
259 - * @param int $post_id
260 - */
261 - public function columns_content( $name, $post_id = 0 ) {
262 - switch ( $name ) {
263 - case 'instructor':
264 - $this->column_instructor( $post_id );
265 - break;
266 - case LP_COURSE_CPT:
267 - $this->_get_item_course( $post_id );
268 - break;
269 - case 'preview':
270 - printf(
271 - '<input type="checkbox" class="learn-press-checkbox learn-press-toggle-item-preview" %s value="%s" data-nonce="%s" />',
272 - get_post_meta( $post_id, '_lp_preview', true ) == 'yes' ? ' checked="checked"' : '',
273 - $post_id,
274 - wp_create_nonce( 'learn-press-toggle-item-preview' )
275 - );
276 - break;
277 - case 'format':
278 - learn_press_item_meta_format( $post_id, __( 'Standard', 'learnpress' ) );
279 - break;
280 - }
281 - }
282 -
283 - /**
284 - * @param $columns
285 - *
286 - * @return mixed
287 - */
288 - public function sortable_columns( $columns ) {
289 - $columns[ LP_COURSE_CPT ] = 'course-name';
290 - $columns['author'] = 'author';
291 -
292 - return $columns;
293 - }
294 -
295 - /**
296 - * Add admin params.
297 - *
298 - * @return array
299 - */
300 - public function admin_params() {
301 - return array( 'notice_empty_lesson' => '' );
302 - }
303 416
304 417 /**
305 418 * Lesson assigned view.
306 419 *