From f6b64bf788b52478aa84b2de80e409e5b9948d8d Mon Sep 17 00:00:00 2001 From: Tungnx Date: Tue, 26 Nov 2024 15:51:50 +0700 Subject: [PATCH] = 4.2.7.4 = ~ Tweak UserItemMode class: handle cache on find_user_item method, fix get_meta_model_from_key method, tweak get_meta_value_from_key --- inc/Models/UserItems/UserItemModel.php | 75 ++++++++++++++----- inc/course/class-lp-course-item.php | 9 ++- .../class-lp-rest-courses-controller.php | 9 ++- 3 files changed, 73 insertions(+), 20 deletions(-) diff --git a/inc/Models/UserItems/UserItemModel.php b/inc/Models/UserItems/UserItemModel.php index ce92eb1af..6d70f0f9e 100644 --- a/inc/Models/UserItems/UserItemModel.php +++ b/inc/Models/UserItems/UserItemModel.php @@ -15,6 +15,8 @@ use LearnPress\Models\CoursePostModel; use LearnPress\Models\PostModel; use LearnPress\Models\UserItemMeta\UserItemMetaModel; +use LearnPressAssignment\Models\UserAssignmentModel; +use LP_Cache; use LP_Datetime; use LP_User; use LP_User_Guest; @@ -240,19 +242,52 @@ public static function get_user_item_model_from_db( LP_User_Items_Filter $filter * @param int $user_id * @param int $item_id * @param string $item_type + * @param int $ref_id + * @param string $ref_type * @param bool $check_cache * * @return false|UserItemModel|static * @since 4.2.7.3 - * @version 1.0.0 - */ - public static function find_user_item( int $user_id, int $item_id, string $item_type, bool $check_cache = false ) { + * @version 1.0.1 + */ + public static function find_user_item( + int $user_id, + int $item_id, + string $item_type, + int $ref_id = 0, + string $ref_type = '', + bool $check_cache = false + ) { + $key_cache = "userItemModel/find/{$user_id}/{$item_id}/{$item_type}"; $filter = new LP_User_Items_Filter(); $filter->user_id = $user_id; $filter->item_id = $item_id; $filter->item_type = $item_type; + if ( ! empty( $ref_id ) ) { + $filter->ref_id = $ref_id; + $key_cache .= "/{$ref_id}"; + } + if ( ! empty( $ref_type ) ) { + $filter->ref_type = $ref_type; + $key_cache .= "/{$ref_type}"; + } + $lpUserItemCache = new LP_Cache(); + + // Check cache + if ( $check_cache ) { + $userItemModel = $lpUserItemCache->get_cache( $key_cache ); + if ( $userItemModel instanceof UserItemModel ) { + return $userItemModel; + } + } + + $userItemModel = static::get_user_item_model_from_db( $filter ); + // Set cache + if ( $userItemModel instanceof UserItemModel ) { + $lpUserItemCache->set_cache( $key_cache, $userItemModel ); + } - return static::get_user_item_model_from_db( $filter ); + return $userItemModel; } /** @@ -261,22 +296,14 @@ public static function find_user_item( int $user_id, int $item_id, string $item_ * @param string $key * * @return false|UserItemMetaModel + * @since 4.2.5 + * @version 1.0.1 */ public function get_meta_model_from_key( string $key ) { - $user_item_metadata = false; - - // Check object meta_data has value of key. - if ( $this->meta_data instanceof stdClass - && property_exists( $this->meta_data, $key ) ) { - $user_item_metadata = $this->meta_data->{$key}; - } else { // Get from DB - $filter = new LP_User_Item_Meta_Filter(); - $filter->meta_key = $key; - $filter->learnpress_user_item_id = $this->get_user_item_id(); - $user_item_metadata = UserItemMetaModel::get_user_item_meta_model_from_db( $filter ); - } - - return $user_item_metadata; + $filter = new LP_User_Item_Meta_Filter(); + $filter->meta_key = $key; + $filter->learnpress_user_item_id = $this->get_user_item_id(); + return UserItemMetaModel::get_user_item_meta_model_from_db( $filter ); } /** @@ -286,10 +313,16 @@ public function get_meta_model_from_key( string $key ) { * @param bool $get_extra * * @return false|string + * @since 4.2.5 + * @version 1.0.1 */ public function get_meta_value_from_key( string $key, bool $get_extra = false ) { $data = false; + if ( $this->meta_data instanceof stdClass && isset( $this->meta_data->{$key} ) ) { + return $this->meta_data->{$key}; + } + $user_item_metadata = $this->get_meta_model_from_key( $key ); if ( $user_item_metadata instanceof UserItemMetaModel ) { if ( ! $this->meta_data instanceof stdClass ) { @@ -437,5 +470,11 @@ public function clean_caches() { $this->item_type, ] ); + + $key_cache_user_item = "userItemModel/find/{$this->user_id}/{$this->item_id}/{$this->item_type}"; + $lp_user_items_cache->clear( $key_cache_user_item ); + + $key_cache_user_item_ref = "userItemModel/find/{$this->user_id}/{$this->item_id}/{$this->item_type}/{$this->ref_id}/{$this->ref_type}"; + $lp_user_items_cache->clear( $key_cache_user_item_ref ); } } diff --git a/inc/course/class-lp-course-item.php b/inc/course/class-lp-course-item.php index 8c38c96cb..e475ac8f1 100644 --- a/inc/course/class-lp-course-item.php +++ b/inc/course/class-lp-course-item.php @@ -204,7 +204,14 @@ public function get_class_v2( $course_id, $item_id, $can_view_item, $more = arra } elseif ( ! $can_view_item->flag ) { $defaults[] = 'item-locked'; } else { - $userItemModel = UserItemModel::find_user_item( $user_id, $item_id, get_post_type( $item_id ) ); + $userItemModel = UserItemModel::find_user_item( + $user_id, + $item_id, + get_post_type( $item_id ), + $course_id, + LP_COURSE_CPT, + true + ); $item_status = $userItemModel ? $userItemModel->get_status() : ''; $item_grade = $userItemModel ? $userItemModel->get_graduation() : ''; diff --git a/inc/rest-api/v1/frontend/class-lp-rest-courses-controller.php b/inc/rest-api/v1/frontend/class-lp-rest-courses-controller.php index 424824cf3..04f8de186 100644 --- a/inc/rest-api/v1/frontend/class-lp-rest-courses-controller.php +++ b/inc/rest-api/v1/frontend/class-lp-rest-courses-controller.php @@ -664,7 +664,14 @@ public function continue_course( WP_REST_Request $request ): LP_REST_Response { $item_id = $item->id ?? $item->item_id; $item_type = $item->type ?? $item->item_type; - $userItemModel = UserItemModel::find_user_item( $user_id, $item_id, $item_type ); + $userItemModel = UserItemModel::find_user_item( + $user_id, + $item_id, + $item_type, + $course_id, + LP_COURSE_CPT, + true + ); if ( ! $userItemModel || $userItemModel->get_status() !== LP_ITEM_COMPLETED ) { $item_link = $course->get_item_link( $item->id ); $flag_found = true;