PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.10
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.10
4.4.10 4.4.9.1 4.4.9 4.4.8 4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 All 142 releases
← All changes | inc/TemplateHooks/Admin/AdminListStudentsEnrolled.php +138 -172 4.3.7 → 4.4.10 View file →
@@ -2,11 +2,9 @@
2 2
3 3 namespace LearnPress\TemplateHooks\Admin;
4 4
5 5 use Exception;
6 -use LearnPress\Databases\PostDB;
7 6 use LearnPress\Databases\UserItemsDB;
8 -use LearnPress\Filters\PostFilter;
9 7 use LearnPress\Filters\UserItemsFilter;
10 8 use LearnPress\Helpers\Singleton;
11 9 use LearnPress\Helpers\Template;
12 10 use LearnPress\Models\CourseModel;
@@ -19,8 +17,9 @@
19 17 use LearnPress\TemplateHooks\UserItem\UserCourseTemplate;
20 18 use LP_Debug;
21 19 use LP_Helper;
22 20 use LP_Page_Controller;
21 +use LP_Request;
23 22 use stdClass;
24 23 use Throwable;
25 24
26 25 /**
@@ -29,9 +28,9 @@
29 28 * Displays enrolled students for Admin (all courses) and Instructor (own courses only).
30 29 * Provides WP Admin submenu + Frontend profile tab.
31 30 *
32 31 * @since 4.3.3
33 - * @version 1.0.0
32 + * @version 1.0.1
34 33 */
35 34 class AdminListStudentsEnrolled {
36 35 use Singleton;
37 36
@@ -36,12 +35,9 @@
36 35 use Singleton;
37 36
38 37 const PER_PAGE = 10;
39 38
40 - public function init() {
41 -
42 - // 1. Register render hook for both admin + frontend profile.
43 - add_action( 'learn-press/admin/enrolled-students/layout', array( $this, 'enrolled_students_layout' ) );
39 + public function init(): void {
44 40 // 2. Whitelist AJAX callback.
45 41 add_filter( 'lp/rest/ajax/allow_callback', array( $this, 'allow_callback' ) );
46 42 // 4. Render a modal toolbar template from PHP (used by JS modal).
47 43 add_action( 'admin_footer', array( $this, 'print_modal_toolbar_template' ) );
@@ -51,14 +47,19 @@
51 47 /**
52 48 * Admin page output callback.
53 49 */
54 50 public function admin_page_output() {
55 - $instructor_id = self::resolve_instructor_id_for_request( array() );
51 + ob_start();
52 + $this->enrolled_students_layout();
53 + $content = ob_get_clean();
56 54
57 - echo '<div class="wrap" id="lp-enrolled-students">';
58 - echo '<h1 class="wp-heading-inline">' . esc_html__( 'Enrolled Students', 'learnpress' ) . '</h1>';
59 - do_action( 'learn-press/admin/enrolled-students/layout', $instructor_id );
60 - echo '</div>';
55 + echo AdminTemplate::html_on_wp_admin_screen(
56 + array(
57 + 'content' => $content,
58 + 'title' => __( 'Students', 'learnpress' ),
59 + 'id' => 'lp-enrolled-students',
60 + )
61 + );
61 62 }
62 63
63 64 /**
64 65 * Allow callback for AJAX.
@@ -74,12 +75,10 @@
74 75 }
75 76
76 77 /**
77 78 * Render initial layout with TemplateAJAX::load_content_via_ajax().
78 - *
79 - * @param int $instructor_id 0 for Admin (all), user ID for Instructor.
80 79 */
81 - public function enrolled_students_layout( $instructor_id = 0 ) {
80 + public function enrolled_students_layout() {
82 81 try {
83 82 $page_current = '';
84 83 if ( function_exists( 'get_current_screen' ) ) {
85 84 $wp_screen = get_current_screen();
@@ -90,28 +89,20 @@
90 89 }
91 90 }
92 91 }
93 92
94 - // Enqueue styles — lp-enrolled-students-table CSS is loaded via admin.css/frontend.css import.
95 - // Build toolbar HTML (outside AJAX so it persists across reloads).
96 - $instructor_id = self::resolve_instructor_id_for_request(
97 - array(
98 - 'instructor_id' => $instructor_id,
99 - )
100 - );
101 -
102 93 $args = array(
103 94 'id_url' => 'lp-enrolled-students',
104 - 'instructor_id' => (int) $instructor_id,
105 - 'course_id' => abs( LP_Helper::sanitize_params_submitted( $_GET['course_id'] ?? 0, 'int' ) ),
106 - 'course_name' => LP_Helper::sanitize_params_submitted( $_GET['course_name'] ?? '' ),
95 + 'course_id' => LP_Request::get_param( 'course_id', 0 ),
96 + 'course_name' => LP_Request::get_param( 'course_name' ),
107 97 'paged' => 1,
108 - 'search' => LP_Helper::sanitize_params_submitted( $_GET['search'] ?? '' ),
109 - 'start_date' => self::sanitize_date_filter( $_GET['start_date'] ?? '' ),
110 - 'end_date' => self::sanitize_date_filter( $_GET['end_date'] ?? '' ),
98 + 'search' => lp_request::get_param( 'search' ),
99 + 'start_date' => LP_Request::get_param( 'start_date' ),
100 + 'end_date' => LP_Request::get_param( 'end_date' ),
111 101 'enableUpdateParamsUrl' => false,
112 102 );
113 103
104 + /** @use self::render_enrolled_students $call_back */
114 105 $call_back = array(
115 106 'class' => self::class,
116 107 'method' => 'render_enrolled_students',
117 108 );
@@ -127,9 +118,8 @@
127 118 ];
128 119
129 120 echo Template::combine_components( $section );
130 121 } catch ( Throwable $e ) {
131 - LP_Debug::error_log( $e );
132 122 Template::print_message( $e->getMessage(), 'error' );
133 123 }
134 124 }
135 125
@@ -148,20 +138,18 @@
148 138
149 139 try {
150 140 // Check permission
151 141 if ( ! current_user_can( UserModel::ROLE_ADMINISTRATOR )
152 - && ! current_user_can( UserModel::ROLE_INSTRUCTOR ) ) {
142 + && ! current_user_can( UserModel::ROLE_INSTRUCTOR ) ) {
153 143 throw new Exception( esc_html__( 'You do not have permission to view enrolled students.', 'learnpress' ) );
154 144 }
155 145
156 - $instructor_id = self::resolve_instructor_id_for_request( $data );
157 -
158 146 $course_id = abs( LP_Helper::sanitize_params_submitted( $data['course_id'] ?? 0, 'int' ) );
159 147 $paged = max( 1, abs( LP_Helper::sanitize_params_submitted( $data['paged'] ?? 1, 'int' ) ) );
160 148 $course_name = LP_Helper::sanitize_params_submitted( $data['course_name'] ?? '' );
161 149 $search = LP_Helper::sanitize_params_submitted( $data['search'] ?? '' );
162 - $start_date = self::sanitize_date_filter( $data['start_date'] ?? '' );
163 - $end_date = self::sanitize_date_filter( $data['end_date'] ?? '' );
150 + $start_date = lp_helper::sanitize_params_submitted( $data['start_date'] ?? '' );
151 + $end_date = lp_helper::sanitize_params_submitted( $data['end_date'] ?? '' );
164 152 $per_page = self::PER_PAGE;
165 153
166 154 // Normalize date range if request is reversed.
167 155 if ( $start_date && $end_date && strtotime( $start_date ) > strtotime( $end_date ) ) {
@@ -192,9 +180,10 @@
192 180 );
193 181 $filter->join[] = "JOIN {$lp_db_user_items->wpdb->posts} p ON ui.item_id = p.ID";
194 182 $filter->join[] = "JOIN {$lp_db_user_items->wpdb->users} u ON ui.user_id = u.ID";
195 183
196 - if ( $instructor_id > 0 ) {
184 + $instructor_id = get_current_user_id();
185 + if ( $instructor_id > 0 && current_user_can( UserModel::ROLE_INSTRUCTOR ) ) {
197 186 $filter->where[] = $lp_db_user_items->wpdb->prepare( 'AND p.post_author = %d', $instructor_id );
198 187 }
199 188
200 189 if ( $course_id > 0 ) {
@@ -229,8 +218,12 @@
229 218 $end_date . ' 23:59:59'
230 219 );
231 220 }
232 221
222 + $filter = apply_filters(
223 + 'learn-press/filter-enrolled-students',
224 + $filter
225 + );
233 226 $total_rows = 0;
234 227 $rows = $lp_db_user_items->get_user_items( $filter, $total_rows );
235 228 if ( ! is_array( $rows ) ) {
236 229 $rows = array();
@@ -256,54 +249,8 @@
256 249 return $content;
257 250 }
258 251
259 252 /**
260 - * Check whether user can view enrolled students content.
261 - *
262 - * @param int $user_id
263 - *
264 - * @return bool
265 - */
266 - private static function can_view_enrolled_students( int $user_id = 0 ): bool {
267 - if ( $user_id < 1 ) {
268 - $user_id = get_current_user_id();
269 - }
270 -
271 - if ( $user_id < 1 ) {
272 - return false;
273 - }
274 -
275 - $user_model = UserModel::find( $user_id, true );
276 - if ( ! $user_model instanceof UserModel ) {
277 - return false;
278 - }
279 -
280 - return $user_model->is_instructor();
281 - }
282 -
283 - /**
284 - * Resolve instructor_id from request by permission.
285 - * Admin can keep requested instructor_id; instructor is forced to self.
286 - *
287 - * @param array $data
288 - *
289 - * @return int
290 - */
291 - private static function resolve_instructor_id_for_request( array $data ): int {
292 - $current_user_id = get_current_user_id();
293 - if ( ! self::can_view_enrolled_students( $current_user_id ) ) {
294 - return 0;
295 - }
296 -
297 - $is_admin = user_can( $current_user_id, UserModel::ROLE_ADMINISTRATOR );
298 - if ( $is_admin ) {
299 - return max( 0, abs( LP_Helper::sanitize_params_submitted( $data['instructor_id'] ?? 0, 'int' ) ) );
300 - }
301 -
302 - return $current_user_id;
303 - }
304 -
305 - /**
306 253 * HTML builder: toolbar (course filter, search).
307 254 *
308 255 * @return string
309 256 */
@@ -313,51 +260,76 @@
313 260 $data_get = LP_Helper::sanitize_params_submitted( $_GET );
314 261 $selected_course = abs( LP_Helper::sanitize_params_submitted( $data_get['course_id'] ?? 0, 'int' ) );
315 262 $search_course = LP_Helper::sanitize_params_submitted( $data_get['course_name'] ?? '' );
316 263 $search_student = LP_Helper::sanitize_params_submitted( $data_get['search'] ?? '' );
317 - $search_start = self::sanitize_date_filter( $data_get['start_date'] ?? '' );
318 - $search_end = self::sanitize_date_filter( $data_get['end_date'] ?? '' );
264 + $search_start = lp_helper::sanitize_params_submitted( $data_get['start_date'] ?? '' );
265 + $search_end = lp_helper::sanitize_params_submitted( $data_get['end_date'] ?? '' );
319 266
320 - $section = array(
321 - 'wrap' => '<form class="lp-enrolled-students-table-toolbar lp-enrolled-students-form" onsubmit="return false;">',
322 - 'filter-row-open' => '<div class="lp-enrolled-students-table-toolbar__row lp-enrolled-students-table-toolbar__row--filters">',
323 - 'course-field-open' => '<div class="lp-enrolled-students-table-toolbar__field">',
324 - 'course-label' => '<label class="lp-enrolled-students-table-toolbar__label" for="lp-enrolled-filter-course-name">' . esc_html__( 'Course Filter', 'learnpress' ) . '</label>',
325 - 'course-input' => '<input id="lp-enrolled-filter-course-name" class="lp-enrolled-filter-course-name lp-enrolled-students-table-toolbar__input" type="text" name="course_name" list="lp-enrolled-course-list" value="' . esc_attr( $search_course ) . '" placeholder="' . esc_attr__( 'Search course...', 'learnpress' ) . '">',
326 - 'course-field-close' => '</div>',
327 - 'student-field-open' => '<div class="lp-enrolled-students-table-toolbar__field lp-enrolled-students-table-toolbar__field--student">',
328 - 'student-label' => '<label class="lp-enrolled-students-table-toolbar__label" for="lp-enrolled-search-input">' . esc_html__( 'Student', 'learnpress' ) . '</label>',
329 - 'student-input' => '<input id="lp-enrolled-search-input" class="lp-enrolled-search-input lp-enrolled-students-table-toolbar__input" type="text" name="search" value="' . esc_attr( $search_student ) . '" placeholder="' . esc_attr__( 'Enter student name or email', 'learnpress' ) . '">',
330 - 'student-field-close' => '</div>',
331 - 'start-field-open' => '<div class="lp-enrolled-students-table-toolbar__field lp-enrolled-students-table-toolbar__field--date">',
332 - 'start-label' => '<label class="lp-enrolled-students-table-toolbar__label" for="lp-enrolled-filter-start-date">' . esc_html__( 'Start Date', 'learnpress' ) . '</label>',
333 - 'start-input' => '<input id="lp-enrolled-filter-start-date" class="lp-enrolled-filter-start-date lp-enrolled-students-table-toolbar__input" type="date" name="start_date" value="' . esc_attr( $search_start ) . '" placeholder="mm/dd/yyyy">',
334 - 'start-field-close' => '</div>',
335 - 'end-field-open' => '<div class="lp-enrolled-students-table-toolbar__field lp-enrolled-students-table-toolbar__field--date">',
336 - 'end-label' => '<label class="lp-enrolled-students-table-toolbar__label" for="lp-enrolled-filter-end-date">' . esc_html__( 'End date', 'learnpress' ) . '</label>',
337 - 'end-input' => '<input id="lp-enrolled-filter-end-date" class="lp-enrolled-filter-end-date lp-enrolled-students-table-toolbar__input" type="date" name="end_date" value="' . esc_attr( $search_end ) . '" placeholder="mm/dd/yyyy">',
338 - 'end-field-close' => '</div>',
339 - 'filter-row-close' => '</div>',
340 - 'actions-open' => '<div class="lp-enrolled-students-table-toolbar__actions">',
341 - 'search-btn' => sprintf(
342 - '<button type="button" class="lp-button lp-enrolled-btn-search">%s</button>',
343 - esc_html__( 'Search', 'learnpress' )
344 - ),
345 - 'clear-btn' => sprintf(
346 - '<button type="button" class="lp-button lp-enrolled-btn-clear">%s</button>',
347 - esc_html__( 'Clear Filter', 'learnpress' )
348 - ),
349 - 'actions-close' => '</div>',
350 - 'wrap-end' => '</form>',
267 + $html_fields = sprintf(
268 + '<div class="filter-field">
269 + <label for="lp-enrolled-filter-course-name">%s</label>
270 + <input id="lp-enrolled-filter-course-name"
271 + class="lp-enrolled-filter-course-name"
272 + type="text"
273 + name="course_name"
274 + list="lp-enrolled-course-list"
275 + value="%s"
276 + placeholder="%s">
277 + </div>
278 + <div class="filter-field">
279 + <label for="lp-enrolled-search-input">%s</label>
280 + <input id="lp-enrolled-search-input"
281 + class="lp-enrolled-search-input"
282 + type="text"
283 + name="search" value="%s" placeholder="%s">
284 + </div>
285 + <div class="filter-field">
286 + <label for="lp-enrolled-filter-start-date">%s</label>
287 + <input id="lp-enrolled-filter-start-date"
288 + class="lp-enrolled-filter-start-date"
289 + type="date" name="start_date"
290 + value="%s"
291 + placeholder="mm/dd/yyyy">
292 + </div>
293 + <div class="filter-field">
294 + <label for="lp-enrolled-filter-end-date">%s</label>
295 + <input id="lp-enrolled-filter-end-date" class="lp-enrolled-filter-end-date" type="date" name="end_date" value="%s" placeholder="mm/dd/yyyy">
296 + </div>
297 + <datalist id="lp-enrolled-course-list">%s</datalist>',
298 + esc_html__( 'Course Filter', 'learnpress' ),
299 + esc_attr( $search_course ),
300 + esc_attr__( 'Search course...', 'learnpress' ),
301 + esc_html__( 'Student', 'learnpress' ),
302 + esc_attr( $search_student ),
303 + esc_attr__( 'Enter student name or email', 'learnpress' ),
304 + esc_html__( 'Start Date', 'learnpress' ),
305 + esc_attr( $search_start ),
306 + esc_html__( 'End date', 'learnpress' ),
307 + esc_attr( $search_end ),
308 + ''
351 309 );
352 - $section = apply_filters(
310 +
311 + $html_btn_actions = sprintf(
312 + '<button type="button" class="lp-button lp-enrolled-btn-search">%s</button>
313 + <button type="button" class="lp-button lp-enrolled-btn-clear">%s</button>',
314 + esc_html__( 'Search', 'learnpress' ),
315 + esc_html__( 'Clear Filter', 'learnpress' )
316 + );
317 +
318 + $html_toolbar = AdminTemplate::html_form_filter(
319 + array(
320 + 'form_classes' => 'lp-enrolled-students-form',
321 + 'fields' => $html_fields,
322 + 'btn_actions' => $html_btn_actions,
323 + )
324 + );
325 +
326 + return apply_filters(
353 327 'learn-press/admin/enrolled-students/toolbar/section',
354 - $section,
328 + $html_toolbar,
355 329 $courses,
356 - $selected_course,
330 + $selected_course
357 331 );
358 -
359 - return Template::combine_components( $section );
360 332 }
361 333
362 334 /**
363 335 * Render toolbar used inside View Students modal.
@@ -364,39 +336,48 @@
364 336 *
365 337 * @return string
366 338 */
367 339 public function html_toolbar_modal(): string {
340 + $html_fields = sprintf(
341 + '<div class="filter-field">
342 + <label for="lp-modal-enrolled-search-input">%s</label>
343 + <input id="lp-modal-enrolled-search-input"
344 + class="lp-enrolled-search-input"
345 + type="text" name="search" placeholder="%s">
346 + </div>
347 + <div class="filter-field">
348 + <label for="lp-modal-enrolled-filter-start-date">%s</label>
349 + <input id="lp-modal-enrolled-filter-start-date"
350 + class="lp-enrolled-filter-start-date"
351 + type="date" name="start_date" placeholder="mm/dd/yyyy">
352 + </div>
353 + <div class="filter-field">
354 + <label for="lp-modal-enrolled-filter-end-date">%s</label>
355 + <input id="lp-modal-enrolled-filter-end-date"
356 + class="lp-enrolled-filter-end-date"
357 + type="date" name="end_date" placeholder="mm/dd/yyyy">
358 + </div>',
359 + esc_html__( 'Student', 'learnpress' ),
360 + esc_attr__( 'Enter student name or email', 'learnpress' ),
361 + esc_html__( 'Start Date', 'learnpress' ),
362 + esc_html__( 'End Date', 'learnpress' )
363 + );
368 364
369 - $section = array(
370 - 'wrap' => '<form class="lp-enrolled-students-table-toolbar lp-enrolled-students-table-toolbar--modal lp-enrolled-students-form lp-enrolled-students-form--modal" id="lp-modal-enrolled-form" onsubmit="return false;">',
371 - 'filter-row-open' => '<div class="lp-enrolled-students-table-toolbar__row lp-enrolled-students-table-toolbar__row--filters">',
372 - 'student-field-open' => '<div class="lp-enrolled-students-table-toolbar__field lp-enrolled-students-table-toolbar__field--student">',
373 - 'student-label' => '<label class="lp-enrolled-students-table-toolbar__label" for="lp-modal-enrolled-search-input">' . esc_html__( 'Student', 'learnpress' ) . '</label>',
374 - 'student-input' => '<input id="lp-modal-enrolled-search-input" class="lp-enrolled-search-input lp-enrolled-students-table-toolbar__input" type="text" name="search" placeholder="' . esc_attr__( 'Enter student name or email', 'learnpress' ) . '">',
375 - 'student-field-close' => '</div>',
376 - 'start-field-open' => '<div class="lp-enrolled-students-table-toolbar__field lp-enrolled-students-table-toolbar__field--date">',
377 - 'start-label' => '<label class="lp-enrolled-students-table-toolbar__label" for="lp-modal-enrolled-filter-start-date">' . esc_html__( 'Start Date', 'learnpress' ) . '</label>',
378 - 'start-input' => '<input id="lp-modal-enrolled-filter-start-date" class="lp-enrolled-filter-start-date lp-enrolled-students-table-toolbar__input" type="date" name="start_date" placeholder="mm/dd/yyyy">',
379 - 'start-field-close' => '</div>',
380 - 'end-field-open' => '<div class="lp-enrolled-students-table-toolbar__field lp-enrolled-students-table-toolbar__field--date">',
381 - 'end-label' => '<label class="lp-enrolled-students-table-toolbar__label" for="lp-modal-enrolled-filter-end-date">' . esc_html__( 'End Date', 'learnpress' ) . '</label>',
382 - 'end-input' => '<input id="lp-modal-enrolled-filter-end-date" class="lp-enrolled-filter-end-date lp-enrolled-students-table-toolbar__input" type="date" name="end_date" placeholder="mm/dd/yyyy">',
383 - 'end-field-close' => '</div>',
384 - 'filter-row-close' => '</div>',
385 - 'actions-open' => '<div class="lp-enrolled-students-table-toolbar__actions">',
386 - 'search-btn' => sprintf(
387 - '<button type="button" class="lp-button lp-enrolled-btn-search-modal">%s</button>',
388 - esc_html__( 'Search', 'learnpress' )
389 - ),
390 - 'clear-btn' => sprintf(
391 - '<button type="button" class="lp-button lp-enrolled-btn-clear-modal">%s</button>',
392 - esc_html__( 'Clear Filter', 'learnpress' )
393 - ),
394 - 'actions-close' => '</div>',
395 - 'wrap-end' => '</form>',
365 + $html_btn_actions = sprintf(
366 + '<button type="button" class="lp-button lp-enrolled-btn-search-modal">%s</button>
367 + <button type="button" class="lp-button lp-enrolled-btn-clear-modal">%s</button>',
368 + esc_html__( 'Search', 'learnpress' ),
369 + esc_html__( 'Clear Filter', 'learnpress' )
396 370 );
397 371
398 - return Template::combine_components( $section );
372 + return AdminTemplate::html_form_filter(
373 + array(
374 + 'id' => 'lp-modal-enrolled-form',
375 + 'form_classes' => 'lp-enrolled-students-form lp-enrolled-students-form--modal lp-enrolled-students-table-toolbar--modal',
376 + 'fields' => $html_fields,
377 + 'btn_actions' => $html_btn_actions,
378 + )
379 + );
399 380 }
400 381
401 382 /**
402 383 * Render lp-target layout used in View Students modal.
@@ -473,9 +454,12 @@
473 454 private function html_table( array $rows, array $meta ): string {
474 455 if ( empty( $rows ) ) {
475 456 $section_empty = array(
476 457 'wrap' => '<div class="lp-enrolled-students-table-wrap">',
477 - 'empty' => '<div class="lp-enrolled-empty"><p>' . esc_html__( 'No students found.', 'learnpress' ) . '</p></div>',
458 + 'empty' => sprintf(
459 + '<div class="lp-enrolled-empty"><p>%s</p></div>',
460 + esc_html__( 'No students found.', 'learnpress' )
461 + ),
478 462 'wrap-end' => '</div>',
479 463 );
480 464 $section_empty = apply_filters(
481 465 'learn-press/admin/enrolled-students/table/empty/section',
@@ -609,9 +593,11 @@
609 593 $graduation = $userCourseModel->get_graduation();
610 594 $status_raw = $graduation !== UserItemModel::GRADUATION_IN_PROGRESS
611 595 ? $userCourseModel->get_graduation()
612 596 : $userCourseModel->get_status();
613 - $status_label = ucfirst( str_replace( array( '-', '_' ), ' ', $status_raw ) );
597 + $status_label = $graduation !== UserItemModel::GRADUATION_IN_PROGRESS
598 + ? $userCourseModel->get_graduation_label()
599 + : $userCourseModel->get_status_label();
614 600 $badge_class = 'lp-badge--' . sanitize_html_class( $status_raw );
615 601
616 602 // Date.
617 603 $date = UserCourseTemplate::instance()->html_start_date_time( $userCourseModel, false );
@@ -622,9 +608,9 @@
622 608 }
623 609
624 610 $section = array(
625 611 'row' => '<tr>',
626 - 'student-cell-open' => '<td class="lp-cell-student">',
612 + 'student-cell-open' => '<td><div class="lp-cell-student">',
627 613 'avatar' => SingleInstructorTemplate::instance()->html_avatar( $userModel ),
628 614 'meta-open' => '<div class="lp-meta">',
629 615 'name' => sprintf(
630 616 '<span class="lp-name">%s</span>',
@@ -634,9 +620,9 @@
634 620 '<span class="lp-email">%s</span>',
635 621 esc_html( $userModel->get_email() )
636 622 ),
637 623 'meta-close' => '</div>',
638 - 'student-cell-close' => '</td>',
624 + 'student-cell-close' => '</div></td>',
639 625 'course-cell' => sprintf(
640 626 '<td class="lp-cell-course"><a href="%s">%s</a></td>',
641 627 esc_url_raw( $courseModel->get_permalink() ),
642 628 $courseModel->get_title()
@@ -724,26 +710,6 @@
724 710 $total_pages
725 711 );
726 712
727 713 return Template::combine_components( $section );
728 - }
729 -
730 - /**
731 - * Sanitize date filter value in Y-m-d format.
732 - *
733 - * @param string $date
734 - *
735 - * @return string
736 - */
737 - private static function sanitize_date_filter( $date ): string {
738 - if ( ! is_scalar( $date ) ) {
739 - return '';
740 - }
741 -
742 - $date = LP_Helper::sanitize_params_submitted( (string) $date );
743 - if ( preg_match( '/^\d{4}-\d{2}-\d{2}$/', $date ) ) {
744 - return $date;
745 - }
746 -
747 - return '';
748 714 }
749 715 }