/** * 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; }
/** * 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 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; }
/** * 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; }