Skip to content

Transfer ThreeWP Broadcast Learndash Enrollments with Course Progress from Subsite to Main Site

  • Use Cases
gbes enrolled course with some progress 2026 09 12 5079

It was decided that a subsite should be closed down, and its users transferred to a LearnDash Group, with their course access at the subsite also transferred, along with each user’s course progress data.

In the following PHP code, “dar” or “DAR” is the subsite. The target blog ID is 21. Obviously, LearnDash and ThreeWP Broadcast need to have been installed.Finally, the courses here have been already broadcast from site 21 to the current site, meaning that the courses and their lessons exist in a child to parent relationship from the current subsite to site 21. If need be, the courses could be re-broadcasted, and methods could be adjusted as needed.

Finally, this code is initiated as a one-time action via WP Crontrol. Additionally, the code relies on data already collected on “user enrollments”: Each time a user at the subsite was enrolled in a course, a site “user_enrollments” option was updated. The essential requirements for compiling this data are straightforward, although in this particular case many secondary factors (e.g., whether the course was independently purchased by the particular user) also had to be accounted for.

The “user_enrollments” were stored in arrays using the following format:

                        $user_enrolled_arrays[] = array(
			
				'user_id' 		=> $user_id,
				'course_id' 	=> $course_id,
				'access_date' 	=> get_user_meta( $user_id, 'course_' . $course_id . '_access_from', true ),
				'first_name'	=> $first_name,
				'last_name'	=> $last_name,
				'email_address'	=> $user_email,
				'group_id'		=> $group_id
				
			) ;
/**
 * Transfer users courses and progress from one subsite to another
 * "21" is the target blog ID
 */
add_action( 'transfer_dar_data', 'transfer_dar_data' ) ;
function transfer_dar_data() {
	
	$enrollments = get_option( 'user_enrollments' ) ;
	$parent_course_id = 0 ; 
	
        //discard enrollments more than 1 year old
	foreach( $enrollments as $key => $enrollment ) {
		
		if ( $enrollment['access_date'] < current_time( 'timestamp' ) - YEAR_IN_SECONDS )  {
			
			unset( $enrollments[$key] ) ;
			
		}
			
	}
	
	$blog_id = get_current_blog_id() ;
	
	foreach( $enrollments as $enrollment ) {  
		
		$user_id 			= 	$enrollment['user_id'] ;
		$access_date 		= 	$enrollment['access_date'] ;
		$course_id 		= 	$enrollment['course_id'] ;
		$broadcast_data 	= 	ThreeWP_Broadcast()->get_post_broadcast_data( $blog_id, $course_id ) ;
		$parent 			= 	$broadcast_data->get_linked_parent() ;
		$parent_course_id 	= 	$parent['post_id'] ;
		
                //ignore if no $parent_course_id (if not a broadcasted course)
                if ( ! $parent_course_id ) {
			
			continue ; 
			
		}
		
		$progress		= 	get_user_meta( $user_id, '_sfwd-course_progress', true ) ;
		$course_data 		= 	$progress[$course_id] ;
		
		$lessons = isset( $course_data['lessons'] ) ? $course_data['lessons'] : array() ;
		if ( ! empty( $lessons ) ) {
			
			foreach ( $lessons as $lesson_id => $completion ) {
				
				$broadcast_data = ThreeWP_Broadcast()->get_post_broadcast_data( $blog_id, $lesson_id ) ;
				$parent_lesson = $broadcast_data->get_linked_parent() ; 
				$parent_lesson_id = $parent_lesson['post_id'] ;
				
				$progress[$parent_course_id]['lessons'][$parent_lesson_id] = $completion ;
				
			}
			
			$completed = $course_data['completed'] ; 
			$total = $course_data['total'] ; 
			$last_id = $course_data['last_id'] ;
			$broadcast_data = ThreeWP_Broadcast()->get_post_broadcast_data( $blog_id, $last_id ) ;
			$last_parent = $broadcast_data->get_linked_parent() ; 
			$last_parent_id = $last_parent['post_id'] ; 
			$status = $course_data['status'] ;	

		}			
			
		switch_to_blog( 21 ) ; 
		
		if ( $parent_course_id && ! empty( $progress ) ) {
			
			$progress[$parent_course_id]['completed'] = $completed ; 
			$progress[$parent_course_id]['total'] = $total ;  
			$progress[$parent_course_id]['status'] = $status ; 			
			$progress[$parent_course_id]['last_id'] = $last_parent_id ; 
			
		}

		ld_update_course_access( $user_id, $parent_course_id ) ;
		
		update_user_meta( $user_id, 'course_' . strval( $parent_course_id ) . '_access_from', $access_date ) ;
		update_user_meta( $user_id, '_sfwd-course_progress', $progress ) ;
		update_user_meta( $user_id, 'learndash_last_known_course_' . $parent_course_id, $last_parent_id ) ;
		
		restore_current_blog() ; 
		
	}
	
}

Leave a Reply