Generare un menu che visualizza le pagine figlio utilizzando wp_list_pages () con la nuova funzionalità di menu in WordPress 3.0?


10

In precedenza, ero in grado di caricare selettivamente pagine figlio per una pagina padre attualmente selezionata utilizzando logiche come:

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

Non sembra esserci un modo nativo per farlo utilizzando la nuova funzionalità register_nav_menus () / wp_nav_menu (). Qualcuno sa come potrei sistemarlo insieme a questo punto?

Ecco uno screenshot di ciò che sto cercando di ottenere:

Menu a discesa Schermata del menu a discesa


Questo è difficile, dal momento che wp_nav_menu non si riferisce alla gerarchia di pagine (o pagine a tutti, per quella materia). Non so abbastanza sui menu per rispondere ora, ma questa è una domanda molto interessante.
John P Bloch,

Non capisco perfettamente la domanda. Cosa stai cercando di realizzare? Vedo il codice ma non capisco il contesto. Hai un sito che vuole? Uno screenshot?
MikeSchinkel,

Vuole aggiungere gli elementi figlio delle voci di menu di livello superiore in modo condizionale (cioè solo se la struttura ad albero è attiva) nella nuova API di menu di navigazione.
John P Bloch,

@John P. Bloch - Cosa significa "solo se la struttura ad albero è attiva" ? Stiamo parlando solo di Pages? Che dire di post, categorie, tag, post personalizzati, ecc.? Vuole farlo sul client tramite jQuery o nel server? Immagino che preferirei non presumere e mi piacerebbe saperne di più sul caso d'uso reale.
MikeSchinkel,

@MikeSchinkel In questo caso particolare, penso che potremmo parlare solo di pagine, ma non importa comunque; la soluzione sarà sempre la stessa. Penso che ZaMoose lo voglia fare sul lato server.
John P Bloch,

Risposte:


9

Ho creato un widget chiamato Page Sub Navigation (intelligente lo so) che funziona per me.

Se lo installi, puoi semplicemente trascinare il widget in una delle aree del tuo widget e BAM funziona.

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

O se vuoi solo le parti succose ...

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

AGGIORNARE

Ho trovato un altro plugin che fa essenzialmente la stessa cosa (e forse lo fa meglio, non lo so). http://wordpress.org/extend/plugins/subpages-widget/


Questo è così, così vicino a ciò di cui ho bisogno. L'unico problema è che si comporta male quando BuddyPress è attivo.
ZaMoose,

2

potresti fare un hack css per fare questo (2 modi che vorrei provare)

1 questo è il modo più semplice a cui riesco a pensare di fare in modo che i CSS visualizzino gli elementi nella sottorilevazione.

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

2 supponendo che il tuo tema supporti le classi corporee, potresti creare un menu di navigazione per ogni "sotto nav" e impostarle per visualizzarle sotto la navigazione principale, quindi modifica il foglio di stile per mostrare solo i div del subnav usando qualcosa del genere:

.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

inserisci qui la descrizione dell'immagine 1 questo è il display php.

inserisci qui la descrizione dell'immagine 2 questo è il display css.


Pubblicare le risposte come schermate del codice è il modo peggiore possibile: modificare nuovamente la risposta. Alcune parole di spiegazione non farebbero male.
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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.