mirror of
https://github.com/WordPress/WordPress.git
synced 2024-12-26 11:08:06 +01:00
0860bb2771
Prior to about 2013, many class methods lacked even access modifiers which made the `@access` notations that much more useful. Now that we've gotten to a point where the codebase is more mature from a maintenance perspective and we can finally remove these notations. Notable exceptions to this change include standalone functions notated as private as well as some classes still considered to represent "private" APIs. See #41452. Built from https://develop.svn.wordpress.org/trunk@41162 git-svn-id: http://core.svn.wordpress.org/trunk@41002 1a063a9b-81f0-0310-95a4-ce76da25c4cd
265 lines
8.2 KiB
PHP
265 lines
8.2 KiB
PHP
<?php
|
|
/**
|
|
* Nav Menu API: Walker_Nav_Menu class
|
|
*
|
|
* @package WordPress
|
|
* @subpackage Nav_Menus
|
|
* @since 4.6.0
|
|
*/
|
|
|
|
/**
|
|
* Core class used to implement an HTML list of nav menu items.
|
|
*
|
|
* @since 3.0.0
|
|
*
|
|
* @see Walker
|
|
*/
|
|
class Walker_Nav_Menu extends Walker {
|
|
/**
|
|
* What the class handles.
|
|
*
|
|
* @since 3.0.0
|
|
* @var string
|
|
*
|
|
* @see Walker::$tree_type
|
|
*/
|
|
public $tree_type = array( 'post_type', 'taxonomy', 'custom' );
|
|
|
|
/**
|
|
* Database fields to use.
|
|
*
|
|
* @since 3.0.0
|
|
* @todo Decouple this.
|
|
* @var array
|
|
*
|
|
* @see Walker::$db_fields
|
|
*/
|
|
public $db_fields = array( 'parent' => 'menu_item_parent', 'id' => 'db_id' );
|
|
|
|
/**
|
|
* Starts the list before the elements are added.
|
|
*
|
|
* @since 3.0.0
|
|
*
|
|
* @see Walker::start_lvl()
|
|
*
|
|
* @param string $output Passed by reference. Used to append additional content.
|
|
* @param int $depth Depth of menu item. Used for padding.
|
|
* @param stdClass $args An object of wp_nav_menu() arguments.
|
|
*/
|
|
public function start_lvl( &$output, $depth = 0, $args = array() ) {
|
|
if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) {
|
|
$t = '';
|
|
$n = '';
|
|
} else {
|
|
$t = "\t";
|
|
$n = "\n";
|
|
}
|
|
$indent = str_repeat( $t, $depth );
|
|
|
|
// Default class.
|
|
$classes = array( 'sub-menu' );
|
|
|
|
/**
|
|
* Filters the CSS class(es) applied to a menu list element.
|
|
*
|
|
* @since 4.8.0
|
|
*
|
|
* @param array $classes The CSS classes that are applied to the menu `<ul>` element.
|
|
* @param stdClass $args An object of `wp_nav_menu()` arguments.
|
|
* @param int $depth Depth of menu item. Used for padding.
|
|
*/
|
|
$class_names = join( ' ', apply_filters( 'nav_menu_submenu_css_class', $classes, $args, $depth ) );
|
|
$class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';
|
|
|
|
$output .= "{$n}{$indent}<ul $class_names>{$n}";
|
|
}
|
|
|
|
/**
|
|
* Ends the list of after the elements are added.
|
|
*
|
|
* @since 3.0.0
|
|
*
|
|
* @see Walker::end_lvl()
|
|
*
|
|
* @param string $output Passed by reference. Used to append additional content.
|
|
* @param int $depth Depth of menu item. Used for padding.
|
|
* @param stdClass $args An object of wp_nav_menu() arguments.
|
|
*/
|
|
public function end_lvl( &$output, $depth = 0, $args = array() ) {
|
|
if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) {
|
|
$t = '';
|
|
$n = '';
|
|
} else {
|
|
$t = "\t";
|
|
$n = "\n";
|
|
}
|
|
$indent = str_repeat( $t, $depth );
|
|
$output .= "$indent</ul>{$n}";
|
|
}
|
|
|
|
/**
|
|
* Starts the element output.
|
|
*
|
|
* @since 3.0.0
|
|
* @since 4.4.0 The {@see 'nav_menu_item_args'} filter was added.
|
|
*
|
|
* @see Walker::start_el()
|
|
*
|
|
* @param string $output Passed by reference. Used to append additional content.
|
|
* @param WP_Post $item Menu item data object.
|
|
* @param int $depth Depth of menu item. Used for padding.
|
|
* @param stdClass $args An object of wp_nav_menu() arguments.
|
|
* @param int $id Current item ID.
|
|
*/
|
|
public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
|
|
if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) {
|
|
$t = '';
|
|
$n = '';
|
|
} else {
|
|
$t = "\t";
|
|
$n = "\n";
|
|
}
|
|
$indent = ( $depth ) ? str_repeat( $t, $depth ) : '';
|
|
|
|
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
|
|
$classes[] = 'menu-item-' . $item->ID;
|
|
|
|
/**
|
|
* Filters the arguments for a single nav menu item.
|
|
*
|
|
* @since 4.4.0
|
|
*
|
|
* @param stdClass $args An object of wp_nav_menu() arguments.
|
|
* @param WP_Post $item Menu item data object.
|
|
* @param int $depth Depth of menu item. Used for padding.
|
|
*/
|
|
$args = apply_filters( 'nav_menu_item_args', $args, $item, $depth );
|
|
|
|
/**
|
|
* Filters the CSS class(es) applied to a menu item's list item element.
|
|
*
|
|
* @since 3.0.0
|
|
* @since 4.1.0 The `$depth` parameter was added.
|
|
*
|
|
* @param array $classes The CSS classes that are applied to the menu item's `<li>` element.
|
|
* @param WP_Post $item The current menu item.
|
|
* @param stdClass $args An object of wp_nav_menu() arguments.
|
|
* @param int $depth Depth of menu item. Used for padding.
|
|
*/
|
|
$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) );
|
|
$class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';
|
|
|
|
/**
|
|
* Filters the ID applied to a menu item's list item element.
|
|
*
|
|
* @since 3.0.1
|
|
* @since 4.1.0 The `$depth` parameter was added.
|
|
*
|
|
* @param string $menu_id The ID that is applied to the menu item's `<li>` element.
|
|
* @param WP_Post $item The current menu item.
|
|
* @param stdClass $args An object of wp_nav_menu() arguments.
|
|
* @param int $depth Depth of menu item. Used for padding.
|
|
*/
|
|
$id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args, $depth );
|
|
$id = $id ? ' id="' . esc_attr( $id ) . '"' : '';
|
|
|
|
$output .= $indent . '<li' . $id . $class_names .'>';
|
|
|
|
$atts = array();
|
|
$atts['title'] = ! empty( $item->attr_title ) ? $item->attr_title : '';
|
|
$atts['target'] = ! empty( $item->target ) ? $item->target : '';
|
|
$atts['rel'] = ! empty( $item->xfn ) ? $item->xfn : '';
|
|
$atts['href'] = ! empty( $item->url ) ? $item->url : '';
|
|
|
|
/**
|
|
* Filters the HTML attributes applied to a menu item's anchor element.
|
|
*
|
|
* @since 3.6.0
|
|
* @since 4.1.0 The `$depth` parameter was added.
|
|
*
|
|
* @param array $atts {
|
|
* The HTML attributes applied to the menu item's `<a>` element, empty strings are ignored.
|
|
*
|
|
* @type string $title Title attribute.
|
|
* @type string $target Target attribute.
|
|
* @type string $rel The rel attribute.
|
|
* @type string $href The href attribute.
|
|
* }
|
|
* @param WP_Post $item The current menu item.
|
|
* @param stdClass $args An object of wp_nav_menu() arguments.
|
|
* @param int $depth Depth of menu item. Used for padding.
|
|
*/
|
|
$atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args, $depth );
|
|
|
|
$attributes = '';
|
|
foreach ( $atts as $attr => $value ) {
|
|
if ( ! empty( $value ) ) {
|
|
$value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
|
|
$attributes .= ' ' . $attr . '="' . $value . '"';
|
|
}
|
|
}
|
|
|
|
/** This filter is documented in wp-includes/post-template.php */
|
|
$title = apply_filters( 'the_title', $item->title, $item->ID );
|
|
|
|
/**
|
|
* Filters a menu item's title.
|
|
*
|
|
* @since 4.4.0
|
|
*
|
|
* @param string $title The menu item's title.
|
|
* @param WP_Post $item The current menu item.
|
|
* @param stdClass $args An object of wp_nav_menu() arguments.
|
|
* @param int $depth Depth of menu item. Used for padding.
|
|
*/
|
|
$title = apply_filters( 'nav_menu_item_title', $title, $item, $args, $depth );
|
|
|
|
$item_output = $args->before;
|
|
$item_output .= '<a'. $attributes .'>';
|
|
$item_output .= $args->link_before . $title . $args->link_after;
|
|
$item_output .= '</a>';
|
|
$item_output .= $args->after;
|
|
|
|
/**
|
|
* Filters a menu item's starting output.
|
|
*
|
|
* The menu item's starting output only includes `$args->before`, the opening `<a>`,
|
|
* the menu item's title, the closing `</a>`, and `$args->after`. Currently, there is
|
|
* no filter for modifying the opening and closing `<li>` for a menu item.
|
|
*
|
|
* @since 3.0.0
|
|
*
|
|
* @param string $item_output The menu item's starting HTML output.
|
|
* @param WP_Post $item Menu item data object.
|
|
* @param int $depth Depth of menu item. Used for padding.
|
|
* @param stdClass $args An object of wp_nav_menu() arguments.
|
|
*/
|
|
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
|
|
}
|
|
|
|
/**
|
|
* Ends the element output, if needed.
|
|
*
|
|
* @since 3.0.0
|
|
*
|
|
* @see Walker::end_el()
|
|
*
|
|
* @param string $output Passed by reference. Used to append additional content.
|
|
* @param WP_Post $item Page data object. Not used.
|
|
* @param int $depth Depth of page. Not Used.
|
|
* @param stdClass $args An object of wp_nav_menu() arguments.
|
|
*/
|
|
public function end_el( &$output, $item, $depth = 0, $args = array() ) {
|
|
if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) {
|
|
$t = '';
|
|
$n = '';
|
|
} else {
|
|
$t = "\t";
|
|
$n = "\n";
|
|
}
|
|
$output .= "</li>{$n}";
|
|
}
|
|
|
|
} // Walker_Nav_Menu
|