/**
 * Handle each of our LearnDash triggers
 *
 * @since 1.0.0
 */
function badgeos_learndash_trigger_event()
{
    // Setup all our important variables
    global $blog_id, $wpdb;
    // Setup args
    $args = func_get_args();
    $userID = get_current_user_id();
    if (is_array($args) && isset($args['user'])) {
        if (is_object($args['user'])) {
            $userID = (int) $args['user']->ID;
        } else {
            $userID = (int) $args['user'];
        }
    }
    if (empty($userID)) {
        return;
    }
    $user_data = get_user_by('id', $userID);
    if (empty($user_data)) {
        return;
    }
    // Grab the current trigger
    $this_trigger = current_filter();
    // Update hook count for this user
    $new_count = badgeos_update_user_trigger_count($userID, $this_trigger, $blog_id);
    // Mark the count in the log entry
    badgeos_post_log_entry(null, $userID, null, sprintf(__('%1$s triggered %2$s (%3$dx)', 'badgeos'), $user_data->user_login, $this_trigger, $new_count));
    // Now determine if any badges are earned based on this trigger event
    $triggered_achievements = $wpdb->get_results($wpdb->prepare("\n\t\tSELECT post_id\n\t\tFROM   {$wpdb->postmeta}\n\t\tWHERE  meta_key = '_badgeos_learndash_trigger'\n\t\t\t\tAND meta_value = %s\n\t\t", $this_trigger));
    foreach ($triggered_achievements as $achievement) {
        badgeos_maybe_award_achievement_to_user($achievement->post_id, $userID, $this_trigger, $blog_id, $args);
    }
}
Ejemplo n.º 2
0
/**
 * Handle each of our activity triggers
 *
 * @since 1.0.0
 * @return mixed
 */
function badgeos_trigger_event()
{
    // Setup all our globals
    global $user_ID, $blog_id, $wpdb;
    $site_id = $blog_id;
    $args = func_get_args();
    // Grab our current trigger
    $this_trigger = current_filter();
    // Grab the user ID
    $user_id = badgeos_trigger_get_user_id($this_trigger, $args);
    $user_data = get_user_by('id', $user_id);
    // Sanity check, if we don't have a user object, bail here
    if (!is_object($user_data)) {
        return $args[0];
    }
    // If the user doesn't satisfy the trigger requirements, bail here
    if (!apply_filters('badgeos_user_deserves_trigger', true, $user_id, $this_trigger, $site_id, $args)) {
        return $args[0];
    }
    // Update hook count for this user
    $new_count = badgeos_update_user_trigger_count($user_id, $this_trigger, $site_id, $args);
    // Mark the count in the log entry
    badgeos_post_log_entry(null, $user_id, null, sprintf(__('%1$s triggered %2$s (%3$dx)', 'badgeos'), $user_data->user_login, $this_trigger, $new_count));
    // Now determine if any badges are earned based on this trigger event
    $triggered_achievements = $wpdb->get_results($wpdb->prepare("\n\t\tSELECT post_id\n\t\tFROM   {$wpdb->postmeta}\n\t\tWHERE  meta_key = '_badgeos_trigger_type'\n\t\t       AND meta_value = %s\n\t\t", $this_trigger));
    foreach ($triggered_achievements as $achievement) {
        badgeos_maybe_award_achievement_to_user($achievement->post_id, $user_id, $this_trigger, $site_id, $args);
    }
    return $args[0];
}
/**
 * Log a user's updated points
 *
 * @since 1.2.0
 * @param integer $user_id        The user ID
 * @param integer $new_points     Points added to the user's total
 * @param integer $total_points   The user's updated total points
 * @param integer $admin_id       An admin ID (if admin-awarded)
 * @param integer $achievement_id The associated achievent ID
 */
function badgeos_log_users_points($user_id, $new_points, $total_points, $admin_id, $achievement_id)
{
    // Setup our user objects
    $user = get_userdata($user_id);
    $admin = get_userdata($admin_id);
    // Alter our log message if this was an admin action
    if ($admin_id) {
        $log_message = sprintf(__('%1$s awarded %2$s %3$s points for a new total of %4$s points', 'badgeos'), $admin->user_login, $user->user_login, number_format($new_points), number_format($total_points));
    } else {
        $log_message = sprintf(__('%1$s earned %2$s points for a new total of %3$s points', 'badgeos'), $user->user_login, number_format($new_points), number_format($total_points));
    }
    // Create a log entry
    $log_entry_id = badgeos_post_log_entry($achievement_id, $user_id, 'points', $log_message);
    // Add relevant meta to our log entry
    update_post_meta($log_entry_id, '_badgeos_awarded_points', $new_points);
    update_post_meta($log_entry_id, '_badgeos_total_user_points', $total_points);
    if ($admin_id) {
        update_post_meta($log_entry_id, '_badgeos_admin_awarded', $admin_id);
    }
}
/**
 * Award an achievement to a user
 *
 * @since  1.0.0
 * @param  integer $achievement_id The given achievement ID to award
 * @param  integer $user_id        The given user's ID
 * @param  string $this_trigger    The trigger
 * @param  integer $site_id        The triggered site id
 * @param  array $args             The triggered args
 * @return mixed                   False on not achievement, void otherwise
 */
function badgeos_award_achievement_to_user($achievement_id = 0, $user_id = 0, $this_trigger = '', $site_id = 0, $args = array())
{
    global $wp_filter, $wp_version;
    // Sanity Check: ensure we're working with an achievement post
    if (!badgeos_is_achievement($achievement_id)) {
        return false;
    }
    // Use the current user ID if none specified
    if ($user_id == 0) {
        $user_id = wp_get_current_user()->ID;
    }
    // Get the current site ID none specified
    if (!$site_id) {
        $site_id = get_current_blog_id();
    }
    // Setup our achievement object
    $achievement_object = badgeos_build_achievement_object($achievement_id);
    // Update user's earned achievements
    badgeos_update_user_achievements(array('user_id' => $user_id, 'new_achievements' => array($achievement_object)));
    // Log the earning of the award
    badgeos_post_log_entry($achievement_id, $user_id);
    // Available hook for unlocking any achievement of this achievement type
    do_action('badgeos_unlock_' . $achievement_object->post_type, $user_id, $achievement_id, $this_trigger, $site_id, $args);
    // Patch for WordPress to support recursive actions, specifically for badgeos_award_achievement
    // Because global iteration is fun, assuming we can get this fixed for WordPress 3.9
    $is_recursed_filter = 'badgeos_award_achievement' == current_filter();
    $current_key = null;
    // Get current position
    if ($is_recursed_filter) {
        $current_key = key($wp_filter['badgeos_award_achievement']);
    }
    // Available hook to do other things with each awarded achievement
    do_action('badgeos_award_achievement', $user_id, $achievement_id, $this_trigger, $site_id, $args);
    if ($is_recursed_filter) {
        reset($wp_filter['badgeos_award_achievement']);
        while (key($wp_filter['badgeos_award_achievement']) !== $current_key) {
            next($wp_filter['badgeos_award_achievement']);
        }
    }
}
/**
 * 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;
}
Ejemplo n.º 6
0
/**
 * Create a log entry for an achievement being sent to Credly.
 *
 * @since  1.3.4
 *
 * @param  integer $user_id        User ID.
 * @param  integer $achievement_id Achievement post ID.
 */
function badgeos_log_user_sent_achievement_to_credly($user_id, $achievement_id)
{
    // Get user data from ID
    $user = get_userdata($user_id);
    // Sanity check, if user doesnt exist, bail
    if (!is_object($user) || is_wp_error($user)) {
        return;
    }
    // Log the action
    $title = sprintf(__('%1$s sent %2$s to Credly', 'badgeos'), $user->user_login, get_the_title($achievement_id));
    badgeos_post_log_entry($achievement_id, $user_id, null, $title);
}
/**
 * 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' => 'quiz', 'badgeos_learndash_quiz_completed_specific' => 'quiz', 'badgeos_learndash_quiz_completed_fail' => 'quiz', 'learndash_lesson_completed' => 'lesson', 'learndash_topic_completed' => 'topic', 'learndash_course_completed' => 'course');
        // Category-specific triggers
        $learndash_category_triggers = array('badgeos_learndash_course_completed_tag');
        // Triggered object ID (used in these hooks, generally 2nd arg)
        $triggered_object_id = 0;
        $arg_data = $args[0];
        if (is_array($arg_data) && isset($learndash_object_triggers[$learndash_trigger]) && isset($arg_data[$learndash_object_triggers[$learndash_trigger]]) && !empty($arg_data[$learndash_object_triggers[$learndash_trigger]])) {
            $triggered_object_id = (int) $arg_data[$learndash_object_triggers[$learndash_trigger]]->ID;
        }
        // Use basic trigger logic if no object set
        if (empty($object_id)) {
            $learndash_triggered = true;
        } elseif ($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 && isset($learndash_object_triggers[$learndash_trigger]) && 'quiz' == $learndash_object_triggers[$learndash_trigger]) {
            // 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;
            }
        }
        if ($learndash_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;
}