' => '', ]; $callback = [ 'class' => get_class( $this ), 'method' => 'render_courses', ]; $args = [ 'id_url' => 'course-related', 'course_id' => $course->get_id(), 'limit' => $limit, ]; $content = TemplateAJAX::load_content_via_ajax( $args, $callback ); echo Template::instance()->nest_elements( $html_wrapper, $content ); } /** * Render template list courses with settings param. * * @param array $settings * * @return stdClass { content: string_html } * @since 4.2.7 * @version 1.0.3 */ public static function render_courses( array $settings = [] ): stdClass { $content = new stdClass(); $content->content = ''; $filter = new LP_Course_Filter(); $course_id = $settings['course_id'] ?? 0; if ( empty( $course_id ) ) { return $content; } $courseModelCurrent = CourseModel::find( $course_id, true ); $terms = $courseModelCurrent->get_categories(); $term_ids = []; foreach ( $terms as $term ) { $term_ids[] = $term->term_id ?? 0; if ( $term->parent ) { $term_ids[] = $term->parent; } } $total_rows = 0; $filter->only_fields = [ 'DISTINCT(ID) AS ID' ]; $filter->post_status = [ 'publish' ]; $filter->limit = $settings['limit'] ?? 4; $filter->term_ids = $term_ids; $filter->query_count = false; $filter->order_by = 'rand()'; $filter->where[] = LP_Database::getInstance()->wpdb->prepare( 'AND p.ID != %d', $course_id ); $courses = Courses::get_courses( $filter, $total_rows ); if ( empty( $courses ) ) { return $content; } // Handle layout $html_ul_courses = [ '
', ]; ob_start(); foreach ( $courses as $courseObj ) { $courseModel = CourseModel::find( $courseObj->ID, true ); if ( ! $courseModel instanceof CourseModel ) { continue; } echo ListCoursesTemplate::render_course( $courseModel, $settings ); } $html_courses = Template::instance()->nest_elements( $html_ul_courses, ob_get_clean() ); $sections = apply_filters( 'learn-press/list-courses/related/sections', [ 'header' => sprintf( '