Cum să verifici dacă un element de navigare are sub-elemente în WordPress

8 ian. 2013, 10:38:44
Vizualizări: 14.4K
Voturi: 5

Încerc să determin dacă un element are un subelement cu adâncimea 1 sau mai mare. Nu găsesc nicăieri dacă există vreo funcție/interogare pe care o pot scrie care să preia elementul curent, să verifice în baza de date dacă are subpagini și să returneze true.

Ceea ce vreau să fac cu asta este să atribui elementului <li> o clasă diferită în funcție de faptul dacă elementul de meniu are un subelement.

Fragmentul din cod pentru ceea ce am realizat până acum:

if ($depth == 0) 
{
    if( /*pagina are subpagini*/ )
    {
            $class_names = $class_names ? ' class="menu-enable"' : '';
    }
    else
    {
            $class_names = $class_names ? '' : '';
    }
}
else
{
    $class_names = $class_names ? ' class="sub-menu-enable"' : '';
}

Acum am nevoie de un cod care să ruleze la pagina are subpagini. Cum pot detecta elementele părinte?

Editare:

Clasa completă personalizată Walker acum:

 class header_walker extends Walker_Nav_Menu
{
 /**
 * @see Walker::start_lvl()
 * @since 3.0.0
 *
 * @param string $output Passed by reference. Used to append additional content.
 * @param int $depth Depth of page. Used for padding.
 */
function start_lvl( &$output, $depth = 0, $args = array() ) {
    $indent = str_repeat("\t", $depth);
    $output .= "\n</li>$indent<div class=\"menu-items\"><div class=\"submenu-item\"><ul>\n";
}

/**
 * @see Walker::end_lvl()
 * @since 3.0.0
 *
 * @param string $output Passed by reference. Used to append additional content.
 * @param int $depth Depth of page. Used for padding.
 */
function end_lvl( &$output, $depth = 0, $args = array() ) {
    $indent = str_repeat("\t", $depth);
    $output .= "$indent</ul></div></div>\n";
}

/**
 * @see Walker::start_el()
 * @since 3.0.0
 *
 * @param string $output Passed by reference. Used to append additional content.
 * @param object $item Menu item data object.
 * @param int $depth Depth of menu item. Used for padding.
 * @param int $current_page Menu item ID.
 * @param object $args
 */
function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {

    $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

    $class_names = $value = '';
    $classes = empty( $item->classes ) ? array() : (array) $item->classes;
    $classes[] = 'menu-item-' . $item->ID;

    $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );
    $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';
            /*
    // valori ale adâncimii
    echo $item->title.' - ';
    echo $depth.'<br />';
    echo $class_names;

    if ($depth == 0) 
    {
        if( verifică dacă există subpagină )
        {
            $class_names = $class_names ? ' class="menu-enable"' : '';
        }
        else
        {
            $class_names = $class_names ? '' : '';
        }
    }
    else
    {
        $class_names = $class_names ? ' class="sub-menu-enable"' : '';
    }*/

    $output .= $indent . '<li' . $class_names .'>';

    $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        ) .'"' : '';

    $item_output = $args->before;
    $item_output .= '<a'. $attributes .'>';
    $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
    $item_output .= '</a>';
    $item_output .= $args->after;

    $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
}
/**
 * @see Walker::end_el()
 * @since 3.0.0
 *
 * @param string $output Passed by reference. Used to append additional content.
 * @param object $item Page data object. Not used.
 * @param int $depth Depth of page. Not Used.
 */
function end_el( &$output, $item, $depth = 0, $args = array() ) {
    $output .= "</li>\n";
}

}

0
Toate răspunsurile la întrebare 2
0

Poți filtra wp_nav_menu_objects și adăuga clasele dintr-o singură mișcare. Nici măcar nu ai nevoie de un walker personalizat pentru asta.

add_filter( 'wp_nav_menu_objects', 'add_has_children_to_nav_items' );

function add_has_children_to_nav_items( $items )
{
    $parents = wp_list_pluck( $items, 'menu_item_parent');

    foreach ( $items as $item )
        in_array( $item->ID, $parents ) && $item->classes[] = 'has-children';

    return $items;
}

Clasa has-children va fi acum atribuită automat elementelor li corespunzătoare.

Într-un walker personalizat, vei găsi clasa în $item->classes în funcția ta start_el(). Următoarele linii din walker-ul implicit vor face treaba:

$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );
$class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';
8 ian. 2013 11:28:22
0

Începând cu WordPress 3.7 (octombrie 2013), au fost adăugate clase CSS pentru a indica elementele și paginile copil în meniurile temelor — nu mai este nevoie să folosiți un walker personalizat, deoarece această funcționalitate este gestionată în nucleul WordPress.

Clasele CSS se numesc menu-item-has-children și page_item_has_children.

HTML-ul generat va arăta similar cu următorul exemplu (simplificat pentru claritate):

<ul>
    <li><a href="#">Acasă</a></li>
    <li class="menu-item-has-children"><a href="#">Despre</a>
        <ul class="sub-menu">
            <li><a href="#">Misiunea noastră</a></li>
        </ul>
    </li>
    <li><a href="#">Contact</a></li>
</ul>
8 oct. 2015 23:18:37