Показывать только один уровень дочерних страниц, страницы списка wp горе


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

Базовая настройка примерно такая...

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

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

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

Что я хотел бы сделать, так это просто показать уровень непосредственно под просматриваемой в данный момент страницей. В основном, меню "В этом разделе...".

Независимо от того, какую комбинацию фрагментов 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 означает, что у меня возникли проблемы с добавлением его в этот код.

Author: a_kc, 2011-10-24

4 answers

Это должно работать, используя не более чем доступные параметры массива аргументов для 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

Хорошо, вот как я бы поступил с кодом, который вы только что добавили. Во-первых, я бы использовал правильный массив, а не строку массива. Затем я бы запросил контекст/дочерние страницы перед построением массива аргументов 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
Author: Chip Bennett, 2011-10-24 16:23:30

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

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
Author: Maxim Krizhanovsky, 2011-10-24 14:14:30

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

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

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

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

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

 0
Author: Matt Keys, 2013-05-19 19:50:42

Я создал функцию, которая использует wp_list_pages() для достижения этой цели. Измените параметры, и все готово.

Суть

 0
Author: Simon, 2017-02-19 13:37:58