campusboy87
8/29/2018 - 6:12 PM

Пример создания своего Walker для БЭМ-меню

Пример создания своего Walker для БЭМ-меню

<?php

class Rohs_Walker_Menu extends Walker_Nav_Menu {
    /**
     * Формирует вложенный <ul> без внутренного содержимого и без </li>.
     *
     * @param string       $output
     * @param int          $depth
     * @param array|object $args
     */
    public function start_lvl( &$output, $depth = 0, $args = [] ) {
        $prefix = $args->container_class;
        $output .= "<ul class='{$prefix}__subMenu'>";
    }

    /**
     * Формирует тег <li> со всем внутренним содержимым без </li>.
     *
     * @param string       $output
     * @param WP_Post      $item
     * @param int          $depth
     * @param array|object $args
     * @param int          $id
     */
    public function start_el( &$output, $item, $depth = 0, $args = [], $id = 0 ) {
        $prefix   = $args->container_class;
        $is_white = get_field( 'white_font', $item ) && is_front_page();

        $li_class = "{$prefix}__item";
        $li_class .= $this->has_children ? " {$prefix}__item--expanded" : '';

        $output .= "<li class='{$li_class}'>";

        $atts           = [];
        $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 : '';

        $atts['class'] = ! empty( $atts['class'] ) ? $atts['class'] . " {$prefix}__link" : "{$prefix}__link";
        $atts['class'] .= $this->has_children ? " {$prefix}__link--expanded" : '';
        $atts['class'] .= $is_white ? " {$prefix}__link--white" : '';
        $atts['class'] .= ! empty( $args->a_class ) ? ' ' . $args->a_class : '';

        $attributes = '';
        foreach ( $atts as $attr => $value ) {
            if ( ! empty( $value ) ) {
                $value      = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
                $attributes .= ' ' . $attr . '="' . $value . '"';
            }
        }

        $title = apply_filters( 'the_title', $item->title, $item->ID );

        $output .= "<a {$attributes}>{$title}</a>";
    }
}