Advertisement
codelion

rules-engine.php

Sep 9th, 2014
529
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.01 KB | None | 0 0
  1. <?php
  2. /**
  3. * Custom Achievement Rules
  4. *
  5. * @package BadgeOS LearnDash
  6. * @subpackage Achievements
  7. * @author Credly, LLC
  8. * @license http://www.gnu.org/licenses/agpl.txt GNU AGPL v3.0
  9. * @link https://credly.com
  10. */
  11.  
  12. /**
  13. * Load up our LearnDash triggers so we can add actions to them
  14. *
  15. * @since 1.0.0
  16. */
  17. function badgeos_learndash_load_triggers() {
  18.  
  19. // Grab our LearnDash triggers
  20. $learndash_triggers = $GLOBALS[ 'badgeos_learndash' ]->triggers;
  21.  
  22. if ( !empty( $learndash_triggers ) ) {
  23. foreach ( $learndash_triggers as $trigger => $trigger_label ) {
  24. if ( is_array( $trigger_label ) ) {
  25. $triggers = $trigger_label;
  26.  
  27. foreach ( $triggers as $trigger_hook => $trigger_name ) {
  28. add_action( $trigger_hook, 'badgeos_learndash_trigger_event', 10, 20 );
  29. }
  30. }
  31. else {
  32. add_action( $trigger, 'badgeos_learndash_trigger_event', 10, 20 );
  33. }
  34. }
  35. }
  36.  
  37. }
  38.  
  39. add_action( 'init', 'badgeos_learndash_load_triggers' );
  40.  
  41. /**
  42. * Handle each of our LearnDash triggers
  43. *
  44. * @since 1.0.0
  45. */
  46. function badgeos_learndash_trigger_event() {
  47.  
  48. // Setup all our important variables
  49. global $blog_id, $wpdb;
  50.  
  51. // Setup args
  52. $args = func_get_args();
  53.  
  54. $userID = get_current_user_id();
  55.  
  56. if ( is_array( $args ) && isset( $args[ 'user' ] ) ) {
  57. if ( is_object( $args[ 'user' ] ) ) {
  58. $userID = (int) $args[ 'user' ]->ID;
  59. }
  60. else {
  61. $userID = (int) $args[ 'user' ];
  62. }
  63. }
  64.  
  65. if ( empty( $userID ) ) {
  66. return;
  67. }
  68.  
  69. $user_data = get_user_by( 'id', $userID );
  70.  
  71. if ( empty( $user_data ) ) {
  72. return;
  73. }
  74.  
  75. // Grab the current trigger
  76. $this_trigger = current_filter();
  77.  
  78. // Update hook count for this user
  79. $new_count = badgeos_update_user_trigger_count( $userID, $this_trigger, $blog_id );
  80.  
  81. // Mark the count in the log entry
  82. badgeos_post_log_entry( null, $userID, null, sprintf( __( '%1$s triggered %2$s (%3$dx)', 'badgeos' ), $user_data->user_login, $this_trigger, $new_count ) );
  83.  
  84. // Now determine if any badges are earned based on this trigger event
  85. $triggered_achievements = $wpdb->get_results( $wpdb->prepare( "
  86. SELECT post_id
  87. FROM $wpdb->postmeta
  88. WHERE meta_key = '_badgeos_learndash_trigger'
  89. AND meta_value = %s
  90. ", $this_trigger ) );
  91.  
  92. foreach ( $triggered_achievements as $achievement ) {
  93. badgeos_maybe_award_achievement_to_user( $achievement->post_id, $userID, $this_trigger, $blog_id, $args );
  94. }
  95. }
  96.  
  97. /**
  98. * Check if user deserves a LearnDash trigger step
  99. *
  100. * @since 1.0.0
  101. *
  102. * @param bool $return Whether or not the user deserves the step
  103. * @param integer $user_id The given user's ID
  104. * @param integer $achievement_id The given achievement's post ID
  105. * @param string $trigger The trigger
  106. * @param integer $site_id The triggered site id
  107. * @param array $args The triggered args
  108. *
  109. * @return bool True if the user deserves the step, false otherwise
  110. */
  111. function badgeos_learndash_user_deserves_learndash_step( $return, $user_id, $achievement_id, $this_trigger = '', $site_id = 1, $args = array() ) {
  112.  
  113. // If we're not dealing with a step, bail here
  114. if ( 'step' != get_post_type( $achievement_id ) ) {
  115. return $return;
  116. }
  117.  
  118. // Grab our step requirements
  119. $requirements = badgeos_get_step_requirements( $achievement_id );
  120.  
  121. // If the step is triggered by LearnDash actions...
  122. if ( 'learndash_trigger' == $requirements[ 'trigger_type' ] ) {
  123. // Do not pass go until we say you can
  124. $return = false;
  125.  
  126. // Unsupported trigger
  127. if ( !isset( $GLOBALS[ 'badgeos_learndash' ]->triggers[ $this_trigger ] ) ) {
  128. return $return;
  129. }
  130.  
  131. // LearnDash requirements not met yet
  132. $learndash_triggered = false;
  133.  
  134. // Set our main vars
  135. $learndash_trigger = $requirements[ 'learndash_trigger' ];
  136. $object_id = $requirements[ 'learndash_object_id' ];
  137.  
  138. // Extra arg handling for further expansion
  139. $object_arg1 = null;
  140.  
  141. if ( isset( $requirements[ 'learndash_object_arg1' ] ) )
  142. $object_arg1 = $requirements[ 'learndash_object_arg1' ];
  143.  
  144. // Object-specific triggers
  145. $learndash_object_triggers = array(
  146. 'learndash_quiz_completed',
  147. 'badgeos_learndash_quiz_completed_specific',
  148. 'badgeos_learndash_quiz_completed_fail',
  149. 'learndash_lesson_completed',
  150. 'learndash_course_completed',
  151. 'learndash_topic_completed'
  152. );
  153.  
  154. // Category-specific triggers
  155. $learndash_category_triggers = array(
  156. 'badgeos_learndash_course_completed_tag'
  157. );
  158.  
  159. // Quiz-specific triggers
  160. $learndash_quiz_triggers = array(
  161. 'learndash_quiz_completed',
  162. 'badgeos_learndash_quiz_completed_specific',
  163. 'badgeos_learndash_quiz_completed_fail'
  164. );
  165.  
  166. // Triggered object ID (used in these hooks, generally 2nd arg)
  167. $triggered_object_id = 0;
  168.  
  169. $arg_data = $args[ 0 ];
  170.  
  171. if ( is_array( $arg_data ) ) {
  172. if ( isset( $arg_data[ 'quiz' ] ) ) {
  173. $triggered_object_id = (int) $arg_data[ 'quiz' ]->ID;
  174. }
  175. elseif ( isset( $arg_data[ 'lesson' ] ) ) {
  176. $triggered_object_id = (int) $arg_data[ 'lesson' ]->ID;
  177. }
  178. elseif ( isset( $arg_data[ 'course' ] ) ) {
  179. $triggered_object_id = (int) $arg_data[ 'course' ]->ID;
  180. }
  181. }
  182.  
  183. // Use basic trigger logic if no object set
  184. if ( empty( $object_id ) ) {
  185. $learndash_triggered = true;
  186. }
  187. // Object specific
  188. elseif ( in_array( $learndash_trigger, $learndash_object_triggers ) && $triggered_object_id == $object_id ) {
  189. $learndash_triggered = true;
  190.  
  191. // Forcing count due to BadgeOS bug tracking triggers properly
  192. $requirements[ 'count' ] = 1;
  193. }
  194. // Category specific
  195. elseif ( in_array( $learndash_trigger, $learndash_category_triggers ) && has_term( $object_id, 'post_tag', $triggered_object_id ) ) {
  196. $learndash_triggered = true;
  197.  
  198. // Forcing count due to BadgeOS bug tracking triggers properly
  199. $requirements[ 'count' ] = 1;
  200. }
  201.  
  202. // Quiz triggers
  203. if ( $learndash_triggered && in_array( $learndash_trigger, $learndash_quiz_triggers ) ) {
  204. // Check for fail
  205. if ( 'badgeos_learndash_quiz_completed_fail' == $learndash_trigger ) {
  206. if ( $arg_data[ 'pass' ] ) {
  207. $learndash_triggered = false;
  208. }
  209. }
  210. // Check for a specific grade
  211. elseif ( 'badgeos_learndash_quiz_completed_specific' == $learndash_trigger ) {
  212. $percentage = (int) $arg_data[ 'percentage' ];
  213. $object_arg1 = (int) $object_arg1;
  214.  
  215. if ( $percentage < $object_arg1 ) {
  216. $learndash_triggered = false;
  217. }
  218. }
  219. // Check for passing
  220. elseif ( !$arg_data[ 'pass' ] ) {
  221. $learndash_triggered = false;
  222. }
  223. }
  224.  
  225. // LearnDash requirements met
  226. if ( $learndash_triggered ) {
  227. // Grab the trigger count
  228. $trigger_count = badgeos_get_user_trigger_count( $user_id, $this_trigger, $site_id );
  229.  
  230. // If we meet or exceed the required number of checkins, they deserve the step
  231. if ( 1 == $requirements[ 'count' ] || $requirements[ 'count' ] <= $trigger_count ) {
  232. // OK, you can pass go now
  233. $return = true;
  234. }
  235. }
  236. }
  237.  
  238. return $return;
  239. }
  240.  
  241. add_filter( 'user_deserves_achievement', 'badgeos_learndash_user_deserves_learndash_step', 15, 6 );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement