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 +191 -99 4.4.3 → 4.4.9 View file →
@@ -10,10 +10,15 @@
10 10 /**
11 11 * Prevent loading this file directly
12 12 */
13 13
14 +use LearnPress\Databases\PostDB;
15 +use LearnPress\Filters\LessonPostFilter;
16 +use LearnPress\Filters\PostFilter;
14 17 use LearnPress\Models\CoursePostModel;
15 18 use LearnPress\Models\CourseSectionItemModel;
19 +use LearnPress\Models\PostModel;
20 +use LearnPress\Models\WPTables\LessonsTable;
16 21
17 22 defined( 'ABSPATH' ) || exit();
18 23
19 24 if ( ! class_exists( 'LP_Lesson_Post_Type' ) ) {
@@ -32,8 +37,13 @@
32 37 */
33 38 protected $_post_type = LP_LESSON_CPT;
34 39
35 40 /**
41 + * @var string
42 + */
43 + protected $_screen_list = 'edit-' . LP_LESSON_CPT;
44 +
45 + /**
36 46 * LP_Lesson_Post_Type constructor.
37 47 *
38 48 * @param $post_type
39 49 */
@@ -42,8 +52,10 @@
42 52 // $this->add_map_method( 'before_delete', 'before_delete_lesson' );
43 53 // hide View Lesson link if not assigned to course
44 54
45 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 );
46 58
47 59 parent::__construct();
48 60 }
49 61
@@ -78,16 +90,176 @@
78 90 }
79 91 }
80 92
81 93 /**
82 - * Filter items unassigned.
94 + * Declare class name of table list lessons.
83 95 *
84 - * @param string $where
96 + * @param string $class_name
97 + * @param array $args
85 98 *
86 99 * @return string
100 + * @since 4.2.9.5
87 101 */
88 - 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 + }
89 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 {
90 262 if ( ! $this->is_page_list_posts_on_backend() ) {
91 263 return $where;
92 264 }
93 265
@@ -95,15 +267,15 @@
95 267
96 268 if ( 'yes' === LP_Request::get( 'unassigned' ) ) {
97 269 $where .= $wpdb->prepare(
98 270 "
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 - ",
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 + ",
106 278 LP_LESSON_CPT
107 279 );
108 280 }
109 281
@@ -111,13 +283,13 @@
111 283
112 284 if ( $preview ) {
113 285 $clause = $wpdb->prepare(
114 286 "
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",
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",
120 292 '_lp_preview',
121 293 'yes',
122 294 LP_LESSON_CPT
123 295 );
@@ -130,9 +302,9 @@
130 302 $where .= " AND {$wpdb->posts}.ID {$in} IN({$clause})";
131 303 }
132 304
133 305 return $where;
134 - }
306 + }*/
135 307
136 308 /**
137 309 * Add filters to lesson view.
138 310 *
@@ -138,11 +310,12 @@
138 310 *
139 311 * @param array $views
140 312 *
141 313 * @return array
314 + * @throws Exception
142 315 * @since 3.0.0
143 316 * @editor tungnx
144 - * @modify 4.1.4.1
317 + * @version 1.0.2
145 318 */
146 319 public function views_pages( array $views ): array {
147 320 $count_unassigned_lesson = LP_Course_DB::getInstance()->get_total_item_unassigned( LP_LESSON_CPT );
148 321
@@ -218,9 +391,9 @@
218 391 'editor',
219 392 'revisions',
220 393 'comments',
221 394 ),
222 - 'hierarchical' => true,
395 + 'hierarchical' => false, // Lessons have no parent-child hierarchy.
223 396 'rewrite' => array(
224 397 'slug' => 'lessons',
225 398 'hierarchical' => true,
226 399 'with_front' => false,
@@ -239,89 +412,8 @@
239 412 /*public function before_delete( int $post_id = 0 ) {
240 413 $curd = new LP_Lesson_CURD();
241 414 $curd->delete( $post_id );
242 415 }*/
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 416
325 417 /**
326 418 * Lesson assigned view.
327 419 *