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