PluginProbe ʕ •ᴥ•ʔ
OttoKit: All-in-One Automation Platform / 1.0.83
OttoKit: All-in-One Automation Platform v1.0.83
1.1.38 1.1.37 1.1.36 1.1.35 1.1.34 1.1.33 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 3 years ago enroll-to-course.php 3 years ago find-course-taxonomy.php 1 year ago find-user-groups.php 1 year ago list-user-enrolled-courses.php 2 years ago make-user-group-leader.php 2 years ago mark-course-complete-for-user.php 3 years ago mark-lesson-complete-for-user.php 2 years ago mark-quiz-complete-for-user.php 2 years ago mark-topic-complete-for-user.php 2 years ago remove-from-course.php 3 years ago remove-user-from-group-leader.php 2 years ago remove-user-group.php 3 years ago reset-user-course-progress.php 2 years ago
reset-user-course-progress.php
425 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 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 void
196 */
197 public function reset_quiz_progress( $user_id, $course_id ) {
198 if ( ! function_exists( 'learndash_get_lesson_list' ) ||
199 ! function_exists( 'learndash_get_lesson_quiz_list' ) ) {
200 return;
201 }
202 $lessons = learndash_get_lesson_list( $course_id, [ 'num' => 0 ] );
203 foreach ( $lessons as $lesson ) {
204 $this->get_topics_quiz( $user_id, $lesson->ID, $course_id );
205 $lesson_quiz_list = learndash_get_lesson_quiz_list( $lesson->ID, $user_id, $course_id );
206
207 if ( $lesson_quiz_list ) {
208 foreach ( $lesson_quiz_list as $ql ) {
209 $this->quiz_list[ $ql['post']->ID ] = 0;
210 }
211 }
212
213 $assignments = get_posts(
214 [
215 'post_type' => 'sfwd-assignment',
216 'posts_per_page' => 10,
217 'meta_query' => [
218 'relation' => 'AND',
219 [
220 'key' => 'lesson_id',
221 'value' => $lesson->ID,
222 'compare' => '=',
223 ],
224 [
225 'key' => 'course_id',
226 'value' => $course_id,
227 'compare' => '=',
228 ],
229 [
230 'key' => 'user_id',
231 'value' => $user_id,
232 'compare' => '=',
233 ],
234 ],
235 ]
236 );
237
238 if ( $assignments ) {
239 foreach ( $assignments as $assignment ) {
240 $this->assignment_list[] = $assignment->ID;
241 }
242 }
243 }
244
245 $this->delete_quiz_progress( $user_id, $course_id );
246 }
247
248 /**
249 *
250 * Get topic quiz + assignment list
251 *
252 * @param int $user_id User ID.
253 * @param int $lesson_id Lesson ID.
254 * @param int $course_id Course ID.
255 *
256 * @return void
257 */
258 public function get_topics_quiz( $user_id, $lesson_id, $course_id ) {
259 if ( ! function_exists( 'learndash_get_lesson_quiz_list' ) ||
260 ! function_exists( 'learndash_get_topic_list' ) ) {
261 return;
262 }
263 $topic_list = learndash_get_topic_list( $lesson_id, $course_id );
264 if ( $topic_list ) {
265 foreach ( $topic_list as $topic ) {
266 $topic_quiz_list = learndash_get_lesson_quiz_list( $topic->ID, $user_id, $course_id );
267 if ( $topic_quiz_list ) {
268 foreach ( $topic_quiz_list as $ql ) {
269 $this->quiz_list[ $ql['post']->ID ] = 0;
270 }
271 }
272
273 $assignments = get_posts(
274 [
275 'post_type' => 'sfwd-assignment',
276 'posts_per_page' => 10,
277 'meta_query' => [
278 'relation' => 'AND',
279 [
280 'key' => 'lesson_id',
281 'value' => $topic->ID,
282 'compare' => '=',
283 ],
284 [
285 'key' => 'course_id',
286 'value' => $course_id,
287 'compare' => '=',
288 ],
289 [
290 'key' => 'user_id',
291 'value' => $user_id,
292 'compare' => '=',
293 ],
294 ],
295 ]
296 );
297
298 if ( $assignments ) {
299 foreach ( $assignments as $assignment ) {
300 $this->assignment_list[] = $assignment->ID;
301 }
302 }
303 }
304 }
305 }
306
307 /**
308 *
309 * Actually deleting quiz data from user meta and pro quiz activity table
310 *
311 * @param int $user_id User ID.
312 * @param int $course_id Course ID.
313 *
314 * @return void
315 */
316 public function delete_quiz_progress( $user_id, $course_id = null ) {
317 if ( ! function_exists( 'learndash_get_course_quiz_list' ) || ! class_exists( 'LDLMS_DB' ) ) {
318 return;
319 }
320 $quizzes = learndash_get_course_quiz_list( $course_id, $user_id );
321 if ( $quizzes ) {
322 foreach ( $quizzes as $quiz ) {
323 $this->quiz_list[ $quiz['post']->ID ] = 0;
324 }
325 }
326 global $wpdb;
327
328 $quizz_progress = [];
329 if ( ! empty( $this->quiz_list ) ) {
330 $usermeta = get_user_meta( $user_id, '_sfwd-quizzes', true );
331 $quizz_progress = empty( $usermeta ) ? [] : $usermeta;
332 if ( is_array( $quizz_progress ) ) {
333 foreach ( $quizz_progress as $k => $p ) {
334 if ( is_array( $p ) && key_exists( $p['quiz'], $this->quiz_list ) && $p['course'] == $course_id ) {
335 $statistic_ref_id = $p['statistic_ref_id'];
336 unset( $quizz_progress[ $k ] );
337 if ( ! empty( $statistic_ref_id ) ) {
338
339 if ( class_exists( '\LDLMS_DB' ) ) {
340 $pro_quiz_stat_table = LDLMS_DB::get_table_name( 'quiz_statistic' );
341 $pro_quiz_stat_ref_table = LDLMS_DB::get_table_name( 'quiz_statistic_ref' );
342 } else {
343 $pro_quiz_stat_table = $wpdb->prefix . 'wp_pro_quiz_statistic';
344 $pro_quiz_stat_ref_table = $wpdb->prefix . 'wp_pro_quiz_statistic_ref';
345 }
346
347 $wpdb->query(
348 $wpdb->prepare(
349 'DELETE FROM %s WHERE statistic_ref_id = %d',
350 $pro_quiz_stat_table,
351 $statistic_ref_id
352 )
353 );
354 $wpdb->query(
355 $wpdb->prepare(
356 'DELETE FROM %s WHERE statistic_ref_id = %d',
357 $pro_quiz_stat_ref_table,
358 $statistic_ref_id
359 )
360 );
361 }
362 }
363 }
364 }
365 }
366
367 update_user_meta( $user_id, '_sfwd-quizzes', $quizz_progress );
368 $usermeta = get_user_meta( $user_id, '_sfwd-quizzes', true );
369 $quizz_progress = empty( $usermeta ) ? [] : $usermeta;
370 if ( is_array( $quizz_progress ) ) {
371 foreach ( $quizz_progress as $k => $p ) {
372 if ( is_array( $p ) && $p['course'] == $course_id ) {
373 $statistic_ref_id = $p['statistic_ref_id'];
374 unset( $quizz_progress[ $k ] );
375 if ( ! empty( $statistic_ref_id ) ) {
376
377 if ( class_exists( '\LDLMS_DB' ) ) {
378 $pro_quiz_stat_table = LDLMS_DB::get_table_name( 'quiz_statistic' );
379 $pro_quiz_stat_ref_table = LDLMS_DB::get_table_name( 'quiz_statistic_ref' );
380 } else {
381 $pro_quiz_stat_table = $wpdb->prefix . 'wp_pro_quiz_statistic';
382 $pro_quiz_stat_ref_table = $wpdb->prefix . 'wp_pro_quiz_statistic_ref';
383 }
384
385 $wpdb->query(
386 $wpdb->prepare(
387 'DELETE FROM %s WHERE statistic_ref_id = %d',
388 $pro_quiz_stat_table,
389 $statistic_ref_id
390 )
391 );
392 $wpdb->query(
393 $wpdb->prepare(
394 'DELETE FROM %s WHERE statistic_ref_id = %d',
395 $pro_quiz_stat_ref_table,
396 $statistic_ref_id
397 )
398 );
399 }
400 }
401 }
402 }
403 update_user_meta( $user_id, '_sfwd-quizzes', $quizz_progress );
404 }
405
406 /**
407 * Delete assignments of course, related to lessons / topics
408 *
409 * @return void
410 */
411 public function delete_assignments() {
412 global $wpdb;
413 $assignments = $this->assignment_list;
414 if ( $assignments ) {
415 foreach ( $assignments as $assignment ) {
416 $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->posts} WHERE ID = %d", $assignment ) );
417 $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE post_id = %d", $assignment ) );
418 }
419 }
420 }
421
422 }
423
424 ResetUserCourseProgress::get_instance();
425