Skip to content

Instantly share code, notes, and snippets.

@justintadlock
Created March 9, 2016 23:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save justintadlock/8d354d92a4af13641e2c to your computer and use it in GitHub Desktop.
Save justintadlock/8d354d92a4af13641e2c to your computer and use it in GitHub Desktop.
Allow "0" for EDD Members - includes/functions.php
<?php
/**
* Helper Functions
*
* @package EDDMembers\Functions
* @since 1.0.0
*/
// Exit if accessed directly
if( !defined( 'ABSPATH' ) ) {
exit;
}
/**
* Load members only template for the content.
*
* Load templates/content-private.php file when content is private.
* This file can be overwitten in themes 'edd-members-templates' folder.
*
* @since 1.0.0
* @param string $content The Content template
* @return string $content
*/
function edd_members_private_content( $content ) {
// Check for private content
$edd_members_is_private_content = edd_members_is_private_content();
// Load private template if the content is private
if ( $edd_members_is_private_content ) {
ob_start();
$content = edd_get_template_part( 'content', 'private' );
return ob_get_clean();
}
return $content;
}
add_filter( 'the_content', 'edd_members_private_content', 99 );
add_filter( 'the_content_feed', 'edd_members_private_content', 99 );
add_filter( 'comment_text_rss', 'edd_members_private_content', 99 );
add_filter( 'bbp_get_topic_content', 'edd_members_private_content', 99 ); // Also support for bbPress topics
add_filter( 'bbp_get_reply_content', 'edd_members_private_content', 99 ); // Also support for bbPress replies
add_filter( 'mb_get_forum_content', 'edd_members_private_content', 99 ); // Also support for Message Board Plugin
add_filter( 'mb_get_topic_content', 'edd_members_private_content', 99 );
add_filter( 'mb_get_reply_content', 'edd_members_private_content', 99 );
/**
* Load members only template for comments.
*
* Load templates/comments-private.php file when comments are private.
* This file can be overwitten in themes 'edd-members-templates' folder.
*
* @since 1.0.0
* @param string $template The Comments template
* @return string $template
*/
function edd_members_private_comments( $template ) {
// Get comments setting
$edd_members_private_comments = edd_get_option( 'edd_members_private_comments' );
// Bail if not checked
if( ! $edd_members_private_comments ) {
return $template;
}
// Check for private content
$edd_members_is_private_content = edd_members_is_private_content();
// Load private template if the content is private
if ( $edd_members_is_private_content ) {
// Look for a 'edd-members-templates/comments-private.php' template in the parent and child theme
$has_template = locate_template( array( 'edd_templates/comments-private.php' ) );
// If the template was found, use it. Otherwise, load 'templates/comments-private.php' template
$template = ( !empty( $has_template ) ? $has_template : EDD_MEMBERS_DIR . 'templates/comments-private.php' );
// Allow developers to overwrite the comments template
$template = apply_filters( 'edd_members_comments_template', $template );
}
// Return the comments template filename
return $template;
}
add_filter( 'comments_template', 'edd_members_private_comments', 4 );
/**
* Check for private content.
*
* User with cap 'edd_members_show_all_content' can always see content.
* Admins have this cap by default.
*
* @since 1.0.0
* @param int $user_id The ID of the user to check
* @param int $post_id The ID of the post to check
* @return boolean
*/
function edd_members_is_private_content( $user_id = false, $post_id = '' ) {
// If no user is given, use the current user
if( ! $user_id ) {
$user_id = get_current_user_id();
}
// If no post ID is given, assume we're in The Loop and get the current post's ID
if ( empty( $post_id ) ) {
$post_id = get_the_ID();
}
// Get the post object.
$post = get_post( $post_id );
// Get post meta for singular posts that have been checked private
$edd_members_check_as_private = get_post_meta( $post_id, '_edd_members_check_as_private', true );
// Get private post types from settings
$edd_members_private_post_type = edd_get_option( 'edd_members_private_post_type' );
// Get feed setting
$edd_members_private_feed = edd_get_option( 'edd_members_private_feed' );
// Add support for EDD Recurring Plugin
if( class_exists( 'EDD_Recurring_Customer' ) ) {
$edd_members_recurring_check = EDD_Recurring_Customer::is_customer_active( $user_id );
$edd_members_rc_active_only = get_post_meta( $post_id, '_edd_members_rc_active_only', true );
$edd_members_rc_all_active_only = edd_get_option( 'edd_members_rc_all_active_only' );
} else {
$edd_members_recurring_check = '';
$edd_members_rc_active_only = '';
$edd_members_rc_all_active_only = '';
}
// By default content is not private
$edd_members_check = false;
// The post author can always see content, or users who can edit the post or have cap 'edd_members_show_all_content'
if( $post_id && ( $post->post_author == $user_id || current_user_can( 'edit_post', $post_id ) || current_user_can( 'edd_members_show_all_content' ) ) ) {
$edd_members_check = false;
}
// Check for feed
elseif ( !edd_members_is_membership_valid() && is_feed() && $edd_members_private_feed ) {
$edd_members_check = true;
}
// Check recurring and post that have been checked private
elseif ( !empty( $edd_members_check_as_private ) && $edd_members_check_as_private && $edd_members_rc_active_only && is_bool( $edd_members_recurring_check ) && !$edd_members_recurring_check && is_main_query() ) {
$edd_members_check = true;
}
// Check recurring for private post types from settings
elseif ( !empty( $edd_members_private_post_type ) && is_singular( array_keys( $edd_members_private_post_type ) ) && $edd_members_rc_all_active_only && is_bool( $edd_members_recurring_check ) && !$edd_members_recurring_check && is_main_query() ) {
$edd_members_check = true;
}
// Check for singular post that have been checked private. @TODO: Should we make is_singular check in here also?
elseif ( !edd_members_is_membership_valid() && !empty( $edd_members_check_as_private ) && $edd_members_check_as_private && is_main_query() ) {
$edd_members_check = true;
}
// Check private post types from settings
elseif ( !edd_members_is_membership_valid() && !empty( $edd_members_private_post_type ) && is_singular( array_keys( $edd_members_private_post_type ) ) && is_main_query() ) {
$edd_members_check = true;
}
return apply_filters( 'edd_members_is_private_content', $edd_members_check );
}
/**
* Add or update expire date to custom user meta when purchasing something on the site.
*
* @since 1.0.0
* @return void
*/
function edd_members_add_expire_date( $payment_id = 0 ) {
// User info
$user_info = edd_get_payment_meta_user_info( $payment_id );
// User ID
$user_id = $user_info['id'];
// Cart details
$downloads = edd_get_payment_meta_cart_details( $payment_id );
if( ! is_array( $downloads ) ) {
return;
}
// Current date
$current_date = current_time( 'timestamp' );
// Get membership lengths in arrays because user might purchase more than one item
$edd_members_membership_lengths = array();
foreach ( $downloads as $download ) {
// Skip if members length is not enabled
if ( ! get_post_meta( $download['id'], '_edd_members_length_enabled', true ) ) {
continue;
}
// Get price id
$price_id = edd_get_cart_item_price_id( $download );
// Add membership_lengths in array
$exp_length = edd_members_get_membership_length( $price_id, $payment_id, $download['id'] ); // TH
if ( $exp_length ) // TH
$edd_members_membership_lengths[] = strtotime( $exp_length, $current_date );
}
// Return if there is no memberships at all in the array.
if ( empty( $edd_members_membership_lengths ) ) {
return;
}
// Pick the max value from membership lengths
$edd_members_membership_length = max( $edd_members_membership_lengths );
// Calculate expire date.
edd_members_calculate_expire_date( $user_id, $edd_members_membership_length );
}
add_action( 'edd_complete_purchase', 'edd_members_add_expire_date' );
/**
* Get membership length from download.
*
* @since 1.0.0
* @return void
*/
function edd_members_get_membership_length( $price_id = 0, $payment_id = 0, $download_id = 0 ) {
// Get expire unit and length
if ( edd_has_variable_prices( $download_id ) ) {
$edd_members_exp_length = edd_members_get_variable_price_length( $download_id, $price_id, 'length' );
$edd_members_exp_unit = edd_members_get_variable_price_length( $download_id, $price_id, 'unit' );
} else {
$edd_members_exp_length = absint( get_post_meta( $download_id, '_edd_members_exp_length', true ) );
$edd_members_exp_unit = esc_attr( get_post_meta( $download_id, '_edd_members_exp_unit', true ) );
}
// Set defaults
if( empty( $edd_members_exp_unit ) ) {
$edd_members_exp_unit = apply_filters( 'edd_members_exp_unit_default', 'days' );
}
if( empty( $edd_members_exp_length ) ) {
$edd_members_exp_length = apply_filters( 'edd_members_exp_length_default', '0' );
}
// Set expiration
$expiration = '+' . $edd_members_exp_length . ' ' . $edd_members_exp_unit;
// TH
if ( ! $edd_members_exp_length || 0 >= absint( $edd_members_exp_length ) )
$expiration = false;
return apply_filters( 'edd_members_membership_length', $expiration, $payment_id, $download_id, $price_id );
}
/**
* Get user expire date in Unix time format.
*
* @since 1.1.5
* @return void
*/
function edd_members_calculate_expire_date( $user_id, $edd_members_membership_length ) {
// Get current expire date
$expire_date = get_user_option( '_edd_members_expiration_date', $user_id );
/**
* If expire_date returns false (this means new user), add membership length = current_date + support_time.
* Else there is expire date already.
*/
if ( false !== $expire_date ) {
$expire_date = $edd_members_membership_length;
}
else {
// if expire_date < current_date, add current_date + support_time
if ( $expire_date < strtotime( $current_date ) ) {
$expire_date = $edd_members_membership_length;
}
else {
// If future_date < expire_date, don't add anything
if ( $edd_members_membership_length < $expire_date ) {
$expire_date = $expire_date;
}
else {
$expire_date = $edd_members_membership_length;
}
}
}
// Set membership expiration date
edd_members_set_membership_expiration( $user_id, $expire_date );
}
/**
* Set membership length to user meta.
*
* $expiration should be a valid time stamp.
*
* @since 1.0.0
* @return void
*/
function edd_members_set_membership_expiration( $user_id, $expiration ) {
// Pre action hook.
do_action( 'edd_members_pre_set_expiration', $user_id, $expiration );
// This will add blog prefix in multisite.
if ( is_multisite() ) {
update_user_option( $user_id, '_edd_members_expiration_date', $expiration );
}
// Leave old method for non multisite, for filtering users by expire date and for email reminders.
update_user_meta( $user_id, '_edd_members_expiration_date', $expiration );
// Post action hook.
do_action( 'edd_members_post_set_expiration', $user_id, $expiration );
}
/**
* Get user expire date in Unix time format.
*
* @since 1.0.0
* @return void
*/
function edd_members_get_unix_expire_date( $user_id = 0 ) {
// Get current user id if it's not set from function call
if ( empty( $user_id ) && is_user_logged_in() ) {
$user_id = get_current_user_id();
}
// Get expire date
$expire_date = get_user_option( '_edd_members_expiration_date', $user_id );
return $expire_date;
}
/**
* Get user expire date in readable format.
*
* @since 1.0.0
* @return void
*/
function edd_members_get_expire_date( $user_id = 0, $show_time = true ) {
// Get expire date
$expire_date = edd_members_get_unix_expire_date( $user_id );
// Return expire_date if there is one
if ( !empty( $expire_date ) ) {
$edd_members_expire_date = date_i18n( get_option( 'date_format' ), $expire_date );
if( $show_time ) {
$edd_members_expire_date .= ' ' . _x( 'at', 'word between date and time', 'edd-members' ) . ' ';
$edd_members_expire_date .= date_i18n( get_option( 'time_format' ), $expire_date );
}
} else {
$edd_members_expire_date = __( 'Unknown', 'edd-members' );
}
return $edd_members_expire_date;
}
/**
* Check if current user membership have expired or not.
*
* @since 1.0.0
* @return boolean
*/
function edd_members_is_membership_valid( $user_id = 0 ) {
$check_membership = false;
if( !is_user_logged_in() ) {
return $check_membership;
}
// Get current user id
if( empty( $user_id ) ) {
$user_id = get_current_user_id();
}
// Current date
$current_date = current_time( 'timestamp' );
// Get expire date
$expire_date = get_user_option( '_edd_members_expiration_date', $user_id );
// Check if user expire date >= current date
if ( !empty( $expire_date ) && $expire_date >= $current_date ) {
$check_membership = true;
}
return apply_filters( 'edd_members_is_membership_valid', $check_membership );
}
/**
* Get membership length and unit for variable prices.
*
* @since 1.0.0
* @return string
*/
function edd_members_get_variable_price_length( $download_id = 0, $price_id = null, $type = null ) {
$prices = edd_get_variable_prices( $download_id );
if ( isset( $prices[ $price_id ][ 'edd_members_length' ] ) && 'length' == $type ) {
return absint( $prices[ $price_id ][ 'edd_members_length' ] );
}
elseif ( isset( $prices[ $price_id ][ 'edd_members_exp_unit' ] ) && 'unit' == $type ) {
return esc_attr( $prices[ $price_id ][ 'edd_members_exp_unit' ] );
}
return false;
}
/**
* Get user info from user email.
*
* @since 1.0.0
* @return void
*/
function edd_members_get_user_info_by_email( $user_email = null, $type = null ) {
if( is_null( $type ) || empty( $type ) ) {
return false;
}
// User info by email
$user = get_user_by( 'email', $user_email );
// User info
$user_info = $user->$type;
return $user_info;
}
/**
* Returns a list of all public post types.
*
* @since 1.0.0
* @return array $edd_members_public_post_types_array All the public post types
*/
function edd_members_get_public_post_types() {
// Get public post types in array
$edd_members_public_post_types = array_values( get_post_types( array( 'public' => true ) ) );
$edd_members_public_post_types_array = array();
foreach ( $edd_members_public_post_types as $edd_members_public_post_type ) {
$post_type_object = get_post_type_object( $edd_members_public_post_type );
$slug = $post_type_object->name;
$label = $post_type_object->labels->name;
$edd_members_public_post_types_array[$slug] = $label;
}
return apply_filters( 'edd_members_public_post_types', $edd_members_public_post_types_array );
}
/**
* Adds our templates dir to the EDD template stack.
*
* @since 1.0.0
* @return array $paths Directories of EDD template stack
*/
function edd_members_add_template_stack( $paths ) {
$paths[ 66 ] = EDD_MEMBERS_DIR . 'templates/';
return $paths;
}
add_filter( 'edd_template_paths', 'edd_members_add_template_stack' );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment