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
learnpress / inc / Ajax / CourseToolsAjax.php

CourseToolsAjax.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.4.8, at inc/Ajax/CourseToolsAjax.php

264 lines 7.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Class CourseToolsAjax
4 *
5 * Handle admin reset course progress via LearnPress AJAX dispatcher.
6 *
7 * @since 4.4.6
8 * @version 1.0.0
9 */
10
11 namespace LearnPress\Ajax;
12
13 use Exception;
14 use LearnPress;
15 use LearnPress\Databases\UserItemsDB;
16 use LearnPress\Filters\UserItemsFilter;
17 use LearnPress\Helpers\Response;
18 use LearnPress\Models\CourseModel;
19 use LearnPress\Models\UserItems\UserCourseModel;
20 use LearnPress\Models\UserItems\UserItemModel;
21 use LearnPress\Models\UserModel;
22 use LP_Helper;
23 use LP_Request;
24 use LP_User_Items_DB;
25 use LP_User_Items_Filter;
26 use Throwable;
27
28 defined( 'ABSPATH' ) || exit;
29
30 /**
31 * Class CourseToolsAjax
32 */
33 class CourseToolsAjax extends AbstractAjax {
34 /**
35 * Register AJAX callbacks with the abstract dispatcher.
36 *
37 * @return void
38 */
39 public static function catch_lp_ajax() {
40 parent::catch_lp_ajax();
41 }
42
43 /**
44 * Reset progress for all users enrolled in the selected courses.
45 *
46 * @return void
47 */
48 public function reset_progress_courses() {
49 $response = new Response();
50
51 ini_set( 'max_execution_time', 0 );
52 try {
53 if ( ! current_user_can( UserModel::ROLE_ADMINISTRATOR ) ) {
54 throw new Exception(
55 esc_html__( 'You do not have permission to reset course progress.', 'learnpress' )
56 );
57 }
58
59 $params = LP_Helper::json_decode( LP_Request::get_param( 'data' ), true );
60 if ( ! is_array( $params ) ) {
61 throw new Exception( esc_html__( 'Data invalid.', 'learnpress' ) );
62 }
63
64 $user_item_ids = array_map( 'absint', (array) ( $params['user_item_ids'] ?? [] ) );
65 $reset_all = $params['reset_all'] ?? false;
66 $search_user = trim( $params['lp-search-user'] ?? '' );
67 $search_course = trim( $params['lp-search-course'] ?? '' );
68
69 // Query
70 $db = UserItemsDB::getInstance();
71 $filter = new UserItemsFilter();
72 $filter->limit = -1;
73
74 // Get only courses has items attendance
75 $filter_course_attendance = new UserItemsFilter();
76 $filter_course_attendance->only_fields = [ 'parent_id' ];
77 $filter_course_attendance->ref_type = LP_COURSE_CPT;
78 $filter_course_attendance->return_string_query = 1;
79 $filter_course_attendance->limit = -1;
80 $query_course_attendance = $db->get_user_items( $filter_course_attendance );
81 $filter->where[] = "AND ui.user_item_id IN ({$query_course_attendance})";
82 // End get only courses has items attendance
83
84 // Search user
85 if ( ! empty( $search_user ) && $reset_all ) {
86 $filter->join[] = "INNER JOIN {$db->tb_users} AS u ON ui.user_id = u.ID";
87 $esc_search_user = '%' . $db->wpdb->esc_like( $search_user ) . '%';
88 $filter->where[] = $db->wpdb->prepare(
89 'AND (u.display_name LIKE %s OR u.user_login LIKE %s OR u.user_email LIKE %s)',
90 $esc_search_user,
91 $esc_search_user,
92 $esc_search_user
93 );
94 }
95
96 // Search course
97 if ( ! empty( $search_course ) && $reset_all ) {
98 $filter->only_fields[] = 'post_title';
99 $filter->join[] = "INNER JOIN {$db->tb_lp_courses} AS c ON ui.item_id = c.ID";
100 $filter->where[] = $db->wpdb->prepare(
101 'AND c.post_title LIKE %s',
102 '%' . $db->wpdb->esc_like( $search_course ) . '%'
103 );
104 }
105
106 if ( ! $reset_all ) {
107 $filter->user_item_ids = $user_item_ids;
108 }
109 // End Query
110
111 $total_rows = 0;
112 $userCourses = $db->get_user_items( $filter, $total_rows );
113 if ( empty( $userCourses ) ) {
114 throw new Exception( esc_html__( 'No data reset.', 'learnpress' ) );
115 }
116
117 foreach ( $userCourses as $userCourseObj ) {
118 $userCourseModel = new UserCourseModel( $userCourseObj );
119
120 $userCourseModel->reset_progress();
121 }
122
123 $response->status = Response::STATUS_SUCCESS;
124 $response->message = sprintf(
125 esc_html__(
126 'Progress of %1$d %2$s has been reset.',
127 'learnpress'
128 ),
129 $total_rows,
130 __( 'data', 'learnpress' )
131 );
132 } catch ( Throwable $e ) {
133 $response->message = $e->getMessage();
134 }
135
136 ini_set( 'max_execution_time', LearnPress::$time_limit_default_of_sever );
137
138 wp_send_json( $response );
139 }
140
141 /**
142 * Reset progress for selected course items (lesson, quiz, etc.).
143 *
144 * @return void
145 * @since 4.4.6
146 * @version 1.0.0
147 */
148 public function reset_progress_items_course() {
149 $response = new Response();
150
151 ini_set( 'max_execution_time', 0 );
152 try {
153 if ( ! current_user_can( UserModel::ROLE_ADMINISTRATOR ) ) {
154 throw new Exception(
155 esc_html__( 'You do not have permission to reset item progress.', 'learnpress' )
156 );
157 }
158
159 $params = LP_Helper::json_decode( LP_Request::get_param( 'data' ), true );
160 if ( ! is_array( $params ) ) {
161 throw new Exception( esc_html__( 'Data invalid.', 'learnpress' ) );
162 }
163
164 $user_item_ids = array_map( 'absint', (array) ( $params['user_item_ids'] ?? [] ) );
165 $reset_all = $params['reset_all'] ?? false;
166 $search_item = trim( $params['lp-search-item'] ?? '' );
167 $search_course = trim( $params['lp-search-course'] ?? '' );
168 $search_user = trim( $params['lp-search-user'] ?? '' );
169 $item_type = trim( $params['lp-item-type'] ?? '' );
170
171 // Query
172 $db = UserItemsDB::getInstance();
173 $filter = new UserItemsFilter();
174 $filter->limit = -1;
175
176 // Filter by ref_type = course (items belong to a course)
177 $filter->ref_type = LP_COURSE_CPT;
178
179 // Get only user_id > 0
180 $filter->where[] = 'AND ui.user_id > 0';
181
182 // Filter by item type
183 if ( ! empty( $item_type ) ) {
184 $filter->item_type = $item_type;
185 } else {
186 $item_types = CourseModel::item_types_support();
187 $types_format = LP_Helper::db_format_array( $item_types, '%s' );
188 // phpcs:disable WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
189 $filter->where[] = $db->wpdb->prepare(
190 'AND ui.item_type IN (' . $types_format . ')',
191 ...$item_types
192 );
193 // phpcs:enable WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
194 }
195
196 if ( $reset_all ) {
197 // Search item by title
198 if ( ! empty( $search_item ) ) {
199 $filter->join[] = "INNER JOIN {$db->tb_posts} AS p ON ui.item_id = p.ID";
200 $filter->where[] = $db->wpdb->prepare(
201 'AND p.post_title LIKE %s',
202 '%' . $db->wpdb->esc_like( $search_item ) . '%'
203 );
204 }
205
206 // Search course by title
207 if ( ! empty( $search_course ) ) {
208 $filter->join[] = "INNER JOIN {$db->tb_posts} AS pc ON ui.ref_id = pc.ID";
209 $filter->where[] = $db->wpdb->prepare(
210 'AND pc.post_title LIKE %s',
211 '%' . $db->wpdb->esc_like( $search_course ) . '%'
212 );
213 }
214
215 // Search user
216 if ( ! empty( $search_user ) ) {
217 $filter->join[] = "INNER JOIN {$db->tb_users} AS u ON ui.user_id = u.ID";
218 $esc_search_user = '%' . $db->wpdb->esc_like( $search_user ) . '%';
219 $filter->where[] = $db->wpdb->prepare(
220 'AND (u.display_name LIKE %s OR u.user_login LIKE %s OR u.user_email LIKE %s)',
221 $esc_search_user,
222 $esc_search_user,
223 $esc_search_user
224 );
225 }
226 } else {
227 if ( empty( $user_item_ids ) ) {
228 throw new Exception( esc_html__( 'No data reset.', 'learnpress' ) );
229 }
230
231 $filter->user_item_ids = $user_item_ids;
232 }
233 // End Query
234
235 $total_rows = 0;
236 $userItems = $db->get_user_items( $filter, $total_rows );
237 if ( empty( $userItems ) ) {
238 throw new Exception( esc_html__( 'No data reset.', 'learnpress' ) );
239 }
240
241 foreach ( $userItems as $userItemObj ) {
242 $userItemModel = new UserItemModel( $userItemObj );
243 $userItemModel->delete();
244 }
245
246 $response->status = Response::STATUS_SUCCESS;
247 $response->message = sprintf(
248 esc_html__(
249 'Progress of %1$d %2$s has been reset.',
250 'learnpress'
251 ),
252 $total_rows,
253 __( 'item(s)', 'learnpress' )
254 );
255 } catch ( Throwable $e ) {
256 $response->message = $e->getMessage();
257 }
258
259 ini_set( 'max_execution_time', LearnPress::$time_limit_default_of_sever );
260
261 wp_send_json( $response );
262 }
263 }
264