PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.8
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.8
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 4.2.0 All 139 releases
← All changes | inc/custom-post-types/lesson.php +232 -129 4.1.7.34.4.8 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,204 @@
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 + $curren_screen = get_current_screen();
128 + if ( ! $curren_screen || $curren_screen->id !== 'edit-' . LP_LESSON_CPT ) {
129 + return $posts;
130 + }
131 +
132 + $post_type = $wp_query->get( 'post_type' );
133 + if ( empty( $post_type ) || $post_type !== LP_LESSON_CPT ) {
134 + return $posts;
135 + }
136 +
137 + $posts_per_page = get_user_option( "edit_{$post_type}_per_page", get_current_user_id() );
138 + if ( empty( $posts_per_page ) ) {
139 + $posts_per_page = 20;
140 + }
141 +
142 + $paged = max( 1, get_query_var( 'paged' ) );
143 + $author = $wp_query->get( 'author' );
144 + $status = $wp_query->get( 'post_status' );
145 + $search = $wp_query->get( 's' );
146 + $month = $wp_query->get( 'm' );
147 + $orderby = LP_Request::get_param( 'orderby', '', 'key' );
148 + $order = LP_Request::get_param( 'order', '', 'key' );
149 + $preview = LP_Request::get_param( 'preview', '', 'key' );
150 + $course_id = LP_Request::get_param( 'course', '', 'int' );
151 +
152 + $filter = new LessonPostFilter();
153 + $filter->page = $paged;
154 + $filter->limit = $posts_per_page;
155 + $filter->only_fields = [ 'p.ID', 'p.post_title', 'p.post_author', 'p.post_date', 'p.post_date_gmt' ];
156 + $post_db = PostDB::getInstance();
157 +
158 + if ( ! empty( $status ) ) {
159 + $filter->post_status = array( $status );
160 + }
161 +
162 + if ( ! empty( $author ) ) {
163 + $filter->post_author = absint( $author );
164 + }
165 +
166 + if ( ! empty( $search ) ) {
167 + $filter->post_title = sanitize_text_field( wp_unslash( $search ) );
168 + }
169 +
170 + // Find lesson assign by course_id
171 + if ( ! empty( $course_id ) ) {
172 + $filter->join[] = "INNER JOIN {$post_db->tb_lp_section_items} si ON p.ID = si.item_id";
173 + $filter->join[] = "INNER JOIN {$post_db->tb_lp_sections} st ON st.section_id = si.section_id";
174 + $filter->where[] = $post_db->wpdb->prepare( 'AND st.section_course_id = %d', $course_id );
175 + }
176 +
177 + if ( ! empty( $month ) && is_numeric( $month ) && strlen( (string) $month ) === 6 ) {
178 + $filter->where[] = $post_db->wpdb->prepare(
179 + 'AND YEAR(p.post_date) = %d AND MONTH(p.post_date) = %d',
180 + substr( $month, 0, 4 ),
181 + substr( $month, 4, 2 )
182 + );
183 + }
184 +
185 + // Exclude status auto-draft
186 + $filter->where[] = $post_db->wpdb->prepare( 'AND p.post_status != %s', PostModel::STATUS_AUTO_DRAFT );
187 +
188 + // Join sections/courses when sorting by course-name
189 + if ( $orderby === 'course-name' ) {
190 + $filter->join[] = "LEFT JOIN {$post_db->wpdb->prefix}learnpress_section_items si ON p.ID = si.item_id";
191 + $filter->join[] = "LEFT JOIN {$post_db->wpdb->prefix}learnpress_sections s ON s.section_id = si.section_id";
192 + $filter->join[] = "LEFT JOIN {$post_db->wpdb->posts} c ON c.ID = s.section_course_id";
193 + }
194 +
195 + // Filter unassigned
196 + if ( 'yes' === LP_Request::get_param( 'unassigned', '', 'key' ) ) {
197 + $filter->where[] = "AND p.ID NOT IN(
198 + SELECT si.item_id
199 + FROM {$post_db->wpdb->learnpress_section_items} si
200 + )";
201 + }
202 +
203 + // Filter preview.
204 + // Non-preview lessons include those that do not have `_lp_preview` meta key.
205 + if ( $preview ) {
206 + $filter_preview = new LessonPostFilter();
207 + $filter_preview->limit = -1;
208 + $filter_preview->only_fields = [ PostFilter::COL_ID ];
209 + $filter_preview->join[] = "INNER JOIN {$post_db->wpdb->postmeta} pm ON p.ID = pm.post_id";
210 + $filter_preview->where[] = $post_db->wpdb->prepare(
211 + 'AND pm.meta_key = %s AND pm.meta_value = %s',
212 + '_lp_preview',
213 + 'yes'
214 + );
215 + $filter_preview->return_string_query = true;
216 +
217 + $preview_rows = $post_db->get_posts( $filter_preview );
218 +
219 + $in = 'no' === $preview ? 'NOT' : '';
220 + $filter->where[] = "AND p.ID {$in} IN({$preview_rows})";
221 + }
222 +
223 + if ( $orderby === 'course-name' ) {
224 + $filter->order_by = 'c.post_title';
225 + } elseif ( $orderby === 'title' ) {
226 + $filter->order_by = 'p.post_title';
227 + } elseif ( $orderby === 'author' ) {
228 + $filter->order_by = 'p.post_author';
229 + } elseif ( $orderby === 'date' ) {
230 + $filter->order_by = 'p.post_date';
231 + } else {
232 + $filter->order_by = 'p.menu_order';
233 + }
234 +
235 + $filter->order = strtolower( $order ) === 'asc' ? 'ASC' : 'DESC';
236 +
237 + // Get lp lessons
238 + $total_rows = 0;
239 + $lp_lessons = $post_db->get_posts( $filter, $total_rows );
240 +
241 + $wp_query->post_count = count( $lp_lessons );
242 + $wp_query->found_posts = $total_rows;
243 + $posts = $lp_lessons;
244 + } catch ( Throwable $e ) {
245 + LP_Debug::error_log( $e );
246 + }
247 +
248 + return $posts;
249 + }
250 +
251 + /*public function posts_where_paged( $where ): string {
55 252 if ( ! $this->is_page_list_posts_on_backend() ) {
56 253 return $where;
57 254 }
58 255
@@ -60,15 +257,15 @@
60 257
61 258 if ( 'yes' === LP_Request::get( 'unassigned' ) ) {
62 259 $where .= $wpdb->prepare(
63 260 "
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 - ",
261 + AND {$wpdb->posts}.ID NOT IN(
262 + SELECT si.item_id
263 + FROM {$wpdb->learnpress_section_items} si
264 + INNER JOIN {$wpdb->posts} p ON p.ID = si.item_id
265 + WHERE p.post_type = %s
266 + )
267 + ",
71 268 LP_LESSON_CPT
72 269 );
73 270 }
74 271
@@ -76,13 +273,13 @@
76 273
77 274 if ( $preview ) {
78 275 $clause = $wpdb->prepare(
79 276 "
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",
277 + SELECT ID
278 + FROM {$wpdb->posts} p
279 + INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = %s
280 + WHERE pm.meta_value = %s
281 + AND p.post_type = %s",
85 282 '_lp_preview',
86 283 'yes',
87 284 LP_LESSON_CPT
88 285 );
@@ -95,9 +292,9 @@
95 292 $where .= " AND {$wpdb->posts}.ID {$in} IN({$clause})";
96 293 }
97 294
98 295 return $where;
99 - }
296 + }*/
100 297
101 298 /**
102 299 * Add filters to lesson view.
103 300 *
@@ -103,11 +300,12 @@
103 300 *
104 301 * @param array $views
105 302 *
106 303 * @return array
304 + * @throws Exception
107 305 * @since 3.0.0
108 306 * @editor tungnx
109 - * @modify 4.1.4.1
307 + * @version 1.0.2
110 308 */
111 309 public function views_pages( array $views ): array {
112 310 $count_unassigned_lesson = LP_Course_DB::getInstance()->get_total_item_unassigned( LP_LESSON_CPT );
113 311
@@ -151,9 +349,9 @@
151 349 */
152 350 public function args_register_post_type(): array {
153 351
154 352 return array(
155 - 'labels' => array(
353 + 'labels' => array(
156 354 'name' => esc_html__( 'Lessons', 'learnpress' ),
157 355 'menu_name' => esc_html__( 'Lessons', 'learnpress' ),
158 356 'singular_name' => esc_html__( 'Lesson', 'learnpress' ),
159 357 'add_new_item' => esc_html__( 'Add A New Lesson', 'learnpress' ),
@@ -165,35 +363,34 @@
165 363 'search_items' => esc_html__( 'Search Lessons', 'learnpress' ),
166 364 'not_found' => esc_html__( 'No lesson found', 'learnpress' ),
167 365 'not_found_in_trash' => esc_html__( 'There was no lesson found in the trash', 'learnpress' ),
168 366 ),
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(
367 + 'public' => true,
368 + 'query_var' => true,
369 + 'taxonomies' => array( 'lesson_tag' ),
370 + 'publicly_queryable' => true,
371 + 'show_ui' => true,
372 + 'has_archive' => false,
373 + 'capability_type' => LP_LESSON_CPT,
374 + 'map_meta_cap' => true,
375 + 'show_in_menu' => 'learn_press',
376 + 'show_in_admin_bar' => true,
377 + 'show_in_nav_menus' => true,
378 + 'show_in_rest' => learn_press_user_maybe_is_a_teacher(),
379 + 'supports' => array(
182 380 'title',
183 381 'editor',
184 - 'post-formats',
185 382 'revisions',
186 383 'comments',
187 384 ),
188 - 'hierarchical' => true,
189 - 'rewrite' => array(
385 + 'hierarchical' => false, // Lessons have no parent-child hierarchy.
386 + 'rewrite' => array(
190 387 'slug' => 'lessons',
191 388 'hierarchical' => true,
192 389 'with_front' => false,
193 390 ),
391 + 'exclude_from_search' => true,
194 392 );
195 -
196 393 }
197 394
198 395 /**
199 396 * Remove lesson form course items.
@@ -205,102 +402,8 @@
205 402 /*public function before_delete( int $post_id = 0 ) {
206 403 $curd = new LP_Lesson_CURD();
207 404 $curd->delete( $post_id );
208 405 }*/
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 406
304 407 /**
305 408 * Lesson assigned view.
306 409 *