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/course.php +148 -46 4.3.7 → 4.4.9 View file →
@@ -3,13 +3,16 @@
3 3 * Class LP_Course_Post_Type
4 4 *
5 5 * @author ThimPress
6 6 * @package LearnPress/Classes
7 - * @version 3.0.2
7 + * @version 3.0.3
8 8 */
9 9
10 +use LearnPress\Databases\PostDB;
11 +use LearnPress\Filters\CoursePostFilter;
10 12 use LearnPress\Models\CourseModel;
11 13 use LearnPress\Models\CoursePostModel;
14 +use LearnPress\Models\PostModel;
12 15 use LearnPress\Models\WPTables\CoursesTable;
13 16
14 17 defined( 'ABSPATH' ) || exit();
15 18
@@ -32,10 +35,11 @@
32 35 public function __construct() {
33 36 parent::__construct();
34 37
35 38 add_action( 'init', array( $this, 'register_taxonomy' ) );
36 - add_filter( 'posts_where_paged', array( $this, '_posts_where_paged_course_items' ), 10 );
37 - add_filter( 'posts_join_paged', array( $this, '_posts_join_paged_course_items' ), 10 );
39 + add_action( 'posts_pre_query', array( $this, 'posts_pre_query' ), 999, 2 );
40 + // add_filter( 'posts_where_paged', array( $this, '_posts_where_paged_course_items' ), 10 );
41 + // add_filter( 'posts_join_paged', array( $this, '_posts_join_paged_course_items' ), 10 );
38 42 }
39 43
40 44 /**
41 45 * Register course post type.
@@ -206,13 +210,140 @@
206 210 $course->delete_relate_data_when_delete_course();
207 211 }
208 212
209 213 /**
210 - * @param string $fields
214 + * Query lp courses in admin via Post DB
211 215 *
212 - * @return string
216 + * @param array $posts
217 + * @param WP_Query $wp_query
218 + *
219 + * @return array
220 + * @since 4.4.8
221 + * @version 1.0.0
213 222 */
214 - public function posts_fields( $fields ): string {
223 + public function posts_pre_query( $posts, $wp_query ) {
224 + try {
225 + if ( ! is_admin() ) {
226 + return $posts;
227 + }
228 +
229 + // Check screen
230 + if ( ! function_exists( 'get_current_screen' ) ) {
231 + return $posts;
232 + }
233 +
234 + $curren_screen = get_current_screen();
235 + if ( ! $curren_screen || $curren_screen->id !== 'edit-' . LP_COURSE_CPT ) {
236 + return $posts;
237 + }
238 +
239 + $post_type = $wp_query->get( 'post_type' );
240 +
241 + if ( empty( $post_type ) || $post_type !== LP_COURSE_CPT ) {
242 + return $posts;
243 + }
244 +
245 + // Convert params from WP_Query to CoursePostFilter
246 + $posts_per_page = get_user_option( "edit_{$post_type}_per_page", get_current_user_id() );
247 + if ( empty( $posts_per_page ) ) {
248 + $posts_per_page = 20;
249 + }
250 +
251 + $paged = max( 1, get_query_var( 'paged' ) );
252 + $author = $wp_query->get( 'author' );
253 + $status = $wp_query->get( 'post_status' );
254 + $search = $wp_query->get( 's' );
255 + $month = $wp_query->get( 'm' );
256 + $orderby = LP_Request::get_param( 'orderby', '', 'key' );
257 + $order = LP_Request::get_param( 'order', '', 'key' );
258 + $filter_price = LP_Helper::sanitize_params_submitted( $_REQUEST['filter_price'] ?? '' );
259 +
260 + $filter = new CoursePostFilter();
261 + $filter->page = $paged;
262 + $filter->limit = $posts_per_page;
263 + $filter->only_fields = array_map(
264 + function ( $field ) {
265 + return "p.{$field}";
266 + },
267 + $filter->all_fields
268 + );
269 + $filter->field_count = 'p.ID';
270 + $post_db = PostDB::getInstance();
271 +
272 + if ( ! empty( $status ) ) {
273 + $filter->post_status = array( $status );
274 + }
275 +
276 + if ( ! empty( $author ) ) {
277 + $filter->post_author = absint( $author );
278 + }
279 +
280 + if ( ! empty( $search ) ) {
281 + $filter->post_title = sanitize_text_field( wp_unslash( $search ) );
282 + }
283 +
284 + if ( ! empty( $month ) && is_numeric( $month ) && strlen( (string) $month ) === 6 ) {
285 + $filter->where[] = $post_db->wpdb->prepare(
286 + 'AND YEAR(p.post_date) = %d AND MONTH(p.post_date) = %d',
287 + substr( $month, 0, 4 ),
288 + substr( $month, 4, 2 )
289 + );
290 + }
291 +
292 + /*$has_price_filter = false;
293 + if ( array_key_exists( 'filter_price', $_REQUEST ) && $filter_price !== '' ) {
294 + $filter_price = floatval( $filter_price );
295 + $has_price_filter = true;
296 + }
297 +
298 + if ( $orderby === 'price' || $has_price_filter ) {
299 + $filter->join[] = "LEFT JOIN {$post_db->wpdb->postmeta} pm_price ON pm_price.post_id = p.ID AND pm_price.meta_key = '_lp_price'";
300 + }
301 +
302 + if ( $has_price_filter ) {
303 + if ( $filter_price == 0 ) {
304 + $filter->where[] = 'AND ( pm_price.meta_value IS NULL || pm_price.meta_value = 0 )';
305 + } else {
306 + $filter->where[] = $post_db->wpdb->prepare( ' AND ( pm_price.meta_value = %s )', $filter_price );
307 + }
308 + }*/
309 +
310 + // Exclude status auto-draft
311 + $filter->where[] = $post_db->wpdb->prepare( 'AND p.post_status != %s', PostModel::STATUS_AUTO_DRAFT );
312 +
313 + if ( $orderby === 'price' ) {
314 + $filter->join[] = "LEFT JOIN {$post_db->wpdb->postmeta} pm_price
315 + ON pm_price.post_id = p.ID
316 + AND pm_price.meta_key = '_lp_price'";
317 + $filter->order_by = 'CAST(pm_price.meta_value AS UNSIGNED)';
318 + } elseif ( $orderby === 'title' ) {
319 + $filter->order_by = 'p.post_title';
320 + } elseif ( $orderby === 'author' ) {
321 + $filter->order_by = 'p.post_author';
322 + } elseif ( $orderby === 'date' ) {
323 + $filter->order_by = 'p.post_date';
324 + } else {
325 + $filter->order_by = 'p.menu_order';
326 + }
327 +
328 + $filter->order = strtolower( $order ) === 'asc' ? 'ASC' : 'DESC';
329 +
330 + // Get lp courses
331 + $total_rows = 0;
332 + $lp_courses = $post_db->get_posts( $filter, $total_rows );
333 +
334 + $wp_query->post_count = count( $lp_courses );
335 + $wp_query->found_posts = $total_rows;
336 + $wp_query->max_num_pages = (int) ceil( $total_rows / $posts_per_page );
337 + $posts = $lp_courses;
338 + } catch ( Throwable $e ) {
339 + LP_Debug::error_log( $e );
340 + }
341 +
342 + return $posts;
343 + }
344 +
345 + /*public function posts_fields( $fields ): string {
215 346 if ( ! $this->is_page_list_posts_on_backend() ) {
216 347 return $fields;
217 348 }
218 349
@@ -248,13 +379,8 @@
248 379
249 380 return $where;
250 381 }
251 382
252 - /**
253 - * @param $join
254 - *
255 - * @return string
256 - */
257 383 public function posts_join_paged( $join ) {
258 384 global $wpdb;
259 385
260 386 if ( ! $this->is_page_list_posts_on_backend() ) {
@@ -269,13 +395,8 @@
269 395
270 396 return $join;
271 397 }
272 398
273 - /**
274 - * @param $where
275 - *
276 - * @return mixed|string
277 - */
278 399 public function posts_where_paged( $where ) {
279 400 global $wpdb;
280 401
281 402 if ( ! $this->is_page_list_posts_on_backend() ) {
@@ -291,29 +412,11 @@
291 412 $where .= $wpdb->prepare( ' AND ( pm_price.meta_value = %s )', $filter_price );
292 413 }
293 414 }
294 415
295 - /*$not_in = $wpdb->prepare(
296 - "
297 - SELECT ID
298 - FROM {$wpdb->posts} p
299 - INNER JOIN {$wpdb->postmeta} pm ON pm.post_id = p.ID AND pm.meta_key = %s
300 - WHERE pm.meta_value = %s
301 - ",
302 - '_lp_preview_course',
303 - 'yes'
304 - );
305 -
306 - $where .= " AND {$wpdb->posts}.ID NOT IN( {$not_in} )";*/
307 -
308 416 return $where;
309 417 }
310 418
311 - /**
312 - * @param $orderby
313 - *
314 - * @return string
315 - */
316 419 public function posts_orderby( $orderby ) {
317 420 if ( ! $this->is_page_list_posts_on_backend() ) {
318 421 return $orderby;
319 422 }
@@ -324,9 +427,9 @@
324 427 $orderby = "CAST(pm_price.meta_value AS UNSIGNED) {$order}";
325 428 }
326 429
327 430 return $orderby;
328 - }
431 + }*/
329 432
330 433 /**
331 434 * Save course post
332 435 *
@@ -334,9 +437,9 @@
334 437 * @param WP_Post|null $post
335 438 * @param bool $is_update
336 439 *
337 440 * @since 4.2.6.9
338 - * @version 1.0.2
441 + * @version 1.0.3
339 442 */
340 443 public function save_post( int $post_id, ?WP_Post $post = null, bool $is_update = false ) {
341 444 try {
342 445 $wp_screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
@@ -354,8 +457,14 @@
354 457 if ( ! $courseModel ) {
355 458 $courseModel = new CourseModel( $post );
356 459 }
357 460
461 + // Get all metadata of post
462 + $all_metadata = $courseModel->get_post_model()->get_all_metadata();
463 + $courseModel->meta_data = $all_metadata;
464 + // Temporary unset _elementor_page_assets of El, reason by method get_all_metadata get not use maybe_unserialize, make save invalid serialize
465 + $courseModel->meta_data->_elementor_page_assets = [];
466 +
358 467 // Merge object post and courseModel
359 468 $new_obj = (array) $post;
360 469 $old_obj = (array) $courseModel;
361 470 $old_now = array_merge( $old_obj, $new_obj );
@@ -360,18 +469,8 @@
360 469 $old_obj = (array) $courseModel;
361 470 $old_now = array_merge( $old_obj, $new_obj );
362 471 $courseModel = new CourseModel( $old_now );
363 472
364 - // Get all metadata of course
365 - if ( $is_update && empty( $wp_screen ) ) {
366 - $coursePost = new CoursePostModel( $courseModel );
367 - $coursePost->get_all_metadata();
368 - // Temporary unset _elementor_page_assets of El, reason by method get_all_metadata get not use maybe_unserialize, make save invalid serialize
369 - $coursePost->meta_data->_elementor_page_assets = [];
370 -
371 - $courseModel->meta_data = $coursePost->meta_data;
372 - }
373 -
374 473 // Save option single course
375 474 include_once LP_PLUGIN_PATH . 'inc/admin/class-lp-admin.php';
376 475 $lp_meta_box_course = new LP_Meta_Box_Course();
377 476 $ground_fields = $lp_meta_box_course->metabox( $courseModel->ID );
@@ -395,8 +494,11 @@
395 494 get_post_meta( $courseModel->ID, $meta_key, true )
396 495 );
397 496 }
398 497 } elseif ( ! $is_update ) {
498 + if ( isset( $courseModel->meta_data->{$meta_key} ) ) {
499 + continue;
500 + }
399 501 $courseModel->meta_data->{$meta_key} = $option->default ?? '';
400 502 } elseif ( ! empty( $wp_screen ) && LP_COURSE_CPT === $wp_screen->id ) {
401 503 $value_saved = $option->save( $courseModel->ID );
402 504 $courseModel->meta_data->{$meta_key} = $value_saved;