Tambahkan walker khusus ke menu yang dibuat di widget

10

Saya tahu cara menambahkan Walker ke menu kustom yang dibuat oleh tema (menu yang disebutkan primarydalam contoh ini), tetapi bagaimana saya bisa menargetkan menu yang dibuat dalam widget dengan widget menu kustom wordpress standar?

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

}
amy
sumber

Jawaban:

14

Jika Anda melihat implementasi WP_Nav_Menu_Widgetkelas Anda akan melihat kode berikut:

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

Ini berarti bahwa tidak ada peluang untuk menghubungkan menu. Jadi, Anda perlu melihat wp_nav_menuimplementasi fungsi, di mana Anda dapat menemukan baris kode berikut:

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

Di sini Anda dapat melihat bahwa semua argumen yang diteruskan ke wp_nav_menufungsi dapat diganti. Jadi yang Anda butuhkan adalah membuat hook handler Anda sendiri yang akan menambahkan walker Anda ke menu navigasi. Ini bisa sederhana seperti:

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' );
Eugene Manuilov
sumber
ini bagus, terima kasih. Sepertinya ini membuat default untuk semua menu. Apakah saya benar untuk menganggap bahwa ketika saya menggunakan ini saya terjebak dengan semua menu memiliki alat bantu ini? karena saya mencoba 'walker' => new Walker_Nav_Menu()argumen dari menu spesifik saya untuk menimpanya lagi menjadi walker default wordpress hanya untuk satu menu, tetapi sayangnya ini tidak berhasil.
amy
@amy ya itu akan menjadi standar untuk semua menu.
Eugene Manuilov
@amy Anda dapat memasukkan kode untuk memeriksa argumen. Kemudian berikan tanda "if" apakah Anda menggunakan alat bantu jalan atau tidak.
Wayne
4

Memperluas jawaban @ Eugene, jika Anda ingin membatasi ini pada menu tertentu, cukup periksa ID istilah menu:

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');
Yaron
sumber
Bagaimana kami memfilter menurut sidebar id?
Steven Vachon
1

Ini adalah alternatif untuk menargetkan menu term_iddan saya pikir ini mungkin berguna bagi seseorang sebagai cara memodifikasi beberapa menu tanpa harus mencari id mereka.

Dengan menambahkan print_r($args)ke filter, saya perhatikan bahwa itu $args['menu']adalah string untuk menu di lokasi tema yang telah ditentukan dan WP_Term_Objectuntuk widget menu khusus di bilah sisi.

Saya menggunakan ini untuk menargetkan menu dengan siput dan menambahkan kelas ke wadah mereka. Sejumlah menu dapat ditargetkan dengan memasukkan string umum ke siput mereka. Catatan: menu slug berasal dari kunci array di 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' );

Untuk satu menu, Anda hanya perlu memeriksa $args['menu']->{slug} == 'your-slug'bukan strpos () bit di atas.

Jon
sumber
1

Anda dapat menambahkan custom walker ke menu nav yang dibuat di widget menggunakan widget_nav_menu_argsfilter yang ditambahkan di wordpress 4.2.0. Ia menerima empat argumen (lihat wp-includes/widgets/class-wp-nav-menu-widget.php). Tetapi untuk menambahkan walker khusus, Anda hanya perlu menggunakan argumen pertama, seperti halnya Anda menggunakan wp_nav_menu_argsfilter.

    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(),
       ) );
    }
seleness
sumber