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; }
/** * 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; }