PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.1.7.2
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.1.7.2
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.7.2, at inc/background-process/class-lp-background-single-course.php

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