{'html_' . $field}( $data ); } else { // For custom field. do_action_ref_array( 'learn-press/filter-courses/sections/field/html', [ &$sections, $field, $data, ] ); } } // Add button Done for mobile if not has btn submit. if ( ! in_array( 'btn_submit', $data['fields'] ) ) { $sections['btn_done'] = $this->html_btn_done( $data ); } $class_wrapper_form = $data['class_wrapper_form'] ?? 'lp-form-course-filter'; $wrapper = apply_filters( 'lp/filter-courses/sections/wrapper', [ 'wrapper' => sprintf( '
', $class_wrapper_form ), 'sections' => Template::combine_components( $sections ), 'close' => sprintf( '
%s
', esc_html__( 'Close', 'learnpress' ) ), 'wrapper_end' => '
', ], $data ); echo Template::combine_components( $wrapper ); } catch ( Throwable $e ) { error_log( __METHOD__ . ': ' . $e->getMessage() ); } } /** * Get html item. * * @param string $title * @param string $content * * @return string */ public function html_item( string $title = '', string $content = '' ): string { try { $title_html = sprintf( '
%s
', $title ); $content_html = sprintf( '
%s
', $content ); $sections = apply_filters( 'lp/filter-courses/item/sections', [ 'title' => $title_html, 'content' => $content_html, ], $title, $content ); $wrapper = apply_filters( 'lp/filter-courses/item/wrapper', [ 'wrapper' => '
', 'content' => Template::combine_components( $sections ), 'wrapper_end' => '
', ] ); $content = Template::combine_components( $wrapper ); } catch ( Throwable $e ) { error_log( __METHOD__ . ': ' . $e->getMessage() ); } return $content; } /** * Get html search. * * @param array $data * * @return string */ public function html_search( array $data = [] ): string { $content = ''; try { $this->check_param_url_has_lang( $data ); $value = LP_Request::get_param( 'c_search' ); $value = isset( $data['params_url'] ) ? ( $data['params_url']['c_search'] ?? $value ) : $value; $content = sprintf( '', esc_html__( 'Search Course', 'learnpress' ), esc_attr( $value ), esc_attr( 'lp-course-filter-search' ), esc_attr( $data['search_suggestion'] ?? 1 ) ); $content .= ''; $sections = [ 'wrapper' => '
', 'content' => $content, 'wrapper_end' => '
', 'result' => '
', ]; $content = Template::combine_components( $sections ); $content = $this->html_item( esc_html__( 'Search', 'learnpress' ), $content ); $wrapper = apply_filters( 'lp/filter-courses/sections/search/wrapper', [ 'wrapper' => '', ], $data ); $content = Template::combine_components( $wrapper ); } catch ( Throwable $e ) { error_log( __METHOD__ . ': ' . $e->getMessage() ); } return $content; } /** * Get html price. * * @param array $data * * @return string * @since 4.2.3.2 * @version 1.0.3 */ public function html_price( array $data = [] ): string { $content = ''; try { $this->check_param_url_has_lang( $data ); $params_url = $data['params_url'] ?? []; $data_selected = $params_url['sort_by'] ?? ''; $data_selected = explode( ',', $data_selected ); $hide_count_zero = $data['hide_count_zero'] ?? 1; // Get number courses free $filter_courses_free = new LP_Course_Filter(); $this->handle_filter_params_before_query( $filter_courses_free, $params_url ); // Not count include sort by price. $filter_courses_free->sort_by = []; $count_courses_free = Courses::count_course_free( $filter_courses_free ); // Get number courses has price $filter_courses_price = new LP_Course_Filter(); $this->handle_filter_params_before_query( $filter_courses_price, $params_url ); $filter_courses_price->query_count = true; $filter_courses_price->sort_by = [ 'on_paid' ]; $count_courses_paid = 0; Courses::get_courses( $filter_courses_price, $count_courses_paid ); $fields = apply_filters( 'learn-press/filter-courses/price/fields', [ 'free' => [ 'label' => __( 'Free', 'learnpress' ), 'count' => $count_courses_free, ], 'paid' => [ 'label' => __( 'Paid', 'learnpress' ), 'count' => $count_courses_paid, ], ] ); foreach ( $fields as $key => $field ) { $value = "on_{$key}"; $disabled = $field['count'] > 0 ? '' : 'disabled'; if ( ! empty( $disabled ) && $hide_count_zero ) { continue; } $checked = in_array( $value, $data_selected ) && empty( $disabled ) ? 'checked' : ''; $input = sprintf( '', esc_attr( $value ), esc_attr( $checked ), esc_attr( $disabled ) ); $label = sprintf( '', wp_kses_post( $field['label'] ) ); $count = sprintf( '%s', esc_html( $field['count'] ) ); $sections = apply_filters( 'lp/filter-courses/price/sections', [ 'input' => $input, 'label' => $label, 'count' => $count, ], $field, $data ); $wrapper = [ 'wrapper' => '
', 'content' => Template::combine_components( $sections ), 'wrapper_end' => '
', ]; $content .= Template::combine_components( $wrapper ); } $content = $this->html_item( esc_html__( 'Price', 'learnpress' ), $content ); } catch ( Throwable $e ) { error_log( __METHOD__ . ': ' . $e->getMessage() ); } return $content; } /** * Get html course list categories. * * @param array $data * * @return string * @since 4.2.3.2 * @version 1.0.4 */ public function html_category( array $data = [] ): string { $content = ''; try { $this->check_param_url_has_lang( $data ); $params_url = $data['params_url'] ?? []; $data_selected = $params_url['term_id'] ?? ''; $data_selected = explode( ',', $data_selected ); $data['data_selected'] = $data_selected; $parent_cat_id = 0; if ( isset( $params_url['page_term_id_current'] ) ) { $category_current_id = $params_url['page_term_id_current']; $category_current = get_term_by( 'id', $category_current_id, LP_COURSE_CATEGORY_TAX ); if ( ! empty( $category_current ) ) { $parent_cat_id = $category_current_id; $content .= $this->html_field_category( $category_current->term_id, $category_current->name, $data ); } } // For subcategories. ob_start(); $data['level_current'] = 0; $data['parent_term_id'] = $parent_cat_id; $this->html_struct_categories( $data ); $content .= ob_get_clean(); $content = $this->html_item( esc_html__( 'Categories', 'learnpress' ), $content ); $wrapper = apply_filters( 'lp/filter-courses/sections/category/wrapper', [ 'wrapper' => '
', 'content' => $content, 'wrapper_end' => '
', ], $data ); $content = Template::combine_components( $wrapper ); } catch ( Throwable $e ) { error_log( __METHOD__ . ': ' . $e->getMessage() ); } return $content; } /** * Get list categories course. * * @param array $args * * @return void * @since 4.2.6.5 * @version 1.0.0 */ public function html_struct_categories( array $args = [] ) { $level_current = $args['level_current'] ?? 0; $number_level_category = $args['number_level_category'] ?? 2; $parent_term_id = $args['parent_term_id'] ?? 0; if ( $level_current >= $number_level_category ) { return; } $terms = ListCourseCategories::get_all_categories_id_name( [ 'parent' => $parent_term_id ] ); if ( empty( $terms ) ) { return; } $class_wrapper = 'lp-cate-parent'; if ( $level_current > 0 ) { $class_wrapper = 'lp-cate-child'; } echo sprintf( '
', esc_attr( $class_wrapper ) ); foreach ( $terms as $term_id => $term_name ) { echo sprintf( '
', esc_attr( $term_id ) ); echo $this->html_field_category( $term_id, $term_name, $args ); $args['level_current'] = $level_current + 1; $args['parent_term_id'] = $term_id; $this->html_struct_categories( $args ); echo '
'; } echo '
'; } /** * Return string html a field category. * * @param int $category_id * @param string $category_name * @param array $args * * @return false|string * @since 4.2.6.5 * @version 1.0.0 */ public function html_field_category( int $category_id, string $category_name, array $args = [] ) { $count_courses = 0; $filter = new LP_Course_Filter(); $filter->query_count = true; $filter->only_fields = [ 'DISTINCT(ID)' ]; $this->handle_filter_params_before_query( $filter, $args['params_url'] ?? [] ); $filter->term_ids = [ $category_id ]; //$filter->debug_string_query = true; Courses::get_courses( $filter, $count_courses ); $disabled = $count_courses > 0 ? '' : 'disabled'; if ( ! empty( $disabled ) && ( $args['hide_count_zero'] ?? 1 ) ) { return ''; } $checked = in_array( $category_id, $args['data_selected'] ?? [] ) && empty( $disabled ) ? 'checked' : ''; $input = sprintf( '', esc_attr( $category_id ), esc_attr( $checked ), esc_attr( $disabled ) ); $label = sprintf( '', wp_kses_post( $category_name ) ); $count = sprintf( '%s', esc_html( $count_courses ) ); $sections = apply_filters( 'lp/filter-courses/course-category/sections', [ 'start' => '
', 'input' => $input, 'label' => $label, 'count' => $count, 'end' => '
', ], $category_id, $category_name, $args ); return Template::combine_components( $sections ); } /** * Get html course tag. * * @param array $data * * @return string * @since 4.2.3.2 * @version 1.0.3 */ public function html_tag( array $data = [] ): string { $content = ''; try { $this->check_param_url_has_lang( $data ); $params_url = $data['params_url'] ?? []; $data_selected = $params_url['tag_id'] ?? ''; $data_selected = explode( ',', $data_selected ); $hide_count_zero = $data['hide_count_zero'] ?? 1; // Check has in tag page. if ( isset( $params_url['page_tag_id_current'] ) && empty( $params_url['tag_id'] ) ) { $data_selected[] = $params_url['page_tag_id_current']; } $terms = get_terms( [ 'taxonomy' => LP_COURSE_TAXONOMY_TAG, 'hide_empty' => true, 'count' => false, ] ); if ( empty( $terms ) ) { return $content; } foreach ( $terms as $term ) { $value = $term->term_id; $filter = new LP_Course_Filter(); $filter->query_count = true; $this->handle_filter_params_before_query( $filter, $params_url ); $filter->tag_ids = [ $value ]; $count_courses = 0; Courses::get_courses( $filter, $count_courses ); $disabled = $count_courses > 0 ? '' : 'disabled'; if ( ! empty( $disabled ) && $hide_count_zero ) { continue; } $checked = in_array( $value, $data_selected ) && empty( $disabled ) ? 'checked' : ''; $input = sprintf( '', esc_attr( $value ), esc_attr( $checked ), esc_attr( $disabled ) ); $label = sprintf( '', wp_kses_post( $term->name ) ); $count = sprintf( '%s', esc_html( $count_courses ) ); $sections = apply_filters( 'lp/filter-courses/course-tag/sections', [ 'input' => $input, 'label' => $label, 'count' => $count, ], $term, $data ); $wrapper = [ 'wrapper' => '
', 'content' => Template::combine_components( $sections ), 'wrapper_end' => '
', ]; $content .= Template::combine_components( $wrapper ); } $content = $this->html_item( esc_html__( 'Tags', 'learnpress' ), $content ); } catch ( Throwable $e ) { error_log( __METHOD__ . ': ' . $e->getMessage() ); } return $content; } /** * Get html course tag. * * @param array $data * * @return string * @since 4.2.3.2 * @version 1.0.4 */ public function html_author( array $data = [] ): string { $content = ''; try { $this->check_param_url_has_lang( $data ); $params_url = $data['params_url'] ?? []; $data_selected = $params_url['c_authors'] ?? ''; $data_selected = explode( ',', $data_selected ); $hide_count_zero = $data['hide_count_zero'] ?? 1; $instructors = get_users( array( 'role__in' => [ LP_TEACHER_ROLE, ADMIN_ROLE ], 'fields' => array( 'ID' ), ) ); foreach ( $instructors as $instructorObj ) { $userModel = UserModel::find( $instructorObj->ID, true ); if ( ! $userModel instanceof UserModel ) { continue; } $instructor_id = $userModel->get_id(); $total_course_of_instructor = 0; $filter = new LP_Course_Filter(); $filter->query_count = true; $filter->only_fields = [ 'DISTINCT(ID)' ]; $this->handle_filter_params_before_query( $filter, $params_url ); $filter->post_authors = [ $instructor_id ]; Courses::get_courses( $filter, $total_course_of_instructor ); $value = $instructor_id; $disabled = $total_course_of_instructor > 0 ? '' : 'disabled'; if ( ! empty( $disabled ) && $hide_count_zero ) { continue; } $checked = in_array( $value, $data_selected ) && empty( $disabled ) ? 'checked' : ''; $input = sprintf( '', esc_attr( $value ), esc_attr( $checked ), esc_attr( $disabled ) ); $label = sprintf( '', esc_html( $userModel->get_display_name() ) ); $count = sprintf( '%s', esc_html( $total_course_of_instructor ) ); $sections = apply_filters( 'lp/filter-courses/author/sections', [ 'input' => $input, 'label' => $label, 'count' => $count, ], $userModel, $total_course_of_instructor, $data ); $wrapper = [ 'wrapper' => '
', 'content' => Template::combine_components( $sections ), 'wrapper_end' => '
', ]; $content .= Template::combine_components( $wrapper ); } $content = $this->html_item( esc_html__( 'Author', 'learnpress' ), $content ); } catch ( Throwable $e ) { LP_Debug::error_log( $e ); } return $content; } /** * Get html course tag. * * @param array $data * * @return string * @since 4.2.3.2 * @version 1.0.4 */ public function html_level( array $data = [] ): string { $content = ''; try { $this->check_param_url_has_lang( $data ); $params_url = $data['params_url'] ?? []; $data_selected = $params_url['c_level'] ?? ''; $data_selected = explode( ',', $data_selected ); $fields = lp_course_level(); $hide_count_zero = $data['hide_count_zero'] ?? 1; foreach ( $fields as $key => $field ) { $value = $key; if ( empty( $key ) ) { $value = 'all'; } $filter = new LP_Course_Filter(); $this->handle_filter_params_before_query( $filter, $params_url ); $filter->only_fields = [ 'DISTINCT(ID)' ]; $filter->query_count = true; $filter->levels = [ $key ]; if ( $key === 'all' ) { $filter->levels[] = ''; } $total_courses = 0; Courses::get_courses( $filter, $total_courses ); $disabled = $total_courses > 0 ? '' : 'disabled'; if ( ! empty( $disabled ) && $hide_count_zero ) { continue; } $checked = in_array( $value, $data_selected ) && empty( $disabled ) ? 'checked' : ''; $input = sprintf( '', esc_attr( $value ), esc_attr( $checked ), esc_attr( $disabled ) ); $label = sprintf( '', esc_html( $field ) ); $count = sprintf( '%s', esc_html( $total_courses ) ); $sections = apply_filters( 'lp/filter-courses/levels/sections', [ 'input' => $input, 'label' => $label, 'count' => $count, ], $field, $value, $data ); $wrapper = [ 'wrapper' => '
', 'content' => Template::combine_components( $sections ), 'wrapper_end' => '
', ]; $content .= Template::combine_components( $wrapper ); } $content = $this->html_item( esc_html__( 'Levels', 'learnpress' ), $content ); } catch ( Throwable $e ) { error_log( __METHOD__ . ': ' . $e->getMessage() ); } return $content; } /** * Get HTML fields type (online/offline) * * @param array $data * * @return string * @since 4.2.8.2 * @version 1.0.0 */ public function html_type( array $data = [] ): string { $content = ''; try { $this->check_param_url_has_lang( $data ); $params_url = $data['params_url'] ?? []; $data_selected = $params_url['c_type'] ?? ''; $data_selected = explode( ',', $data_selected ); $filter_types = apply_filters( 'learn-press/filter-courses/type/fields', array( 'online' => __( 'Online', 'learnpress' ), 'offline' => __( 'Offline', 'learnpress' ), ) ); foreach ( $filter_types as $key => $type ) { $checked = in_array( $key, $data_selected ) ? 'checked' : ''; $input = sprintf( '', esc_attr( $key ), esc_attr( $checked ) ); $label = sprintf( '', esc_html( $type ) ); $sections = apply_filters( 'lp/filter-courses/type/sections', [ 'input' => $input, 'label' => $label, ], $type, $key, $data ); $wrapper = [ 'wrapper' => '
', 'content' => Template::combine_components( $sections ), 'wrapper_end' => '
', ]; $content .= Template::combine_components( $wrapper ); } $content = $this->html_item( esc_html__( 'Type', 'learnpress' ), $content ); } catch ( Throwable $e ) { LP_Debug::error_log( $e ); } return $content; } /** * Get html button submit filter. * * @param array $data * * @return string */ public function html_btn_submit( array $data = [] ): string { return sprintf( '', esc_html__( 'Apply', 'learnpress' ) ); } /** * Get html button Done - for mobile when not show btn submit. * * @param array $data * * @return string */ public function html_btn_done( array $data = [] ): string { return sprintf( '', esc_html__( 'Done', 'learnpress' ) ); } /** * Get html button reset filter. * * @param array $data * * @return string */ public function html_btn_reset( array $data = [] ): string { return sprintf( '', esc_html__( 'Reset', 'learnpress' ) ); } /** * Get html button reset filter. * * @param array $data * * @return string * @since 4.2.7.6 * @version 1.0.0 */ public function html_btn_filter_mobile( array $data = [] ): string { $count = $data['count_fields_selected'] ?? ''; if ( $count === '(0)' ) { $count = ''; } $section = [ 'wrapper' => '
', 'icon' => '', 'count_fields_selected' => sprintf( '%s', esc_html( $count ) ), 'wrapper_end' => '
', ]; return Template::combine_components( $section ); } /** * Set params from url for filter. * * @param LP_Course_Filter $filter * @param array $params_url * * @return void */ public function handle_filter_params_before_query( LP_Course_Filter &$filter, array $params_url = [] ) { Courses::handle_params_for_query_courses( $filter, $params_url ); // Check has in category page. if ( isset( $params_url['page_term_id_current'] ) && empty( $params_url['term_id'] ) ) { $filter->term_ids[] = $params_url['page_term_id_current']; } elseif ( isset( $params_url['page_tag_id_current'] ) && empty( $params_url['tag_id'] ) ) { $filter->tag_ids[] = $params_url['page_tag_id_current']; } } /** * Check param url has lang for multiple lang. * * @param array $data * * @return void * @since 4.2.5.7 * @version 1.0.0 */ public function check_param_url_has_lang( array $data = [] ) { $params_url = $data['params_url'] ?? []; if ( isset( $params_url['lang'] ) ) { $_REQUEST['lang'] = sanitize_text_field( $params_url['lang'] ); } } }