PluginProbe ʕ •ᴥ•ʔ
OttoKit: All-in-One Automation Platform / 1.1.32
OttoKit: All-in-One Automation Platform v1.1.32
1.1.32 1.1.31 1.1.30 1.1.29 1.1.28 1.1.27 1.1.9 trunk 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.20 1.0.21 1.0.22 1.0.23 1.0.24 1.0.25 1.0.26 1.0.27 1.0.28 1.0.29 1.0.30 1.0.31 1.0.32 1.0.33 1.0.34 1.0.35 1.0.36 1.0.37 1.0.38 1.0.39 1.0.40 1.0.41 1.0.42 1.0.43 1.0.44 1.0.45 1.0.46 1.0.47 1.0.48 1.0.49 1.0.50 1.0.51 1.0.52 1.0.53 1.0.54 1.0.55 1.0.56 1.0.57 1.0.58 1.0.59 1.0.60 1.0.61 1.0.62 1.0.63 1.0.64 1.0.65 1.0.66 1.0.67 1.0.68 1.0.69 1.0.7 1.0.70 1.0.71 1.0.72 1.0.73 1.0.74 1.0.75 1.0.76 1.0.77 1.0.78 1.0.79 1.0.8 1.0.80 1.0.81 1.0.82 1.0.83 1.0.84 1.0.85 1.0.86 1.0.87 1.0.88 1.0.89 1.0.9 1.0.90 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.20 1.1.21 1.1.22 1.1.23 1.1.24 1.1.25 1.1.26 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8
suretriggers / src / Integrations / learndash / actions / reset-user-course-progress.php
suretriggers / src / Integrations / learndash / actions Last commit date
add-user-group.php 9 months ago enroll-to-course.php 9 months ago find-course-taxonomy.php 9 months ago find-user-group-leader-groups.php 3 months ago find-user-groups.php 9 months ago list-user-enrolled-courses.php 9 months ago make-user-group-leader.php 2 years ago mark-course-complete-for-user.php 9 months ago mark-lesson-complete-for-user.php 9 months ago mark-quiz-complete-for-user.php 9 months ago mark-topic-complete-for-user.php 9 months ago remove-from-course.php 9 months ago remove-user-from-group-leader.php 9 months ago remove-user-group.php 9 months ago reset-user-course-progress.php 9 months ago
reset-user-course-progress.php
435 lines
1 <?php
2 /**
3 * ResetUserCourseProgress.
4 * php version 5.6
5 *
6 * @category ResetUserCourseProgress
7 * @package SureTriggers
8 * @author BSF <username@example.com>
9 * @license https://www.gnu.org/licenses/gpl-3.0.html GPLv3
10 * @link https://www.brainstormforce.com/
11 * @since 1.0.0
12 */
13
14 namespace SureTriggers\Integrations\LearnDash\Actions;
15
16 use SureTriggers\Integrations\AutomateAction;
17 use SureTriggers\Integrations\LearnDash\LearnDash;
18 use SureTriggers\Traits\SingletonLoader;
19 use LDLMS_DB;
20
21 /**
22 * ResetUserCourseProgress
23 *
24 * @category ResetUserCourseProgress
25 * @package SureTriggers
26 * @author BSF <username@example.com>
27 * @license https://www.gnu.org/licenses/gpl-3.0.html GPLv3
28 * @link https://www.brainstormforce.com/
29 * @since 1.0.0
30 */
31 class ResetUserCourseProgress extends AutomateAction {
32
33
34 /**
35 * Integration type.
36 *
37 * @var string
38 */
39 public $integration = 'LearnDash';
40 /**
41 * The quiz_list.
42 *
43 * @var array
44 */
45 private $quiz_list;
46 /**
47 * The assignment_list.
48 *
49 * @var array
50 */
51 private $assignment_list;
52 /**
53 * Action name.
54 *
55 * @var string
56 */
57 public $action = 'ld_reset_user_course_progress';
58
59 use SingletonLoader;
60
61 /**
62 * Register an action.
63 *
64 * @param array $actions actions.
65 * @return array
66 */
67 public function register( $actions ) {
68 $actions[ $this->integration ][ $this->action ] = [
69 'label' => __( 'Reset User Progress', 'suretriggers' ),
70 'action' => $this->action,
71 'function' => [ $this, 'action_listener' ],
72 ];
73 return $actions;
74 }
75
76 /**
77 * Action listener.
78 *
79 * @param int $user_id user id.
80 * @param int $automation_id automation_id.
81 * @param array $fields template fields.
82 * @param array $selected_options saved template data.
83 * @psalm-suppress UndefinedFunction
84 *
85 * @return bool|array
86 */
87 public function _action_listener( $user_id, $automation_id, $fields, $selected_options ) {
88
89 $course_id = ( isset( $selected_options['sfwd-courses'] ) ) ? $selected_options['sfwd-courses'] : '';
90
91 self::delete_user_activity( $user_id, $course_id );
92 if ( self::delete_course_progress( $user_id, $course_id ) ) {
93 self::reset_quiz_progress( $user_id, $course_id );
94 self::delete_assignments();
95 }
96
97 self::reset_quiz_progress( $user_id, $course_id );
98
99 $user_data = LearnDash::get_user_pluggable_data( $user_id );
100 return [
101 'user' => $user_data,
102 'course' => LearnDash::get_course_pluggable_data( $course_id ),
103 ];
104 }
105
106 /**
107 *
108 * Delete course related meta keys from user meta table.
109 * Delete all activity related to a course from LD tables
110 *
111 * @param int $user_id User ID.
112 * @param int $course_id Course ID.
113 *
114 * @return array|void
115 */
116 public function delete_user_activity( $user_id, $course_id ) {
117 global $wpdb;
118 delete_user_meta( $user_id, 'completed_' . $course_id );
119 delete_user_meta( $user_id, 'course_completed_' . $course_id );
120 delete_user_meta( $user_id, 'learndash_course_expired_' . $course_id );
121
122 $activity_ids = $wpdb->get_results(
123 $wpdb->prepare(
124 "SELECT activity_id FROM {$wpdb->prefix}learndash_user_activity
125 WHERE course_id = %d AND user_id = %d",
126 $course_id,
127 $user_id
128 )
129 );
130
131 if ( $activity_ids ) {
132 foreach ( $activity_ids as $activity_id ) {
133 $wpdb->query(
134 $wpdb->prepare(
135 "DELETE FROM {$wpdb->prefix}learndash_user_activity_meta
136 WHERE activity_id = %d",
137 $activity_id->activity_id
138 )
139 );
140 $wpdb->query(
141 $wpdb->prepare(
142 "DELETE FROM {$wpdb->prefix}learndash_user_activity
143 WHERE activity_id = %d",
144 $activity_id->activity_id
145 )
146 );
147 }
148 }
149 }
150
151 /**
152 *
153 * Delete course progress from Usermeta Table
154 *
155 * @param int $user_id User ID.
156 * @param int $course_id Course ID.
157 *
158 * @return bool
159 */
160 public function delete_course_progress( $user_id, $course_id ) {
161 $usermeta = get_user_meta( $user_id, '_sfwd-course_progress', true );
162 if ( ! empty( $usermeta ) && is_array( $usermeta ) && isset( $usermeta[ $course_id ] ) ) {
163 unset( $usermeta[ $course_id ] );
164 update_user_meta( $user_id, '_sfwd-course_progress', $usermeta );
165
166 $last_know_step = get_user_meta( $user_id, 'learndash_last_known_page', true );
167 if ( is_string( $last_know_step ) ) {
168 $last_know_step = explode( ',', $last_know_step );
169
170 if ( isset( $last_know_step[0] ) && isset( $last_know_step[1] ) ) {
171 $step_id = $last_know_step[0];
172 $step_course_id = $last_know_step[1];
173
174 if ( (int) $step_course_id === (int) $course_id ) {
175 delete_user_meta( $user_id, 'learndash_last_known_page' );
176 }
177 }
178 }
179
180 delete_user_meta( $user_id, 'learndash_last_known_course_' . $course_id );
181
182 return true;
183 }
184
185 return false;
186 }
187
188 /**
189 *
190 * Delete quiz progress, related to course, quiz etc
191 *
192 * @param int $user_id User ID.
193 * @param int $course_id Course ID.
194 *
195 * @return array|void
196 */
197 public function reset_quiz_progress( $user_id, $course_id ) {
198 if ( ! function_exists( 'learndash_get_lesson_list' ) || ! function_exists( 'learndash_get_lesson_quiz_list' ) ) {
199 return [
200 'status' => 'error',
201 'message' => __( 'Required functions not found.', 'suretriggers' ),
202
203 ];
204 }
205 $lessons = learndash_get_lesson_list( $course_id, [ 'num' => 0 ] );
206 foreach ( $lessons as $lesson ) {
207 $this->get_topics_quiz( $user_id, $lesson->ID, $course_id );
208 $lesson_quiz_list = learndash_get_lesson_quiz_list( $lesson->ID, $user_id, $course_id );
209
210 if ( $lesson_quiz_list ) {
211 foreach ( $lesson_quiz_list as $ql ) {
212 $this->quiz_list[ $ql['post']->ID ] = 0;
213 }
214 }
215
216 $assignments = get_posts(
217 [
218 'post_type' => 'sfwd-assignment',
219 'posts_per_page' => 10,
220 'meta_query' => [
221 'relation' => 'AND',
222 [
223 'key' => 'lesson_id',
224 'value' => $lesson->ID,
225 'compare' => '=',
226 ],
227 [
228 'key' => 'course_id',
229 'value' => $course_id,
230 'compare' => '=',
231 ],
232 [
233 'key' => 'user_id',
234 'value' => $user_id,
235 'compare' => '=',
236 ],
237 ],
238 ]
239 );
240
241 if ( $assignments ) {
242 foreach ( $assignments as $assignment ) {
243 $this->assignment_list[] = $assignment->ID;
244 }
245 }
246 }
247
248 $this->delete_quiz_progress( $user_id, $course_id );
249 }
250
251 /**
252 *
253 * Get topic quiz + assignment list
254 *
255 * @param int $user_id User ID.
256 * @param int $lesson_id Lesson ID.
257 * @param int $course_id Course ID.
258 *
259 * @return array|void
260 */
261 public function get_topics_quiz( $user_id, $lesson_id, $course_id ) {
262 if ( ! function_exists( 'learndash_get_lesson_quiz_list' ) || ! function_exists( 'learndash_get_topic_list' ) ) {
263 return [
264 'status' => 'error',
265 'message' => __( 'Required functions not found.', 'suretriggers' ),
266
267 ];
268 }
269 $topic_list = learndash_get_topic_list( $lesson_id, $course_id );
270 if ( $topic_list ) {
271 foreach ( $topic_list as $topic ) {
272 $topic_quiz_list = learndash_get_lesson_quiz_list( $topic->ID, $user_id, $course_id );
273 if ( $topic_quiz_list ) {
274 foreach ( $topic_quiz_list as $ql ) {
275 $this->quiz_list[ $ql['post']->ID ] = 0;
276 }
277 }
278
279 $assignments = get_posts(
280 [
281 'post_type' => 'sfwd-assignment',
282 'posts_per_page' => 10,
283 'meta_query' => [
284 'relation' => 'AND',
285 [
286 'key' => 'lesson_id',
287 'value' => $topic->ID,
288 'compare' => '=',
289 ],
290 [
291 'key' => 'course_id',
292 'value' => $course_id,
293 'compare' => '=',
294 ],
295 [
296 'key' => 'user_id',
297 'value' => $user_id,
298 'compare' => '=',
299 ],
300 ],
301 ]
302 );
303
304 if ( $assignments ) {
305 foreach ( $assignments as $assignment ) {
306 $this->assignment_list[] = $assignment->ID;
307 }
308 }
309 }
310 }
311 }
312
313 /**
314 *
315 * Actually deleting quiz data from user meta and pro quiz activity table
316 *
317 * @param int $user_id User ID.
318 * @param int $course_id Course ID.
319 *
320 * @return array|void
321 */
322 public function delete_quiz_progress( $user_id, $course_id = null ) {
323 if ( ! function_exists( 'learndash_get_course_quiz_list' ) || ! class_exists( 'LDLMS_DB' ) ) {
324 return [
325 'status' => 'error',
326 'message' => __( 'Required functions not found.', 'suretriggers' ),
327
328 ];
329 }
330 $quizzes = learndash_get_course_quiz_list( $course_id, $user_id );
331 if ( $quizzes ) {
332 foreach ( $quizzes as $quiz ) {
333 $this->quiz_list[ $quiz['post']->ID ] = 0;
334 }
335 }
336 global $wpdb;
337
338 $quizz_progress = [];
339 if ( ! empty( $this->quiz_list ) ) {
340 $usermeta = get_user_meta( $user_id, '_sfwd-quizzes', true );
341 $quizz_progress = empty( $usermeta ) ? [] : $usermeta;
342 if ( is_array( $quizz_progress ) ) {
343 foreach ( $quizz_progress as $k => $p ) {
344 if ( is_array( $p ) && key_exists( $p['quiz'], $this->quiz_list ) && $p['course'] == $course_id ) {
345 $statistic_ref_id = $p['statistic_ref_id'];
346 unset( $quizz_progress[ $k ] );
347 if ( ! empty( $statistic_ref_id ) ) {
348
349 if ( class_exists( '\LDLMS_DB' ) ) {
350 $pro_quiz_stat_table = LDLMS_DB::get_table_name( 'quiz_statistic' );
351 $pro_quiz_stat_ref_table = LDLMS_DB::get_table_name( 'quiz_statistic_ref' );
352 } else {
353 $pro_quiz_stat_table = $wpdb->prefix . 'wp_pro_quiz_statistic';
354 $pro_quiz_stat_ref_table = $wpdb->prefix . 'wp_pro_quiz_statistic_ref';
355 }
356
357 $wpdb->query(
358 $wpdb->prepare(
359 'DELETE FROM %s WHERE statistic_ref_id = %d',
360 $pro_quiz_stat_table,
361 $statistic_ref_id
362 )
363 );
364 $wpdb->query(
365 $wpdb->prepare(
366 'DELETE FROM %s WHERE statistic_ref_id = %d',
367 $pro_quiz_stat_ref_table,
368 $statistic_ref_id
369 )
370 );
371 }
372 }
373 }
374 }
375 }
376
377 update_user_meta( $user_id, '_sfwd-quizzes', $quizz_progress );
378 $usermeta = get_user_meta( $user_id, '_sfwd-quizzes', true );
379 $quizz_progress = empty( $usermeta ) ? [] : $usermeta;
380 if ( is_array( $quizz_progress ) ) {
381 foreach ( $quizz_progress as $k => $p ) {
382 if ( is_array( $p ) && $p['course'] == $course_id ) {
383 $statistic_ref_id = $p['statistic_ref_id'];
384 unset( $quizz_progress[ $k ] );
385 if ( ! empty( $statistic_ref_id ) ) {
386
387 if ( class_exists( '\LDLMS_DB' ) ) {
388 $pro_quiz_stat_table = LDLMS_DB::get_table_name( 'quiz_statistic' );
389 $pro_quiz_stat_ref_table = LDLMS_DB::get_table_name( 'quiz_statistic_ref' );
390 } else {
391 $pro_quiz_stat_table = $wpdb->prefix . 'wp_pro_quiz_statistic';
392 $pro_quiz_stat_ref_table = $wpdb->prefix . 'wp_pro_quiz_statistic_ref';
393 }
394
395 $wpdb->query(
396 $wpdb->prepare(
397 'DELETE FROM %s WHERE statistic_ref_id = %d',
398 $pro_quiz_stat_table,
399 $statistic_ref_id
400 )
401 );
402 $wpdb->query(
403 $wpdb->prepare(
404 'DELETE FROM %s WHERE statistic_ref_id = %d',
405 $pro_quiz_stat_ref_table,
406 $statistic_ref_id
407 )
408 );
409 }
410 }
411 }
412 }
413 update_user_meta( $user_id, '_sfwd-quizzes', $quizz_progress );
414 }
415
416 /**
417 * Delete assignments of course, related to lessons / topics
418 *
419 * @return array|void
420 */
421 public function delete_assignments() {
422 global $wpdb;
423 $assignments = $this->assignment_list;
424 if ( $assignments ) {
425 foreach ( $assignments as $assignment ) {
426 $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->posts} WHERE ID = %d", $assignment ) );
427 $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE post_id = %d", $assignment ) );
428 }
429 }
430 }
431
432 }
433
434 ResetUserCourseProgress::get_instance();
435