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