Source: includes/class-sensei-learner-profiles.php

<?php
if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}

/**
 * All functionality pertaining to the learner profiles in Sensei.
 *
 * @package Views
 * @author Automattic
 *
 * @since 1.4.0
 */
class Sensei_Learner_Profiles {
	/**
	 * Constructor.
	 *
	 * @since  1.4.0
	 */
	public function __construct() {
		// Setup permalink structure for learner profiles
		add_action( 'init', array( $this, 'setup_permastruct' ) );
		add_filter( 'wp_title', array( $this, 'page_title' ), 10, 2 );

		// Scripts for frontend.
		add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) );

		// Set heading for courses section of learner profiles
		add_action( 'sensei_learner_profile_info', array( $this, 'learner_profile_courses_heading' ), 30, 1 );

		// Add class to body tag
		add_filter( 'body_class', array( $this, 'learner_profile_body_class' ), 10, 1 );
	}

	/**
	 * Get the profile URL base.
	 *
	 * @return string
	 */
	private function get_profile_url_base() {
		return (string) apply_filters( 'sensei_learner_profiles_url_base', __( 'learner', 'sensei-lms' ) );
	}

	/**
	 * Enqueue frontend JavaScripts.
	 *
	 * @since  3.0.0
	 * @access private
	 */
	public function enqueue_scripts() {
		global $wp_query;

		if ( ! Sensei_Utils::get_setting_as_flag( 'js_disable', 'sensei_settings_js_disable' ) &&
			isset( $wp_query->query_vars['learner_profile'] ) ) {

			wp_enqueue_script( Sensei()->token . '-user-dashboard' );
		}
	}

	/**
	 * Setup permalink structure for learner profiles
	 *
	 * @since  1.4.0
	 * @return void
	 */
	public function setup_permastruct() {

		if ( isset( Sensei()->settings->settings['learner_profile_enable'] )
			&& Sensei()->settings->settings['learner_profile_enable'] ) {

			add_rewrite_rule( '^' . $this->get_profile_url_base() . '/([^/]*)/?', 'index.php?learner_profile=$matches[1]', 'top' );
			add_rewrite_tag( '%learner_profile%', '([^&]+)' );

		}
	}

	/**
	 * Adding page title for course results page
	 *
	 * @param  string $title Original title
	 * @param  string $sep   Seeparator string
	 * @return string        Modified title
	 */
	public function page_title( $title, $sep = null ) {
		global $wp_query;
		if ( isset( $wp_query->query_vars['learner_profile'] ) ) {
			$query_var    = $wp_query->query_vars['learner_profile'];
			$learner_user = Sensei_Learner::find_by_query_var( $query_var );
			if ( false === $learner_user ) {
				return $title;
			}

			$name = Sensei_Learner::get_full_name( $learner_user->ID );

			/**
			 * Filter the title for the learner profile page.
			 *
			 * @hook sensei_learner_profile_courses_heading
			 *
			 * @param {string} $title The title.
			 * @return {string} The filtered title.
			 */
			$title = apply_filters(
				'sensei_learner_profile_courses_heading',
				// translators: Placeholder is the name of the student.
				sprintf( __( 'Courses %s is taking', 'sensei-lms' ), $name )
			) . ' ' . $sep . ' ';
		}
		return $title;
	}

	/**
	 * Get permalink for learner profile
	 *
	 * @since  1.4.0
	 * @param  integer $user_id ID of user
	 * @return string           The learner profile permalink
	 */
	public function get_permalink( $user_id = 0 ) {
		$user = false;
		if ( $user_id == 0 ) {
			global $current_user;
			wp_get_current_user();
			$user = $current_user;
		} else {
			$user = get_userdata( $user_id );
		}

		$permalink = '';

		if ( $user ) {
			if ( get_option( 'permalink_structure' ) ) {
				$permalink = trailingslashit( get_home_url() ) . $this->get_profile_url_base() . '/' . $user->user_nicename;
			} else {
				$permalink = trailingslashit( get_home_url() ) . '?learner_profile=' . $user->user_nicename;
			}
		}

		/**
		 * This allows filtering of the Learner Profile permalinks.
		 *
		 * @since 1.9.13
		 *
		 * @hook sensei_learner_profile_permalink
		 *
		 * @param {string} $permalink The profile permalink.
		 * @param {object} $user      The user object.
		 * @return {string} The filtered permalink.
		 */
		return apply_filters( 'sensei_learner_profile_permalink', $permalink, $user );
	}

	/**
	 * Set heading for courses section of learner profiles
	 *
	 * @since  1.4.0
	 * @param  object $user Queried user object
	 * @return void
	 */
	public function learner_profile_courses_heading( $user ) {
		if ( strlen( $user->first_name ) > 0 ) {
			$name = $user->first_name;
		} else {
			$name = $user->display_name;
		}

		/**
		 * Filter the name for the heading in the courses section of the learner profile.
		 *
		 * @hook sensei_learner_profile_courses_heading_name
		 *
		 * @param {string} $name The name.
		 * @return {string} The filtered name.
		 */
		$name = apply_filters( 'sensei_learner_profile_courses_heading_name', $name );

		/**
		 * Filter the title for the learner profile page.
		 *
		 * @hook sensei_learner_profile_courses_heading
		 *
		 * @param {string} $title The title.
		 * @return {string} The filtered title.
		 */
		$title = apply_filters(
			'sensei_learner_profile_courses_heading',
			// translators: Placeholder is the name of the student.
			sprintf( __( 'Courses %s is taking', 'sensei-lms' ), $name )
		);
		echo '<h2>' . wp_kses_post( $title ) . '</h2>';
	}

	/**
	 * Load user info for learner profiles
	 *
	 * @since  1.4.0
	 * @param  object $user Queried user object
	 * @return void
	 */
	public static function user_info( $user ) {

		/**
		 * This hooke fires inside the Sensei_Learner_Profiles::user_info function.
		 * Just before the HTML is generated.
		 *
		 * @since 1.0.0
		 *
		 * @hook sensei_learner_profile_info
		 *
		 * @param {object} $user The user object.
		 */
		do_action( 'sensei_learner_profile_info', $user );

		/**
		 * This filter runs inside the Sensei_Learner_Profiles::user_info function.
		 * Here you can change the user avatar.
		 *
		 * @since 1.0.0
		 *
		 * @hook sensei_learner_profile_info_avatar
		 *
		 * @param {false|string} $user_avatar The user avatar.
		 * @param {int}          $user_id     The user ID.
		 * @return {false|string} The filtered avatar.
		 */
		$learner_avatar = apply_filters( 'sensei_learner_profile_info_avatar', get_avatar( $user->ID, 120 ), $user->ID );

		/**
		 * This filter runs inside the Sensei_Learner_Profiles::user_info function.
		 * Here you can change the learner profile user display name.
		 *
		 * @since 1.0.0
		 *
		 * @hook sensei_learner_profile_info_name
		 *
		 * @param {string} $user_display_name The user display name.
		 * @param {string} $user_id           The user ID.
		 * @return {string} The filtered display name.
		 */
		$learner_name = apply_filters( 'sensei_learner_profile_info_name', $user->display_name, $user->ID );

		/**
		 * This filter runs inside the Sensei_Learner_Profiles::user_info function.
		 * With this filter can change the users description on the learner user info
		 * output.
		 *
		 * @since 1.0.0
		 *
		 * @hook sensei_learner_profile_info_bio
		 *
		 * @param {string} $user_description The user description.
		 * @param {string} $user_id          The user ID.
		 * @return {string} The filtered description.
		 */
		$learner_bio = apply_filters( 'sensei_learner_profile_info_bio', $user->description, $user->ID );
		?>

		<div id="learner-info">

			<div class="learner-avatar"><?php echo wp_kses_post( $learner_avatar ); ?></div>

			<div class="learner-content">

				<h2><?php echo esc_html( $learner_name ); ?></h2>

				<div class="description"><?php echo wp_kses_post( wpautop( $learner_bio ) ); ?></div>

			</div>

		</div>

		<?php
	}

	/**
	 * Adding class to body tag
	 *
	 * @param  array $classes Existing classes
	 * @return array          Modified classes
	 */
	public function learner_profile_body_class( $classes ) {
		global $wp_query;
		if ( isset( $wp_query->query_vars['learner_profile'] ) ) {
			$classes[] = 'learner-profile';
		}
		return $classes;
	}

}

/**
 * Class WooThemes_Sensei_Learner_Profiles
 *
 * @ignore only for backward compatibility
 * @since 1.9.0
 */
class WooThemes_Sensei_Learner_Profiles extends Sensei_Learner_Profiles {}