PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 2.7.0
Tutor LMS – eLearning and online course solution v2.7.0
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 2 years ago Admin.php 2 years ago Ajax.php 2 years ago Announcements.php 3 years ago Assets.php 2 years ago Backend_Page_Trait.php 3 years ago Course.php 2 years ago Course_Embed.php 3 years ago Course_Filter.php 2 years ago Course_List.php 2 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 2 years ago Frontend.php 2 years ago Gutenberg.php 3 years ago Input.php 3 years ago Instructor.php 2 years ago Instructors_List.php 2 years ago Lesson.php 2 years ago Options_V2.php 2 years ago Permalink.php 2 years ago Post_types.php 2 years ago Private_Course_Access.php 3 years ago Q_And_A.php 2 years ago Question_Answers_List.php 3 years ago Quiz.php 2 years ago Quiz_Attempts_List.php 2 years ago RestAPI.php 2 years ago Reviews.php 3 years ago Rewrite_Rules.php 2 years ago Shortcode.php 2 years ago Student.php 2 years ago Students_List.php 3 years ago Taxonomies.php 3 years ago Template.php 2 years ago Theme_Compatibility.php 3 years ago Tools.php 3 years ago Tools_V2.php 2 years ago Tutor.php 2 years ago TutorEDD.php 2 years ago Tutor_Base.php 2 years ago Tutor_Setup.php 2 years ago Upgrader.php 2 years ago User.php 2 years ago Utils.php 2 years ago Video_Stream.php 3 years ago WhatsNew.php 2 years ago Withdraw.php 2 years ago Withdraw_Requests_List.php 3 years ago WooCommerce.php 2 years ago
Course_Filter.php
315 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 $current_page = (int) Input::sanitize_request_data( 'current_page', 1 );
79 $paged = max( 1, $current_page );
80 $sanitized_post['current_page'] = $paged;
81
82 // Order arg.
83 $order_by = 'post_date';
84 $order = 'DESC';
85
86 if ( isset( $sanitized_post['course_order'] ) ) {
87 switch ( $sanitized_post['course_order'] ) {
88 case 'newest_first':
89 $order_by = 'post_date';
90 $order = 'DESC';
91 break;
92
93 case 'oldest_first':
94 $order_by = 'post_date';
95 $order = 'ASC';
96 break;
97
98 case 'course_title_az':
99 $order_by = 'post_title';
100 $order = 'ASC';
101 break;
102
103 case 'course_title_za':
104 $order_by = 'post_title';
105 $order = 'DESC';
106 break;
107 }
108 }
109
110 $args = array(
111 'post_status' => 'publish',
112 'post_type' => tutor()->course_post_type,
113 'posts_per_page' => $courses_per_page,
114 'paged' => $paged,
115 'orderby' => $order_by,
116 'order' => $order,
117 'tax_query' => array(
118 'relation' => 'OR',
119 ),
120 );
121
122 // Prepare taxonomy.
123 foreach ( array( 'category', 'tag' ) as $taxonomy ) {
124
125 $term_array = tutils()->array_get( 'tutor-course-filter-' . $taxonomy, $sanitized_post, array() );
126 ! is_array( $term_array ) ? $term_array = array( $term_array ) : 0;
127
128 $term_array = array_filter(
129 $term_array,
130 function( $term_id ) {
131 return is_numeric( $term_id );
132 }
133 );
134
135 if ( count( $term_array ) > 0 ) {
136 $tax_query = array(
137 'taxonomy' => $this->$taxonomy,
138 'field' => 'term_id',
139 'terms' => $term_array,
140 'operator' => 'IN',
141 );
142 array_push( $args['tax_query'], $tax_query );
143 }
144 }
145
146 // Prepare level and price type.
147 $is_membership = get_tutor_option( 'monetize_by' ) == 'pmpro' && tutils()->has_pmpro();
148 $level_price = array();
149 foreach ( array( 'level', 'price' ) as $type ) {
150
151 if ( $is_membership && 'price' === $type ) {
152 continue;
153 }
154
155 $type_array = tutils()->array_get( 'tutor-course-filter-' . $type, $sanitized_post, array() );
156 $type_array = array_map( 'sanitize_text_field', ( is_array( $type_array ) ? $type_array : array( $type_array ) ) );
157
158 if ( 'level' == $type && in_array( 'all_levels', $type_array ) ) {
159 continue;
160 }
161
162 if ( count( $type_array ) > 0 ) {
163 $level_price[] = array(
164 'key' => 'level' === $type ? '_tutor_course_level' : '_tutor_course_price_type',
165 'value' => $type_array,
166 'compare' => 'IN',
167 );
168 }
169 }
170 count( $level_price ) ? $args['meta_query'] = $level_price : 0;
171
172 $search_key = sanitize_text_field( tutils()->array_get( 'keyword', $sanitized_post, null ) );
173 $search_key ? $args['s'] = $search_key : 0;
174
175 if ( isset( $sanitized_post['tutor_course_filter'] ) ) {
176 switch ( $sanitized_post['tutor_course_filter'] ) {
177
178 case 'newest_first':
179 $args['orderby'] = 'post_date';
180 $args['order'] = 'desc';
181 break;
182
183 case 'oldest_first':
184 $args['orderby'] = 'post_date';
185 $args['order'] = 'asc';
186 break;
187
188 case 'course_title_az':
189 $args['orderby'] = 'post_title';
190 $args['order'] = 'asc';
191 break;
192
193 case 'course_title_za':
194 $args['orderby'] = 'post_title';
195 $args['order'] = 'desc';
196 break;
197 }
198 }
199
200 // Return filters.
201 $filters = apply_filters( 'tutor_course_filter_args', $args );
202 if ( $return_filter ) {
203 return $filters;
204 }
205
206 ob_start();
207
208 query_posts( $filters );
209 tutor_load_template( 'archive-course-init', array_merge( array( 'loop_content_only' => true ), $sanitized_post ) );
210
211 wp_send_json_success( array( 'html' => ob_get_clean() ) );
212 exit;
213 }
214
215 /**
216 * Get current term ID
217 *
218 * @since 1.0.0
219 * @return integer
220 */
221 private function get_current_term_id() {
222
223 if ( null === $this->current_term_id ) {
224 $queried = get_queried_object();
225 $this->current_term_id = ( is_object( $queried ) && property_exists( $queried, 'term_id' ) ) ? $queried->term_id : false;
226 }
227
228 return $this->current_term_id;
229 }
230
231 /**
232 * Sort terms hierarchically
233 *
234 * @since 1.0.0
235 *
236 * @param array $terms term list.
237 * @param integer $parent_id parent ID.
238 * @return array
239 */
240 private function sort_terms_hierarchically( $terms, $parent_id = 0 ) {
241 $term_array = array();
242
243 foreach ( $terms as $term ) {
244 if ( $term->parent == $parent_id ) {
245 $term->children = $this->sort_terms_hierarchically( $terms, $term->term_id );
246 $term_array[] = $term;
247 }
248 }
249
250 return $term_array;
251 }
252
253 /**
254 * Render terms hierarchically
255 *
256 * @since 1.0.0
257 *
258 * @param array $terms term list.
259 * @param string $taxonomy taxonomy name.
260 * @return void
261 */
262 private function render_terms_hierarchically( $terms, $taxonomy ) {
263 $term_id = $this->get_current_term_id();
264
265 foreach ( $terms as $term ) {
266 ?>
267 <li class="tutor-list-item">
268 <label>
269 <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"' : '' ); ?>/>
270 <?php echo esc_html( $term->name ); ?>
271 </label>
272 </li>
273 <?php isset( $term->children ) ? $this->render_terms_hierarchically( $term->children, $taxonomy ) : 0; ?>
274 <?php
275 }
276 }
277
278 /**
279 * Render terms
280 *
281 * @since 1.0.0
282 *
283 * @param string $taxonomy taxonomy name.
284 * @return void
285 */
286 public function render_terms( $taxonomy ) {
287 $terms = get_terms(
288 array(
289 'taxonomy' => $this->$taxonomy,
290 'hide_empty' => true,
291 )
292 );
293 $this->render_terms_hierarchically( $this->sort_terms_hierarchically( $terms ), $taxonomy );
294 }
295
296 /**
297 * Filter course-category term's permalink
298 *
299 * Add a query param so that course filter can work
300 *
301 * @param string $termlink default term link.
302 * @param \WP_Term $term term obj.
303 * @param string $taxonomy taxonomy.
304 *
305 * @return string customized term link
306 */
307 public static function filter_course_category_term_link( string $termlink, \WP_Term $term, string $taxonomy ) {
308 if ( 'course-category' === $taxonomy ) {
309 $termlink = add_query_arg( 'tutor-course-filter-category', $term->term_id, $termlink );
310
311 }
312 return $termlink;
313 }
314 }
315