Wygenerować menu wyświetlające strony podrzędne za pomocą wp_list_pages () z nową funkcją menu w WordPress 3.0?


10

Wcześniej byłem w stanie selektywnie ładować strony podrzędne dla aktualnie wybranej strony nadrzędnej za pomocą logiki, takiej jak:

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 {
}

Wydaje się, że nie ma natywnego sposobu na zrobienie tego za pomocą nowej funkcji register_nav_menus () / wp_nav_menu (). Czy ktoś wie, jak mogę to teraz załatać?

Oto zrzut ekranu tego, co próbuję osiągnąć:

Zrzut ekranowy menu podrzędnego


Jest to trudne, ponieważ wp_nav_menu nie odnosi się do hierarchii stron (lub w ogóle stron). Nie wiem wystarczająco dużo o menu, aby odpowiedzieć na to pytanie, ale jest to bardzo interesujące pytanie.
John P Bloch,

Nie do końca rozumiem pytanie. Co próbujesz osiągnąć Widzę kod, ale nie rozumiem kontekstu. Masz witrynę, która chce? Zrzut ekranu?
MikeSchinkel,

Chce warunkowo dodać elementy potomne elementów menu najwyższego poziomu (tj. Tylko jeśli ta struktura drzewa jest aktywna) w nowym interfejsie menu nawigacji.
John P Bloch,

@John P. Bloch - Co znaczy „tylko wtedy, gdy struktura drzewa jest aktywna” ? Czy mówimy tylko o stronach? Co z postami, kategoriami, tagami, niestandardowymi postami itp.? Czy chce to zrobić na kliencie przez jQuery czy na serwerze? Myślę, że wolałbym nie zakładać i chciałbym dowiedzieć się więcej o rzeczywistym przypadku użycia.
MikeSchinkel,

@MikeSchinkel W tym konkretnym przypadku myślę, że możemy rozmawiać tylko o stronach, ale to i tak nie ma znaczenia; rozwiązanie pozostanie takie samo. Myślę, że ZaMoose chce to zrobić po stronie serwera.
John P Bloch,

Odpowiedzi:


9

Stworzyłem widżet o nazwie Page Sub Navigation (mądry, wiem), który działa dla mnie.

Jeśli to zainstalujesz, możesz po prostu przeciągnąć widget do jednego z obszarów widgetów i działa BAM .

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

A jeśli chcesz tylko soczyste części ...

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

AKTUALIZACJA

Znalazłem inną wtyczkę, która robi to samo (a może robi to lepiej, nie wiem). http://wordpress.org/extend/plugins/subpages-widget/


To jest SO, tak blisko tego, czego potrzebuję. Jedynym problemem jest to, że źle się zachowuje, gdy BuddyPress jest aktywny.
ZaMoose,

2

możesz zrobić hack css, aby to zrobić (2 sposoby, które spróbowałbym)

1 jest to najprostszy sposób, w jaki mogę wymusić, aby css wyświetlał elementy w subnavigation.

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

2 zakładając, że Twój motyw obsługuje klasy ciała, możesz utworzyć menu nawigacji dla każdej „nawigacji podrzędnej” i ustawić je tak, aby wyświetlały się pod główną nawigacją - a następnie edytuj arkusz stylów, aby wyświetlał tylko div diva używającego czegoś takiego:

.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

wprowadź opis zdjęcia tutaj 1 to jest wyświetlacz php.

wprowadź opis zdjęcia tutaj 2 to jest wyświetlacz css.


Publikowanie odpowiedzi w postaci zrzutów ekranu kodu jest najgorszym możliwym sposobem - prosimy o zmianę odpowiedzi. Kilka słów wyjaśnienia również nie zaszkodzi.
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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.