__( 'Recount quizzes completed', 'gamipress' ),
'ld_topics' => __( 'Recount topics completed', 'gamipress' ),
'ld_lessons' => __( 'Recount lessons completed', 'gamipress' ),
'ld_courses' => __( 'Recount courses completed', 'gamipress' ),
);
return $recountable_activity_triggers;
}
add_filter( 'gamipress_recountable_activity_triggers', 'gamipress_ld_recountable_activity_triggers' );
/**
* Recount quizzes completed
*
* @since 1.0.9
* @updated 1.1.0 Added $loop parameter
*
* @param array $response
* @param int $loop
* @param int $limit
* @param int $offset
*
* @return array $response
*/
function gamipress_ld_activity_recount_quizzes( $response, $loop, $limit, $offset ) {
global $wpdb;
// Meta where information resides
$meta_key = '_sfwd-quizzes';
// Get all stored users count
$users_count = absint( $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->users} AS u LEFT JOIN {$wpdb->usermeta} AS um ON um.user_id = u.ID AND um.meta_key = '{$meta_key}' WHERE um.meta_key IS NOT NULL" ) ) );
// On first loop send an informational text
if( $loop === 0 && $users_count > $limit ) {
$response['run_again'] = true;
$response['message'] = sprintf( __( '%d users found, recounting...', 'gamipress' ), $users_count );
$response['log'] = sprintf( __( '%d users found, recounting...', 'gamipress' ), $users_count ) . "
\n";
// Return early to inform
return $response;
}
// Get all stored users
$users = $wpdb->get_results( $wpdb->prepare( "SELECT u.ID FROM {$wpdb->users} AS u LEFT JOIN {$wpdb->usermeta} AS um ON um.user_id = u.ID AND um.meta_key = '{$meta_key}' WHERE um.meta_key IS NOT NULL LIMIT {$offset}, {$limit}" ) );
foreach( $users as $user ) {
// Get all user quizzes completed
$quizzes = get_user_meta( $user->ID, $meta_key, true );
// Skip if user does not have completed any quizzes
if( ! is_array( $quizzes ) ) {
continue;
}
foreach( $quizzes as $quiz ) {
$quiz['quiz'] = get_post( $quiz['quiz'] );
// Skip incorrect quizzes
if( ! $quiz['quiz'] )
continue;
// Ensure required data
$quiz['course'] = get_post( $quiz['course'] );
if( ! isset( $quiz['percentage'] ) )
$quiz['percentage'] = 0;
if( ! isset( $quiz['pass'] ) )
$quiz['pass'] = 0;
// Call to all separated quiz completion listeners
gamipress_ld_complete_quiz_listener( $quiz, $user );
gamipress_ld_complete_quiz_min_grade_listener( $quiz, $user );
gamipress_ld_complete_quiz_max_grade_listener( $quiz, $user );
gamipress_ld_complete_quiz_between_grade_listener( $quiz, $user );
gamipress_ld_pass_quiz_listener( $quiz, $user );
gamipress_ld_fail_quiz_listener( $quiz, $user );
$quiz_id = $quiz['quiz']->ID;
$course_id = ( $quiz['course'] instanceof WP_Post ? $quiz['course']->ID : 0 );
if( $course_id !== 0 ) {
$response['log'] .= sprintf( __( '[Complete quiz] Quiz: %s User: %s Course: %s Quiz Score: %s', 'gamipress' ),
'' . $quiz_id . '',
'' . $user->ID . '',
'' . $course_id . '',
absint( $quiz['percentage'] )
) . "
\n";
} else {
$response['log'] .= sprintf( __( '[Complete quiz] Quiz: %s User: %s Quiz Score: %s', 'gamipress' ),
'' . $quiz_id . '',
'' . $user->ID . '',
absint( $quiz['percentage'] )
) . "
\n";
}
}
}
$recounted_users = $limit * ( $loop + 1 );
// Check remaining posts
if( $recounted_users < $users_count ) {
$response['run_again'] = true;
$response['message'] = sprintf( __( '%d remaining users to finish recount', 'gamipress' ), ( $users_count - $recounted_users ) );
}
return $response;
}
add_filter( 'gamipress_activity_recount_ld_quizzes', 'gamipress_ld_activity_recount_quizzes', 10, 4 );
/**
* Recount topics completed
*
* @since 1.0.9
* @updated 1.1.0 Added $loop parameter
*
* @param array $response
* @param int $loop
* @param int $limit
* @param int $offset
*
* @return array $response
*/
function gamipress_ld_activity_recount_topics( $response, $loop, $limit, $offset ) {
global $wpdb;
// Meta where information resides
$meta_key = '_sfwd-course_progress';
// Get all stored users count
$users_count = absint( $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->users} AS u LEFT JOIN {$wpdb->usermeta} AS um ON um.user_id = u.ID AND um.meta_key = '{$meta_key}' WHERE um.meta_key IS NOT NULL" ) ) );
// On first loop send an informational text
if( $loop === 0 && $users_count > $limit ) {
$response['run_again'] = true;
$response['message'] = sprintf( __( '%d users found, recounting...', 'gamipress' ), $users_count );
$response['log'] = sprintf( __( '%d users found, recounting...', 'gamipress' ), $users_count ) . "
\n";
// Return early to inform
return $response;
}
// Get all stored users
$users = $wpdb->get_results( $wpdb->prepare( "SELECT u.ID FROM {$wpdb->users} AS u LEFT JOIN {$wpdb->usermeta} AS um ON um.user_id = u.ID AND um.meta_key = '{$meta_key}' WHERE um.meta_key IS NOT NULL LIMIT {$offset}, {$limit}" ) );
foreach( $users as $user ) {
// Get all user courses completed
$courses = get_user_meta( $user->ID, $meta_key, true );
// Skip if user does not have completed any courses
if( ! is_array( $courses ) ) {
continue;
}
foreach( $courses as $course_id => $course ) {
// Skip if user does not have completed any topics
if( ! is_array( $course['topics'] ) ) {
continue;
}
// Loop all topics completed (topics are separated in lessons)
foreach( $course['topics'] as $lesson_id => $topics ) {
// Skip if user does not have completed any topics
if( ! is_array( $topics ) ) {
continue;
}
// Loop all lesson topics completed
foreach( $topics as $topic_id => $completed ) {
if( $completed ) {
$args = array(
'topic' => get_post( $topic_id ),
'user' => $user,
'lesson' => get_post( $lesson_id ),
'course' => get_post( $course_id ),
);
// Skip incorrect topics
if( ! $args['topic'] )
continue;
gamipress_ld_complete_topic( $args );
$response['log'] .= sprintf( __( '[Complete topic] Topic: %s User: %s Lesson: %s Course: %s', 'gamipress' ),
'' . $topic_id . '',
'' . $user->ID . '',
'' . $lesson_id . '',
'' . $course_id . ''
) . "
\n";
}
}
}
}
}
$recounted_users = $limit * ( $loop + 1 );
// Check remaining posts
if( $recounted_users < $users_count ) {
$response['run_again'] = true;
$response['message'] = sprintf( __( '%d remaining users to finish recount', 'gamipress' ), ( $users_count - $recounted_users ) );
}
return $response;
}
add_filter( 'gamipress_activity_recount_ld_topics', 'gamipress_ld_activity_recount_topics', 10, 4 );
/**
* Recount lessons completed
*
* @since 1.0.9
* @updated 1.1.0 Added $loop parameter
*
* @param array $response
* @param int $loop
* @param int $limit
* @param int $offset
*
* @return array $response
*/
function gamipress_ld_activity_recount_lessons( $response, $loop, $limit, $offset ) {
global $wpdb;
// Meta where information resides
$meta_key = '_sfwd-course_progress';
// Get all stored users count
$users_count = absint( $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->users} AS u LEFT JOIN {$wpdb->usermeta} AS um ON um.user_id = u.ID AND um.meta_key = '{$meta_key}' WHERE um.meta_key IS NOT NULL" ) ) );
// On first loop send an informational text
if( $loop === 0 && $users_count > $limit ) {
$response['run_again'] = true;
$response['message'] = sprintf( __( '%d users found, recounting...', 'gamipress' ), $users_count );
$response['log'] = sprintf( __( '%d users found, recounting...', 'gamipress' ), $users_count ) . "
\n";
// Return early to inform
return $response;
}
// Get all stored users
$users = $wpdb->get_results( $wpdb->prepare( "SELECT u.ID FROM {$wpdb->users} AS u LEFT JOIN {$wpdb->usermeta} AS um ON um.user_id = u.ID AND um.meta_key = '{$meta_key}' WHERE um.meta_key IS NOT NULL LIMIT {$offset}, {$limit}" ) );
foreach( $users as $user ) {
// Get all user courses completed
$courses = get_user_meta( $user->ID, $meta_key, true );
// Skip if user does not have completed any courses
if( ! is_array( $courses ) ) {
continue;
}
foreach( $courses as $course_id => $course ) {
// Skip if user does not have completed any lessons
if( ! is_array( $course['lessons'] ) ) {
continue;
}
// Loop all lessons completed
foreach( $course['lessons'] as $lesson_id => $completed ) {
if( $completed ) {
$args = array(
'user' => $user,
'lesson' => get_post( $lesson_id ),
'course' => get_post( $course_id ),
);
// Skip incorrect lessons
if( ! $args['lesson'] )
continue;
gamipress_ld_complete_lesson( $args );
$response['log'] .= sprintf( __( '[Complete lesson] Lesson: %s User: %s Course: %s', 'gamipress' ),
'' . $lesson_id . '',
'' . $user->ID . '',
'' . $course_id . ''
) . "
\n";
}
}
}
}
$recounted_users = $limit * ( $loop + 1 );
// Check remaining posts
if( $recounted_users < $users_count ) {
$response['run_again'] = true;
$response['message'] = sprintf( __( '%d remaining users to finish recount', 'gamipress' ), ( $users_count - $recounted_users ) );
}
return $response;
}
add_filter( 'gamipress_activity_recount_ld_lessons', 'gamipress_ld_activity_recount_lessons', 10, 4 );
/**
* Recount courses completed
*
* @since 1.0.9
* @updated 1.1.0 Added $loop parameter
*
* @param array $response
* @param int $loop
* @param int $limit
* @param int $offset
*
* @return array $response
*/
function gamipress_ld_activity_recount_courses( $response, $loop, $limit, $offset ) {
global $wpdb;
// Meta where information resides
$meta_key = '_sfwd-course_progress';
// Get all stored users count
$users_count = absint( $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->users} AS u LEFT JOIN {$wpdb->usermeta} AS um ON um.user_id = u.ID AND um.meta_key = '{$meta_key}' WHERE um.meta_key IS NOT NULL" ) ) );
// On first loop send an informational text
if( $loop === 0 && $users_count > $limit ) {
$response['run_again'] = true;
$response['message'] = sprintf( __( '%d users found, recounting...', 'gamipress' ), $users_count );
$response['log'] = sprintf( __( '%d users found, recounting...', 'gamipress' ), $users_count ) . "
\n";
// Return early to inform
return $response;
}
// Get all stored users
$users = $wpdb->get_results( $wpdb->prepare( "SELECT u.ID FROM {$wpdb->users} AS u LEFT JOIN {$wpdb->usermeta} AS um ON um.user_id = u.ID AND um.meta_key = '{$meta_key}' WHERE um.meta_key IS NOT NULL LIMIT {$offset}, {$limit}" ) );
foreach( $users as $user ) {
// Get all user courses completed
$courses = get_user_meta( $user->ID, $meta_key, true );
// Skip if user does not have completed any courses
if( ! is_array( $courses ) ) {
continue;
}
foreach( $courses as $course_id => $course ) {
$completed = get_user_meta( $user->ID, 'course_completed_' . $course_id, true );
if( $completed ) {
$args = array(
'user' => $user,
'course' => get_post( $course_id ),
);
// Skip incorrect courses
if( ! $args['course'] )
continue;
gamipress_ld_complete_course( $args );
$response['log'] .= sprintf( __( '[Complete course] Course: %s User: %s', 'gamipress' ),
'' . $course_id . '',
'' . $user->ID . ''
) . "
\n";
}
}
}
$recounted_users = $limit * ( $loop + 1 );
// Check remaining posts
if( $recounted_users < $users_count ) {
$response['run_again'] = true;
$response['message'] = sprintf( __( '%d remaining users to finish recount', 'gamipress' ), ( $users_count - $recounted_users ) );
}
return $response;
}
add_filter( 'gamipress_activity_recount_ld_courses', 'gamipress_ld_activity_recount_courses', 10, 4 );