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/background-process/class-lp-background-single-course.php +74 -157 4.2.04.4.8 View file →
@@ -5,10 +5,15 @@
5 5 * Single to run not schedule, run one time and done when be call
6 6 *
7 7 * @since 4.1.1
8 8 * @author tungnx
9 - * @version 1.0.1
9 + * @version 1.0.2
10 10 */
11 +
12 +use LearnPress\Models\CourseModel;
13 +use LearnPress\Models\CoursePostModel;
14 +use LearnPress\Models\PostModel;
15 +
11 16 defined( 'ABSPATH' ) || exit;
12 17
13 18 if ( ! class_exists( 'LP_Background_Single_Course' ) ) {
14 19 class LP_Background_Single_Course extends LP_Async_Request {
@@ -14,9 +19,9 @@
14 19 class LP_Background_Single_Course extends LP_Async_Request {
15 20 protected $action = 'background_single_course';
16 21 protected static $instance;
17 22 /**
18 - * @var $lp_course LP_Course
23 + * @var $lp_course CourseModel
19 24 */
20 25 protected $lp_course;
21 26 /**
22 27 * @var array
@@ -24,23 +29,23 @@
24 29 protected $data = array();
25 30
26 31 /**
27 32 * Get params via $_POST and handle
28 - * @in_array
29 - * @see LP_Course_Post_Type::save
33 + *
34 + * @see LP_Course_Post_Type::save_post()
30 35 */
31 36 protected function handle() {
37 + ini_set( 'max_execution_time', 0 );
32 38 try {
33 - $handle_name = LP_Helper::sanitize_params_submitted( $_POST['handle_name'] ?? '' );
39 + $handle_name = LP_Request::get_param( 'handle_name', '', 'key', 'post' );
34 40 $course_id = intval( $_POST['course_id'] ?? 0 );
35 41 if ( empty( $handle_name ) || ! $course_id ) {
36 42 return;
37 43 }
38 44
39 - $this->lp_course = learn_press_get_course( $course_id );
40 - $this->data = LP_Helper::sanitize_params_submitted( $_POST['data'] ?? '' );
41 -
42 - if ( empty( $this->lp_course ) ) {
45 + $this->data = LP_Request::get_param( 'data', [], 'text', 'post' );
46 + $this->lp_course = CourseModel::find( $course_id, true );
47 + if ( ! $this->lp_course instanceof CourseModel ) {
43 48 return;
44 49 }
45 50
46 51 switch ( $handle_name ) {
@@ -52,26 +57,68 @@
52 57 }
53 58 } catch ( Throwable $e ) {
54 59 error_log( $e->getMessage() );
55 60 }
61 + ini_set( 'max_execution_time', LearnPress::$time_limit_default_of_sever );
62 + die;
56 63 }
57 64
58 65 /**
59 - * Save course post data
66 + * Save course via post data
60 67 *
61 68 * @throws Exception
69 + * @since 4.1.3
70 + * @version 1.0.4
62 71 */
63 72 protected function save_post() {
64 - $this->save_price();
65 - $this->save_extra_info();
73 + if ( ! current_user_can( 'edit_lp_courses' ) ) {
74 + error_log( 'Not permission save background course' );
75 + }
76 +
77 + $courseModel = $this->lp_course;
78 + // Unset value of keys for calculate again
79 + unset( $courseModel->first_item_id );
80 + unset( $courseModel->total_items );
81 + unset( $courseModel->sections_items );
82 + unset( $courseModel->meta_data->_lp_final_quiz );
83 + unset( $courseModel->categories );
84 + unset( $courseModel->tags );
85 + //unset( $courseModel->image_url );
86 + $courseModel->get_author_model();
87 + $courseModel->get_first_item_id();
88 + $courseModel->get_total_items();
89 + $sections_items = $courseModel->get_section_items();
90 + // Update for case data old, section_order and item_order begin = 0
91 + $section_curd = new LP_Section_CURD( $courseModel->get_id() );
92 + $section_ids = LP_Database::get_values_by_key( $sections_items, 'section_id' );
93 + $section_curd->update_sections_order( $section_ids );
94 +
95 + foreach ( $sections_items as $section_items ) {
96 + $section_curd->update_section_items( $section_items->section_id, $section_items->items );
97 + }
98 + // End
99 + $courseModel->get_final_quiz();
100 + $courseModel->get_categories();
101 + $courseModel->get_tags();
102 + /*$size_img_setting = LP_Settings::get_option( 'course_thumbnail_dimensions', [] );
103 + $size_img_send = [
104 + $size_img_setting['width'] ?? 500,
105 + $size_img_setting['height'] ?? 300,
106 + ];
107 + $courseModel->get_image_url( $size_img_send );*/
108 + $courseModel->save();
109 +
110 + //$this->save_extra_info();
111 + $this->clean_data_invalid();
66 112 $this->review_post_author();
67 113
68 - do_action( 'lp/background/course/save', $this->lp_course, $this->data );
114 + // Old hook, addon wpml and assignment is using
115 + do_action( 'lp/background/course/save', learn_press_get_course( $this->lp_course->get_id() ), $this->data );
116 + // New hook from v4.2.6.9
117 + do_action( 'learnPress/background/course/save', $courseModel, $this->data );
69 118
70 119 /**
71 120 * Clean cache courses
72 - *
73 - * @see LP_Course::get_courses() where set cache
74 121 */
75 122 $keys_cache = LP_Courses_Cache::instance()->get_cache( LP_Courses_Cache::$keys );
76 123 if ( $keys_cache ) {
77 124 foreach ( $keys_cache as $key ) {
@@ -78,160 +125,30 @@
78 125 LP_Courses_Cache::instance()->clear( $key );
79 126 }
80 127 LP_Courses_Cache::instance()->clear( LP_Courses_Cache::$keys );
81 128 }
129 +
130 + // Clear total courses free.
131 + $lp_courses_cache = new LP_Courses_Cache( true );
132 + $lp_courses_cache->clear_cache_on_group( LP_Courses_Cache::KEYS_COUNT_COURSES_FREE );
82 133 // End
83 - }
84 134
85 - /**
86 - * Save price course
87 - *
88 - * @return void
89 - */
90 - protected function save_price() {
91 - $has_sale_price = false;
92 - $regular_price = $this->data['_lp_regular_price'] ?? '';
93 - if ( empty( $regular_price ) ) {
94 - return;
95 - }
96 -
97 - $sale_price = $this->data['_lp_sale_price'] ?? '';
98 - $start_date = $this->data['_lp_sale_start'] ?? '';
99 - $end_date = $this->data['_lp_sale_end'] ?? '';
100 - $price = 0;
101 -
102 - if ( '' != $regular_price ) {
103 - $price = $regular_price;
104 -
105 - if ( '' != $sale_price ) {
106 - if ( floatval( $sale_price ) < floatval( $regular_price ) ) {
107 - $price = $sale_price;
108 - $has_sale_price = true;
109 - }
110 -
111 - // Check in days sale
112 - if ( '' !== $start_date && '' !== $end_date ) {
113 - $now = strtotime( get_date_from_gmt( gmdate( 'Y-m-d H:i:s', time() ) ) );
114 - $end = strtotime( $end_date );
115 - $start = strtotime( $start_date );
116 -
117 - $has_sale_price = $now >= $start && $now <= $end;
118 - }
119 - }
120 - }
121 -
122 - update_post_meta( $this->lp_course->get_id(), '_lp_price', $price );
123 -
124 - // Update course is sale
125 - if ( $has_sale_price ) {
126 - update_post_meta( $this->lp_course->get_id(), '_lp_course_is_sale', 1 );
127 - } else {
128 - delete_post_meta( $this->lp_course->get_id(), '_lp_course_is_sale' );
129 - }
135 + $lp_courses_cache->clear_cache_on_group( LP_Courses_Cache::KEYS_QUERY_COURSES_APP );
130 136 }
131 137
132 138 /**
133 - * Save Extra info of course
139 + * Clean data invalid
134 140 *
135 - * @author tungnx
136 - * @since 4.1.4.1
141 + * @throws Exception
142 + * @since 4.2.6.4
137 143 * @version 1.0.0
138 144 */
139 - protected function save_extra_info() {
140 - $lp_course_db = LP_Course_DB::getInstance();
141 - $lp_course = $this->lp_course;
142 - $lp_course_cache = LP_Course_Cache::instance();
143 - $course_id = $lp_course->get_id();
144 -
145 - try {
146 - $extra_info = $this->lp_course->get_info_extra_for_fast_query();
147 -
148 - // Get and set first item id
149 - // Clean cache
150 - $key_cache_first_item_id = "$course_id/first_item_id";
151 - $lp_course_cache->clear( $key_cache_first_item_id );
152 - $first_item_id = $lp_course_db->get_first_item_id( $lp_course->get_id() );
153 - $extra_info->first_item_id = $first_item_id;
154 -
155 - // Get and set total items course
156 - // Clean cache
157 - $key_cache_total_items = "$course_id/total_items";
158 - $lp_course_cache->clear( $key_cache_total_items );
159 - $total_items = $lp_course_db->get_total_items( $lp_course->get_id() );
160 - $extra_info->total_items = $total_items;
161 -
162 - // Get and set sections, items of course
163 - // Clean cache
164 - $key_cache_sections_items = "$course_id/sections_items";
165 - $lp_course_cache->clear( $key_cache_sections_items );
166 - $sections_items = $lp_course->get_sections_and_items_course_from_db_and_sort();
167 - $extra_info->sections_items = $sections_items;
168 -
169 - // Check items removed course, will delete on 'learnpress_user_items', 'learnpress_user_item_results' table
170 - $this->delete_user_items_data( $sections_items );
171 -
172 - // Save post meta
173 - $lp_course->set_info_extra_for_fast_query( $extra_info );
174 - // End set first item id
175 - } catch ( Throwable $e ) {
176 - error_log( $e->getMessage() );
177 - }
145 + protected function clean_data_invalid() {
146 + // Delete items of course not in table Post, can error from old data, delete item, but not remove it in sections course
147 + LP_Section_Items_DB::getInstance()->delete_item_not_in_tb_post( $this->lp_course->get_id() );
178 148 }
179 149
180 150 /**
181 - * Delete items removed on course on tables:
182 - * learnpress_user_items, learnpress_user_itemmeta, learnpress_user_item_results
183 - *
184 - * @return void
185 - * @since 4.1.6.9
186 - * @version 1.0.0
187 - */
188 - private function delete_user_items_data() {
189 - // Get all user_item_id
190 - $lp_user_items_db = LP_User_Items_DB::getInstance();
191 - $lp_user_item_results_db = LP_User_Items_Result_DB::instance();
192 -
193 - try {
194 - $course = $this->lp_course;
195 -
196 - // Get all items of course is attend
197 - $filter_user_items = new LP_User_Items_Filter();
198 - $filter_user_items->only_fields = [ 'item_id', 'user_item_id' ];
199 - $filter_user_items->ref_id = $course->get_id();
200 - $filter_user_items->ref_type = LP_COURSE_CPT;
201 - $users_items_result = $lp_user_items_db->get_user_items( $filter_user_items );
202 -
203 - $item_ids = $course->get_item_ids();
204 -
205 - $users_items_ids_need_delete = [];
206 - foreach ( $users_items_result as $user_item ) {
207 - //$users_items[ $user_item->item_id ] = $user_item->user_item_id;
208 - $item_id = $user_item->item_id;
209 - if ( ! in_array( $item_id, $item_ids ) ) {
210 - $users_items_ids_need_delete[] = $user_item->user_item_id;
211 - }
212 - }
213 -
214 - if ( empty( $users_items_ids_need_delete ) ) {
215 - return;
216 - }
217 -
218 - // Delete on tb lp_user_items
219 - $filter_delete = new LP_User_Items_Filter();
220 - $filter_delete->user_item_ids = $users_items_ids_need_delete;
221 - $lp_user_items_db->remove_user_item_ids( $filter_delete );
222 -
223 - // Delete user_itemmeta
224 - $lp_user_items_db->remove_user_itemmeta( $filter_delete );
225 -
226 - // Delete user_item_results
227 - $lp_user_item_results_db->remove_user_item_results( $filter_delete );
228 - } catch ( Throwable $e ) {
229 - error_log( $e->getMessage() );
230 - }
231 - }
232 -
233 - /**
234 151 * Check user is Instructor and enable review post of Instructor
235 152 *
236 153 * @author tungnx
237 154 * @since 4.1.4.1
@@ -242,9 +159,9 @@
242 159
243 160 $user = learn_press_get_current_user();
244 161 $required_review = LP_Settings::get_option( 'required_review', 'yes' ) === 'yes';
245 162
246 - if ( $user->is_instructor() && $required_review && $lp_course->get_status() === 'publish' ) {
163 + if ( $user->is_instructor() && $required_review && $lp_course->post_status === 'publish' ) {
247 164 wp_update_post(
248 165 array(
249 166 'ID' => $lp_course->get_id(),
250 167 'post_status' => 'pending',