josephcarrington
  • 0
Новичок

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

  • 0

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

Семейные деревья

  • Кузнецы
  • Джонсы
  • Делает

Когда пользователь щелкает Smiths, мы хотим, чтобы список выглядел так:

Кузнецы

  • Кузнецы
    • Дэйв
    • Стив
    • Долли
  • Джонсы
  • Делает

И когда пользователь нажимает на Стива, мы хотим, чтобы список также выглядел так:

Дэйв Смит

  • Кузнецы
    • Дэйв
    • Стив
    • Долли
  • Джонсы
  • Делает

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

Есть идеи?

Share
  1. Привет , @Джозеф Кэррингтон. Что это за сообщения? Это страницы или пользовательские типы сообщений? Кроме того, хотите ли вы загружать все данные при загрузке страницы и использовать jQuery+CSS для отображения тех, которые вам нужны, или вы хотите использовать jQuery+AJAX для загрузки подстраниц по запросу? (Если у вас их много, последнее может быть вашим единственным жизнеспособным вариантом.)

    • 0
  2. То, что вы пишете, напомнило мне какой-то плагин/виджет, о котором я знаю. Это связано с веб-дизайном Silo, а плагин — это плагин Silo Widgets для WordPress. В SemPro вы можете использовать встроенные виджеты, чтобы отображать что-то подобное в сообщениях.

    • 0
  3. Это был довольно приличный плагин для отображения гибкого списка страниц, когда я пробовал его в прошлый раз (сам в этом не нуждался)..

    http://wordpress.org/extend/plugins/flexi-pages-widget/

    Во всяком случае, вы можете обратиться к этому плагину за некоторыми идеями и вдохновением о том, как с этим справиться.

    • 0
  4. Мне действительно пришлось сделать это один раз. Вы можете сделать это без плагина и без javascript. Возможно, вам придется немного настроить его, чтобы он работал именно так, как вам нужно, но он должен дать вам правильное представление; отображение родительских страниц и их дочерних и т. д.

    Вот учебник, который я использовал: http://www.svennerberg.com/2009/02/creating-a-submenu-in-wordpress/

    • 0
  5. Забудьте о плагинах, у меня была та же проблема, и плагины создали целую кучу беспорядка и слишком много вызовов БД.

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

    get_template_part( 'subnav', 'pagename' );
    

    Проблема в том, что вы уже знаете своих детей и своих родителей. Я попытался использовать функцию wp-list-pages с параметром echo равным false и включая идентификаторы, но это немного запутало. Это решение не идеально, но оно намного чище, чем использование плагина или двух.

    В двух словах — вам нужен абсолютный верхний родительский идентификатор, затем вы хотите получить всех дочерних элементов текущих предков сообщений:

    function get_top_id($id){
       $parents = get_post_ancestors( $post );
       return $parents[count($parents)-1]; 
    }
    
    
    function get_sub_pages($id){
    
        global $post;
    
        // get the ancestors for this depth
        $parents = get_post_ancestors( $post );
    
        //add the post id to the list in order to get the children
        array_unshift($parents, $post->ID);
    
        //reverse the order of the array
        $parents = array_reverse($parents);
    
        // specify to get all children of the top level parent
        $args = array( 'child_of' => $id); 
    
        if($subPages = get_pages($args)):
    
            // start at the first  $parents array key
           $curParent = 0;
           $childList = '<ul>';
    
           if($id == $post->ID) $class = ' class="selected"';
           $childList .= "<li" . $class ."><a href='". get_page_link( $id )."'>Introduction</a></li>" ;
    
           foreach( $subPages as $page ) :
    
                // only add the item if:
                // a: the pages parent is in the ancestors array
    
                if(in_array($page->post_parent, $parents)){ 
    
                    // get the key of the page parent within the $parents array 
                    // this helps us check if we are going to a deeper/higher level
                    $pageParent = array_search($page->post_parent, $parents);
    
                    if($curParent != $pageParent){
    
                        // if we are going deeper, add a new list for the children
                        if($pageParent > $curParent){
                            $childList .= '<ul>';
                        }
    
                        // if we are going higher, check how many depth changes                        
                        if($pageParent < $curParent){                            
                            $depthChange = $curParent - $pageParent;
    
                            // close off all the children of higher depths
                            while($depthChange > 0){
                                $childList .= '</li></ul>';
                                $depthChange --;
                            }                            
                        }
    
                        // set the new parent level
                        $curParent = $pageParent;                        
                    }
    
                    $class = '';
                    if($page->ID == $post->ID) $class = ' class="selected"';
                    if($page->ID == $post->post_parent) $class = ' class="parent"';
    
                    // leave off the trailing <li> in case there are children to be added to this
                    $childList .= "<li" . $class . "><a href='". get_page_link( $page->ID )."'>". $page->post_title . "</a>" ;
    
                }
    
           endforeach;
    
           $childList .= '</ul>';
    
        endif;
    
        return $childList;
    }
    
    // get the absolute top level parent of this page
    $topID = get_top_id();
    
    // if no parent, we are ar the top
    if(!$topID) $topID = $post->ID;
    
    echo get_sub_pages($topID);
    

    Этот код также добавляет класс «выбранный» к текущему сообщению и «родительский» к текущему родительскому сообщению в списке.

    Надеюсь, это поможет кому-то!

    • 0

Оставить ответ

You must login to add an answer.