Gerar um menu que exibe páginas filho usando wp_list_pages () com a nova funcionalidade de menu no WordPress 3.0?


10

Anteriormente, eu era capaz de carregar seletivamente páginas filho para uma página pai atualmente selecionada usando lógica como:

if(  $post->post_parent ) {
  $children = wp_list_pages("title_li=&child_of=".$post->post_parent."&echo=0");
} else {
  $children = wp_list_pages("title_li=&child_of=".$post->ID."&echo=0");
}

if ($children) { ?>
   <ul id="subnav">
     <?php echo $children; ?>
   </ul>
<?php 
} else {
}

Não parece haver uma maneira nativa de fazer isso usando a nova funcionalidade register_nav_menus () / wp_nav_menu (). Alguém sabe como eu poderia consertar isso juntos neste momento?

Aqui está uma captura de tela do que estou tentando alcançar:

Tela suspensa do menu filho


Isso é difícil, pois wp_nav_menu não se refere à hierarquia de páginas (ou mesmo a todas as páginas). Não sei o suficiente sobre menus para responder a isso agora, mas essa é uma pergunta muito interessante.
John P Bloch

Eu não entendo completamente a pergunta. O que você está tentando realizar? Eu vejo o código, mas não entendo o contexto. Tem um site que quer? Uma captura de tela?
precisa saber é o seguinte

Ele deseja adicionar itens filhos dos itens de menu de nível superior condicionalmente (ou seja, apenas se essa estrutura em árvore estiver ativa) na nova API do menu de navegação.
John P Bloch

@ John P. Bloch - O que significa "apenas se a estrutura da árvore estiver ativa" ? Estamos falando apenas de páginas? E quanto a postagens, categorias, tags, postagens personalizadas etc.? Ele quer fazer isso no cliente via jQuery ou no servidor? Acho que prefiro não assumir e gostaria de ouvir mais sobre o caso de uso real.
MikeSchinkel

@ MikeSchinkel Nesse caso em particular, acho que podemos estar falando apenas de páginas, mas isso não importa; a solução ainda será a mesma. Eu acho que o ZaMoose quer que seja feito no lado do servidor.
John P Bloch

Respostas:


9

Eu criei um Widget chamado Sub Navegação de Página (inteligente eu sei) que está funcionando para mim.

Se você instalar isso, basta arrastar o widget para uma das áreas do widget e o BAM funciona.

<?php
/*
Plugin Name: Page Sub Navigation
Plugin URI: http://codegavin.com/wordpress/sub-nav
Description: Displays a list of child pages for the current page
Author: Jesse Gavin
Version: 1
Author URI: http://codegavin.com
*/

function createPageSubMenu()
{
  if (is_page()) {
    global $wp_query;

    if( empty($wp_query->post->post_parent) ) {
      $parent = $wp_query->post->ID;
    } else {
      $parent = $wp_query->post->post_parent;
    }

    $title = get_the_title($parent);

    if(wp_list_pages("title_li=&child_of=$parent&echo=0" )) {
      echo "<div id='submenu'>";
      echo "<h3><span>$title</span></h3>";
      echo "<ul>";
      wp_list_pages("title_li=&child_of=$parent&echo=1" );
      echo "</ul>";
      echo "</div>";
    }
  }
}


function widget_pageSubNav($args) {
  extract($args);
  echo $before_widget;
  createPageSubMenu();
  echo $after_widget;
}

function pageSubMenu_init()
{
  wp_register_sidebar_widget("cg-sidebar-widget", __('Page Sub Navigation'), 'widget_pageSubNav');
}
add_action("plugins_loaded", "pageSubMenu_init");
?>

Ou se você só quer as partes suculentas ...

if (is_page()) {
  global $wp_query;

  if( empty($wp_query->post->post_parent) ) {
    $parent = $wp_query->post->ID;
  } else {
    $parent = $wp_query->post->post_parent;
  }

  if(wp_list_pages("title_li=&child_of=$parent&echo=0" )) {
    wp_list_pages("title_li=&child_of=$parent&echo=1" );
  }
}

ATUALIZAR

Encontrei outro plugin que faz essencialmente a mesma coisa (e talvez faça melhor, não sei). http://wordpress.org/extend/plugins/subpages-widget/


Isso é tão, tão perto do que eu preciso. O único problema é que ele se comporta mal quando o BuddyPress está ativo.
ZaMoose 19/08/10

2

você poderia fazer um hack css para fazer isso (2 maneiras que eu tentaria)

Essa é a maneira mais fácil que consigo pensar em fazer o css exibir os itens na subnavegação.

.current-menu-ancestor ul {display:inline;}
.current-menu-parent ul (display:inline;}

2 assumindo que seu tema suporta classes de corpo, você pode criar um menu de navegação para cada "sub nav" e configurá-lo para exibição abaixo da navegação principal - edite sua folha de estilo para mostrar apenas as div subnav usando algo como isto:

.child-menu-about, .child-menu-leadership {display:none;}
body.page-id-YOUR_ABOUT_PAGE_ID .child-menu-about {display:inline;}
body.category-YOUR-CATEGORY-SLUG  .child-menu-leadership {display:inline;}

0

insira a descrição da imagem aqui 1 esta é a tela php.

insira a descrição da imagem aqui 2 este é o display css.


Postar respostas como capturas de tela do código é a pior maneira possível - reedite sua resposta. Algumas palavras de explicação não machucariam também.
Picard

0
<nav class="site-nav children-link">
                <?php       

                    if(  $post->post_parent ) 
                    {
                      $children = wp_list_pages("title_li=&child_of=".$post->post_parent."&echo=0");
                    } 
                    else 
                    {
                      $children = wp_list_pages("title_li=&child_of=".$post->ID."&echo=0");
                    }

                    if ($children) { ?>
                       <ul>

                            <?php echo $children; ?>

                       </ul>

                    <?php 
                        } else {
                        }
                ?>
        </nav>

CSS

/*children-links links*/

.children-link 
{       

        background-color: #1a5957;
        color:#FFF;
        font-size: 100%;

}

.children-link li
{
    margin: 10px;   


}

.children-link ul li a:link,
.children-link ul li a:visited 
{
        padding: 15px 17px;
        text-decoration: none;
        border: 1px solid #1a5957;

}
.children-link ul li a:hover 
{
        background-color: #1a5957;
        color:#FFF;
        font-weight: bold;

}
.children-link .current_page_item a:link,
.children-link .current_page_item a:visited
{

    background-color: #1a5957;
    color: #FFF;
    cursor: default;
}
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.