Source: includes/class-sensei-course-results.php

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

/**
 * All functionality pertaining to the course results pages in Sensei.
 *
 * @package Views
 * @author Automattic
 *
 * @since 1.4.0
 */
class Sensei_Course_Results {

	/**
	 * @var string
	 */
	public $courses_url_base;

	/**
	 * Constructor.
	 *
	 * @since  1.4.0
	 */
	public function __construct() {

		// Setup permalink structure for course results
		add_action( 'init', array( $this, 'setup_permastruct' ) );

		// Support older WordPress theme (< 4.4)
		add_filter( 'wp_title', array( $this, 'page_title' ), 10, 2 );

		// Support newer WordPress theme (>= 4.4)
		add_filter( 'document_title_parts', array( $this, 'page_title' ), 10, 2 );

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

	}

	/**
	 * Setup permalink structure for course results
	 *
	 * @since  1.4.0
	 * @return void
	 */
	public function setup_permastruct() {
		// Setup course results URL base.
		/**
		 * Filter the course slug.
		 *
		 * @hook sensei_course_slug
		 *
		 * @param {string} $course_slug The course slug.
		 * @return {string} Filtered course slug.
		 */
		$this->courses_url_base = apply_filters( 'sensei_course_slug', _x( 'course', 'post type single url slug', 'sensei-lms' ) );

		// Setup permalinks structure.
		add_rewrite_rule( '^' . $this->courses_url_base . '/([^/]*)/results/?', 'index.php?course_results=$matches[1]', 'top' );
		add_rewrite_tag( '%course_results%', '([^&]+)' );
	}

	/**
	 * Adding page title for course results page
	 *
	 * @param  mixed  $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['course_results'] ) ) {
			$course         = get_page_by_path( $wp_query->query_vars['course_results'], OBJECT, 'course' );
			$modified_title = __( 'Course Results: ', 'sensei-lms' ) . $course->post_title . ' ' . $sep . ' ';
			if ( is_array( $title ) ) {
				$title['title'] = $modified_title;
			} else {
				$title = $modified_title;
			}
		}
		return $title;
	}

	/**
	 * Get permalink for course results based on course ID
	 *
	 * @since  1.4.0
	 * @param  integer $course_id ID of course
	 * @return string             The course results page permalink
	 */
	public function get_permalink( $course_id = 0 ) {

		$permalink = '';

		if ( $course_id > 0 ) {

			$course = get_post( $course_id );

			if ( get_option( 'permalink_structure' ) ) {
				$permalink = trailingslashit( get_home_url() ) . $this->courses_url_base . '/' . $course->post_name . '/results/';
			} else {
				$permalink = trailingslashit( get_home_url() ) . '?course_results=' . $course->post_name;
			}
		}

		return $permalink;
	}

	/**
	 * Load course results info
	 *
	 * @since  1.4.0
	 * @return void
	 */
	public function course_info() {

		global $course;

		Sensei_Utils::sensei_user_course_status_message( $course->ID, get_current_user_id() );

	}

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

	/**
	 * Fire the sensei frontend message hook
	 *
	 * @since 1.9.0
	 */
	public static function fire_sensei_message_hook() {
		/**
		 * Fires when the frontend messages are displayed.
		 *
		 * @hook sensei_frontend_messages
		 */
		do_action( 'sensei_frontend_messages' );

	}

}

/**
 * Class WooThemes_Sensei_Course_Results
 *
 * @ignore only for backward compatibility
 * @since 1.9.0
 */
class WooThemes_Sensei_Course_Results extends Sensei_Course_Results{}