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