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 +181 -99 4.4.24.4.8 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,166 @@
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 + $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 {
90 252 if ( ! $this->is_page_list_posts_on_backend() ) {
91 253 return $where;
92 254 }
93 255
@@ -95,15 +257,15 @@
95 257
96 258 if ( 'yes' === LP_Request::get( 'unassigned' ) ) {
97 259 $where .= $wpdb->prepare(
98 260 "
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 - ",
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 + ",
106 268 LP_LESSON_CPT
107 269 );
108 270 }
109 271
@@ -111,13 +273,13 @@
111 273
112 274 if ( $preview ) {
113 275 $clause = $wpdb->prepare(
114 276 "
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",
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",
120 282 '_lp_preview',
121 283 'yes',
122 284 LP_LESSON_CPT
123 285 );
@@ -130,9 +292,9 @@
130 292 $where .= " AND {$wpdb->posts}.ID {$in} IN({$clause})";
131 293 }
132 294
133 295 return $where;
134 - }
296 + }*/
135 297
136 298 /**
137 299 * Add filters to lesson view.
138 300 *
@@ -138,11 +300,12 @@
138 300 *
139 301 * @param array $views
140 302 *
141 303 * @return array
304 + * @throws Exception
142 305 * @since 3.0.0
143 306 * @editor tungnx
144 - * @modify 4.1.4.1
307 + * @version 1.0.2
145 308 */
146 309 public function views_pages( array $views ): array {
147 310 $count_unassigned_lesson = LP_Course_DB::getInstance()->get_total_item_unassigned( LP_LESSON_CPT );
148 311
@@ -218,9 +381,9 @@
218 381 'editor',
219 382 'revisions',
220 383 'comments',
221 384 ),
222 - 'hierarchical' => true,
385 + 'hierarchical' => false, // Lessons have no parent-child hierarchy.
223 386 'rewrite' => array(
224 387 'slug' => 'lessons',
225 388 'hierarchical' => true,
226 389 'with_front' => false,
@@ -239,89 +402,8 @@
239 402 /*public function before_delete( int $post_id = 0 ) {
240 403 $curd = new LP_Lesson_CURD();
241 404 $curd->delete( $post_id );
242 405 }*/
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 406
325 407 /**
326 408 * Lesson assigned view.
327 409 *