PluginProbe
GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI / 8.0.2
GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI v8.0.2
8.0.1 8.0.2 8.0.0 7.9.9.7 7.9.9.6 7.9.9.5 7.9.9.4 7.9.9.3 7.9.9.2 7.9.9.1 7.9.9 7.9.8 7.9.7 7.9.6 7.9.5 7.9.4 7.9.3 7.9.2 7.9.1 7.9.0 7.8.9 7.8.8 7.8.7 7.8.6 7.8.5 All 44 releases
gamipress / integrations / learndash / includes / rules-engine.php

rules-engine.php in GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI 8.0.2, at integrations/learndash/includes/rules-engine.php

176 lines 6.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Rules Engine
4 *
5 * @package GamiPress\LearnDash\Rules_Engine
6 * @since 1.0.0
7 */
8 // Exit if accessed directly
9 if( !defined( 'ABSPATH' ) ) exit;
10
11 /**
12 * Checks if given requirement meets the requirements of triggered event
13 *
14 * @since 1.2.5
15 *
16 * @param int $requirement_id
17 * @param string $trigger
18 * @param array $args
19 *
20 * @return bool
21 */
22 function gamipress_ld_check_if_meets_requirements( $requirement_id, $trigger, $args ) {
23
24 // Initialize the return value
25 $return = true;
26
27 // If is minimum score trigger, rules engine needs to check the minimum score
28 if( $trigger === 'gamipress_ld_complete_quiz_grade'
29 || $trigger === 'gamipress_ld_complete_specific_quiz_grade'
30 || $trigger === 'gamipress_ld_complete_quiz_specific_course_grade'
31 || $trigger === 'gamipress_ld_complete_quiz_course_category_grade'
32 || $trigger === 'gamipress_ld_complete_quiz_course_tag_grade'
33 || $trigger === 'gamipress_ld_complete_quiz_category_grade'
34 || $trigger === 'gamipress_ld_complete_quiz_tag_grade' ) {
35
36 $score = absint( $args[3] );
37
38 $required_score = absint( get_post_meta( $requirement_id, '_gamipress_ld_score', true ) );
39
40 // True if there is score is bigger than required score
41 $return = (bool) ( $score >= $required_score );
42
43 }
44
45 // If is maximum score trigger, rules engine needs to check the maximum score
46 if( $trigger === 'gamipress_ld_complete_quiz_max_grade'
47 || $trigger === 'gamipress_ld_complete_specific_quiz_max_grade'
48 || $trigger === 'gamipress_ld_complete_quiz_specific_course_max_grade'
49 || $trigger === 'gamipress_ld_complete_quiz_course_category_max_grade'
50 || $trigger === 'gamipress_ld_complete_quiz_course_tag_max_grade'
51 || $trigger === 'gamipress_ld_complete_quiz_category_max_grade'
52 || $trigger === 'gamipress_ld_complete_quiz_tag_max_grade' ) {
53
54 $score = absint( $args[3] );
55
56 $required_score = absint( get_post_meta( $requirement_id, '_gamipress_ld_score', true ) );
57
58 // True if there is score is lower than required score
59 $return = (bool) ( $score <= $required_score );
60
61 }
62
63 // If is between score trigger, rules engine needs to check the minimum and maximum score allowed
64 if( $trigger === 'gamipress_ld_complete_quiz_between_grade'
65 || $trigger === 'gamipress_ld_complete_specific_quiz_between_grade'
66 || $trigger === 'gamipress_ld_complete_quiz_specific_course_between_grade'
67 || $trigger === 'gamipress_ld_complete_quiz_course_category_between_grade'
68 || $trigger === 'gamipress_ld_complete_quiz_course_tag_between_grade'
69 || $trigger === 'gamipress_ld_complete_quiz_category_between_grade'
70 || $trigger === 'gamipress_ld_complete_quiz_tag_between_grade' ) {
71
72 $score = absint( $args[3] );
73
74 $min_score = absint( get_post_meta( $requirement_id, '_gamipress_ld_min_score', true ) );
75 $max_score = absint( get_post_meta( $requirement_id, '_gamipress_ld_max_score', true ) );
76
77 // True if there is score is bigger than min score and lower than max score
78 $return = (bool) ( $score >= $min_score && $score <= $max_score );
79
80 }
81
82 // If everything done, check if there is a specific term
83 if ( $return ) {
84
85 // Check if trigger requires a specific term
86 $terms_ids_index = gamipress_ld_get_terms_ids_index( $trigger );
87
88 if( $terms_ids_index !== -1 ) {
89 // Add the terms IDs from $args
90 $terms_ids = $args[$terms_ids_index];
91
92 // If terms IDs exists, then check them against the requirement term ID
93 if( is_array( $terms_ids ) && count( $terms_ids ) > 0 ) {
94 $element = gamipress_ld_get_term_element( $trigger );
95 $taxonomy = gamipress_ld_get_term_taxonomy( $trigger );
96
97 $required_term_id = absint( get_post_meta( $requirement_id, '_gamipress_ld_' . $element . '_' . $taxonomy . '_id', true ) );
98
99 // Turn all IDs into integers
100 $terms_ids = array_map( 'absint', $terms_ids );
101
102 // True if required term id is in the terms ids passed
103 $return = in_array( $required_term_id, $terms_ids );
104 }
105
106 }
107
108 }
109
110 return $return;
111
112 }
113
114 /**
115 * Filter triggered requirements to reduce the number of requirements to check by the awards engine
116 *
117 * @since 1.2.5
118 *
119 * @param array $triggered_requirements
120 * @param integer $user_id
121 * @param string $trigger
122 * @param integer $site_id
123 * @param array $args
124 *
125 * @return array
126 */
127 function gamipress_ld_filter_triggered_requirements( $triggered_requirements, $user_id, $trigger, $site_id, $args ) {
128
129 $new_requirements = array();
130
131 foreach( $triggered_requirements as $i => $requirement ) {
132
133 // Skip item
134 if( ! gamipress_ld_check_if_meets_requirements( $requirement->ID, $trigger, $args ) ) {
135 continue;
136 }
137
138 // Keep the requirement on the list of requirements to check by the awards engine
139 $new_requirements[] = $requirement;
140
141 }
142
143 return $new_requirements;
144
145 }
146 add_filter( 'gamipress_get_triggered_requirements', 'gamipress_ld_filter_triggered_requirements', 20, 5 );
147
148 /**
149 * Checks if a user is allowed to work on a given requirement related to a minimum of score
150 *
151 * @since 1.0.0
152 *
153 * @param bool $return The default return value
154 * @param int $user_id The given user's ID
155 * @param int $requirement_id The given requirement's post ID
156 * @param string $trigger The trigger triggered
157 * @param int $site_id The site id
158 * @param array $args Arguments of this trigger
159 *
160 * @return bool True if user has access to the requirement, false otherwise
161 */
162 function gamipress_ld_user_has_access_to_achievement( $return = false, $user_id = 0, $requirement_id = 0, $trigger = '', $site_id = 0, $args = array() ) {
163
164 // If we're not working with a requirement, bail here
165 if ( ! in_array( get_post_type( $requirement_id ), gamipress_get_requirement_types_slugs() ) )
166 return $return;
167
168 // Check if user has access to the achievement ($return will be false if user has exceed the limit or achievement is not published yet)
169 if( ! $return )
170 return $return;
171
172 // Send back our eligibility
173 return gamipress_ld_check_if_meets_requirements( $requirement_id, $trigger, $args );
174
175 }
176 add_filter( 'user_has_access_to_achievement', 'gamipress_ld_user_has_access_to_achievement', 10, 6 );