コード例 #1
0
/**
 * Check if user deserves a LearnDash trigger step
 *
 * @since  1.0.0
 *
 * @param  bool $return         Whether or not the user deserves the step
 * @param  integer $user_id        The given user's ID
 * @param  integer $achievement_id The given achievement's post ID
 * @param  string $trigger        The trigger
 * @param  integer $site_id        The triggered site id
 * @param  array $args        The triggered args
 *
 * @return bool                    True if the user deserves the step, false otherwise
 */
function badgeos_learndash_user_deserves_learndash_step($return, $user_id, $achievement_id, $this_trigger = '', $site_id = 1, $args = array())
{
    // If we're not dealing with a step, bail here
    if ('step' != get_post_type($achievement_id)) {
        return $return;
    }
    // Grab our step requirements
    $requirements = badgeos_get_step_requirements($achievement_id);
    // If the step is triggered by LearnDash actions...
    if ('learndash_trigger' == $requirements['trigger_type']) {
        // Do not pass go until we say you can
        $return = false;
        // Unsupported trigger
        if (!isset($GLOBALS['badgeos_learndash']->triggers[$this_trigger])) {
            return $return;
        }
        // LearnDash requirements not met yet
        $learndash_triggered = false;
        // Set our main vars
        $learndash_trigger = $requirements['learndash_trigger'];
        $object_id = $requirements['learndash_object_id'];
        // Extra arg handling for further expansion
        $object_arg1 = null;
        if (isset($requirements['learndash_object_arg1'])) {
            $object_arg1 = $requirements['learndash_object_arg1'];
        }
        // Object-specific triggers
        $learndash_object_triggers = array('learndash_quiz_completed', 'badgeos_learndash_quiz_completed_specific', 'badgeos_learndash_quiz_completed_fail', 'learndash_lesson_completed', 'learndash_course_completed');
        // Category-specific triggers
        $learndash_category_triggers = array('badgeos_learndash_course_completed_tag');
        // Quiz-specific triggers
        $learndash_quiz_triggers = array('learndash_quiz_completed', 'badgeos_learndash_quiz_completed_specific', 'badgeos_learndash_quiz_completed_fail');
        // Triggered object ID (used in these hooks, generally 2nd arg)
        $triggered_object_id = 0;
        $arg_data = $args[0];
        if (is_array($arg_data)) {
            if (isset($arg_data['quiz'])) {
                $triggered_object_id = (int) $arg_data['quiz']->ID;
            } elseif (isset($arg_data['lesson'])) {
                $triggered_object_id = (int) $arg_data['lesson']->ID;
            } elseif (isset($arg_data['course'])) {
                $triggered_object_id = (int) $arg_data['course']->ID;
            }
        }
        // Use basic trigger logic if no object set
        if (empty($object_id)) {
            $learndash_triggered = true;
        } elseif (in_array($learndash_trigger, $learndash_object_triggers) && $triggered_object_id == $object_id) {
            $learndash_triggered = true;
            // Forcing count due to BadgeOS bug tracking triggers properly
            $requirements['count'] = 1;
        } elseif (in_array($learndash_trigger, $learndash_category_triggers) && has_term($object_id, 'post_tag', $triggered_object_id)) {
            $learndash_triggered = true;
            // Forcing count due to BadgeOS bug tracking triggers properly
            $requirements['count'] = 1;
        }
        // Quiz triggers
        if ($learndash_triggered && in_array($learndash_trigger, $learndash_quiz_triggers)) {
            // Check for fail
            if ('badgeos_learndash_quiz_completed_fail' == $learndash_trigger) {
                if ($arg_data['pass']) {
                    $learndash_triggered = false;
                }
            } elseif ('badgeos_learndash_quiz_completed_specific' == $learndash_trigger) {
                $percentage = (int) $arg_data['percentage'];
                $object_arg1 = (int) $object_arg1;
                if ($percentage < $object_arg1) {
                    $learndash_triggered = false;
                }
            } elseif (!$arg_data['pass']) {
                $learndash_triggered = false;
            }
        }
        // LearnDash requirements met
        if ($learndash_triggered) {
            // Grab the trigger count
            $trigger_count = badgeos_get_user_trigger_count($user_id, $this_trigger, $site_id);
            // If we meet or exceed the required number of checkins, they deserve the step
            if (1 == $requirements['count'] || $requirements['count'] <= $trigger_count) {
                // OK, you can pass go now
                $return = true;
            }
        }
    }
    return $return;
}
コード例 #2
0
/**
 * Count a user's relevant actions for a given step
 *
 * @since  1.0.0
 * @param  integer $user_id The given user's ID
 * @param  integer $step_id The given step's ID
 * @return integer          The total activity count
 */
function badgeos_get_step_activity_count($user_id = 0, $step_id = 0)
{
    // Assume the user has no relevant activities
    $activities = array();
    // Grab the requirements for this step
    $step_requirements = badgeos_get_step_requirements($step_id);
    // Determine which type of trigger we're using and return the corresponding activities
    switch ($step_requirements['trigger_type']) {
        case 'specific-achievement':
            // Get our parent achievement
            $parent_achievement = badgeos_get_parent_of_achievement($step_id);
            // If the user has any interaction with this achievement, only get activity since that date
            if ($parent_achievement && ($date = badgeos_achievement_last_user_activity($parent_achievement->ID, $user_id))) {
                $since = $date;
            } else {
                $since = 0;
            }
            // Get our achievement activity
            $achievements = badgeos_get_user_achievements(array('user_id' => absint($user_id), 'achievement_id' => absint($step_requirements['achievement_post']), 'since' => $since));
            $activities = count($achievements);
            break;
        case 'any-achievement':
            $activities = badgeos_get_user_trigger_count($user_id, 'badgeos_unlock_' . $step_requirements['achievement_type']);
            break;
        case 'all-achievements':
            $activities = badgeos_get_user_trigger_count($user_id, 'badgeos_unlock_all_' . $step_requirements['achievement_type']);
            break;
        default:
            $activities = badgeos_get_user_trigger_count($user_id, $step_requirements['trigger_type']);
            break;
    }
    // Available filter for overriding user activity
    return absint(apply_filters('badgeos_step_activity', $activities, $user_id, $step_id));
}
コード例 #3
0
/**
 * Update the user's trigger count for a given trigger by 1
 *
 * @since  1.0.0
 * @param  integer $user_id The given user's ID
 * @param  string  $trigger The trigger we're updating
 * @param  integer $site_id The desired Site ID to update
 * @param  array $args        The triggered args
 * @return integer          The updated trigger count
 */
function badgeos_update_user_trigger_count($user_id, $trigger, $site_id = 0, $args = array())
{
    // Set to current site id
    if (!$site_id) {
        $site_id = get_current_blog_id();
    }
    // Grab the current count and increase it by 1
    $trigger_count = absint(badgeos_get_user_trigger_count($user_id, $trigger, $site_id, $args));
    $trigger_count += (int) apply_filters('badgeos_update_user_trigger_count', 1, $user_id, $trigger, $site_id, $args);
    // Update the triggers arary with the new count
    $user_triggers = badgeos_get_user_triggers($user_id, false);
    $user_triggers[$site_id][$trigger] = $trigger_count;
    update_user_meta($user_id, '_badgeos_triggered_triggers', $user_triggers);
    // Send back our trigger count for other purposes
    return $trigger_count;
}
コード例 #4
0
/**
 * Check if user deserves a GravityForms trigger step
 *
 * @since  1.0.0
 *
 * @param  bool $return         Whether or not the user deserves the step
 * @param  integer $user_id        The given user's ID
 * @param  integer $achievement_id The given achievement's post ID
 * @param  string $trigger        The trigger
 * @param  integer $site_id        The triggered site id
 * @param  array $args        The triggered args
 *
 * @return bool                    True if the user deserves the step, false otherwise
 */
function badgeos_gravityforms_user_deserves_gravityforms_step($return, $user_id, $achievement_id, $this_trigger = '', $site_id = 1, $args = array())
{
    // If we're not dealing with a step, bail here
    if ('step' != get_post_type($achievement_id)) {
        return $return;
    }
    // Grab our step requirements
    $requirements = badgeos_get_step_requirements($achievement_id);
    // If the step is triggered by GravityForms actions...
    if ('gravityforms_trigger' == $requirements['trigger_type']) {
        // Do not pass go until we say you can
        $return = false;
        // Unsupported trigger
        if (!isset($GLOBALS['badgeos_gravityforms']->triggers[$this_trigger])) {
            return $return;
        }
        // GravityForms requirements not met yet
        $gravityforms_triggered = false;
        // Set our main vars
        $gravityforms_trigger = $requirements['gravityforms_trigger'];
        $object_id = $requirements['gravityforms_object_id'];
        $object_arg1 = null;
        $object_arg2 = null;
        if (isset($requirements['gravityforms_object_arg1'])) {
            $object_arg1 = $requirements['gravityforms_object_arg1'];
        }
        if (isset($requirements['gravityforms_object_arg2'])) {
            $object_arg2 = $requirements['gravityforms_object_arg2'];
        }
        // Object-specific triggers
        $gravityforms_object_triggers = array('gform_after_submission' => 'form_id');
        // Triggered object ID (used in these hooks, generally 2nd arg)
        $triggered_object_id = 0;
        $entry_data = $args[0];
        $form_data = $args[1];
        if (is_array($entry_data) && isset($gravityforms_object_triggers[$gravityforms_trigger]) && isset($entry_data[$gravityforms_object_triggers[$gravityforms_trigger]]) && !empty($entry_data[$gravityforms_object_triggers[$gravityforms_trigger]])) {
            $triggered_object_id = (int) $entry_data[$gravityforms_object_triggers[$gravityforms_trigger]];
        }
        // Use basic trigger logic if no object set
        if (empty($object_id)) {
            $gravityforms_triggered = true;
        } elseif ($triggered_object_id == $object_id) {
            $gravityforms_triggered = true;
            // Forcing count due to BadgeOS bug tracking triggers properly
            $requirements['count'] = 1;
        }
        // Category specific
        // elseif ( in_array( $gravityforms_trigger, $gravityforms_category_triggers ) && has_term( $object_id, 'post_tag', $triggered_object_id ) ) {
        // 	$gravityforms_triggered = true;
        // 	// Forcing count due to BadgeOS bug tracking triggers properly
        // 	$requirements[ 'count' ] = 1;
        // }
        // TODO: Enable user to optionally specify form values that user must select
        //       in order to trigger this achievement
        // && 'form' == $gravityforms_object_triggers[ $gravityforms_trigger ]
        if ($gravityforms_triggered && isset($gravityforms_object_triggers[$gravityforms_trigger])) {
            if ('gform_after_submission' == $gravityforms_trigger && !empty($object_arg1)) {
                $field_id = $object_arg1;
                $field_value = $object_arg2;
                if ($entry_data[$field_id] != $field_value) {
                    $gravityforms_triggered = false;
                }
            }
        }
        // GravityForms requirements met
        if ($gravityforms_triggered) {
            // Grab the trigger count
            $trigger_count = badgeos_get_user_trigger_count($user_id, $this_trigger, $site_id);
            // If we meet or exceed the required number of checkins, they deserve the step
            if (1 == $requirements['count'] || $requirements['count'] <= $trigger_count) {
                // OK, you can pass go now
                $return = true;
            }
        }
        if ($gravityforms_triggered && $return) {
            $user_data = get_userdata($user_id);
            badgeos_post_log_entry(null, $user_id, null, sprintf(__('%1$s deserves %2$s', 'badgeos'), $user_data->user_login, $this_trigger));
        }
    }
    return $return;
}