/**
  * CoursePress constructor.
  *
  * @since 1.0.0
  * @return self
  */
 function __construct()
 {
     // Setup CoursePress properties
     $this->init_vars();
     $this->mp_file = '128762_marketpress-ecommerce-3.0.0.2.zip';
     // Initiate sessions
     if (!session_id()) {
         session_start();
     }
     $_SESSION['coursepress_student'] = array();
     $_SESSION['coursepress_unit_completion'] = array();
     // Register Globals
     $GLOBALS['plugin_dir'] = $this->plugin_dir;
     $GLOBALS['coursepress_url'] = $this->plugin_url;
     $GLOBALS['coursepress_version'] = $this->version;
     $GLOBALS['course_slug'] = $this->get_course_slug();
     $GLOBALS['units_slug'] = $this->get_units_slug();
     $GLOBALS['notifications_slug'] = $this->get_notifications_slug();
     $GLOBALS['module_slug'] = $this->get_module_slug();
     $GLOBALS['instructor_profile_slug'] = $this->get_instructor_profile_slug();
     $GLOBALS['enrollment_process_url'] = $this->get_enrollment_process_slug(true);
     $GLOBALS['signup_url'] = $this->get_signup_slug(true);
     /**
      * CoursePress Sessions
      * Better handling of session data using WP_Session_Tokens introduced in 4.0.
      */
     require_once $this->plugin_dir . 'includes/classes/class.session.php';
     /**
      * CoursePress custom non-persistent cache.
      */
     require_once $this->plugin_dir . 'includes/classes/class.coursepress-cache.php';
     /**
      * CoursePress Object Class.
      */
     require_once $this->plugin_dir . 'includes/classes/class.coursepress-object.php';
     /**
      * CoursePress Capabilities Class.
      */
     require_once $this->plugin_dir . 'includes/classes/class.coursepress-capabilities.php';
     /**
      * CoursePress WordPress compatibility hooks.
      */
     require_once $this->plugin_dir . 'includes/classes/class.coursepress-compatibility.php';
     /**
      * CoursePress Plugin Integrations.
      */
     require_once $this->plugin_dir . 'includes/classes/class.coursepress-integration.php';
     if (CoursePress_Capabilities::is_pro() && !CoursePress_Capabilities::is_campus()) {
         // Prepare WPMUDev Dashboard Notifications
         global $wpmudev_notices;
         $wpmudev_notices[] = array('id' => 913071, 'name' => $this->name, 'screens' => array('toplevel_page_courses', $this->screen_base . '_page_course_details', $this->screen_base . '_page_instructors', $this->screen_base . '_page_students', $this->screen_base . '_page_assessment', $this->screen_base . '_page_reports', $this->screen_base . '_page_notifications', $this->screen_base . '_page_settings'));
         /**
          * Include WPMUDev Dashboard.
          */
         include_once $this->plugin_dir . 'includes/external/dashboard/wpmudev-dash-notification.php';
     }
     // Define custom theme directory for CoursePress theme
     if (!CoursePress_Capabilities::is_campus()) {
         $this->register_theme_directory();
     }
     // Install Plugin
     register_activation_hook(__FILE__, array($this, 'install'));
     /**
      * @todo: Document this
      */
     global $last_inserted_unit_id;
     //$last_inserted_module_id
     global $last_inserted_front_page_module_id;
     //$last_inserted_module_id
     /**
      * CampusPress/Edublogs Specifics.
      */
     require_once $this->plugin_dir . 'includes/classes/class.coursepress-campus.php';
     /**
      * Basic certificates
      * This is Pro only, by changing this flag in the free version you will break it!
      */
     if (CoursePress_Capabilities::is_pro()) {
         require_once $this->plugin_dir . 'includes/classes/class.basic.certificate.php';
     }
     //Administration area
     if (is_admin()) {
         /**
          * Course search.
          */
         require_once $this->plugin_dir . 'includes/classes/class.coursesearch.php';
         /**
          * Notificatioon search.
          */
         require_once $this->plugin_dir . 'includes/classes/class.notificationsearch.php';
         /**
          * Contextual help.
          *
          * @todo: Finish this class
          */
         //require_once( $this->plugin_dir . 'includes/classes/class.help.php' );
         /**
          * Search Students class.
          */
         require_once $this->plugin_dir . 'includes/classes/class.studentsearch.php';
         /**
          * Search Instructor class.
          */
         require_once $this->plugin_dir . 'includes/classes/class.instructorsearch.php';
         /**
          * Pagination Class.
          */
         require_once $this->plugin_dir . 'includes/classes/class.pagination.php';
         /**
          * Tooltip Helper.
          */
         require_once $this->plugin_dir . 'includes/classes/class.cp-helper-tooltip.php';
         /**
          * CoursePress Menu meta box.
          */
         require_once $this->plugin_dir . 'includes/classes/class.menumetabox.php';
         /**
          * Add instructor to a course (AJAX).
          *
          * This also assigns the instructor capabilities.
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_add_course_instructor', array(&$this, 'add_course_instructor'));
         /**
          * Remove instructor from a course (AJAX).
          *
          * If the instructor is no longer an instructor of any courses
          * then the instructor's capabilities will also be removed.
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_remove_course_instructor', array(&$this, 'remove_course_instructor'));
         add_action('wp_ajax_update_unit', array(&$this, 'update_unit'));
         /**
          * Add instructor MD5 as meta.
          *
          * Used to conceal instructor ids.
          *
          * @since 1.2.1
          */
         add_action('coursepress_course_instructor_added', array(&$this, 'create_instructor_hash'), 10, 2);
         add_action('coursepress_instructor_invite_confirmed', array(&$this, 'create_instructor_hash'), 10, 2);
         /**
          * Update course during setup (AJAX).
          *
          * This method is executed during setup in the 'Course Overview'.
          * Each time the user moved from one section to another or when triggered
          * via the 'Update' button.
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_autoupdate_course_settings', array(&$this, 'autoupdate_course_settings'));
         /**
          * Determined if a gateway is active (AJAX).
          *
          * MarketPress integration:
          * An active gateway is required to be able to sell a course.
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_course_has_gateway', array(&$this, 'course_has_gateway'));
         /**
          * Invite an instructor to join a course (AJAX).
          *
          * Sends the instructor an email with a confirmation link.
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_send_instructor_invite', array(&$this, 'send_instructor_invite'));
         /**
          * Remove instructor invite (AJAX).
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_remove_instructor_invite', array(&$this, 'remove_instructor_invite'));
         /**
          * Change course state (draft/publish) (AJAX).
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_change_course_state', array(&$this, 'change_course_state'));
         /**
          * Change unit state (draft/publish) (AJAX).
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_change_unit_state', array(&$this, 'change_unit_state'));
         /**
          * Update Course Calendar widget/shortcode (AJAX).
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_refresh_course_calendar', array(&$this, 'refresh_course_calendar'));
         /**
          * Update Course Calendar for all visitors (AJAX).
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_nopriv_refresh_course_calendar', array(&$this, 'refresh_course_calendar'));
         /**
          * Handle popup registration/signup forms (AJAX).
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_cp_popup_signup', array(&$this, 'popup_signup'));
         /**
          * Handle popup registration/signup forms for everyone (AJAX).
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_nopriv_cp_popup_signup', array(&$this, 'popup_signup'));
         /**
          * Returns whether the user already exists (AJAX).
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_cp_popup_user_exists', array(&$this, 'cp_popup_user_exists'));
         /**
          * Returns whether the user already exists for everyone (AJAX).
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_nopriv_cp_popup_user_exists', array(&$this, 'cp_popup_user_exists'));
         /**
          * Removes uppercase restriction for username registration
          */
         add_filter('wpmu_validate_user_signup', array($this, 'ms_validate_username'));
         /**
          * Returns whether the email already exists (AJAX).
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_cp_popup_email_exists', array(&$this, 'cp_popup_email_exists'));
         /**
          * Returns whether the course passcode is valid (AJAX).
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_cp_valid_passcode', array(&$this, 'cp_valid_passcode'));
         add_action('wp_ajax_nopriv_cp_valid_passcode', array(&$this, 'cp_valid_passcode'));
         /**
          * Returns whether the email already exists for everyone (AJAX).
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_nopriv_cp_popup_email_exists', array(&$this, 'cp_popup_email_exists'));
         /**
          * Login the user from the popup (AJAX).
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_cp_popup_login_user', array(&$this, 'cp_popup_login_user'));
         /**
          * Login the user from the popup for everyone (AJAX).
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_nopriv_cp_popup_login_user', array(&$this, 'cp_popup_login_user'));
         /**
          * Get the URL for the next unit in a course (AJAX).
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_get_next_unit_url', array(&$this, 'get_next_unit_url'));
         /**
          * Get the URL for the next unit in a course for everyone (AJAX).
          *
          * Available to everyone because of the course preview options.
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_nopriv_get_next_unit_url', array(&$this, 'get_next_unit_url'));
         /**
          * Create a unit element draft post (AJAX).
          *
          * Allows the user to preview a unit.
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_create_unit_element_draft', array(&$this, 'create_unit_element_draft'));
         /**
          * MarketPress Gateway Settings (AJAX).
          *
          * Allows access to MarketPress gateways from Course Setup.
          *
          * @since 1.0.0
          */
         add_action('mp_gateway_settings', array(&$this, 'cp_marketpress_popup'));
         /**
          * Activate MarketPress or MarketPress Lite (AJAX).
          *
          * Dependending on whether this is CoursePress or CoursePress Pro.
          *
          * @since 1.0.0
          */
         add_action('wp_ajax_cp_activate_mp_lite', array(&$this, 'activate_marketpress_lite'));
         /**
          * Hook Unit creation to add course meta.
          */
         add_action('coursepress_unit_created', array(&$this, 'update_course_meta_on_unit_creation'), 10, 2);
         add_action('coursepress_unit_updated', array(&$this, 'update_course_meta_on_unit_creation'), 10, 2);
         /**
          * Hook WordPress Editor filters and actions.
          *
          * But do so with WordPress compatibility in mind. Therefore,
          * create a new action hook to be used by CoursePress_Compatibility().
          *
          * @since 1.2.1
          */
         do_action('coursepress_editor_compatibility');
         /**
          * Hook CoursePress admin initialization.
          *
          * Allows plugins and themes to add additional hooks during CoursePress constructor
          * for admin specific actions.
          *
          * @since 1.2.1
          *
          */
         do_action('coursepress_admin_init');
         /**
          * Add certificate admin settings
          *
          * @since 1.2.6
          */
         if (CoursePress_Capabilities::is_pro()) {
             CP_Basic_Certificate::init_settings();
         }
         /*
          * Plugin activation class
          */
         require_once $this->plugin_dir . 'includes/classes/class.plugin-activation.php';
     }
     if (CoursePress_Capabilities::is_pro()) {
         CP_Basic_Certificate::init_front();
     }
     /**
      * Add's ?action=view_certificate
      *
      * @since 1.2.6
      */
     /**
      * Setup payment gateway array.
      *
      * MarketPress integration.
      *
      * @since 1.0.0
      */
     add_action('init', array($this, 'setup_gateway_array'));
     /**
      * Output buffer workaround
      *
      * Prevents errors from CoursePress and other plugins or themes
      * from breaking AJAX calls.
      *
      * @since 1.0.0
      */
     add_action('init', array(&$this, 'output_buffer'), 0);
     /**
      * Is there a version of MarketPress active.
      *
      * MarketPress integration.
      *
      * @since 1.0.0
      */
     add_action('init', array(&$this, 'marketpress_check'), 0);
     /**
      * Class for rendering course calendar.
      */
     require_once $this->plugin_dir . 'includes/classes/class.coursecalendar.php';
     /**
      * Class for creating/participating in course discussions.
      */
     require_once $this->plugin_dir . 'includes/classes/class.discussion.php';
     /**
      * Class for certificate template
      */
     require_once $this->plugin_dir . 'includes/classes/class.certificate_template.php';
     /**
      * Class for certificate templates
      */
     require_once $this->plugin_dir . 'includes/classes/class.certificate_templates.php';
     /**
      * Class for certificate template elements
      */
     require_once $this->plugin_dir . 'includes/classes/class.certificate_template_elements.php';
     /**
      * Class for certificate templates search
      */
     require_once $this->plugin_dir . 'includes/classes/class.certificate_templates_search.php';
     /**
      * Class to search course discussions.
      */
     require_once $this->plugin_dir . 'includes/classes/class.discussionsearch.php';
     /**
      * Class for managing instructors.
      */
     require_once $this->plugin_dir . 'includes/classes/class.instructor.php';
     /**
      * Class for managing Units.
      */
     require_once $this->plugin_dir . 'includes/classes/class.course.unit.php';
     /**
      * The Course class.
      */
     require_once $this->plugin_dir . 'includes/classes/class.course.php';
     /**
      * The hooks for course settings.
      */
     require_once $this->plugin_dir . 'includes/classes/class.course.settings.php';
     /**
      * Class to determine course completion.
      */
     require_once $this->plugin_dir . 'includes/classes/class.course.completion.php';
     /**
      * Class to determine course completion.
      */
     require_once $this->plugin_dir . 'includes/classes/class.student.completion.php';
     /**
      * Class for creating course or sitewide course notifications.
      */
     require_once $this->plugin_dir . 'includes/classes/class.notification.php';
     /**
      * Class to manage students.
      */
     require_once $this->plugin_dir . 'includes/classes/class.student.php';
     /**
      * Class to manage unit (page) elements.
      */
     require_once $this->plugin_dir . 'includes/classes/class.course.unit.module.php';
     /**
      * Load all unit element classes.
      *
      * @since 1.0.0
      */
     add_action('init', array(&$this, 'load_modules'), 11);
     /**
      * Load CoursePress widgets.
      *
      * @since 1.0.0
      */
     add_action('init', array(&$this, 'load_widgets'), 0);
     /**
      * Class to handle shortcodes.
      */
     require_once $this->plugin_dir . 'includes/classes/class.shortcodes.php';
     /**
      * Class to create virtual pages.
      * Does not use existing pages.
      */
     require_once $this->plugin_dir . 'includes/classes/class.virtualpage.php';
     /**
      * Register all CoursePress custom post types.
      *
      * @since 1.0.0
      */
     add_action('init', array(&$this, 'register_custom_posts'), 1);
     /**
      * Check for forced download in 'File' unit element.
      *
      * Checks to see if the file needs to be downloaded on click and then
      * serve up the file.
      *
      * @since 1.0.0
      */
     add_action('init', array(&$this, 'check_for_force_download_file_request'), 1);
     /**
      * Initiate plugin localization.
      *
      * @since 1.0.0
      */
     add_action('plugins_loaded', array(&$this, 'localization'), 9);
     /**
      * Handle $_GET actions.
      *
      * @since 1.0.0
      */
     add_action('init', array(&$this, 'check_for_get_actions'), 98);
     /**
      * Add virtual pages.
      *
      * @since 1.0.0
      */
     add_action('init', array(&$this, 'create_virtual_pages'), 99);
     /**
      * Add custom image sizes.
      *
      * @since 1.0.0
      */
     add_action('init', array(&$this, 'add_custom_image_sizes'));
     /**
      * Add custom image sizes to media library.
      *
      * @todo: decide to keep it or remove it
      * @since 1.0.0
      */
     //add_filter( 'image_size_names_choose', array( &$this, 'add_custom_media_library_sizes' ) );
     /**
      * Add plugin menu for network installs.
      *
      * @since 1.0.0
      */
     add_action('network_admin_menu', array(&$this, 'add_admin_menu_network'));
     /**
      * Add admin menu.
      *
      * @since 1.0.0
      */
     add_action('admin_menu', array(&$this, 'add_admin_menu'));
     /**
      * Check for admin notices.
      *
      * @since 1.0.0
      */
     add_action('admin_notices', array(&$this, 'admin_nopermalink_warning'));
     /**
      * Custom header actions.
      *
      * @since 1.0.0
      */
     add_action('wp_enqueue_scripts', array(&$this, 'header_actions'));
     /**
      * Custom header actions.
      *
      * @since 1.0.0
      */
     add_action('wp_head', array(&$this, 'head_actions'));
     /**
      * Custom footer actions.
      *
      * @since 1.0.0
      */
     add_action('wp_footer', array(&$this, 'footer_actions'));
     /**
      * Add jQueryUI.
      *
      * @todo: decide if we need to keep this hook
      * @since 1.0.0
      */
     //add_action( 'admin_enqueue_scripts', array( &$this, 'add_jquery_ui' ) );
     add_action('admin_enqueue_scripts', array(&$this, 'cp_jquery_admin'), 0, 1);
     /**
      * Admin header actions.
      *
      * @since 1.0.0
      */
     add_action('admin_enqueue_scripts', array(&$this, 'admin_header_actions'));
     /**
      * Load Course Details (admin).
      *
      * @since 1.0.0
      */
     add_action('load-' . $this->screen_base . '_page_course_details', array(&$this, 'admin_coursepress_page_course_details'));
     /**
      * Load CoursePress Settings (admin).
      *
      * @since 1.0.0
      */
     add_action('load-' . $this->screen_base . '_page_settings', array(&$this, 'admin_coursepress_page_settings'));
     /**
      * Load Course Page (admin).
      *
      * @since 1.0.0
      */
     add_action('load-toplevel_page_courses', array(&$this, 'admin_coursepress_page_courses'));
     /**
      * Load Course Notifications Page (admin).
      *
      * @since 1.0.0
      */
     add_action('load-' . $this->screen_base . '_page_notifications', array(&$this, 'admin_coursepress_page_notifications'));
     /**
      * Load Course Discussions Page (admin).
      *
      * @since 1.0.0
      */
     add_action('load-' . $this->screen_base . '_page_discussions', array(&$this, 'admin_coursepress_page_discussions'));
     /**
      * Load Course Reports Page (admin).
      *
      * @since 1.0.0
      */
     add_action('load-' . $this->screen_base . '_page_reports', array(&$this, 'admin_coursepress_page_reports'));
     /**
      * Load Course Assessments Page (admin).
      *
      * @since 1.0.0
      */
     add_action('load-' . $this->screen_base . '_page_assessment', array(&$this, 'admin_coursepress_page_assessment'));
     /**
      * Load Course Certificates Page (admin).
      *
      * @since 1.0.0
      */
     add_action('load-' . $this->screen_base . '_page_certificates', array(&$this, 'admin_coursepress_page_certificates'));
     /**
      * Load Course Students Page (admin).
      *
      * @since 1.0.0
      */
     add_action('load-' . $this->screen_base . '_page_students', array(&$this, 'admin_coursepress_page_students'));
     /**
      * Load Course Instructors Page (admin).
      *
      * @since 1.0.0
      */
     add_action('load-' . $this->screen_base . '_page_instructors', array(&$this, 'admin_coursepress_page_instructors'));
     /**
      * Redirect users after login.
      *
      * @since 1.0.0
      */
     add_filter('login_redirect', array(&$this, 'login_redirect'), 10, 3);
     /**
      * Check for valid permalinks.
      *
      * @since 1.0.0
      */
     add_filter('post_type_link', array(&$this, 'check_for_valid_post_type_permalinks'), 10, 3);
     /**
      * Enable comments for discussions pages.
      *
      * @since 1.0.0
      */
     add_filter('comments_open', array(&$this, 'comments_open_filter'), 10, 2);
     /**
      * Remove comments from Virtual Pages.
      *
      * @since 1.0.0
      */
     add_filter('comments_template', array(&$this, 'no_comments_template'));
     /**
      * Load CoursePress templates.
      *
      * @since 1.0.0
      */
     add_action('wp', array(&$this, 'load_plugin_templates'));
     /**
      * Add CoursePress rewrite rules.
      *
      * @since 1.0.0
      */
     add_filter('rewrite_rules_array', array(&$this, 'add_rewrite_rules'));
     /**
      * Prevent Virtual Pages from redirecting.
      *
      * @since 1.0.0
      */
     add_action('pre_get_posts', array(&$this, 'remove_canonical'));
     add_action('pre_get_posts', array(&$this, 'course_archive_categories'));
     add_action('pre_get_posts', array(&$this, 'course_archive'));
     /**
      * Filter searches.
      *
      * @since 1.0.0
      */
     add_filter('pre_get_posts', array(&$this, 'filter_search'));
     /**
      * Add post type filtering.
      *
      * @since 1.0.0
      */
     add_filter('posts_where', array(&$this, 'posts_where'));
     /**
      * Update unit positions of reordering (AJAX).
      *
      * @since 1.0.0
      */
     add_action('wp_ajax_update_units_positions', array($this, 'update_units_positions'));
     /**
      * Update course positions of reordering (AJAX).
      *
      */
     add_action('wp_ajax_update_course_positions', array($this, 'update_course_positions'));
     /**
      * Apply custom filter to WP query variables (AJAX).
      *
      * @since 1.0.0
      */
     add_filter('query_vars', array($this, 'filter_query_vars'));
     /**
      * Filter 'edit' link for Course post type.
      *
      * @since 1.0.0
      */
     add_filter('get_edit_post_link', array($this, 'courses_edit_post_link'), 10, 3);
     /**
      * Continue parsing requests when WordPress is done.
      *
      * @since 1.0.0
      */
     add_action('parse_request', array($this, 'action_parse_request'));
     /**
      * Redirect to Setup Guide on plugin activation.
      *
      * @since 1.0.0
      */
     add_action('admin_init', array(&$this, 'coursepress_plugin_do_activation_redirect'), 0);
     /**
      * Record last student login.
      *
      * @since 1.0.0
      */
     add_action('wp_login', array(&$this, 'set_latest_student_activity_upon_login'), 10, 2);
     /**
      * Upgrade legacy instructor meta on login.
      *
      * @since 1.0.0
      */
     add_action('init', array(&$this, 'upgrade_instructor_meta'));
     /**
      * Did MarketPress process a successful order.
      *
      * If MarketPress payment was successful, then enrol the user.
      *
      * @since 1.0.0
      */
     if (cp_use_woo()) {
         add_action('woocommerce_order_status_completed', array($this, 'woo_listen_for_paid_status_for_courses'), 10, 1);
     } else {
         // Moved to MarketPress_Integration
     }
     /**
      * Course taxonomies (not in this version).
      *
      * @todo: on the roadmap to implement
      * @since 1.0.0
      */
     add_action('parent_file', array(&$this, 'parent_file_correction'));
     /**
      * Update CoursePress login/logout menu item.
      *
      * @since 1.0.0
      */
     add_filter('wp_nav_menu_objects', array(&$this, 'menu_metabox_navigation_links'), 10, 2);
     //add_filter( 'wp_nav_menu_args', array( &$this, 'modify_nav_menu_args' ), 10 );
     if (get_option('display_menu_items', 1)) {
         /**
          * Create CoursePress basic menus automatically.
          *
          * @since 1.0.0
          */
         add_filter('wp_nav_menu_objects', array(&$this, 'main_navigation_links'), 10, 2);
     }
     /*
      * If allowing CoursePress to create a basic menu then
      * make sure that there is somewhere to put it.
      */
     if (get_option('display_menu_items', 1)) {
         $theme_location = 'primary';
         if (!has_nav_menu($theme_location)) {
             $theme_locations = get_nav_menu_locations();
             foreach ((array) $theme_locations as $key => $location) {
                 $theme_location = $key;
                 break;
             }
         }
         if (!has_nav_menu($theme_location)) {
             if (get_option('display_menu_items', 1)) {
                 /**
                  * Fallback if there is no menu location.
                  *
                  * @since 1.0.0
                  */
                 add_filter('wp_page_menu', array(&$this, 'main_navigation_links_fallback'), 20, 2);
                 if (wp_get_theme() == 'CoursePress') {
                     /**
                      * Special case for the CoursePress theme.
                      *
                      * @todo: replace this with a hook so that it can be extended for other themes.
                      * @since 1.0.0
                      */
                     add_filter('wp_page_menu', array(&$this, 'mobile_navigation_links_fallback'), 21, 3);
                 }
             }
         }
     }
     /**
      * Add image filter for content.
      *
      * @since 1.0.0
      */
     add_filter('element_content_filter', array(&$this, 'element_content_img_filter'), 98, 1);
     /**
      * Add link filter for content.
      *
      * @since 1.0.0
      */
     add_filter('element_content_filter', array(&$this, 'element_content_link_filter'), 99, 1);
     /**
      * Redirect user after logout.
      *
      * Works with custom shortcode and CoursePress custom login.
      *
      * @since 1.0.0
      */
     add_action('wp_logout', array(&$this, 'redirect_after_logout'));
     /**
      * Load the correct Virtual Page template.
      *
      * @since 1.0.0
      */
     add_action('template_redirect', array(&$this, 'virtual_page_template'));
     /**
      * Display the Instructor invite confirmation page.
      *
      * @since 1.0.0
      */
     add_action('template_redirect', array(&$this, 'instructor_invite_confirmation'));
     /**
      * MarketPress: Making it a little bit more friendly for non-physical goods (aka Courses).
      *
      * @since 1.0.0
      */
     add_filter('gettext', array(&$this, 'change_mp_shipping_to_email'), 20, 3);
     /**
      * Use the course list image as the MarketPress product image.
      *
      * @since 1.0.0
      */
     add_filter('mp_product_image', array(&$this, 'course_product_image'), 10, 4);
     /**
      * Show extra instructor profile fields.
      *
      * @since 1.0.0
      */
     add_action('show_user_profile', array(&$this, 'instructor_extra_profile_fields'));
     /**
      * Edit/show extra instructor profile fields.
      *
      * @since 1.0.0
      */
     add_action('edit_user_profile', array(&$this, 'instructor_extra_profile_fields'));
     /**
      * Save instructor profile fields.
      *
      * Grant/Revoke instructor capabilities.
      *
      * @since 1.0.0
      */
     add_action('personal_options_update', array(&$this, 'instructor_save_extra_profile_fields'));
     /**
      * Save instructor profile fields.
      *
      * Grant/Revoke instructor capabilities.
      *
      * @since 1.0.0
      */
     add_action('edit_user_profile_update', array(&$this, 'instructor_save_extra_profile_fields'));
     /**
      * Add extra classes to HTML body.
      *
      * @since 1.0.0
      */
     add_filter('body_class', array(&$this, 'add_body_classes'));
     // Handle MP payment confirmation
     /* $gateways = get_option( 'mp_settings', false );
     			  if ( !empty( $gateways ) && !empty( $gateways[ 'gateways' ][ 'allowed' ] ) ) {
     			  $gateways = $gateways[ 'gateways' ][ 'allowed' ];
     			  foreach ( $gateways as $gateway ) {
     			  // Don't enroll students automatically with manual payments.
     			  if ( 'manual-payments' != $gateway ) {
     
     			  add_action( 'mp_payment_confirm_' . $gateway, array(
     			  &$this,
     			  'enroll_on_payment_confirmation'
     			  ), 10, 2 );
     			  //add_action( 'mp_create_order', array( &$this, 'enroll_on_payment_confirmation' ), 10, 1 );
     			  }
     			  }
     			  } */
     //add_action( 'mp_order_paid', array( &$this, 'enroll_on_order_status_paid' ), 10, 1 );
     /**
      * Change the MarketPress message to be more suitable for Courses.
      *
      * MarketPress integration.
      *
      * @since 1.0.0
      */
     add_filter('mp_setting_msgsuccess', array(&$this, 'course_checkout_success_msg'), 10, 2);
     add_filter('get_edit_post_link', array(&$this, 'get_edit_post_link'), 10, 1);
     /**
      * Class to manage integration with automessage plugin (if installed)
      */
     require_once $this->plugin_dir . 'includes/classes/class.automessage-integration.php';
     /**
      * Class to manage integration with WooCommerce plugin (if installed)
      */
     require_once $this->plugin_dir . 'includes/classes/class.woocommerce-integration.php';
     /**
      * Class to manage integration with MarketPress 3 plugin (if installed)
      */
     require_once $this->plugin_dir . 'includes/classes/class.marketpress-integration.php';
     /**
      * Hook CoursePress initialization.
      *
      * Allows plugins and themes to add aditional hooks during CoursePress constructor.
      *
      * @since 1.2.1
      *
      */
     do_action('coursepress_init');
 }
        /**
         *
         * UNIT DETAILS SHORTCODES
         * =========================
         *
         */
        function course_unit_archive_submenu($atts)
        {
            global $coursepress;
            extract(shortcode_atts(array('course_id' => ''), $atts));
            if (!empty($course_id)) {
                $course_id = (int) $course_id;
            }
            if ($course_id == '') {
                $course_id = do_shortcode('[get_parent_course_id]');
            }
            if (isset($coursepress->units_archive_subpage)) {
                $subpage = $coursepress->units_archive_subpage;
            } else {
                $subpage = '';
            }
            ob_start();
            ?>
			<div class="submenu-main-container">
				<ul id="submenu-main" class="submenu nav-submenu">
					<li class="submenu-item submenu-units <?php 
            echo isset($subpage) && $subpage == 'units' ? 'submenu-active' : '';
            ?>
"><a href="<?php 
            echo get_permalink($course_id) . $coursepress->get_units_slug();
            ?>
/"><?php 
            _e('Units', 'cp');
            ?>
</a></li>
					<li class="submenu-item submenu-notifications <?php 
            echo isset($subpage) && $subpage == 'notifications' ? 'submenu-active' : '';
            ?>
"><a href="<?php 
            echo get_permalink($course_id) . $coursepress->get_notifications_slug();
            ?>
/"><?php 
            _e('Notifications', 'cp');
            ?>
</a></li>
					<?php 
            $pages = Course::get_allowed_pages($course_id);
            if ($pages['course_discussion'] == 'on') {
                ?>
						<li class="submenu-item submenu-discussions <?php 
                echo isset($subpage) && $subpage == 'discussions' ? 'submenu-active' : '';
                ?>
"><a href="<?php 
                echo get_permalink($course_id) . $coursepress->get_discussion_slug();
                ?>
/"><?php 
                _e('Discussions', 'cp');
                ?>
</a></li>
					<?php 
            }
            /* if ( $course->allow_course_grades_page == 'on' ) {
            	  ?>
            	  <li class="submenu-item submenu-grades <?php echo( isset( $subpage ) && $subpage == 'grades' ? 'submenu-active' : '' ); ?>"><a href="<?php echo get_permalink( $course_id ) . $coursepress->get_grades_slug(); ?>/"><?php _e( 'Grades', 'cp' ); ?></a></li>
            	  <?php
            	  } */
            if ($pages['workbook'] == 'on') {
                ?>
						<li class="submenu-item submenu-workbook <?php 
                echo isset($subpage) && $subpage == 'workbook' ? 'submenu-active' : '';
                ?>
"><a href="<?php 
                echo get_permalink($course_id) . $coursepress->get_workbook_slug();
                ?>
/"><?php 
                _e('Workbook', 'cp');
                ?>
</a></li>
					<?php 
            }
            ?>
					<li class="submenu-item submenu-info"><a href="<?php 
            echo get_permalink($course_id);
            ?>
"><?php 
            _e('Course Details', 'cp');
            ?>
</a></li>
					<?php 
            $show_link = false;
            if (CoursePress_Capabilities::is_pro()) {
                $show_link = CP_Basic_Certificate::option('basic_certificate_enabled');
                $show_link = !empty($show_link) ? true : false;
            }
            if (is_user_logged_in() && $show_link) {
                if (Student_Completion::is_course_complete(get_current_user_id(), $course_id)) {
                    $certificate = CP_Basic_Certificate::get_certificate_link(get_current_user_id(), $course_id, __('Certificate', 'cp'));
                    ?>
							<li class="submenu-item submenu-certificate <?php 
                    echo isset($subpage) && $subpage == 'certificate' ? 'submenu-active' : '';
                    ?>
"><?php 
                    echo $certificate;
                    ?>
</li>
						<?php 
                }
            }
            ?>
				</ul><!--submenu-main-->
			</div><!--submenu-main-container-->
			<?php 
            $content = ob_get_clean();
            return $content;
        }
 public static function get_certificate_link($student_id, $course_id, $link_title, $pre = '', $post = '', $show_link = false)
 {
     if (!$show_link) {
         $show_link = CP_Basic_Certificate::option('basic_certificate_enabled');
         $show_link = !empty($show_link) ? true : false;
         $show_link = CoursePress_Capabilities::is_pro() ? $show_link : false;
     }
     if ($show_link) {
         if (Student_Completion::is_course_complete($student_id, $course_id)) {
             $certificate_permalink = add_query_arg(array('action' => 'view_certificate', 'course_id' => $course_id), get_permalink($course_id));
             return esc_html($pre) . '<a target="_blank" href="' . esc_url($certificate_permalink) . '">' . esc_html($link_title) . '</a>' . esc_html($post);
         }
     }
     return '';
 }