PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 2.1.6
Tutor LMS – eLearning and online course solution v2.1.6
3.9.14 3.9.13 3.9.12 3.9.11 trunk 1.0.0 1.0.0-alpha 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.2.0 1.2.1 1.2.11 1.2.12 1.2.13 1.2.20 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9 1.8.0 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.15 1.9.16 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.1.1 2.1.10 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.3.0 2.4.0 2.5.0 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.1.0 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.7.0 3.7.1 3.7.2 3.7.3 3.7.4 3.8.0 3.8.1 3.8.2 3.8.3 3.9.0 3.9.1 3.9.10 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9
tutor / classes / Course_Filter.php
tutor / classes Last commit date
Addons.php 3 years ago Admin.php 3 years ago Ajax.php 3 years ago Announcements.php 3 years ago Assets.php 3 years ago Backend_Page_Trait.php 3 years ago Course.php 3 years ago Course_Embed.php 3 years ago Course_Filter.php 3 years ago Course_List.php 3 years ago Course_Settings_Tabs.php 3 years ago Course_Widget.php 3 years ago Custom_Validation.php 3 years ago Dashboard.php 3 years ago FormHandler.php 3 years ago Frontend.php 3 years ago Gutenberg.php 3 years ago Input.php 3 years ago Instructor.php 3 years ago Instructors_List.php 3 years ago Lesson.php 3 years ago Options_V2.php 3 years ago Post_types.php 3 years ago Private_Course_Access.php 3 years ago Q_and_A.php 3 years ago Question_Answers_List.php 3 years ago Quiz.php 3 years ago Quiz_Attempts_List.php 3 years ago RestAPI.php 3 years ago Reviews.php 3 years ago Rewrite_Rules.php 3 years ago Shortcode.php 3 years ago Student.php 3 years ago Students_List.php 3 years ago Taxonomies.php 3 years ago Template.php 3 years ago Theme_Compatibility.php 3 years ago Tools.php 3 years ago Tools_V2.php 3 years ago Tutor.php 3 years ago TutorEDD.php 3 years ago Tutor_Base.php 3 years ago Tutor_Setup.php 3 years ago Upgrader.php 3 years ago User.php 3 years ago Utils.php 3 years ago Video_Stream.php 3 years ago Withdraw.php 3 years ago Withdraw_Requests_List.php 3 years ago WooCommerce.php 3 years ago
Course_Filter.php
295 lines
1 <?php
2 /**
3 * Manage Course Filter
4 *
5 * @package Tutor
6 * @author Themeum <support@themeum.com>
7 * @link https://themeum.com
8 * @since 1.0.0
9 */
10
11 namespace TUTOR;
12
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit;
15 }
16
17 /**
18 * Course filter class
19 *
20 * @since 1.0.0
21 */
22 class Course_Filter {
23 /**
24 * Course Category
25 *
26 * @var string
27 */
28 private $category = 'course-category';
29 /**
30 * Course Tag
31 *
32 * @var string
33 */
34 private $tag = 'course-tag';
35 /**
36 * Course term id
37 *
38 * @var null|integer
39 */
40 private $current_term_id = null;
41
42 /**
43 * Constructor
44 *
45 * @since 1.0.0
46 *
47 * @param boolean $register_hook register hook or not.
48 * @return void|null
49 */
50 public function __construct( $register_hook = true ) {
51 if ( ! $register_hook ) {
52 return;
53 }
54 add_action( 'wp_ajax_tutor_course_filter_ajax', array( $this, 'load_listing' ), 10, 0 );
55 add_action( 'wp_ajax_nopriv_tutor_course_filter_ajax', array( $this, 'load_listing' ), 10, 0 );
56 }
57
58 /**
59 * Load course listing
60 *
61 * @since 1.0.0
62 *
63 * @param mixed $filters filters.
64 * @param boolean $return_filter return filterd data or not.
65 * @return mixed
66 */
67 public function load_listing( $filters = null, $return_filter = false ) {
68 ! $return_filter ? tutils()->checking_nonce() : 0;
69
70 $sanitized_post = tutor_sanitize_data( null == $filters ? $_POST : $filters ); //phpcs:ignore WordPress.Security.NonceVerification.Missing
71 ! is_array( $sanitized_post ) ? $sanitized_post = array() : 0;
72
73 $default_per_page = tutils()->get_option( 'courses_per_page', 12 );
74 $courses_per_page = (int) tutils()->array_get( 'course_per_page', $sanitized_post, $default_per_page );
75
76 // Pagination arg.
77 $page = max( 1, Input::post( 'current_page', 0, Input::TYPE_INT ) );
78 $sanitized_post['current_page'] = $page;
79
80 // Order arg.
81 $order_by = 'post_date';
82 $order = 'DESC';
83
84 if ( isset( $sanitized_post['course_order'] ) ) {
85 switch ( $sanitized_post['course_order'] ) {
86 case 'newest_first':
87 $order_by = 'post_date';
88 $order = 'DESC';
89 break;
90
91 case 'oldest_first':
92 $order_by = 'post_date';
93 $order = 'ASC';
94 break;
95
96 case 'course_title_az':
97 $order_by = 'post_title';
98 $order = 'ASC';
99 break;
100
101 case 'course_title_za':
102 $order_by = 'post_title';
103 $order = 'DESC';
104 break;
105 }
106 }
107
108 $args = array(
109 'post_status' => 'publish',
110 'post_type' => tutor()->course_post_type,
111 'posts_per_page' => $courses_per_page,
112 'paged' => (int) $page,
113 'orderby' => $order_by,
114 'order' => $order,
115 'tax_query' => array(
116 'relation' => 'OR',
117 ),
118 );
119
120 // Prepare taxonomy.
121 foreach ( array( 'category', 'tag' ) as $taxonomy ) {
122
123 $term_array = tutils()->array_get( 'tutor-course-filter-' . $taxonomy, $sanitized_post, array() );
124 ! is_array( $term_array ) ? $term_array = array( $term_array ) : 0;
125
126 $term_array = array_filter(
127 $term_array,
128 function( $term_id ) {
129 return is_numeric( $term_id );
130 }
131 );
132
133 if ( count( $term_array ) > 0 ) {
134 $tax_query = array(
135 'taxonomy' => $this->$taxonomy,
136 'field' => 'term_id',
137 'terms' => $term_array,
138 'operator' => 'IN',
139 );
140 array_push( $args['tax_query'], $tax_query );
141 }
142 }
143
144 // Prepare level and price type.
145 $is_membership = get_tutor_option( 'monetize_by' ) == 'pmpro' && tutils()->has_pmpro();
146 $level_price = array();
147 foreach ( array( 'level', 'price' ) as $type ) {
148
149 if ( $is_membership && 'price' === $type ) {
150 continue;
151 }
152
153 $type_array = tutils()->array_get( 'tutor-course-filter-' . $type, $sanitized_post, array() );
154 $type_array = array_map( 'sanitize_text_field', ( is_array( $type_array ) ? $type_array : array( $type_array ) ) );
155
156 if ( 'level' == $type && in_array( 'all_levels', $type_array ) ) {
157 continue;
158 }
159
160 if ( count( $type_array ) > 0 ) {
161 $level_price[] = array(
162 'key' => 'level' === $type ? '_tutor_course_level' : '_tutor_course_price_type',
163 'value' => $type_array,
164 'compare' => 'IN',
165 );
166 }
167 }
168 count( $level_price ) ? $args['meta_query'] = $level_price : 0;
169
170 $search_key = sanitize_text_field( tutils()->array_get( 'keyword', $sanitized_post, null ) );
171 $search_key ? $args['s'] = $search_key : 0;
172
173 if ( isset( $sanitized_post['tutor_course_filter'] ) ) {
174 switch ( $sanitized_post['tutor_course_filter'] ) {
175
176 case 'newest_first':
177 $args['orderby'] = 'post_date';
178 $args['order'] = 'desc';
179 break;
180
181 case 'oldest_first':
182 $args['orderby'] = 'post_date';
183 $args['order'] = 'asc';
184 break;
185
186 case 'course_title_az':
187 $args['orderby'] = 'post_title';
188 $args['order'] = 'asc';
189 break;
190
191 case 'course_title_za':
192 $args['orderby'] = 'post_title';
193 $args['order'] = 'desc';
194 break;
195 }
196 }
197
198 // Return filters.
199 $filters = apply_filters( 'tutor_course_filter_args', $args );
200 if ( $return_filter ) {
201 return $filters;
202 }
203
204 ob_start();
205
206 query_posts( $filters );
207 tutor_load_template( 'archive-course-init', array_merge( array( 'loop_content_only' => true ), $sanitized_post ) );
208
209 wp_send_json_success( array( 'html' => ob_get_clean() ) );
210 exit;
211 }
212
213 /**
214 * Get current term ID
215 *
216 * @since 1.0.0
217 * @return integer
218 */
219 private function get_current_term_id() {
220
221 if ( null === $this->current_term_id ) {
222 $queried = get_queried_object();
223 $this->current_term_id = ( is_object( $queried ) && property_exists( $queried, 'term_id' ) ) ? $queried->term_id : false;
224 }
225
226 return $this->current_term_id;
227 }
228
229 /**
230 * Sort terms hierarchically
231 *
232 * @since 1.0.0
233 *
234 * @param array $terms term list.
235 * @param integer $parent_id parent ID.
236 * @return array
237 */
238 private function sort_terms_hierarchically( $terms, $parent_id = 0 ) {
239 $term_array = array();
240
241 foreach ( $terms as $term ) {
242 if ( $term->parent == $parent_id ) {
243 $term->children = $this->sort_terms_hierarchically( $terms, $term->term_id );
244 $term_array[] = $term;
245 }
246 }
247
248 return $term_array;
249 }
250
251 /**
252 * Render terms hierarchically
253 *
254 * @since 1.0.0
255 *
256 * @param array $terms term list.
257 * @param string $taxonomy taxonomy name.
258 * @return void
259 */
260 private function render_terms_hierarchically( $terms, $taxonomy ) {
261
262 $term_id = $this->get_current_term_id();
263
264 foreach ( $terms as $term ) {
265 ?>
266 <li class="tutor-list-item">
267 <label>
268 <input type="checkbox" class="tutor-form-check-input" name="tutor-course-filter-<?php echo esc_attr( $taxonomy ); ?>" value="<?php echo esc_attr( $term->term_id ); ?>" <?php echo esc_attr( $term->term_id == $term_id ? 'checked="checked"' : '' ); ?>/>
269 <?php echo esc_html( $term->name ); ?>
270 </label>
271 </li>
272 <?php isset( $term->children ) ? $this->render_terms_hierarchically( $term->children, $taxonomy ) : 0; ?>
273 <?php
274 }
275 }
276
277 /**
278 * Render terms
279 *
280 * @since 1.0.0
281 *
282 * @param string $taxonomy taxonomy name.
283 * @return void
284 */
285 public function render_terms( $taxonomy ) {
286 $terms = get_terms(
287 array(
288 'taxonomy' => $this->$taxonomy,
289 'hide_empty' => true,
290 )
291 );
292 $this->render_terms_hierarchically( $this->sort_terms_hierarchically( $terms ), $taxonomy );
293 }
294 }
295