/** * Filter step titles to link to LearnDash objects * * @since 1.0.0 * * @param string $title Our step title * @param object $step Our step's post object * * @return string Our potentially updated title */ function badgeos_gravityforms_step_link_title_to_object($title = '', $step = null) { // Can't link a link, bro if (false !== strpos($title, '<a ')) { return $title; } // Grab our step requirements $requirements = badgeos_get_step_requirements($step->ID); // If the step is triggered by Gravity Forms actions... if ('gravityforms_trigger' == $requirements['trigger_type']) { $url = ''; // Set our main vars $trigger = $requirements['gravityforms_trigger']; $object_id = $requirements['gravityforms_object_id']; // Object-specific triggers $object_triggers = array('gform_after_submission' => 'gravityforms-entry'); // // Category-specific triggers // $category_triggers = array( // 'badgeos_gravityforms_course_completed_tag' => 'post_tag' // ); // Object specific if (isset($object_triggers[$trigger])) { if (!empty($object_id)) { $url = get_permalink($object_id); } else { $url = get_post_type_archive_link($object_triggers[$trigger]); } } elseif (isset($category_triggers[$trigger])) { if (!empty($object_id)) { $url = get_term_link($object_id); } /* LOL JK there is no taxonomy archive else { $url = get_taxonomy_archive_link( $object_triggers[ $trigger ] ); }*/ } // If we have a URL, update the title to link to it if (!empty($url)) { $title = '<a href="' . esc_url($url) . '">' . $title . '</a>'; } } return $title; }
/** * Filter step titles to link to LearnDash objects * * @since 1.0.0 * * @param string $title Our step title * @param object $step Our step's post object * * @return string Our potentially updated title */ function badgeos_learndash_step_link_title_to_object($title = '', $step = null) { // Can't link a link, bro if (false !== strpos($title, '<a ')) { return $title; } // Grab our step requirements $requirements = badgeos_get_step_requirements($step->ID); // If the step is triggered by LearnDash actions... if ('learndash_trigger' == $requirements['trigger_type']) { $url = ''; // Set our main vars $trigger = $requirements['learndash_trigger']; $object_id = $requirements['learndash_object_id']; // Object-specific triggers $object_triggers = array('learndash_quiz_completed' => 'sfwd-quiz', 'badgeos_learndash_quiz_completed_specific' => 'sfwd-quiz', 'badgeos_learndash_quiz_completed_fail' => 'sfwd-quiz', 'learndash_lesson_completed' => 'sfwd-lessons', 'learndash_topic_completed' => 'sfwd-topic', 'learndash_course_completed' => 'sfwd-courses'); // Category-specific triggers $category_triggers = array('badgeos_learndash_course_completed_tag' => 'post_tag'); // Object specific if (isset($object_triggers[$trigger])) { if (!empty($object_id)) { $url = get_permalink($object_id); } else { $url = get_post_type_archive_link($object_triggers[$trigger]); } } elseif (isset($category_triggers[$trigger])) { if (!empty($object_id)) { $url = get_term_link($object_id); } /* LOL JK there is no taxonomy archive else { $url = get_taxonomy_archive_link( $object_triggers[ $trigger ] ); }*/ } // If we have a URL, update the title to link to it if (!empty($url)) { $title = '<a href="' . esc_url($url) . '">' . $title . '</a>'; } } return $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', '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; }
/** * Filter our step titles to link to achievements and achievement type archives * * @since 1.0.0 * @param string $title Our step title * @param object $step Our step's post object * @return string Our potentially udated title */ function badgeos_step_link_title_to_achievement($title = '', $step = null) { // Grab our step requirements $step_requirements = badgeos_get_step_requirements($step->ID); // Setup a URL to link to a specific achievement or an achievement type if (!empty($step_requirements['achievement_post'])) { $url = get_permalink($step_requirements['achievement_post']); } // elseif ( ! empty( $step_requirements['achievement_type'] ) ) // $url = get_post_type_archive_link( $step_requirements['achievement_type'] ); // If we have a URL, update the title to link to it if (isset($url) && !empty($url)) { $title = '<a href="' . esc_url($url) . '">' . $title . '</a>'; } return $title; }
/** * 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)); }
/** * 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; }
/** * AJAX helper for getting our posts and returning select options * * @since 1.0.0 * @return void */ function badgeos_activity_trigger_post_select_ajax_handler() { // Grab our achievement type from the AJAX request $achievement_type = $_REQUEST['achievement_type']; $exclude_posts = (array) $_REQUEST['excluded_posts']; $requirements = badgeos_get_step_requirements($_REQUEST['step_id']); // If we don't have an achievement type, bail now if (empty($achievement_type)) { die; } // Grab all our posts for this achievement type $achievements = get_posts(array('post_type' => $achievement_type, 'post__not_in' => $exclude_posts, 'posts_per_page' => -1, 'orderby' => 'title', 'order' => 'ASC')); // Setup our output $output = '<option></option>'; foreach ($achievements as $achievement) { $output .= '<option value="' . $achievement->ID . '" ' . selected($requirements['achievement_post'], $achievement->ID, false) . '>' . $achievement->post_title . '</option>'; } // Send back our results and die like a man echo $output; die; }