Walker personalizado: como obter o ID na função start_lvl


14

Estou fazendo meu primeiro andador personalizado a criar um menu de acordeão. Para começar, usei este exemplo: http://bitacre.com/2025/custom-nav-menu-walker-for-wordpress-themes

Existem duas funções. Primeiro start_lvl e depois start_el.

Em start_el, o ID get é implementado por $ item-> ID. Alguém sabe como eu posso fazer isso no start_lvl também? Preciso fornecer um ID (para a navegação de nível inferior) para que eu possa acionar o recolhimento no menu sanfona.

O que estou tentando gerar é algo como isto:

<a href="#collapse2">Titel 2</a>
<ul id="collapse2">Lower Level Menu 2</ul>
<a href="#collapse3">Titel 3</a>
<ul id="collapse3">Lower Level Menu  3</ul>

Meu código para a função start_lvl:

// add id's and classes to ul sub-menus
function start_lvl( &$output, $depth, $item ) {
    // depth dependent classes
    $indent = ( $depth > 0  ? str_repeat( "\t", $depth ) : '' ); // code indent
    $display_depth = ( $depth + 1); // because it counts the first submenu as 0
    $pgid = ; // How to get ID in here??
    $classes = array(
        'sub-menu',
        ( $display_depth == 1  ? 'accordion-body collapse' : '' ),
        ( $display_depth % 2  ? 'menu-odd' : 'menu-even' ),
        ( $display_depth >=2 ? 'sub-sub-menu' : '' ),
        'menu-depth-' . $display_depth
        );
    $ids = array(
        'collapse' . $pgid
        );
    $class_names = implode( ' ', $classes );
    $id_name = implode( ' ', $ids );

    // build html
    $output .= "\n" . $indent . '<ul id="' . $id_name . '" class="' . $class_names . '">' . "\n";
}

Respostas:


37

Eu só tinha que fazer isso em um dos meus temas ... Como você não tem acesso à variável $ item nessa fase do Walker, você deseja armazenar seu item atual em um escopo mais global no momento em que tem acesso a ele. O código a seguir fará mais sentido ... observação: eu retirei tudo, exceto o código relevante.

class ThemeTruck_Nav_Walker extends Walker_Nav_Menu {
   private $curItem;

  // retrieve the curItem
  function start_lvl(&$output, $depth = 0, $args = array()) {
    var_dump($this->curItem );
  }

  // store the curItem
  function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {
    $this->curItem = $item;
  }

 }

3
Esta é a solução mais elegante apresentada nesta discussão. Graças Lane!
Kevin C.

1
De fato, uma abordagem muito limpa que funciona bem. Muito Obrigado.
Isaac Gregson

1
Não tenho certeza, mas eu tenho que adicionar todo o código padrão para start_el para fazê-lo funcionar?
GDY

4
Ok, você pode simplesmente usar parent :: start_el ($ output, $ item, $ depth, $ args, $ id); na start_el ...
GDY

Brilhante, pretendia descobrir isso há séculos e isso funcionou imediatamente. Obrigado.
cfx 21/06

3

Eu tive um problema semelhante e o resolvi usando uma variável estática dentro da classe:

static protected $menu_lvl; 

E então no "display_element" eu incrementei a variável:

self::$menu_lvl++;

No meu código, referenciei na função start_lvl algo como isto:

$output .= "<ul id='level". self::$menu_lvl ."'>";

Isso não usa o ID da página, mas usa um ID exclusivo para instruções UL que podem ser referenciadas pelo javascript.

BTW - Isso é realmente útil apenas para acordeões aninhados ou menus suspensos aninhados clicáveis ​​no Roots Theme usando o Bootstrap para aplicativos móveis.


2

Você pode usar o seguinte filtro em sua start_elfunção e agrupar seu argumento em start_lvlfunção.

apply_filters( 'walker_nav_menu_start_lvl', $item_output, $item, $depth, $args->myarg=$item->title );

Por favor, deixe-me saber se funciona.


Obrigado por publicar! Espero encontrar algum tempo para resolver isso nos próximos dias, mas estou muito ocupado com meu estudo agora. Voltarei a você com o resultado!
Robert Bouten 17/09/12

0

Você pode simplesmente adicionar $ page ao argumento do caminhante personalizado:

class My_Custom_Walker extends Walker_page {
    function start_el(&$output, $page, $depth, $args, $current_page) {
        if ( $depth )
            $indent = str_repeat("\t", $depth);
        else
            $indent = '';

        extract($args, EXTR_SKIP);

        $output .= $indent . 
            '<li>
            <a style="color:red" href="' . get_page_link($page->ID) . '" title="' . 
            esc_attr( wp_strip_all_tags( apply_filters( 'the_title', $page->post_title, $page->ID ) ) ) . '">' . 
            $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>';

Experimente o exposto acima e, antes de ligar para wp_list_pages (), adicione a classe walker personalizada:

$MyWalker = new My_Custom_Walker();

Em seguida, nos argumentos para wp_list_pages:

wp_list_pages ('walker' => $ MyWalker)

Verifique e veja se a saída do andador está vermelha.


Isso está na função start_el, mas aparentemente é diferente no start_lvl porque não posso colocar as mesmas variáveis ​​lá. Ou pelo menos não a mesma ordem.
Robert Bouten

O que você está tentando fazer com start_lvl?
AlxVallejo 16/08/2012

Estou tentando fornecer ao <ul> um id = "collapse102" com 102 o ID da página gerada. Dessa forma, posso acioná-lo para recolhê-lo no meu menu de acordeão.
Robert Bouten

Adicionar o id = "collapse" funciona, mas não consigo fazê-lo funcionar para adicionar também o ID da página.
Robert Bouten

Você quer dizer que apenas os IDs específicos sejam recolhidos? Eu tenho uma árvore de acordeão para wp_list_pages e não preciso alterar o start_lvl.
AlxVallejo 16/08/2012
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.