public function single_lesson_handler()
 {
     global $post;
     // Preview Lessons shouldn't ignore this rule.
     if (WooThemes_Sensei_Utils::is_preview_lesson($post->ID)) {
         return;
     }
     $course_id = get_post_meta($post->ID, '_lesson_course', true);
     // User already started this course, so ideally, we shouldn't restrict access.
     if (WooThemes_Sensei_Utils::user_started_course($post->ID, wp_get_current_user()->ID)) {
         return;
     }
     // This happens if the lesson isn't locked itself.
     if (memberful_can_user_access_post(wp_get_current_user()->ID, $post->ID)) {
         if (!memberful_can_user_access_post(wp_get_current_user()->ID, $course_id)) {
             // The user doesn't have access to this post, so he shouldn't have actions on it.
             remove_all_actions('sensei_lesson_single_meta');
             // Now the funky filtering part.
             remove_action('the_content', 'memberful_wp_protect_content');
             add_action('the_content', array($this, 'single_lesson_special_content_filter'), -10);
         }
     } else {
         // The user doesn't have access to this post, so he shouldn't have actions on it.
         remove_all_actions('sensei_lesson_single_meta');
     }
 }
 /**
  * check_user_permissions function.
  *
  * @access public
  * @param string $page (default: '')
  * @param array $data (default: array())
  * @return void
  */
 public function check_user_permissions($page = '', $data = array())
 {
     // REFACTOR
     global $current_user, $post;
     if (!isset($current_user)) {
         return;
     }
     // Get User Meta
     get_currentuserinfo();
     $user_allowed = false;
     switch ($page) {
         case 'course-single':
             // check for prerequisite course or lesson,
             $course_prerequisite_id = (int) get_post_meta($post->ID, '_course_prerequisite', true);
             $update_course = $this->woocommerce_course_update($post->ID);
             // Count completed lessons
             if (0 < absint($course_prerequisite_id)) {
                 $prerequisite_complete = WooThemes_Sensei_Utils::user_completed_course($course_prerequisite_id, $current_user->ID);
             } else {
                 $prerequisite_complete = true;
             }
             // End If Statement
             // Handles restrictions
             if (!$prerequisite_complete && 0 < absint($course_prerequisite_id)) {
                 $this->permissions_message['title'] = get_the_title($post->ID) . ': ' . __('Restricted Access', 'woothemes-sensei');
                 $course_link = '<a href="' . esc_url(get_permalink($course_prerequisite_id)) . '">' . __('course', 'woothemes-sensei') . '</a>';
                 $this->permissions_message['message'] = sprintf(__('Please complete the previous %1$s before taking this course.', 'woothemes-sensei'), $course_link);
             } else {
                 $user_allowed = true;
             }
             // End If Statement
             break;
         case 'lesson-single':
             // Check for WC purchase
             $lesson_course_id = get_post_meta($post->ID, '_lesson_course', true);
             $update_course = $this->woocommerce_course_update($lesson_course_id);
             $is_preview = WooThemes_Sensei_Utils::is_preview_lesson($post->ID);
             if ($this->access_settings() && WooThemes_Sensei_Utils::user_started_course($lesson_course_id, $current_user->ID)) {
                 $user_allowed = true;
             } elseif ($this->access_settings() && false == $is_preview) {
                 $user_allowed = true;
             } else {
                 $this->permissions_message['title'] = get_the_title($post->ID) . ': ' . __('Restricted Access', 'woothemes-sensei');
                 $course_link = '<a href="' . esc_url(get_permalink($lesson_course_id)) . '">' . __('course', 'woothemes-sensei') . '</a>';
                 $wc_post_id = get_post_meta($lesson_course_id, '_course_woocommerce_product', true);
                 if (WooThemes_Sensei_Utils::sensei_is_woocommerce_activated() && 0 < $wc_post_id) {
                     if ($is_preview) {
                         $this->permissions_message['message'] = sprintf(__('This is a preview lesson. Please purchase the %1$s to access all lessons.', 'woothemes-sensei'), $course_link);
                     } else {
                         $this->permissions_message['message'] = apply_filters('sensei_please_purchase_course_text', sprintf(__('Please purchase the %1$s before starting this Lesson.', 'woothemes-sensei'), $course_link));
                     }
                 } else {
                     if ($is_preview) {
                         $this->permissions_message['message'] = sprintf(__('This is a preview lesson. Please sign up for the %1$s to access all lessons.', 'woothemes-sensei'), $course_link);
                     } else {
                         /** This filter is documented in class-woothemes-sensei-frontend.php */
                         $this->permissions_message['message'] = apply_filters('sensei_please_sign_up_text', sprintf(__('Please sign up for the %1$s before starting the lesson.', 'woothemes-sensei'), $course_link));
                     }
                 }
                 // End If Statement
             }
             // End If Statement
             break;
         case 'quiz-single':
             $lesson_id = get_post_meta($post->ID, '_quiz_lesson', true);
             $lesson_course_id = get_post_meta($lesson_id, '_lesson_course', true);
             $update_course = $this->woocommerce_course_update($lesson_course_id);
             if ($this->access_settings() && WooThemes_Sensei_Utils::user_started_course($lesson_course_id, $current_user->ID) || sensei_all_access()) {
                 // Check for prerequisite lesson for this quiz
                 $lesson_prerequisite_id = (int) get_post_meta($lesson_id, '_lesson_prerequisite', true);
                 $user_lesson_prerequisite_complete = WooThemes_Sensei_Utils::user_completed_lesson($lesson_prerequisite_id, $current_user->ID);
                 // Handle restrictions
                 if (sensei_all_access()) {
                     $user_allowed = true;
                 } else {
                     if (0 < absint($lesson_prerequisite_id) && !$user_lesson_prerequisite_complete) {
                         $this->permissions_message['title'] = get_the_title($post->ID) . ': ' . __('Restricted Access', 'woothemes-sensei');
                         $lesson_link = '<a href="' . esc_url(get_permalink($lesson_prerequisite_id)) . '">' . __('lesson', 'woothemes-sensei') . '</a>';
                         $this->permissions_message['message'] = sprintf(__('Please complete the previous %1$s before taking this Quiz.', 'woothemes-sensei'), $lesson_link);
                     } else {
                         $user_allowed = true;
                     }
                     // End If Statement
                 }
                 // End If Statement
             } elseif ($this->access_settings()) {
                 // Check if the user has started the course
                 if (is_user_logged_in() && !WooThemes_Sensei_Utils::user_started_course($lesson_course_id, $current_user->ID) && (isset($this->settings->settings['access_permission']) && true == $this->settings->settings['access_permission'])) {
                     $user_allowed = false;
                     $this->permissions_message['title'] = get_the_title($post->ID) . ': ' . __('Restricted Access', 'woothemes-sensei');
                     $course_link = '<a href="' . esc_url(get_permalink($lesson_course_id)) . '">' . __('course', 'woothemes-sensei') . '</a>';
                     $wc_post_id = get_post_meta($lesson_course_id, '_course_woocommerce_product', true);
                     if (WooThemes_Sensei_Utils::sensei_is_woocommerce_activated() && 0 < $wc_post_id) {
                         $this->permissions_message['message'] = sprintf(__('Please purchase the %1$s before starting this Quiz.', 'woothemes-sensei'), $course_link);
                     } else {
                         $this->permissions_message['message'] = sprintf(__('Please sign up for the %1$s before starting this Quiz.', 'woothemes-sensei'), $course_link);
                     }
                     // End If Statement
                 } else {
                     $user_allowed = true;
                 }
                 // End If Statement
             } else {
                 $this->permissions_message['title'] = get_the_title($post->ID) . ': ' . __('Restricted Access', 'woothemes-sensei');
                 $course_link = '<a href="' . esc_url(get_permalink(get_post_meta(get_post_meta($post->ID, '_quiz_lesson', true), '_lesson_course', true))) . '">' . __('course', 'woothemes-sensei') . '</a>';
                 $this->permissions_message['message'] = sprintf(__('Please sign up for the %1$s before taking this Quiz.', 'woothemes-sensei'), $course_link);
             }
             // End If Statement
             break;
         default:
             $user_allowed = true;
             break;
     }
     // End Switch Statement
     /**
      * filter the permissions message shown on sensei post types.
      *
      * @since 1.8.7
      *
      * @param array $permissions_message{
      *
      *   @type string $title
      *   @type string $message
      *
      * }
      * @param string $post_id
      */
     $this->permissions_message = apply_filters('sensei_permissions_message', $this->permissions_message, $post->ID);
     if (sensei_all_access() || WooThemes_Sensei_Utils::is_preview_lesson($post->ID)) {
         $user_allowed = true;
     }
     return apply_filters('sensei_access_permissions', $user_allowed);
 }
     $single_lesson_complete = WooThemes_Sensei_Utils::user_completed_lesson($lesson_item->ID, $current_user->ID);
     if ($single_lesson_complete) {
         $post_classes[] = 'lesson-completed';
     }
     // End If Statement
 }
 // End If Statement
 // Get Lesson data
 $complexity_array = $woothemes_sensei->post_types->lesson->lesson_complexities();
 $lesson_length = get_post_meta($lesson_item->ID, '_lesson_length', true);
 $lesson_complexity = get_post_meta($lesson_item->ID, '_lesson_complexity', true);
 if ('' != $lesson_complexity) {
     $lesson_complexity = $complexity_array[$lesson_complexity];
 }
 $user_info = get_userdata(absint($lesson_item->post_author));
 $is_preview = WooThemes_Sensei_Utils::is_preview_lesson($lesson_item->ID);
 $preview_label = '';
 if ($is_preview && !$is_user_taking_course) {
     $preview_label = $woothemes_sensei->frontend->sensei_lesson_preview_title_text($post->ID);
     $preview_label = '<span class="preview-heading">' . $preview_label . '</span>';
     $post_classes[] = 'lesson-preview';
 }
 $html .= '<article class="' . esc_attr(join(' ', get_post_class($post_classes, $lesson_item->ID))) . '">';
 $html .= '<header>';
 $html .= '<h2><a href="' . esc_url(get_permalink($lesson_item->ID)) . '" title="' . esc_attr(sprintf(__('Start %s', 'woothemes-sensei'), $lesson_item->post_title)) . '">';
 if (apply_filters('sensei_show_lesson_numbers', $show_lesson_numbers)) {
     $html .= '<span class="lesson-number">' . $lesson_count . '. </span>';
 }
 $html .= esc_html(sprintf(__('%s', 'woothemes-sensei'), $lesson_item->post_title)) . $preview_label . '</a></h2>';
 $html .= '<p class="lesson-meta">';
 if ('' != $lesson_length) {
 public function sensei_course_preview_titles($title, $lesson_id)
 {
     global $post, $current_user, $woothemes_sensei;
     $course_id = $post->ID;
     $title_text = '';
     if (method_exists('WooThemes_Sensei_Utils', 'is_preview_lesson') && WooThemes_Sensei_Utils::is_preview_lesson($lesson_id)) {
         $is_user_taking_course = WooThemes_Sensei_Utils::sensei_check_for_activity(array('post_id' => $course_id, 'user_id' => $current_user->ID, 'type' => 'sensei_course_status'));
         if (!$is_user_taking_course) {
             if (method_exists('WooThemes_Sensei_Frontend', 'sensei_lesson_preview_title_text')) {
                 $title_text = $woothemes_sensei->frontend->sensei_lesson_preview_title_text($course_id);
                 // Remove brackets for display here
                 $title_text = str_replace('(', '', $title_text);
                 $title_text = str_replace(')', '', $title_text);
                 $title_text = '<span class="preview-label">' . $title_text . '</span>';
             }
             $title .= ' ' . $title_text;
         }
     }
     return $title;
 }
                <?php 
$view_lesson = true;
wp_get_current_user();
$lesson_prerequisite = absint(get_post_meta($post->ID, '_lesson_prerequisite', true));
if ($lesson_prerequisite > 0) {
    // Check for prerequisite lesson completions
    $view_lesson = WooThemes_Sensei_Utils::user_completed_lesson($lesson_prerequisite, $current_user->ID);
}
$lesson_course_id = get_post_meta($post->ID, '_lesson_course', true);
$user_taking_course = WooThemes_Sensei_Utils::user_started_course($lesson_course_id, $current_user->ID);
if (current_user_can('administrator')) {
    $view_lesson = true;
    $user_taking_course = true;
}
$is_preview = false;
if (WooThemes_Sensei_Utils::is_preview_lesson($post->ID)) {
    $is_preview = true;
    $view_lesson = true;
}
if ($view_lesson) {
    ?>

					<section class="entry fix">
					<?php 
    if ($is_preview && !$user_taking_course) {
        ?>
						<div class="sensei-message alert"><?php 
        echo $woothemes_sensei->permissions_message['message'];
        ?>
</div>
					<?php 
 public function sensei_lesson_preview_title($title = '', $id = 0)
 {
     global $post, $current_user;
     // Limit to lessons and check if lesson ID matches filtered post ID
     // @see https://github.com/woothemes/sensei/issues/574
     if (isset($post->ID) && $id == $post->ID && 'lesson' == get_post_type($post)) {
         // Limit to main query only
         if (is_main_query()) {
             // Get the course ID
             $course_id = get_post_meta($post->ID, '_lesson_course', true);
             // Check if the user is taking the course
             if (is_singular('lesson') && WooThemes_Sensei_Utils::is_preview_lesson($post->ID) && !WooThemes_Sensei_Utils::user_started_course($course_id, $current_user->ID) && $post->ID == $id) {
                 $title .= ' ' . $this->sensei_lesson_preview_title_text($course_id);
             }
         }
     }
     return $title;
 }
    function widget($args, $instance)
    {
        global $woothemes_sensei, $post, $current_user, $view_lesson, $user_taking_course;
        $allmodules = 'off';
        if (isset($instance['allmodules'])) {
            $allmodules = $instance['allmodules'];
        }
        // If not viewing a lesson/quiz, don't display the widget
        if (!(is_singular('lesson') || is_singular('quiz'))) {
            return;
        }
        extract($args);
        if (is_singular('quiz')) {
            $current_lesson_id = absint(get_post_meta($post->ID, '_quiz_lesson', true));
        } else {
            $current_lesson_id = $post->ID;
        }
        // get the course for the current lesson/quiz
        $lesson_course_id = get_post_meta($current_lesson_id, '_lesson_course', true);
        // Check if the user is taking the course
        $is_user_taking_course = WooThemes_Sensei_Utils::user_started_course($lesson_course_id, $current_user->ID);
        //Check for preview lesson
        $is_preview = false;
        if (method_exists('WooThemes_Sensei_Utils', 'is_preview_lesson')) {
            $is_preview = WooThemes_Sensei_Utils::is_preview_lesson($post->ID);
        }
        $course_title = get_the_title($lesson_course_id);
        $course_url = get_the_permalink($lesson_course_id);
        $in_module = false;
        $lesson_module = '';
        $lesson_array = array();
        if (0 < $current_lesson_id) {
            // get an array of lessons in the module if there is one
            if (isset(Sensei()->modules) && has_term('', Sensei()->modules->taxonomy, $current_lesson_id)) {
                // Get all modules
                $course_modules = Sensei()->modules->get_course_modules($lesson_course_id);
                $lesson_module = Sensei()->modules->get_lesson_module($current_lesson_id);
                $in_module = true;
                $current_module_title = htmlspecialchars($lesson_module->name);
                // Display all modules
                if ('on' == $allmodules) {
                    foreach ($course_modules as $module) {
                        // get all lessons in the module
                        $args = array('post_type' => 'lesson', 'post_status' => 'publish', 'posts_per_page' => -1, 'meta_query' => array(array('key' => '_lesson_course', 'value' => intval($lesson_course_id), 'compare' => '=')), 'tax_query' => array(array('taxonomy' => Sensei()->modules->taxonomy, 'field' => 'id', 'terms' => intval($module->term_id))), 'meta_key' => '_order_module_' . intval($module->term_id), 'orderby' => 'meta_value_num date', 'order' => 'ASC');
                        $lesson_array = array_merge($lesson_array, get_posts($args));
                    }
                } else {
                    // Only display current module
                    // get all lessons in the current module
                    $args = array('post_type' => 'lesson', 'post_status' => 'publish', 'posts_per_page' => -1, 'meta_query' => array(array('key' => '_lesson_course', 'value' => intval($lesson_course_id), 'compare' => '=')), 'tax_query' => array(array('taxonomy' => Sensei()->modules->taxonomy, 'field' => 'id', 'terms' => $lesson_module)), 'meta_key' => '_order_module_' . intval($lesson_module->term_id), 'orderby' => 'meta_value_num date', 'order' => 'ASC');
                    $lesson_array = get_posts($args);
                }
            } else {
                // if there's no module, get all lessons in the course
                $lesson_array = Sensei()->course->course_lessons($lesson_course_id);
            }
        }
        echo $before_widget;
        ?>

		<header>
			<h2 class="course-title"><a href="<?php 
        echo $course_url;
        ?>
"><?php 
        echo $course_title;
        ?>
</a></h2>

			<?php 
        if ($in_module && 'on' != $allmodules) {
            ?>
				<h3 class="module-title"><?php 
            echo $current_module_title;
            ?>
</h3>
			<?php 
        }
        ?>

		</header>

		<?php 
        $nav_id_array = sensei_get_prev_next_lessons($current_lesson_id);
        $previous_lesson_id = absint($nav_id_array['prev_lesson']);
        $next_lesson_id = absint($nav_id_array['next_lesson']);
        if (0 < $previous_lesson_id || 0 < $next_lesson_id) {
            ?>

			<ul class="course-progress-navigation">
				<?php 
            if (0 < $previous_lesson_id) {
                ?>
<li class="prev"><a href="<?php 
                echo esc_url(get_permalink($previous_lesson_id));
                ?>
" title="<?php 
                echo get_the_title($previous_lesson_id);
                ?>
"><span><?php 
                _e('Previous', 'sensei-course-progress');
                ?>
</span></a></li><?php 
            }
            ?>
				<?php 
            if (0 < $next_lesson_id) {
                ?>
<li class="next"><a href="<?php 
                echo esc_url(get_permalink($next_lesson_id));
                ?>
" title="<?php 
                echo get_the_title($next_lesson_id);
                ?>
"><span><?php 
                _e('Next', 'sensei-course-progress');
                ?>
</span></a></li><?php 
            }
            ?>
			</ul>

		<?php 
        }
        ?>

		<ul class="course-progress-lessons">

			<?php 
        $old_module = '';
        foreach ($lesson_array as $lesson) {
            $lesson_id = $lesson->ID;
            $lesson_title = htmlspecialchars($lesson->post_title);
            $lesson_url = get_the_permalink($lesson_id);
            // add 'completed' class to completed lessons
            $classes = "not-completed";
            if (WooThemes_Sensei_Utils::user_completed_lesson($lesson->ID, $current_user->ID)) {
                $classes = "completed";
            }
            // Lesson Quiz Meta
            $lesson_quiz_id = Sensei()->lesson->lesson_quizzes($lesson_id);
            // add 'current' class on the current lesson/quiz
            if ($lesson_id == $post->ID || $lesson_quiz_id == $post->ID) {
                $classes .= " current";
            }
            if (isset(Sensei()->modules) && 'on' == $allmodules) {
                $new_module = Sensei()->modules->get_lesson_module($lesson_id);
                if ($old_module != $new_module) {
                    ?>
						<li class="course-progress-module"><h3><?php 
                    echo $new_module->name;
                    ?>
</h3></li>
						<?php 
                    $old_module = $new_module;
                }
            }
            ?>

				<li class="course-progress-lesson <?php 
            echo $classes;
            ?>
">
					<?php 
            if ($lesson->ID == $post->ID || $lesson_quiz_id == $post->ID) {
                echo '<span>' . $lesson_title . '</span>';
            } else {
                echo '<a href="' . $lesson_url . '">' . $lesson_title . '</a>';
            }
            ?>
				</li>

			<?php 
        }
        ?>

		</ul>

		<?php 
        echo $after_widget;
    }