Created
March 8, 2016 22:43
-
-
Save thomasplevy/7b25c23554aece15ccb4 to your computer and use it in GitHub Desktop.
lifterlms patch file
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Page functions | |
* | |
* Functions used for managing page / post access | |
* | |
* @author codeBOX | |
* @project lifterLMS | |
*/ | |
/** | |
* Main restriction function | |
* Runs checks against restriction types based on page / post type. | |
* returns array containing information about page restriction | |
* | |
* @param int $post_id [ID of current post or page] | |
* | |
* @return array $results | |
*/ | |
function llms_page_restricted( $post_id ) { | |
$post = get_post( $post_id ); | |
$restricted = false; | |
$reason = ''; | |
if ( ! current_user_can( 'manage_options' ) ) { | |
if ( site_restricted_by_membership( $post_id ) ) { | |
$restricted = true; | |
$reason = 'site_wide_membership'; | |
} elseif ( page_restricted_by_membership( $post_id ) ) { | |
$restricted = true; | |
$reason = 'membership'; | |
} elseif ( is_single() && $post->post_type == 'lesson' ) { | |
$l = new LLMS_Lesson( $post_id ); | |
if ( ! $l->get_is_free()) { | |
if ( parent_page_restricted_by_membership( $post_id ) ) { | |
$restricted = true; | |
$reason = 'parent_membership'; | |
} elseif ( ! llms_is_user_enrolled( get_current_user_id(), $post_id ) ) { | |
$restricted = true; | |
$reason = 'enrollment_lesson'; | |
} elseif ( outstanding_prerequisite_exists( get_current_user_id(), $post_id ) ) { | |
$restricted = true; | |
$reason = 'prerequisite'; | |
} elseif ( lesson_start_date_in_future( get_current_user_id(), $post_id ) ) { | |
$restricted = true; | |
$reason = 'lesson_start_date'; | |
} | |
} | |
} elseif ( is_single() && $post->post_type == 'course') { | |
if ( ! llms_is_user_enrolled( get_current_user_id(), $post_id ) ) { | |
$restricted = true; | |
$reason = 'enrollment'; | |
} elseif ( outstanding_prerequisite_exists( get_current_user_id(), $post_id ) ) { | |
$restricted = true; | |
$reason = 'prerequisite'; | |
} elseif ( course_start_date_in_future( $post_id ) ) { | |
$restricted = true; | |
$reason = 'course_start_date'; | |
} elseif ( course_end_date_in_past( $post_id ) ) { | |
$restricted = true; | |
$reason = 'course_end_date'; | |
} | |
} elseif ( is_single() && $post->post_type == 'llms_question' ) { | |
if ( quiz_restricted() ) { | |
$restricted = true; | |
$reason = 'quiz_restricted'; | |
} | |
} elseif ( is_single() && $post->post_type == 'llms_membership' ) { | |
if ( membership_page_restricted() ) { | |
$restricted = true; | |
$reason = 'membership_page'; | |
} | |
} | |
} | |
$results = array( | |
'id' => $post_id, | |
'is_restricted' => $restricted, | |
'reason' => $reason, | |
); | |
return apply_filters( 'llms_page_restricted', $results ); | |
} | |
/** | |
* Checks if user has ability to view quiz | |
* | |
* @return bool [Can user view quiz] | |
*/ | |
function quiz_restricted() { | |
$quiz = LLMS()->session->get( 'llms_quiz' ); | |
if ( $quiz && $quiz->end_date == '' ) { | |
return false; | |
} else { | |
return true; | |
} | |
} | |
/** | |
* Checks if site is restricted by master membership | |
* If site is restricted checks if user has authority to view current page. | |
* | |
* @param int $post_id [ID of current post or page] | |
* | |
* @return bool [Can user view page based on membership restriction] | |
*/ | |
function site_restricted_by_membership( $post_id ) { | |
// if this is a course and the user is already enrolled, ignore the sitewide restriction | |
// this allows users to buy a course that's available on it's own OR with a membership | |
if ( 'course' == get_post_type( $post_id ) || 'lesson' == get_post_type( $post_id ) ) { | |
if( llms_is_user_enrolled( get_current_user_id(), $post_id ) ) { | |
return false; | |
} | |
} | |
//check if membership is required | |
$membership_required = get_option( 'lifterlms_membership_required', '' ); | |
//if it's not required return false | |
if ( ! $membership_required || $membership_required == '') { | |
return false; | |
} | |
if ($membership_required && ! $membership_required == '') { | |
if ( is_user_logged_in() ) { | |
$user_id = get_current_user_id(); | |
$user_memberships = get_user_meta( $user_id, '_llms_restricted_levels', true ); | |
if ( $user_memberships && in_array( $membership_required, $user_memberships ) ) { | |
return false; | |
} | |
} | |
} | |
$post = get_post( $post_id ); | |
//if page is not account, purchase, memberships, or is of post type llms_memberships restrict content | |
if ( $post->post_type == 'llms_membership') { | |
return false; | |
} elseif ( is_post_type_archive( 'llms_membership' ) ) { | |
return false; | |
} elseif ( is_page( llms_get_page_id( 'memberships' ) ) ) { | |
return false; | |
} elseif ( is_page( llms_get_page_id( 'myaccount' ) ) ) { | |
return false; | |
} elseif ( is_page( llms_get_page_id( 'checkout' ) ) ) { | |
return false; | |
} | |
//get site restricted memberships | |
return true; | |
} | |
/** | |
* Checks if user is a member of the membership post they are viewing | |
* @return [type] [description] | |
*/ | |
function membership_page_restricted() { | |
global $post; | |
$restricted = true; | |
if (is_single() && $post->post_type === 'llms_membership') { | |
if ( is_user_logged_in() ) { | |
$user_memberships = get_user_meta( get_current_user_id(), '_llms_restricted_levels', true ); | |
if ( $user_memberships && in_array( $post->ID, $user_memberships ) ) { | |
$restricted = false; | |
} | |
} | |
} | |
return $restricted; | |
} | |
/** | |
* Checks if specific page / post is restricted by membership(s) | |
* If page is restricted checks user authority to view content. | |
* | |
* @param int $post_id [ID of current post or page] | |
* | |
* @return bool $resticted_access [Is page restricted by membership level] | |
*/ | |
function page_restricted_by_membership( $post_id ) { | |
$post = get_post( $post_id ); | |
$userid = get_current_user_id(); | |
$membership_required = get_option( 'lifterlms_membership_required', '' ); | |
$restrict_access = false; | |
$membership_id = ''; | |
if ( is_single() || is_page() ) { | |
// if this is a course and the user is already enrolled, ignore the sitewide restriction | |
// this allows users to buy a course that's available on it's own OR with a membership | |
if ( 'course' == get_post_type( $post_id ) || 'lesson' == get_post_type( $post_id ) ) { | |
if( llms_is_user_enrolled( get_current_user_id(), $post_id ) ) { | |
return false; | |
} | |
} | |
//are there membership restictions on page | |
$page_restrictions = get_post_meta( $post_id, '_llms_restricted_levels', true ); | |
if ( ! $page_restrictions) { | |
//check if page is a topic and restict if parent is restricted (bbpress) | |
$page_restrictions = is_topic_restricted( $post ); | |
} | |
// membership restrictions exist | |
if ( ! empty( $page_restrictions ) ) { | |
$restrict_access = true; | |
//is user logged in | |
if ( is_user_logged_in() ) { | |
$user_memberships = get_user_meta( $userid, '_llms_restricted_levels', true ); | |
//does user have any membership levels | |
if ( ! empty( $user_memberships ) ) { | |
foreach ( $page_restrictions as $key => $value ) { | |
if ( in_array( $value, $user_memberships ) ) { | |
$restrict_access = false; | |
} else if ( $membership_required && ! $membership_required == '') { | |
if ( in_array( $membership_required , $user_memberships ) ) { | |
$restrict_access = false; | |
} | |
} | |
} | |
//if post type is course and user is enrolled then do not restrict content. | |
if ($post->post_type == 'course' ) { | |
if ( llms_is_user_enrolled( $userid, $post->id ) ) { | |
$restrict_access = false; | |
} | |
} | |
} | |
} | |
} | |
} | |
return $restrict_access; | |
} | |
/** | |
* Custom restriction for bbpress topics | |
* @param [type] $post [description] | |
* @return boolean [description] | |
*/ | |
function is_topic_restricted( $post ) { | |
$page_restrictions = array(); | |
if (isset( $post->post_type ) && $post->post_type === 'topic') { | |
$parent_id = wp_get_post_parent_id( $post->ID ); | |
if ($parent_id) { | |
$page_restrictions = get_post_meta( $parent_id, '_llms_restricted_levels', true ); | |
llms_log( $page_restrictions ); | |
} | |
} | |
return $page_restrictions; | |
} | |
/** | |
* Get membership levels associated with post / page | |
* | |
* @param int $post_id [ID of current post or page] | |
* | |
* @return array [Membership levels associated with post / page] | |
*/ | |
function llms_get_post_memberships( $post_id ) { | |
$memberships = get_post_meta( $post_id, '_llms_restricted_levels', true ); | |
return $memberships; | |
} | |
/** | |
* Queries course membership level if post type is lesson | |
* | |
* @param int $post_id [ID of current post or page] | |
* | |
* @return array [membership levels associated with parent course] | |
*/ | |
function llms_get_parent_post_memberships( $post_id ) { | |
$lesson = new LLMS_Lesson( $post_id ); | |
$parent_id = $lesson->get_parent_course(); | |
$memberships = get_post_meta( $parent_id, '_llms_restricted_levels', true ); | |
return $memberships; | |
} | |
/** | |
* Checks if parent course membership should restrict user from viewing content | |
* | |
* @param int $post_id [ID of current post or page] | |
* | |
* @return bool [Restrict access to user?] | |
*/ | |
function parent_page_restricted_by_membership( $post_id ) { | |
$post = get_post( $post_id ); | |
$restrict_access = false; | |
if ($post->post_type == 'lesson') { | |
$lesson = new LLMS_Lesson( $post_id ); | |
$parent_course = $lesson->get_parent_course(); | |
if ( page_restricted_by_membership( $parent_course ) ) { | |
$restrict_access = true; | |
} | |
} | |
return $restrict_access; | |
} | |
/** | |
* Checks if lesson or course has outstanding prerequisites that need to be met | |
* | |
* @param int $user_id [ID of the current user] | |
* @param int $post_id [ID of current post or page] | |
* | |
* @return bool $result [Does post have outstanding prerequisite?] | |
*/ | |
function outstanding_prerequisite_exists( $user_id, $post_id ) { | |
$user = new LLMS_Person; | |
$result = false; | |
$post = get_post( $post_id ); | |
if ( $post->post_type == 'course' ) { | |
$current_post = new LLMS_Course( $post->ID ); | |
$result = find_prerequisite( $user_id, $current_post ); | |
} | |
if ( $post->post_type == 'lesson' ) { | |
$current_post = new LLMS_Lesson( $post->ID ); | |
$parent_course_id = $current_post->get_parent_course(); | |
$parent_course = new LLMS_Course( $parent_course_id ); | |
$result = find_prerequisite( $user_id, $parent_course ); | |
if ( ! $result) { | |
$result = find_prerequisite( $user_id, $current_post ); | |
} | |
} | |
return $result; | |
} | |
/** | |
* Queries post metadata for prerequisite | |
* | |
* @param int $user_id [ID of current user] | |
* @param int $post_id [ID of current post or page] | |
* | |
* @return bool $prerequisite_exists [Does a prerequisite exist for post?] | |
*/ | |
function find_prerequisite( $user_id, $post ) { | |
$user = new LLMS_Person; | |
$course = new LLMS_Course( $post->id ); | |
$p = $course->get_prerequisite(); | |
$prerequisite_exists = false; | |
$initial_prereq = false; | |
if ($prerequisite_id = $course->get_prerequisite()) { | |
$prerequisite_exists = true; | |
$prerequisite = get_post( $prerequisite_id ); | |
$user_postmetas = $user->get_user_postmeta_data( $user_id, $prerequisite->ID ); | |
if ( isset( $user_postmetas ) ) { | |
foreach ( $user_postmetas as $key => $value ) { | |
if ( isset( $user_postmetas['_is_complete'] ) && $user_postmetas['_is_complete']->post_id == $prerequisite_id) { | |
$prerequisite_exists = false; | |
} | |
} | |
} | |
$initial_prereq = $prerequisite_exists; | |
} | |
if ($prerequisite_id = $course->get_prerequisite_track()) { | |
$prerequisite_exists = true; | |
$args = array( | |
'posts_per_page' => 1000, | |
'post_type' => 'course', | |
'nopaging' => true, | |
'post_status' => 'publish', | |
'orderby' => 'post_title', | |
'order' => 'ASC', | |
'suppress_filters' => true, | |
'tax_query' => array( | |
array( | |
'taxonomy' => 'course_track', | |
'field' => 'term_id', | |
'terms' => $prerequisite_id, | |
), | |
), | |
); | |
$prerequisites = get_posts( $args ); | |
$prerequisite_exists = false; | |
foreach ($prerequisites as $prerequisite) { | |
$user_postmetas = $user->get_user_postmeta_data( $user_id, $prerequisite->ID ); | |
if ( isset( $user_postmetas ) ) { | |
foreach ( $user_postmetas as $key => $value ) { | |
if ( ! isset( $user_postmetas['_is_complete'] ) && $user_postmetas['_is_complete']->post_id == $prerequisite->ID) { | |
$prerequisite_exists = true; | |
} | |
} | |
} else { | |
$prerequisite_exists = true; | |
} | |
} | |
} | |
return ($initial_prereq || $prerequisite_exists); | |
} | |
/** | |
* Queries course metadata to get the date the user enrolled. | |
* | |
* @param int $user_id [ID of current user] | |
* @param int $post_id [ID of current post or page] | |
* | |
* @return datetime $start_date [Start Date in M, d, Y format] or empty string if user is not enrolled. | |
*/ | |
function llms_get_course_enrolled_date( $user_id, $post_id ) { | |
$post = get_post( $post_id ); | |
$course_id = -1; | |
if ($post->post_type == 'course') { | |
$course_id = $post_id; | |
} else if ($post->post_type == 'lesson') { | |
$lesson = new LLMS_Lesson( $post->ID ); | |
$course_id = $lesson->get_parent_course(); | |
} | |
$start_date = ''; | |
$llms_person = new LLMS_Person(); | |
$user_postmetas = $llms_person->get_user_postmeta_data( $user_id, $course_id ); | |
if ( isset( $user_postmetas['_status'] ) ) { | |
if ( $user_postmetas['_status']->meta_value == 'Enrolled' ) { | |
$start_date = date( 'Y-m-d', strtotime( $user_postmetas['_status']->updated_date ) ); | |
} | |
} | |
return $start_date; | |
} | |
/** | |
* Checks if course end date is less than current date. | |
* | |
* @param int $post_id [ID of current post or page] | |
* | |
* @return bool $course_in_past [Hast the course end date past?] | |
*/ | |
function course_end_date_in_past( $post_id ) { | |
$course_in_past = false; | |
$course = new LLMS_Course( $post_id ); | |
$end_date = $course->get_end_date( $post_id ); //removed copy and past code here just becuase it was so glaring | |
if ( $end_date != '' ) { | |
$todays_date = current_time( 'mysql' ); | |
if ($todays_date > $end_date) { | |
$course_in_past = true; | |
} | |
} | |
// break out and display an error | |
// TODO should this take the drip feed into account, I would assume so... | |
if ($course_in_past) { | |
$end_date_formatted = LLMS_Date::pretty_date( $end_date ); | |
do_action( 'lifterlms_content_restricted_by_end_date', $end_date_formatted ); | |
} | |
return $course_in_past; | |
} | |
/** | |
* Returns the start date for the lesson | |
* Returns the date the lesson can start | |
* If drip days are set it calculates the drip days | |
* | |
* @param int $user_id [ID of current user] | |
* @param int $post_id [ID of lesson] | |
* | |
* @return datetime $lesson_start_date [Start Date in M, d, Y format] | |
*/ | |
function llms_get_lesson_start_date( $user_id, $post_id ) { | |
$lesson = new LLMS_Lesson( $post_id ); | |
$course_id = $lesson->get_parent_course(); | |
$course = new LLMS_Course( $course_id ); | |
//get the course start date | |
//get the date the user enrolled | |
$course_start_date = $course->get_start_date(); | |
$user_enrolled_date = $course->get_user_enroll_date( $user_id ); | |
$drip_days = $lesson->get_drip_days(); | |
//get the greater of the two dates | |
if ( $course_start_date > $user_enrolled_date ) { | |
$start_date = $course_start_date; | |
} else { | |
$start_date = $user_enrolled_date; | |
} | |
//add drip days | |
$start_date = LLMS_Date::db_date( $start_date . '+ ' . $drip_days . ' days' ); | |
return $start_date; | |
} | |
/** | |
* Checks if lesson start date is greater than current date. | |
* | |
* @param int $post_id [ID of current post or page] | |
* | |
* @return bool $result [Does the lesson have a future start date?] | |
*/ | |
function lesson_start_date_in_future( $user_id, $post_id ) { | |
return course_end_date_in_past( $post_id ) || (date_create( current_time( 'mysql' ) ) < date_create( llms_get_lesson_start_date( $user_id, $post_id ) )); | |
} | |
/** | |
* Checks if course start date is greater than current date. | |
* | |
* @param int $post_id [ID of current post or page] | |
* | |
* @return bool $course_in_future [Does the course have a future start date?] | |
*/ | |
function course_start_date_in_future( $post_id ) { | |
$course = new LLMS_Course( $post_id ); | |
$start_date = $course->get_start_date( $post_id ); | |
$course_in_future = false; | |
if (current_time( 'mysql' ) < $start_date) { | |
$course_in_future = true; | |
} | |
return $course_in_future; | |
} | |
/** | |
* On screen notice passed to user when page is restricted by membership | |
* | |
* @param int $membership_id [ID of the membership] | |
* | |
* @return void | |
*/ | |
function page_restricted_by_membership_alert( $membership_id ) { | |
$required_membership_name = get_the_title( $membership_id ); | |
llms_add_notice( sprintf( __( '%s membership is required to view this content.', 'lifterlms' ), | |
$required_membership_name ) ); | |
} | |
add_action( 'lifterlms_content_restricted_by_membership', 'page_restricted_by_membership_alert' ); | |
/** | |
* Checks if user is currently enrolled in course | |
* | |
* @param int $user_id [ID of the current user] | |
* @param int $product_id [ID of the product ($course post id)] | |
* | |
* @return bool $enrolled [Is user currently enrolled in the course?] | |
*/ | |
function llms_is_user_enrolled( $user_id, $product_id ) { | |
global $wpdb; | |
$enrolled = false; | |
$post = get_post( $product_id ); | |
if ( ! $post->post_type == 'lesson' || ! $post->post_type == 'course') { | |
return true; } | |
if ( ! empty( $user_id ) && ! empty( $product_id ) ) { | |
$user = new LLMS_Person; | |
if ( $post->post_type == 'lesson' ) { | |
$lesson = new LLMS_Lesson( $post->ID ); | |
$product_id = $lesson->get_parent_course(); | |
} | |
$user_postmetas = $user->get_user_postmeta_data( $user_id, $product_id ); | |
if (isset( $user_postmetas['_status'] )) { | |
$course_status = $user_postmetas['_status']->meta_value; | |
if ( $course_status == 'Enrolled' ) { | |
$enrolled = true; | |
} | |
} | |
} | |
return $enrolled; | |
} | |
/** | |
* Checks if user has the membership level required to view the post / page | |
* | |
* @param int $user_id [ID of the current user] | |
* @param int $post_id [ID of the post / page] | |
* | |
* @return bool $is_member [Does the user have the required membership level required to view page / post?] | |
*/ | |
function llms_is_user_member( $user_id, $post_id ) { | |
$user_memberships = get_user_meta( $user_id, '_llms_restricted_levels', true ); | |
$is_member = false; | |
if ( empty( $user_memberships ) ) { | |
$is_member = false; | |
} else { | |
foreach ( $user_memberships as $key => $value ) { | |
if ( $post_id == $value) { | |
$is_member = true; | |
} | |
} | |
} | |
return $is_member; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment