PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.8
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.8
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 4.1.7.3.1 4.1.7.3.2 4.2.0 All 139 releases
← All changes | inc/TemplateHooks/CourseBuilder/CourseBuilderTemplate.php +158 -15 4.3.74.4.8 View file →
@@ -416,9 +416,9 @@
416 416
417 417 $hide_instructor_access_admin_screen = LP_Settings::is_hide_instructor_access_admin_screen();
418 418 $wp_user = new WP_User( $userModel );
419 419 $is_instructor = user_can( $wp_user, UserModel::ROLE_INSTRUCTOR );
420 - $dashboard_url = admin_url();
420 + $dashboard_url = admin_url( 'edit.php?post_type=' . LP_COURSE_CPT );
421 421
422 422 $footer = [
423 423 'wrapper' => '<div class="lp-cb-sidebar__footer">',
424 424 ];
@@ -456,37 +456,180 @@
456 456 * @return string
457 457 * @since 4..0
458 458 */
459 459 protected function html_nav_item_main( $slug, $tab_data ) {
460 - $tab_current = CourseBuilder::get_menu_current();
461 - $is_active = $slug === $tab_current;
462 - $classes = [ 'lp-cb-sidebar__item', $slug ];
460 + $tab_current = CourseBuilder::get_menu_current();
461 + $sub_menu_items = $this->get_nav_item_sub_menu_items( $slug, $tab_data );
462 + $has_sub_menu = ! empty( $sub_menu_items );
463 + $has_active_submenu = $has_sub_menu && ! empty(
464 + array_filter(
465 + $sub_menu_items,
466 + static function ( array $item ): bool {
467 + return ! empty( $item['is_active'] );
468 + }
469 + )
470 + );
471 + $is_active = $slug === $tab_current || ! empty( $has_active_submenu );
472 + $classes = [ 'lp-cb-sidebar__item', $slug ];
463 473
474 + if ( $has_sub_menu ) {
475 + $classes[] = 'has-sub-menu';
476 + }
477 +
464 478 if ( $is_active ) {
465 479 $classes[] = 'is-active';
466 480 }
467 481
468 - $icon = isset( $tab_data['icon'] ) ? $tab_data['icon'] : '';
469 - $title = $tab_data['title'];
470 - $link = CourseBuilder::get_tab_link( $slug );
482 + if ( $has_sub_menu && $is_active ) {
483 + $classes[] = 'is-expanded';
484 + }
471 485
472 - $item = [
473 - 'wrapper' => sprintf( '<li class="%s">', implode( ' ', $classes ) ),
474 - 'content' => sprintf(
475 - '<a href="%s" title="%s" aria-label="%s">
476 - %s
477 - <span class="lp-cb-sidebar__item-title">%s</span>
486 + $icon = isset( $tab_data['icon'] ) ? $tab_data['icon'] : '';
487 + $title = $tab_data['title'];
488 + $link = CourseBuilder::get_tab_link( $slug );
489 + $sub_menu_id = 'lp-cb-sidebar-sub-menu-' . sanitize_html_class( $slug );
490 + $aria_current = $is_active && empty( $has_active_submenu ) ? ' aria-current="page"' : '';
491 +
492 + if ( $has_sub_menu ) {
493 + $content = sprintf(
494 + '<div class="lp-cb-sidebar__item-control">
495 + <a href="%1$s" class="lp-cb-sidebar__item-link" title="%2$s" aria-label="%2$s"%3$s>
496 + %4$s
497 + <span class="lp-cb-sidebar__item-title">%5$s</span>
498 + </a>
499 + <button type="button" class="lp-cb-sidebar__sub-menu-toggle" aria-label="%6$s" aria-expanded="%7$s" aria-controls="%8$s">
500 + <span class="dashicons dashicons-arrow-down-alt2" aria-hidden="true"></span>
501 + </button>
502 + </div>',
503 + esc_url( $link ),
504 + esc_attr( $title ),
505 + $aria_current,
506 + $icon,
507 + esc_html( $title ),
508 + esc_attr( sprintf( __( 'Toggle %s submenu', 'learnpress' ), $title ) ),
509 + $is_active ? 'true' : 'false',
510 + esc_attr( $sub_menu_id )
511 + );
512 + } else {
513 + $content = sprintf(
514 + '<a href="%1$s" class="lp-cb-sidebar__item-link" title="%2$s" aria-label="%2$s"%3$s>
515 + %4$s
516 + <span class="lp-cb-sidebar__item-title">%5$s</span>
478 517 </a>',
479 518 esc_url( $link ),
480 519 esc_attr( $title ),
481 - esc_attr( $title ),
520 + $aria_current,
482 521 $icon,
483 522 esc_html( $title )
484 - ),
523 + );
524 + }
525 +
526 + $item = [
527 + 'wrapper' => sprintf( '<li class="%s">', implode( ' ', $classes ) ),
528 + 'content' => $content,
485 529 'wrapper_end' => '</li>',
486 530 ];
487 531
532 + if ( $has_sub_menu ) {
533 + $item['content'] .= $this->html_nav_item_sub_menu( $sub_menu_items, $sub_menu_id, $title );
534 + }
535 +
488 536 return Template::combine_components( $item );
537 + }
538 +
539 + protected function get_nav_item_sub_menu_items( string $parent_slug, array $tab_data ): array {
540 + $items = [];
541 + if ( ! empty( $tab_data['sub_menu'] ) && is_array( $tab_data['sub_menu'] ) ) {
542 + $items = $this->normalize_nav_sub_menu_items( $parent_slug, $tab_data['sub_menu'] );
543 + }
544 +
545 + return $items;
546 + }
547 +
548 + protected function normalize_nav_sub_menu_items( string $parent_slug, array $sub_menu ): array {
549 + $is_admin = current_user_can( ADMIN_ROLE );
550 + $items = [];
551 +
552 + foreach ( $sub_menu as $key => $item ) {
553 + if ( ! is_array( $item ) || ( ! empty( $item['admin_only'] ) && ! $is_admin ) ) {
554 + continue;
555 + }
556 +
557 + $title = $item['title'] ?? '';
558 + if ( '' === $title ) {
559 + continue;
560 + }
561 +
562 + $slug = ! empty( $item['slug'] ) ? (string) $item['slug'] : ( is_string( $key ) ? $key : sanitize_title( $title ) );
563 + if ( '' === $slug ) {
564 + continue;
565 + }
566 +
567 + $url = $item['url'] ?? '';
568 + if ( '' === $url ) {
569 + $url = CourseBuilder::get_tab_link( $parent_slug, $slug );
570 + }
571 +
572 + if ( '' === $url ) {
573 + continue;
574 + }
575 +
576 + $is_active = false;
577 + if ( $parent_slug === CourseBuilder::get_menu_current() ) {
578 + $is_active = $slug === (string) CourseBuilder::get_item_id();
579 + }
580 +
581 + $items[] = [
582 + 'class' => is_string( $key ) ? $key : sanitize_title( $title ),
583 + 'icon' => $item['icon'] ?? '',
584 + 'is_active' => $is_active,
585 + 'rel' => ! empty( $item['target'] ) && '_blank' === $item['target'] ? 'noopener noreferrer' : '',
586 + 'slug' => $slug,
587 + 'target' => $item['target'] ?? '',
588 + 'title' => $title,
589 + 'url' => $url,
590 + ];
591 + }
592 +
593 + return $items;
594 + }
595 +
596 + protected function html_nav_item_sub_menu( array $sub_menu_items, string $sub_menu_id, string $parent_title = '' ): string {
597 + if ( empty( $sub_menu_items ) ) {
598 + return '';
599 + }
600 +
601 + $content = '';
602 +
603 + foreach ( $sub_menu_items as $item ) {
604 + $target = '' !== $item['target'] ? sprintf( ' target="%s"', esc_attr( $item['target'] ) ) : '';
605 + $rel = '' !== $item['rel'] ? sprintf( ' rel="%s"', esc_attr( $item['rel'] ) ) : '';
606 + $active_class = ! empty( $item['is_active'] ) ? ' is-active' : '';
607 + $aria_current = ! empty( $item['is_active'] ) ? ' aria-current="page"' : '';
608 +
609 + $content .= sprintf(
610 + '<li class="lp-cb-sidebar__sub-menu-item %1$s%2$s"><a href="%3$s" class="lp-cb-sidebar__sub-menu-link"%4$s%5$s%6$s>%7$s<span class="lp-cb-sidebar__sub-menu-title">%8$s</span></a></li>',
611 + esc_attr( sanitize_html_class( $item['class'] ) ),
612 + esc_attr( $active_class ),
613 + esc_url( $item['url'] ),
614 + $target,
615 + $rel,
616 + $aria_current,
617 + $item['icon'],
618 + esc_html( $item['title'] )
619 + );
620 + }
621 +
622 + if ( '' === $content ) {
623 + return '';
624 + }
625 +
626 + return sprintf(
627 + '<ul id="%1$s" class="lp-cb-sidebar__sub-menu" aria-label="%2$s">%3$s</ul>',
628 + esc_attr( $sub_menu_id ),
629 + esc_attr( sprintf( __( '%s submenu', 'learnpress' ), $parent_title ) ),
630 + $content
631 + );
489 632 }
490 633
491 634 public function html_btn_add_new() {
492 635 $tab_current = CourseBuilder::get_menu_current();