WordPress nav_menu-按菜单名称过滤带有条件语句的输出


WordPress nav_menu - Filter output with conditional statement by Menu Name?

我正在使用WordPress中的动态菜单作为小部件。我正在尝试过滤输出,以便在不依赖jQuery的情况下向<a>标记(而不是默认的父<li>)添加一个类。

我不想通过theme_location进行筛选,因为我根据页面切换菜单,无法将多个动态菜单分配到一个位置。

我想通过菜单名称来定位这些菜单。

到目前为止,我已经意识到wp_nav_menu在回答这个问题时的可用论据是什么:https://wordpress.stackexchange.com/questions/53950/add-a-custom-walkter-to-a-menu-created-in-a-widget

以下似乎运行良好:

add_filter('wp_nav_menu_items','replace_class', 10, 2);
function replace_class($items, $args) 
{
    if ($args->menu->term_id == '27') {
            $items = preg_replace('/<a/', '<a class="custom-class"', $items);
        }
    return $items;
}

然而,这只能通过对菜单使用"term_id"来实现。

无论出于什么原因,尝试做if ($args->menu == 'menu-services') {之类的事情都是行不通的。我用错过滤器了吗?

*更新*

如果你想使用你的方法或功能-只需添加slug

add_filter('wp_nav_menu_items','replace_class', 10, 2);
function replace_class($items, $args) 
{
    if ($args->menu->slug == 'your-menu-name') {
            $items = preg_replace('/<a/', '<a class="custom-class"', $items);
        }
    return $items;
}

原始答案:

我昨天回答了这个问题-在这里看我的回答

基于您提供的链接(来自wordpress stackexchange)添加此代码以将自定义助行器添加到小部件菜单:

function widget($args, $instance) {
    // Get menu
    $nav_menu = ! empty( $instance['nav_menu'] ) ? wp_get_nav_menu_object( $instance['nav_menu'] ) : false;
    if ( !$nav_menu )
        return;
    $instance['title'] = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );
    echo $args['before_widget'];
    if ( !empty($instance['title']) )
        echo $args['before_title'] . $instance['title'] . $args['after_title'];
    wp_nav_menu( array( 'fallback_cb' => '', 'menu' => $nav_menu ) );
    echo $args['after_widget'];
}
$defaults = array( 'menu' => '', 'container' => 'div', 'container_class' => '', 'container_id' => '', 'menu_class' => 'menu', 'menu_id' => '',
'echo' => true, 'fallback_cb' => 'wp_page_menu', 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '', 'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s</ul>',
'depth' => 0, 'walker' => '', 'theme_location' => '' );
$args = wp_parse_args( $args, $defaults );
$args = apply_filters( 'wp_nav_menu_args', $args );
$args = (object) $args;
function myplugin_custom_walker( $args ) {
    return array_merge( $args, array(
        'walker' => new Class_Name_Walker(),
        // another setting go here ... 
    ) );
}
add_filter( 'wp_nav_menu_args', 'myplugin_custom_walker' );

然后添加这个walker-它将类添加到a

class Class_Name_Walker extends Walker_Nav_Menu
    {
        /**
         * Start the element output.
         *
         * @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. May be used for padding.
         * @param  array $args    Additional strings.
         * @return void
         */
         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 ) . '"' : '';
        $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
        $id = $id ? ' id="' . esc_attr( $id ) . '"' : '';
        $output .= $indent . '<li' . $id . $value .'>';
        $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        : '';
        $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args );
        $attributes = '';
        foreach ( $atts as $attr => $value ) {
            if ( ! empty( $value ) ) {
                $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
                $attributes .= ' ' . $attr . '="' . $value . '"';
            }
        }
        $item_output = $args->before;
        $item_output .= '<a'. $attributes .$class_names.'>';
        $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";
    }
    }

在您的管理区域中,转到外观>菜单。在屏幕右上角,点击底部一行的"屏幕选项"-确保选中"CSS类"。