PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 2.1.8
Tutor LMS – eLearning and online course solution v2.1.8
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
314 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 add_filter( 'term_link', __CLASS__ . '::filter_course_category_term_link', 10, 3 );
57 }
58
59 /**
60 * Load course listing
61 *
62 * @since 1.0.0
63 *
64 * @param mixed $filters filters.
65 * @param boolean $return_filter return filterd data or not.
66 * @return mixed
67 */
68 public function load_listing( $filters = null, $return_filter = false ) {
69 ! $return_filter ? tutils()->checking_nonce() : 0;
70
71 $sanitized_post = tutor_sanitize_data( null == $filters ? $_POST : $filters ); //phpcs:ignore WordPress.Security.NonceVerification.Missing
72 ! is_array( $sanitized_post ) ? $sanitized_post = array() : 0;
73
74 $default_per_page = tutils()->get_option( 'courses_per_page', 12 );
75 $courses_per_page = (int) tutils()->array_get( 'course_per_page', $sanitized_post, $default_per_page );
76
77 // Pagination arg.
78 $page = max( 1, Input::post( 'current_page', 0, Input::TYPE_INT ) );
79 $sanitized_post['current_page'] = $page;
80
81 // Order arg.
82 $order_by = 'post_date';
83 $order = 'DESC';
84
85 if ( isset( $sanitized_post['course_order'] ) ) {
86 switch ( $sanitized_post['course_order'] ) {
87 case 'newest_first':
88 $order_by = 'post_date';
89 $order = 'DESC';
90 break;
91
92 case 'oldest_first':
93 $order_by = 'post_date';
94 $order = 'ASC';
95 break;
96
97 case 'course_title_az':
98 $order_by = 'post_title';
99 $order = 'ASC';
100 break;
101
102 case 'course_title_za':
103 $order_by = 'post_title';
104 $order = 'DESC';
105 break;
106 }
107 }
108
109 $args = array(
110 'post_status' => 'publish',
111 'post_type' => tutor()->course_post_type,
112 'posts_per_page' => $courses_per_page,
113 'paged' => (int) $page,
114 'orderby' => $order_by,
115 'order' => $order,
116 'tax_query' => array(
117 'relation' => 'OR',
118 ),
119 );
120
121 // Prepare taxonomy.
122 foreach ( array( 'category', 'tag' ) as $taxonomy ) {
123
124 $term_array = tutils()->array_get( 'tutor-course-filter-' . $taxonomy, $sanitized_post, array() );
125 ! is_array( $term_array ) ? $term_array = array( $term_array ) : 0;
126
127 $term_array = array_filter(
128 $term_array,
129 function( $term_id ) {
130 return is_numeric( $term_id );
131 }
132 );
133
134 if ( count( $term_array ) > 0 ) {
135 $tax_query = array(
136 'taxonomy' => $this->$taxonomy,
137 'field' => 'term_id',
138 'terms' => $term_array,
139 'operator' => 'IN',
140 );
141 array_push( $args['tax_query'], $tax_query );
142 }
143 }
144
145 // Prepare level and price type.
146 $is_membership = get_tutor_option( 'monetize_by' ) == 'pmpro' && tutils()->has_pmpro();
147 $level_price = array();
148 foreach ( array( 'level', 'price' ) as $type ) {
149
150 if ( $is_membership && 'price' === $type ) {
151 continue;
152 }
153
154 $type_array = tutils()->array_get( 'tutor-course-filter-' . $type, $sanitized_post, array() );
155 $type_array = array_map( 'sanitize_text_field', ( is_array( $type_array ) ? $type_array : array( $type_array ) ) );
156
157 if ( 'level' == $type && in_array( 'all_levels', $type_array ) ) {
158 continue;
159 }
160
161 if ( count( $type_array ) > 0 ) {
162 $level_price[] = array(
163 'key' => 'level' === $type ? '_tutor_course_level' : '_tutor_course_price_type',
164 'value' => $type_array,
165 'compare' => 'IN',
166 );
167 }
168 }
169 count( $level_price ) ? $args['meta_query'] = $level_price : 0;
170
171 $search_key = sanitize_text_field( tutils()->array_get( 'keyword', $sanitized_post, null ) );
172 $search_key ? $args['s'] = $search_key : 0;
173
174 if ( isset( $sanitized_post['tutor_course_filter'] ) ) {
175 switch ( $sanitized_post['tutor_course_filter'] ) {
176
177 case 'newest_first':
178 $args['orderby'] = 'post_date';
179 $args['order'] = 'desc';
180 break;
181
182 case 'oldest_first':
183 $args['orderby'] = 'post_date';
184 $args['order'] = 'asc';
185 break;
186
187 case 'course_title_az':
188 $args['orderby'] = 'post_title';
189 $args['order'] = 'asc';
190 break;
191
192 case 'course_title_za':
193 $args['orderby'] = 'post_title';
194 $args['order'] = 'desc';
195 break;
196 }
197 }
198
199 // Return filters.
200 $filters = apply_filters( 'tutor_course_filter_args', $args );
201 if ( $return_filter ) {
202 return $filters;
203 }
204
205 ob_start();
206
207 query_posts( $filters );
208 tutor_load_template( 'archive-course-init', array_merge( array( 'loop_content_only' => true ), $sanitized_post ) );
209
210 wp_send_json_success( array( 'html' => ob_get_clean() ) );
211 exit;
212 }
213
214 /**
215 * Get current term ID
216 *
217 * @since 1.0.0
218 * @return integer
219 */
220 private function get_current_term_id() {
221
222 if ( null === $this->current_term_id ) {
223 $queried = get_queried_object();
224 $this->current_term_id = ( is_object( $queried ) && property_exists( $queried, 'term_id' ) ) ? $queried->term_id : false;
225 }
226
227 return $this->current_term_id;
228 }
229
230 /**
231 * Sort terms hierarchically
232 *
233 * @since 1.0.0
234 *
235 * @param array $terms term list.
236 * @param integer $parent_id parent ID.
237 * @return array
238 */
239 private function sort_terms_hierarchically( $terms, $parent_id = 0 ) {
240 $term_array = array();
241
242 foreach ( $terms as $term ) {
243 if ( $term->parent == $parent_id ) {
244 $term->children = $this->sort_terms_hierarchically( $terms, $term->term_id );
245 $term_array[] = $term;
246 }
247 }
248
249 return $term_array;
250 }
251
252 /**
253 * Render terms hierarchically
254 *
255 * @since 1.0.0
256 *
257 * @param array $terms term list.
258 * @param string $taxonomy taxonomy name.
259 * @return void
260 */
261 private function render_terms_hierarchically( $terms, $taxonomy ) {
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 /**
296 * Filter course-category term's permalink
297 *
298 * Add a query param so that course filter can work
299 *
300 * @param string $termlink default term link.
301 * @param \WP_Term $term term obj.
302 * @param string $taxonomy taxonomy.
303 *
304 * @return string customized term link
305 */
306 public static function filter_course_category_term_link( string $termlink, \WP_Term $term, string $taxonomy ) {
307 if ( 'course-category' === $taxonomy ) {
308 $termlink = add_query_arg( 'tutor-course-filter-category', $term->term_id, $termlink );
309
310 }
311 return $termlink;
312 }
313 }
314