function __construct($search_term = '', $page_num = '', $courses_per_page = 10, $category = 0)
 {
     $this->is_light = CoursePress_Capabilities::is_pro() ? false : true;
     if ($this->is_light) {
         $page_num = 1;
         $this->courses_per_page = 2;
     } else {
         if ($this->courses_per_page !== $courses_per_page) {
             $this->courses_per_page = $courses_per_page;
         }
     }
     $this->search_term = $search_term;
     $this->raw_page = '' == $page_num ? false : (int) $page_num;
     $this->page_num = (int) ('' == $page_num) ? 1 : $page_num;
     $selected_course_order_by_type = get_option('course_order_by_type', 'DESC');
     $selected_course_order_by = get_option('course_order_by', 'post_date');
     $args = array('posts_per_page' => $this->courses_per_page, 'offset' => ($this->page_num - 1) * $this->courses_per_page, 'post_type' => $this->post_type, 'post_status' => 'any');
     if (!current_user_can('manage_options')) {
         $instructor = new Instructor(get_current_user_id());
         $instructor_courses = $instructor->get_accessable_courses();
         $args['post__in'] = $instructor_courses;
     }
     if ($category !== 0) {
         $args['tax_query'] = array(array('taxonomy' => 'course_category', 'field' => 'term_id', 'terms' => array($category)));
     }
     if ($selected_course_order_by == 'course_order') {
         /* FIX FOR 4.1 */
         $args['meta_query'] = array('relation' => 'OR', array('key' => 'course_order', 'compare' => 'NOT EXISTS'), array('key' => 'course_order', 'compare' => 'EXISTS'));
         $args['orderby'] = 'meta_value';
         $args['order'] = $selected_course_order_by_type;
     } else {
         $args['orderby'] = $selected_course_order_by;
         $args['order'] = $selected_course_order_by_type;
     }
     $this->args = $args;
 }
        /**
         *
         * 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;
        }
Пример #3
0
 /**
  * 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');
 }
                }
                if (current_user_can('install_plugins') && current_user_can('activate_plugins')) {
                    ?>
															<div class="cp-markertpress-not-active <?php 
                    echo CoursePress_MarketPress_Integration::is_active() ? 'hidden' : '';
                    ?>
">
																<div id="marketpressprompt-box">
																	<label>
																		<?php 
                    _e('Sell your courses online with MarketPress.', 'cp');
                    ?>
																	</label>

																	<?php 
                    if (!CoursePress_Capabilities::is_pro()) {
                        echo sprintf(__('To start selling your course, you will need to activate the MarketPress Lite plugin: <br /> %s<br /><br />' . 'If you require other payment gateways, you will need to upgrade to %s.', 'cp'), '<a target="_blank" href="' . admin_url('admin.php?page=' . $this->screen_base . '_settings' . '&tab=cp-marketpress') . '">' . __('Begin Activating MarketPress Lite', 'cp') . '</a>', '<a target="_blank" href="https://premium.wpmudev.org/project/e-commerce/">' . __('MarketPress', 'cp') . '</a>');
                    } else {
                        echo sprintf(__('The full version of MarketPress has been bundled with %s.<br />' . 'To start selling your course, you will need to activate MarketPress: <br /> %s<br /><br />', 'cp'), 'CoursePress Pro', '<a target="_blank" href="' . admin_url('admin.php?page=' . $this->screen_base . '_settings' . '&tab=cp-marketpress') . '">' . __('Begin Activating MarketPress', 'cp') . '</a>');
                    }
                    ?>
																</div>
															</div>  <!-- cp-marketpress-not-active -->
														<?php 
                }
                if (current_user_can('manage_options') || !current_user_can('manage_options') && $gateways) {
                    echo CoursePress_MarketPress_Integration::product_settings('', $course_id);
                }
                ?>
<!-- cp-markertpress-is-active -->
														<!--_e('Please ask administrator to enable at least one payment gateway.', 'cp');-->
 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 '';
 }
 /**
  * Installs a plugin or activates a plugin depending on the hover
  * link clicked by the user.
  *
  * Checks the $_GET variable to see which actions have been
  * passed and responds with the appropriate method.
  *
  * Uses WP_Filesystem to process and handle the plugin installation
  * method.
  *
  * @uses WP_Filesystem
  * @uses WP_Error
  * @uses WP_Upgrader
  * @uses Plugin_Upgrader
  * @uses Plugin_Installer_Skin
  *
  * @return boolean True on success, false on failure
  */
 protected function do_plugin_install()
 {
     // All plugin information will be stored in an array for processing.
     $plugin = array();
     // Checks for actions from hover links to process the installation.
     if (isset($_GET['plugin']) && (isset($_GET['cp-plugin-install']) && 'install-plugin' == $_GET['cp-plugin-install'])) {
         check_admin_referer('cp-plugin-install');
         $plugin['name'] = $_GET['plugin_name'];
         // Plugin name.
         $plugin['slug'] = $_GET['plugin'];
         // Plugin slug.
         $plugin['source'] = $_GET['plugin_source'];
         // Plugin source.
         // Pass all necessary information via URL if WP_Filesystem is needed.
         $url = wp_nonce_url(esc_url(add_query_arg(array('page' => $this->menu, 'plugin' => $plugin['slug'], 'plugin_name' => $plugin['name'], 'plugin_source' => $plugin['source'], 'cp-plugin-install' => 'install-plugin'), admin_url('admin.php'))), 'cp-plugin-install');
         $method = '';
         // Leave blank so WP_Filesystem can populate it as necessary.
         $fields = array('cp-plugin-install');
         // Extra fields to pass to WP_Filesystem.
         if (false === ($creds = request_filesystem_credentials($url, $method, false, false, $fields))) {
             return true;
         }
         if (!WP_Filesystem($creds)) {
             request_filesystem_credentials($url, $method, true, false, $fields);
             // Setup WP_Filesystem.
             return true;
         }
         require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
         // Need for plugins_api.
         require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
         // Need for upgrade classes.
         // Prep variables for Plugin_Installer_Skin class.
         $title = sprintf($this->strings['installing'], $plugin['name']);
         $url = add_query_arg(array('action' => 'install-plugin', 'plugin' => $plugin['slug']), 'update.php');
         if (isset($_GET['from'])) {
             $url .= add_query_arg('from', urlencode(stripslashes($_GET['from'])), $url);
         }
         $url = esc_url($url);
         // Avoid XSS
         $nonce = 'install-plugin_' . $plugin['slug'];
         // Prefix a default path to pre-packaged plugins.
         if (!CoursePress_Capabilities::is_pro()) {
             $source = 'https://' . $plugin['source'];
             //added protocol to avoid mod_security
         } else {
             $source = $plugin['source'];
         }
         // Create a new instance of Plugin_Upgrader.
         $upgrader = new Plugin_Upgrader($skin = new Plugin_Installer_Skin(compact('type', 'title', 'url', 'nonce', 'plugin', 'api')));
         // Perform the action and install the plugin from the $source urldecode().
         $upgrader->install($source);
         // Flush plugins cache so we can make sure that the installed plugins list is always up to date.
         wp_cache_flush();
         // Display message based on if all plugins are now active or not.
         $complete = array();
         if (!$this->is_plugin_active($this->plugin['base_path'])) {
             echo '<p><a href="' . esc_url(add_query_arg('page', $this->menu, admin_url('admin.php'))) . '" title="' . esc_attr($this->strings['return']) . '" target="_parent">' . $this->strings['return'] . '</a></p>';
             $complete[] = $plugin;
         } else {
             $complete[] = '';
         }
         // Filter out any empty entries.
         $complete = array_filter($complete);
         // All plugins are active, so we display the complete string and hide the plugin menu.
         if (empty($complete)) {
             echo '<p>' . sprintf($this->strings['complete'], '<a href="' . admin_url() . '" title="' . __('Return to the Dashboard', 'cp') . '">' . __('Return to the Dashboard', 'cp') . '</a>') . '</p>';
             echo '<style type="text/css">#adminmenu .wp-submenu li.current { display: none !important; }</style>';
         }
         return true;
     } elseif (isset($_GET['plugin']) && (isset($_GET['cp-activate-plugin']) && 'activate-plugin' == $_GET['cp-activate-plugin'])) {
         check_admin_referer('cp-activate-plugin', 'cp-activate-plugin-nonce');
         // Populate $plugin array with necessary information.
         $plugin['name'] = $_GET['plugin_name'];
         $plugin['slug'] = $_GET['plugin'];
         $plugin['source'] = $_GET['plugin_source'];
         $plugin_data = get_plugins('/' . $plugin['slug']);
         // Retrieve all plugins.
         $plugin_file = array_keys($plugin_data);
         // Retrieve all plugin files from installed plugins.
         $plugin_to_activate = $plugin['slug'] . '/' . $plugin_file[0];
         // Match plugin slug with appropriate plugin file.
         $activate = activate_plugin($plugin_to_activate);
         // Activate the plugin.
         if (is_wp_error($activate)) {
             echo '<div id="message" class="error"><p>' . $activate->get_error_message() . '</p></div>';
             echo '<p><a href="' . esc_url(add_query_arg('page', $this->menu, admin_url('admin.php'))) . '" title="' . esc_attr($this->strings['return']) . '" target="_parent">' . $this->strings['return'] . '</a></p>';
             return true;
             // End it here if there is an error with activation.
         } else {
             // Make sure message doesn't display again if bulk activation is performed immediately after a single activation.
             if (!isset($_POST['action'])) {
                 $msg = $this->strings['activated_successfully'] . ' <strong>' . $plugin['name'] . '</strong>';
                 echo '<div id="message" class="updated"><p>' . $msg . '</p></div>';
             }
         }
     }
     return false;
 }