Instantly share code, notes, and snippets.
Created
November 11, 2012 21:42
-
Star
0
(0)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
Save gicolek/4056363 to your computer and use it in GitHub Desktop.
Poprawiona klasa
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
* To change this template, choose Tools | Templates | |
* and open the template in the editor. | |
*/ | |
/** | |
* Description of exp_menu | |
* | |
* @author oem | |
*/ | |
class Own_Exp_Menu extends Walker_Nav_Menu { | |
/** | |
* @see Walker::$tree_type | |
* @since 3.0.0 | |
* @var string | |
*/ | |
var $tree_type = array( 'post_type', 'taxonomy', 'custom' ); | |
/** | |
* @see Walker::$db_fields | |
* @since 3.0.0 | |
* @todo Decouple this. | |
* @var array | |
*/ | |
var $db_fields = array( 'parent' => 'menu_item_parent', 'id' => 'db_id' ); | |
function display_element($element, &$children_elements, $max_depth, $depth = 0, $args, &$output) { | |
if ( !$element ) | |
return; | |
$id_field = $this->db_fields['id']; | |
//display this element | |
if ( is_array( $args[0] ) ) | |
$args[0]['has_children'] = !empty( $children_elements[$element->$id_field] ); | |
// Adds the 'parent' class to the current item if it has children | |
if ( !empty( $children_elements[$element->$id_field] ) ) { | |
array_push( $element->classes, 'has-child' ); | |
} | |
$cb_args = array_merge( array( &$output, $element, $depth ), $args ); | |
call_user_func_array( array( &$this, 'start_el' ), $cb_args ); | |
$id = $element->$id_field; | |
// descend only when the depth is right and there are childrens for this element | |
if ( ($max_depth == 0 || $max_depth > $depth + 1 ) && isset( $children_elements[$id] ) ) { | |
foreach ( $children_elements[$id] as $child ) { | |
if ( !isset( $newlevel ) ) { | |
$newlevel = true; | |
//start the child delimiter | |
$cb_args = array_merge( array( &$output, $depth ), $args ); | |
call_user_func_array( array( &$this, 'start_lvl' ), $cb_args ); | |
} | |
$this->display_element( $child, $children_elements, $max_depth, $depth + 1, $args, $output ); | |
} | |
unset( $children_elements[$id] ); | |
} | |
if ( isset( $newlevel ) && $newlevel ) { | |
//end the child delimiter | |
$cb_args = array_merge( array( &$output, $depth ), $args ); | |
call_user_func_array( array( &$this, 'end_lvl' ), $cb_args ); | |
} | |
//end this element | |
$cb_args = array_merge( array( &$output, $element, $depth ), $args ); | |
call_user_func_array( array( &$this, 'end_el' ), $cb_args ); | |
} | |
// add classes to ul sub-menus | |
function start_lvl(&$output, $depth) { | |
// depth dependent classes | |
$indent = ( $depth > 0 ? str_repeat( "\t", $depth ) : '' ); // code indent | |
$display_depth = ( $depth + 1); // because it counts the first submenu as 0 | |
$classes = array( | |
'sub-nav', | |
'nav', | |
'stacked', | |
'menu-depth-' . $display_depth | |
); | |
$class_names = implode( ' ', $classes ); | |
// build html | |
$output .= "\n" . $indent . '<ul class="' . $class_names . '">' . "\n"; | |
} | |
// add main/sub classes to li's and links | |
function start_el(&$output, $item, $depth, $args) { | |
global $wp_query; | |
$indent = ( $depth > 0 ? str_repeat( "\t", $depth ) : '' ); // code indent | |
// depth dependent classes | |
$depth_classes = array( | |
( $depth == 0 ? 'main-menu-item' : 'sub-menu-item' ), | |
( $depth >= 2 ? 'sub-sub-menu-item' : '' ), | |
( $depth % 2 ? 'menu-item-odd' : 'menu-item-even' ), | |
'menu-item-depth-' . $depth | |
); | |
$depth_class_names = esc_attr( implode( ' ', $depth_classes ) ); | |
// passed classes | |
$classes = empty( $item->classes ) ? array( ) : ( array ) $item->classes; | |
$class_names = esc_attr( implode( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) ) ); | |
// build html | |
$output .= $indent . '<li id="nav-menu-item-' . $item->ID . '" class="' . $depth_class_names . ' ' . $class_names . ' ' . $depth . '">'; | |
if ( in_array( 'has-child', $item->classes ) ) { | |
$output .= '<span class="sub-nav-toggle"></span>'; | |
} | |
// link attributes | |
$attributes = !empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) . '"' : ''; | |
$attributes .=!empty( $item->target ) ? ' target="' . esc_attr( $item->target ) . '"' : ''; | |
$attributes .=!empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) . '"' : ''; | |
$attributes .=!empty( $item->url ) ? ' href="' . esc_attr( $item->url ) . '"' : ''; | |
$attributes .= ' class="menu-link ' . ( $depth > 0 ? 'sub-menu-link' : 'main-menu-link' ) . '"'; | |
$item_output = sprintf( '%1$s<a%2$s>%3$s%4$s%5$s</a>%6$s', $args->before, $attributes, $args->link_before, apply_filters( 'the_title', $item->title, $item->ID ), $args->link_after, $args->after | |
); | |
// build html | |
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment