PluginProbe
GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI / 8.0.5
GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI v8.0.5
8.0.5 8.0.4 8.0.3 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 All 47 releases
← All changes | integrations/learndash/includes/rules-engine.php +176 -0 7.9.3 → 8.0.5 View file →
@@ -1,0 +1,176 @@
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 );