it-swarm.com.de

Fügen Sie Sie in ein Widget ein, das Sie erstellt haben

Ich weiß, wie man einen Walker zu einem benutzerdefinierten Menü hinzufügt, das vom Design erstellt wurde (Menü primary in diesem Beispiel), aber wie kann ich ein Menü, das in einem Widget erstellt wurde, mit dem standardmäßigen benutzerdefinierten WordPress-Menü-Widget ausrichten?

if ( has_nav_menu( 'primary' ) ) {

$args = array(
    'menu' => 'main-menu',
    'menu_id' => 'main-menu',
    'theme_location' => 'primary',
    'depth' => 0,
    'container' => false,
    'menu_class' => 'nav',
    'walker' => new Myprefix_Walker_Nav_Menu(),
    'echo' => 0
);

$nav = wp_nav_menu( $args );

}
9
amy

Wenn Sie sich die Implementierung der Klasse WP_Nav_Menu_Widget ansehen, sehen Sie den folgenden Code:

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'];
}

Dies bedeutet, dass es keine Möglichkeit gibt, ein Menü anzuhängen. Sie müssen sich also die Implementierung der Funktion wp_nav_menu ansehen, in der Sie folgende Codezeilen finden:

$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;

Hier sehen Sie, dass alle an die Funktion wp_nav_menu übergebenen Argumente ersetzt werden konnten. Sie müssen also einen eigenen Hook-Handler erstellen, der Ihren Walker zu einem Navigationsmenü hinzufügt. Es könnte so einfach sein:

function myplugin_custom_walker( $args ) {
    return array_merge( $args, array(
        'walker' => new My_Custom_Walker(),
        // another setting go here ... 
    ) );
}
add_filter( 'wp_nav_menu_args', 'myplugin_custom_walker' );
13
Eugene Manuilov

Wenn Sie die Antwort von @ Eugene auf ein bestimmtes Menü beschränken möchten, überprüfen Sie einfach die Term-ID des Menüs:

function custom_nav_args($args){
$menu = $args['menu'];
    if($menu->term_id === 17)  /* replace term_id with menu id, or use $menu->name to do it by menu name*/
    {
        $args['walker'] = new My_Custom_Walker();
    }
    return $args;
}
add_filter('wp_nav_menu_args', 'custom_nav_args');
3
Yaron

Sie können einem Navigationsmenü, das in einem Widget erstellt wurde, mit dem in WordPress widget_nav_menu_args hinzugefügten 4.2.0-Filter einen benutzerdefinierten Walker hinzufügen. Es akzeptiert vier Argumente (siehe wp-includes/widgets/class-wp-nav-menu-widget.php). Um jedoch nur einen benutzerdefinierten Walker hinzuzufügen, müssen Sie nur das erste Argument verwenden, genauso wie Sie den wp_nav_menu_args-Filter verwenden.

    add_filter('wp_nav_menu_args', 'my_args'); //for menus
    add_filter('widget_nav_menu_args', 'my_args'); //for menus in widgets
    function my_args($args) { //$args is only argument needed to add custom walker
       return array_merge( $args, array(
          'walker' => new My_Custom_Walker(),
       ) );
    }
0
celleness

Dies ist eine Alternative zum Anzielen eines Menüs mit term_id, und ich dachte, es könnte für jemanden nützlich sein, um mehrere Menüs zu ändern, ohne ihre IDs nachschlagen zu müssen.

Durch das Hinzufügen von print_r($args) zu einem Filter habe ich festgestellt, dass $args['menu'] eine Zeichenfolge für Menüs an vordefinierten Themenpositionen und WP_Term_Object für ein benutzerdefiniertes Menü-Widget in einer Seitenleiste ist.

Ich habe dies verwendet, um Menüs per Slug anzuvisieren und ihrem Container eine Klasse hinzuzufügen. Eine Reihe von Menüs können ausgewählt werden, indem eine gemeinsame Zeichenfolge in ihre Slugs eingefügt wird. Hinweis: Der Menü-Slug stammt aus der Array-Taste in register_nav_menus().

function my_menu_thingy( $args ) {
  if( is_object($args['menu']) && strpos($args['menu']->{slug},'my-common-string') !== false ) {
    $args['walker'] = new My_Custom_Walker();
  }
  return $args;
}
add_filter( 'wp_nav_menu_args', 'my_menu_thingy' );

Für ein einzelnes Menü müssten Sie nur den $args['menu']->{slug} == 'your-slug' anstelle des obigen strpos () -Bits überprüfen.

0
Jon