PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.1.6.9
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.1.6.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 4.2.0 All 139 releases
learnpress / inc / background-process / class-lp-background-single-course.php

class-lp-background-single-course.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.1.6.9, at inc/background-process/class-lp-background-single-course.php

270 lines 7.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Class LP_Background_Single_Course
4 *
5 * Single to run not schedule, run one time and done when be call
6 *
7 * @since 4.1.1
8 * @author tungnx
9 * @version 1.0.1
10 */
11 defined( 'ABSPATH' ) || exit;
12
13 if ( ! class_exists( 'LP_Background_Single_Course' ) ) {
14 class LP_Background_Single_Course extends WP_Async_Request {
15 protected $prefix = 'lp';
16 protected $action = 'background_single_course';
17 protected static $instance;
18 /**
19 * @var $lp_course LP_Course
20 */
21 protected $lp_course;
22 /**
23 * @var array
24 */
25 protected $data = array();
26
27 /**
28 * Get params via $_POST and handle
29 * @in_array
30 * @see LP_Course_Post_Type::save
31 */
32 protected function handle() {
33 try {
34 $handle_name = LP_Helper::sanitize_params_submitted( $_POST['handle_name'] ?? '' );
35 $course_id = intval( $_POST['course_id'] ?? 0 );
36 if ( empty( $handle_name ) || ! $course_id ) {
37 return;
38 }
39
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 ) ) {
44 return;
45 }
46
47 switch ( $handle_name ) {
48 case 'save_post':
49 $this->save_post();
50 break;
51 default:
52 break;
53 }
54 } catch ( Throwable $e ) {
55 error_log( $e->getMessage() );
56 }
57 }
58
59 /**
60 * Save course post data
61 *
62 * @throws Exception
63 */
64 protected function save_post() {
65 $this->save_price();
66 $this->save_extra_info();
67 $this->review_post_author();
68
69 do_action( 'lp/background/course/save', $this->lp_course, $this->data );
70
71 /**
72 * Clean cache courses
73 *
74 * @see LP_Course::get_courses() where set cache
75 */
76 $keys_cache = LP_Courses_Cache::instance()->get_cache( LP_Courses_Cache::$keys );
77 if ( $keys_cache ) {
78 foreach ( $keys_cache as $key ) {
79 LP_Courses_Cache::instance()->clear( $key );
80 }
81 LP_Courses_Cache::instance()->clear( LP_Courses_Cache::$keys );
82 }
83 // End
84 }
85
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 }
127 }
128
129 /**
130 * Save Extra info of course
131 *
132 * @author tungnx
133 * @since 4.1.4.1
134 * @version 1.0.0
135 */
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 }
175 }
176
177 /**
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 * Check user is Instructor and enable review post of Instructor
232 *
233 * @author tungnx
234 * @since 4.1.4.1
235 * @version 1.0.0
236 */
237 protected function review_post_author() {
238 $lp_course = $this->lp_course;
239
240 $user = learn_press_get_current_user();
241 $required_review = LP_Settings::get_option( 'required_review', 'yes' ) === 'yes';
242
243 if ( $user->is_instructor() && $required_review ) {
244 wp_update_post(
245 array(
246 'ID' => $lp_course->get_id(),
247 'post_status' => 'pending',
248 ),
249 array( '%d', '%s' )
250 );
251 }
252 // End
253 }
254
255 /**
256 * @return LP_Background_Single_Course
257 */
258 public static function instance(): self {
259 if ( is_null( self::$instance ) ) {
260 self::$instance = new self();
261 }
262
263 return self::$instance;
264 }
265 }
266
267 // Must run instance to register ajax.
268 LP_Background_Single_Course::instance();
269 }
270