LLMS_Nav_Menus
LifterLMS Navigation Menus
Description Description
Source Source
File: includes/class.llms.nav.menus.php
class LLMS_Nav_Menus { /** * Constructor * @since 3.14.7 * @version 3.22.0 */ public function __construct() { // filter menu items on frontend to add real URLs to menu items add_filter( 'wp_nav_menu_objects', array( $this, 'filter_nav_items' ) ); // add meta box to the Appearance -> Menus screen on admin panel add_action( 'load-nav-menus.php', array( $this, 'add_metabox' ) ); // add LifterLMS menu item type section to customizer add_filter( 'customize_nav_menu_available_item_types', array( $this, 'customize_add_type' ) ); // add LifterLMS menu items links to the customizer add_filter( 'customize_nav_menu_available_items', array( $this, 'customize_add_items' ), 10, 4 ); // add active classes for nav items for catalog pages add_filter( 'wp_nav_menu_objects', array( $this, 'menu_item_classes' ) ); } /** * Add nav menu metabox * @return void * @since 3.14.7 * @version 3.14.7 */ public function add_metabox() { add_meta_box( 'llms-nav-menu', __( 'LifterLMS', 'lifterlms' ), array( $this, 'output' ), 'nav-menus', 'side', 'default' ); add_action( 'admin_print_footer_scripts', array( $this, 'output_scripts' ) ); } /** * Adds LifterLMS menu items to the customizer * @param array $items menu items * @param string $type requested menu item type * @param string $object requested menu item object * @param integer $page requested page number * @return array * @since 3.14.7 * @version 3.14.7 */ public function customize_add_items( $items = array(), $type = '', $object = '', $page = 0 ) { if ( 'llms_nav' !== $object ) { return $items; } foreach ( $this->get_nav_items() as $id => $data ) { $items[] = array( 'classes' => 'llms-nav-item-' . $id, 'id' => $id, 'title' => $data['title'], 'type_label' => __( 'Custom Link', 'lifterlms' ), 'url' => esc_url_raw( $data['url'] ), ); } return array_slice( $items, 10 * $page, 10 ); } /** * Add the LifterLMS menu item section to the customizer * @param array $types existing menu item types * @return array * @since 3.14.7 * @version 3.14.7 */ public function customize_add_type( $types ) { $types['llms_nav_menu_items'] = array( 'title' => _x( 'LifterLMS', 'customizer menu section title', 'lifterlms' ), 'type' => 'llms_nav', 'object' => 'llms_nav', ); return $types; } /** * Filters Nav Menu Items to convert #llms- urls into actual URLs * Also hides URLs that should only be available to logged in users * @param array $items nav menu items * @return array * @since 3.14.7 * @version 3.14.7 */ public function filter_nav_items( $items ) { $urls = array( '#llms-signout', '#llms-signin', ); foreach ( $items as $i => &$data ) { if ( in_array( $data->url, $urls ) ) { if ( '#llms-signin' === $data->url ) { if ( is_user_logged_in() ) { unset( $items[ $i ] ); } else { $data->url = llms_get_page_url( 'myaccount' ); } } elseif ( '#llms-signout' === $data->url ) { if ( is_user_logged_in() ) { $data->url = wp_logout_url( llms_get_page_url( 'myaccount' ) ); } else { unset( $items[ $i ] ); } } } } return $items; } /** * Retrieve a filtered array of custom LifterLMS nav menu items * @return array * @since 3.14.7 * @version 3.14.7 */ private function get_nav_items() { $items = array(); foreach ( LLMS_Student_Dashboard::get_tabs() as $id => $data ) { if ( ! empty( $data['nav_item'] ) ) { $items[ $id ] = array( 'url' => $data['endpoint'] ? llms_get_endpoint_url( $data['endpoint'], '', llms_get_page_url( 'myaccount' ) ) : $data['url'], 'label' => $data['title'], 'title' => $data['title'], ); } } $items['signin'] = array( 'url' => '#llms-signin', 'label' => __( 'Sign In', 'lifterlms' ), 'title' => __( 'Sign In', 'lifterlms' ), ); $items['signout'] = array( 'url' => '#llms-signout', 'label' => __( 'Sign Out', 'lifterlms' ), 'title' => __( 'Sign Out', 'lifterlms' ), ); return apply_filters( 'llms_nav_menu_items', $items ); } /** * Add "active" classes to menu items for LLMS catalog pages * @param array $menu_items menu items * @return array * @since 3.22.0 * @version 3.22.0 */ public function menu_item_classes( $menu_items ) { if ( ! is_lifterlms() ) { return $menu_items; } $courses_id = llms_get_page_id( 'courses' ); $memberships_id = llms_get_page_id( 'memberships' ); $blog_id = get_option( 'page_for_posts' ); foreach ( $menu_items as $key => $item ) { $classes = $item->classes; // remove active class from blog archive if ( $blog_id == $item->object_id ) { $menu_items[ $key ]->current = false; foreach ( array( 'current_page_parent', 'current-menu-item' ) as $class ) { if ( in_array( $class, $classes ) ) { unset( $classes[ array_search( $class, $classes ) ] ); } } } elseif ( 'page' === $item->object && ( ( is_courses() && $courses_id == $item->object_id ) || ( is_memberships() && $memberships_id == $item->object_id ) ) ) { $menu_items[ $key ]->current = true; $classes[] = 'current-menu-item'; $classes[] = 'current_page_item'; // set parent links for courses & memberships } elseif ( ( $courses_id == $item->object_id && ( is_singular( 'course' ) || is_course_taxonomy() ) ) || ( $memberships_id == $item->object_id && ( is_singular( 'llms_membership' ) || is_membership_taxonomy() ) ) ) { $classes[] = 'current_page_parent'; } $menu_items[ $key ]->classes = array_unique( $classes ); } return $menu_items; } /** * Output the metabox * @return void * @since 3.14.7 * @version 3.24.0 */ public function output() { ?> <div id="posttype-llms-nav-items" class="posttypediv"> <div id="tabs-panel-llms-nav-items" class="tabs-panel tabs-panel-active"> <ul id="llms-nav-items-checklist" class="categorychecklist form-no-clear"> <?php $i = -1; foreach ( $this->get_nav_items() as $key => $data ) : ?> <li> <label class="menu-item-title"> <input type="checkbox" class="menu-item-checkbox" name="menu-item[<?php echo esc_attr( $i ); ?>][menu-item-object-id]" value="<?php echo esc_attr( $i ); ?>" /> <?php echo esc_html( $data['label'] ); ?> </label> <input type="hidden" class="menu-item-type" name="menu-item[<?php echo esc_attr( $i ); ?>][menu-item-type]" value="custom" /> <input type="hidden" class="menu-item-title" name="menu-item[<?php echo esc_attr( $i ); ?>][menu-item-title]" value="<?php echo esc_html( $data['title'] ); ?>" /> <input type="hidden" class="menu-item-url" name="menu-item[<?php echo esc_attr( $i ); ?>][menu-item-url]" value="<?php echo esc_url( $data['url'] ); ?>" /> <input type="hidden" class="menu-item-classes" name="menu-item[<?php echo esc_attr( $i ); ?>][menu-item-classes]" value="<?php echo esc_attr( 'llms-nav-item-' . $key ); ?>" /> </li> <?php $i--; endforeach; ?> </ul> </div> <p class="button-controls"> <span class="list-controls"> <a href="<?php echo admin_url( 'nav-menus.php?page-tab=all&selectall=1#posttype-llms-nav-items' ); ?>" class="select-all"><?php _e( 'Select all', 'lifterlms' ); ?></a> </span> <span class="add-to-menu"> <input type="submit" class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e( 'Add to menu', 'lifterlms' ); ?>" name="add-post-type-menu-item" id="submit-posttype-llms-nav-items"> <span class="spinner"></span> </span> </p> </div> <?php } /** * Output JS to ensure that users don't edit the #llms-signout URL that's replaced dynamically with an actual signout link * @return void * @since 3.14.7 * @version 3.14.7 */ public function output_scripts() { ?> <script type="text/javascript"> jQuery( '#menu-to-edit' ).on( 'click', 'a.item-edit', function() { var $settings = jQuery(this).closest( '.menu-item-bar' ).next( '.menu-item-settings' ), $url = $settings.find( '.edit-menu-item-url' ); if ( 0 === $url.val().indexOf( '#llms-sign' ) ) { $url.closest( 'p.field-url' ).css( 'display', 'none' ); } } ); </script> <?php } }
Expand full source code Collapse full source code View on GitHub
Changelog Changelog
Version | Description |
---|---|
3.14.7 | Introduced. |
Methods Methods
- __construct — Constructor
- add_metabox — Add nav menu metabox
- customize_add_items — Adds LifterLMS menu items to the customizer
- customize_add_type — Add the LifterLMS menu item section to the customizer
- filter_nav_items — Filters Nav Menu Items to convert #llms- urls into actual URLs Also hides URLs that should only be available to logged in users
- get_nav_items — Retrieve a filtered array of custom LifterLMS nav menu items
- menu_item_classes — Add "active" classes to menu items for LLMS catalog pages
- output — Output the metabox
- output_scripts — Output JS to ensure that users don't edit the #llms-signout URL that's replaced dynamically with an actual signout link
User Contributed Notes User Contributed Notes
Permalink: