Генерация меню с дочерними страницами с помощью wp_list_pages() и новой функциональности меню в WordPress 3.0?

19 авг. 2010 г., 00:13:36
Просмотры: 15.2K
Голосов: 10

Раньше я мог выборочно загружать дочерние страницы для текущей выбранной родительской страницы с помощью такой логики:

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

Кажется, нет встроенного способа сделать это с помощью новой функциональности register_nav_menus()/wp_nav_menu(). Кто-нибудь знает, как можно решить эту задачу на данный момент?

Вот скриншот того, что я пытаюсь достичь:

Скриншот выпадающего меню с дочерними страницами

12
Комментарии

Это сложный вопрос, так как wp_nav_menu не связан с иерархией страниц (или вообще со страницами, если на то пошло). Я недостаточно разбираюсь в меню, чтобы ответить сейчас, но это очень интересный вопрос.

John P Bloch John P Bloch
19 авг. 2010 г. 00:31:23

Я не совсем понимаю вопрос. Что вы пытаетесь сделать? Я вижу код, но не улавливаю контекст. У вас есть сайт, который это делает? Может, скриншот?

MikeSchinkel MikeSchinkel
19 авг. 2010 г. 00:39:02

Он хочет добавлять дочерние элементы пунктов верхнего уровня меню условно (т.е. только если эта древовидная структура активна) в новом API навигационного меню.

John P Bloch John P Bloch
19 авг. 2010 г. 00:40:43

@John P. Bloch - Что означает "только если древовидная структура активна"? Речь только о Страницах? А как насчет Записей, Рубрик, Меток, Произвольных типов записей и т.д.? Он хочет сделать это на клиенте через jQuery или на сервере? Пожалуй, я бы не стал предполагать и хотел бы услышать больше о реальном случае использования.

MikeSchinkel MikeSchinkel
19 авг. 2010 г. 00:45:38

@MikeSchinkel В данном конкретном случае, возможно, речь идет только о страницах, но это не имеет значения; решение все равно будет тем же. Думаю, ZaMoose хочет сделать это на стороне сервера.

John P Bloch John P Bloch
19 авг. 2010 г. 00:55:52

@MikeSchinkel Джон прав. Я хочу загружать дочерние страницы (если они существуют) для текущей родительской страницы, а затем выводить неупорядоченный список этих дочерних элементов. По сути, это позволяет создать контекстное подменю для страниц.

ZaMoose ZaMoose
19 авг. 2010 г. 01:19:33

@ZaMoose: Извини за тупость. Что ты имеешь в виду под "загрузкой дочерних страниц?" Это означает то же самое? "Я хочу вывести неупорядоченный список дочерних страниц, если у страницы есть дочерние страницы." И где ты хочешь их выводить? Как часть выпадающего меню или в другом месте страницы? Я понимаю, что для тебя и, очевидно, для Джона это совершенно ясно, но я просто не улавливаю, чего именно ты хочешь.

MikeSchinkel MikeSchinkel
19 авг. 2010 г. 01:41:38

@MikeSchinkel: Это изображение должно проиллюстрировать, чего я пытаюсь достичь.

http://skitch.com/zamoose/d12rt/about-us-delta-sigma-theta-sorority-inc-south-jersey-alumnae-chapter

ZaMoose ZaMoose
19 авг. 2010 г. 17:46:05

@ZaMoose - Идеально, спасибо (Чувак, я просто обожаю Skitch, а ты? :) Я отредактирую твой пост, чтобы включить твой скриншот. Кстати, я вижу, что @jessegavin ответил тебе, но это не работает с BuddyPress? Хм, этого не было в твоем вопросе, иначе я бы пропустил его, потому что я еще не разобрался с BuddyPress.

MikeSchinkel MikeSchinkel
19 авг. 2010 г. 19:25:27

@MikeSchinkel: Да, я выделил часть, касающуюся BP, в отдельный вопрос. Я собираюсь отметить ответ @jessegavin как авторитетный.

ZaMoose ZaMoose
19 авг. 2010 г. 19:35:11

Круто. Я собираюсь убрать "BuddyPress", который добавил в заголовок.

MikeSchinkel MikeSchinkel
19 авг. 2010 г. 20:26:51

...И да, Skitch — весьма полезный инструмент для аннотирования скриншотов. ухмылка

ZaMoose ZaMoose
19 авг. 2010 г. 21:07:19
Показать остальные 7 комментариев
Все ответы на вопрос 4
1

Я создал виджет под названием "Page Sub Navigation" (остроумно, я знаю), который работает у меня.

Если вы установите его, то сможете просто перетащить виджет в одну из областей виджетов, и БАМ — он заработает.

<?php
/*
Plugin Name: Page Sub Navigation
Plugin URI: http://codegavin.com/wordpress/sub-nav
Description: Отображает список дочерних страниц для текущей страницы
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");
?>

Или, если вам нужна только суть...

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

ОБНОВЛЕНИЕ

Я нашел другой плагин, который делает практически то же самое (и, возможно, делает это лучше, я не знаю). http://wordpress.org/extend/plugins/subpages-widget/

19 авг. 2010 г. 01:00:28
Комментарии

Это ОЧЕНЬ близко к тому, что мне нужно. Единственная проблема — некорректная работа при активном BuddyPress.

ZaMoose ZaMoose
19 авг. 2010 г. 17:38:33
0

Вы можете использовать CSS-хак для решения этой задачи (я бы попробовал 2 способа):

1. Это самый простой способ, который я могу предложить, чтобы заставить CSS отображать элементы подменю.

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

2. Предполагая, что ваша тема поддерживает body-классы, вы можете создать отдельное меню для каждого "подменю" и разместить их под основным меню - затем отредактировать таблицу стилей, чтобы показывать только нужные блоки подменю с помощью чего-то вроде этого:

.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;}
19 авг. 2010 г. 23:21:52
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-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;
}
11 июл. 2017 г. 13:06:52
1

PHP отображение 1 Это PHP отображение.

CSS отображение 2 Это CSS отображение.

11 июл. 2017 г. 13:30:55
Комментарии

Публиковать ответы в виде скриншотов кода — это худший из возможных способов. Пожалуйста, перепишите ваш ответ. Не помешало бы добавить пару слов пояснения.

Picard Picard
11 июл. 2017 г. 14:15:58