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 +138 -35 4.4.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 *