Покажите всего один уровень дочерних страниц, wp_list_pages горе

Я работаю над сайтом, который имеет довольно большую структуру страницы несколько уровней глубоко - в некоторых разделах существует много страниц.

Основная установка - что-то вроде этого...

Parent
Parent
Parent
-Child
-Child
--Grandchild
--Grandchild
--Grandchild
---GreatGrandchild
-Child
-Child
--Grandchild
--Grandchild
--Grandchild
---GreatGrandchild
-Child
Parent
-Child
Parent
Parent
-Child
-Child
--Grandchild
---GreatGrandchild
--Grandchild

Вы добираетесь, изображение - просто воображают намного больше страниц!

Мое нормальное решение подменю обычно хорошо работает (взятый прямо из Кодекса), потому что я работаю над намного меньшими сайтами. Этот сайт приводит к в широком масштабе длинному меню, которое далеко к большому, чтобы быть полезным.

То, что я хотел бы сделать, должно только показать уровень непосредственно ниже страницы, которая в настоящее время просматривается. В основном меню 'In this section...'.

Какая комбинация wp_list_pages отрывка я нашел, что только смог добраться все или ничего.

Также, потому что существуют некоторые разделы, которые не имеют детей, это должно просто показать высокоуровневые ссылки, когда никакие дети не присутствуют.

Надо надеяться, это имеет смысл - я отрывал волосы весь день по этому! Любая справка значительно ценится!

Править

Право, я буду реклама это здесь. Извините за то, чтобы быть новичком!

Настолько огромный благодаря @chip-bennet для получения меня настолько далеко!

У меня теперь есть этот код, который делает почти все, к чему я нуждаюсь в нем.


$output = wp_list_pages('echo=0&depth=1&title_li=Sections' );

        if (is_page( )) {

          $page = $post->ID;

          if ($post->post_parent) {
            $page = $post->post_parent;
          }

          $children=wp_list_pages( 'echo=0&child_of=' . $page . '&title_li=' );


          if ($children) {
            $output = wp_list_pages( array(
                // Only pages that are children of the current page
                'child_of' => $post->ID,
                // Only show one level of hierarchy
                'depth' => 1,
                'title_li' => 'In this Section'
            ) );
          }


        } 

        echo $output;

Это работает точно, как я хочу, пока я не достиг низшей точки дерева, когда оно ничего не производит.

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

5
24.10.2011, 18:57
3 ответа

Это должно работать, с помощью не чего иного как доступных параметров массива аргументов для wp_list_pages(): а именно, depth и child_of.

Отобразить один уровень иерархии, для порожденных страниц текущей страницы:

<?php
// Globalize the $post variable;
// probably already available in this context, but just in case...
global $post;
wp_list_pages( array(
    // Only pages that are children of the current page
    'child_of' => $post->ID,
    // Only show one level of hierarchy
    'depth' => 1
) );
?>

Не должно быть никакой потребности обратиться к пользовательскому классу Уокера.

Править

ДЛЯ показа ссылок верхнего уровня также просто измените несколько параметров:

<?php
// Globalize the $post variable;
// probably already available in this context, but just in case...
global $post;
wp_list_pages( array(
    // Only pages that are children of the current page's parent
    'child_of' => $post->post_parent,
    // Only show two level of hierarchy
    'depth' => 2
) );
?>

Обратите внимание на изменения 'child_of' => $post->ID кому: 'child_of' => $post->post_parent, который будет включать страницы родительской страницы текущей страницы и изменение 'depth' => 1 кому: 'depth' => 2, который будет включать одноуровневые элементы текущей страницы и их детей.

РЕДАКТИРОВАНИЕ 2

Хорошо, вот то, как я обработал бы код, который Вы просто добавили. Во-первых, я использовал бы надлежащий массив, а не строку массива. Затем я запросил бы для context/child-pages прежде, чем создать wp_list_pages() массив аргументов, затем, просто звонит wp_list_pages() однажды:

// Use parent page if exists, else use current page    
$child_of_value = ( $post->post_parent ? $post->post_parent : $post->ID );
// Depth of 2 if parent page, else depth of 1
$depth_value = ( $post->post_parent ? 2 : 1 );
// Build argument array
$wp_list_pages_args = array( 
    'child_of' => $child_of_value,
    'depth' => $depth_value,
    'title_li' => 'Sections'
);
// Now, output the result
wp_list_pages( $wp_list_pages_args );

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

8
19.02.2020, 22:07
  • 1
    Brilliant, это, конечно, получило меня на правильном пути! Используя комбинацию от другого бита кода у меня есть он делающий 90% того, что мне нужен он, чтобы сделать... –  a_kc 24.10.2011, 17:47
  • 2
    Так, что 10% Вы пропускаете? :) –  Chip Bennett 24.10.2011, 17:50
  • 3
    , который я имею, так, когда нет никаких дочерних страниц, он отображает высокоуровневые страницы. Это является большим, пока это не достигает нижней части дерева - затем это в настоящее время ничего не производит. Идеально затем это или перечислило бы, это - коллеги или сбой, что это - родители. –  a_kc 24.10.2011, 18:04
  • 4
    См. обновленный ответ. :) –  Chip Bennett 24.10.2011, 18:27
  • 5
    , в котором я не могу почтовый индекс здесь легко, может я? В основном я вижу, как это все, которое работает! Увы я очень frontend, и мое отсутствие знаний PHP останавливает меня засовывающий все это вместе! –  a_kc 24.10.2011, 18:47

Ну, можно использовать аргумент глубины для управления, сколько уровней глубоко Вы хотите показать, и я создал SubMenu Уокер, который отображает меню, запускающееся от прямых детей текущей страницы. Код:

class My_Walker_Submenu extends Walker_Nav_Menu {


  function display_element($element, &$children_elements, $max_depth, $depth = 0, $args, &$output) {

    if (! $element)
      return;

    $itemId = null;

    if ( $depth == 0) {
        if (!isset($args[0]->child_of)){
         return;
        }
      foreach ( $children_elements as $id => $children ) {
        $data = get_post_meta ( $id, '_menu_item_object_id', true );
        if ($data == $args [0]->child_of) {
          $itemId = $id;
          break;
        }
      }
      if ($itemId == null) {
        return;
      }
      unset($args [0]->child_of);

      foreach ( $children_elements [$itemId] as $child ) {
        parent::display_element ( $child, $children_elements, $max_depth, $depth + 1, $args, $output );
      }
      return;

    }
    return parent::display_element ( $element, $children_elements, $max_depth, $depth, $args, $output );
  }

И использование (я использую его на боковой панели на самом деле):

echo wp_nav_menu( array(
              'container' => '',
              'theme_location' => 'header-menu',
              'walker' => new My_Walker_Submenu(),
              'child_of' => $page->ID, 
              'depth'   => 2
) );
2
19.02.2020, 22:07

Это - проблема, которую я вижу, подходят довольно часто. Я думаю, что решениями WP_List_Pages, которые я вижу на всем протяжении, является немного старая школа теперь, когда Wordpress имеет надлежащего менеджера по меню (Появление-> Меню).

Я попробовал многочисленные решения включая некоторые плагины/виджеты и ходоков как тот выше. Я никогда не был очень доволен доступными решениями. Я создал свой собственный плагин, который обрабатывает эти вторичные меню способ, которым я предпочитаю, и привык к. При отображении меню можно установить start_depth для информирования меню для игнорирования определенного числа 'уровней' выше текущей страницы.

Таким образом для Ваших потребностей Вы установили бы start_depth на 1, и он автоматически проигнорирует высокоуровневые элементы навигации при отображении меню.

Я называю сменный WP Военно-морским Плюс то, потому что он полагается в настоящее время питание и опции wp_nav_menu, только с дополнительным из start_depth аргумента в пользу отображения нижестоящих меню.

Для любого, кому интересно, это доступно в моем веб-сайте: https://mattkeys.me/products/wp-nav-plus/

0
19.02.2020, 22:07

Теги

Похожие вопросы