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

时间:2014-04-29 21:09:09

标签: php html wordpress menu

我在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;

}

然而,这只能通过使用&#34; term_id&#34;用于菜单。

尝试执行以下操作:if ($args->menu == 'menu-services') {无论出于何种原因都不起作用。我可以使用错误的过滤器吗?

1 个答案:

答案 0 :(得分:1)

<强> * UPDATE *

如果您想使用您的方法或功能 - 只需添加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;

}

原始答案:

我昨天回答了这个问题 - 请参阅我的回答here

基于您提供的link(来自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";
    }
    }

在您的管理区域中,转到外观&gt;菜单。 在屏幕的右上角,点击底行的“屏幕选项” - 确保选中“CSS Classes”。