<?php add_filter('badgeos_achievement_data_meta_box_fields', function ($fields) { $prefix = "_badgeos_"; $fields[] = array('name' => __('Time limit', 'timelimit-add-on-for-badgeos'), 'desc' => ' ' . __('Number of minutes this badge cannot be earned after it has been awarded. (set to 0 for unlimited).', 'timelimit-add-on-for-badgeos'), 'id' => $prefix . 'time_limit', 'type' => 'text_small', 'std' => '0'); return $fields; }); add_filter('user_deserves_achievement', function ($return, $user_id, $achievement_id) { // If we're not working with a step, bail if ('step' != get_post_type($achievement_id)) { return $return; } // grab the achievement $parent_achievement = badgeos_get_parent_of_achievement($achievement_id); if (!$parent_achievement) { return $return; } $achievement_id = $parent_achievement->ID; $timelimit = absint(get_post_meta($achievement_id, '_badgeos_time_limit', true)); $last_activity = badgeos_achievement_last_user_activity(absint($achievement_id), absint($user_id)); if ($timelimit && $last_activity && time() - $last_activity < $timelimit * 60) { return false; } return $return; }, 15, 3);
/** * 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)); }
/** * Update the user's active achievement meta with each earned achievement * * @since 1.2.0 * * @param integer $user_id The given user's ID * @param integer $achievement_id The given achievement's post ID * @return object The final achievement object */ function badgeos_user_update_active_achievement_on_earnings($user_id, $achievement_id) { // If achievement is a step, update its parent activity if ('step' == get_post_type($achievement_id)) { $parent_achievement = badgeos_get_parent_of_achievement($achievement_id); if ($parent_achievement) { badgeos_user_update_active_achievement($user_id, $parent_achievement->ID); } // Otherwise, drop the earned achievement form the user's active achievement array } else { badgeos_user_delete_active_achievement($user_id, $achievement_id); } }