dains
  • 0
Новичок

Используете Цикл для отображения всех уровней подстраниц на родительской странице? На полпути

  • 0

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

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

Что, я думаю, мне нужно сделать, так это использовать 1 цикл, который начинается с post_parent (чтобы он отображал дочерние страницы), но вставить функцию для изменения идентификатора сообщения для каждой найденной дочерней страницы, чтобы цикл продолжал детализироваться до тех пор, пока он не закончится, затем отступает на 1 уровень, переходит к следующему доступному идентификатору и т. д.

Моя проблема в том, что я недостаточно программист для WP (или вообще настоящий программист), чтобы добиться этого. Готов поспорить, что если бы все это было реализовано в коде, я бы смог это реализовать, но у WP, очевидно, есть скрытые функции, связанные с have_post и the_post, для циклического перебора доступных идентификаторов сообщений, и это не дает мне понять, как интегрировать то, что мне нужно.

Вот где я нахожусь в данный момент. Любая помощь будет оценена!

<?php   
$args = array(
'posts_per_page' => -1,
'post_parent' => $post->ID,
'post_type' => 'page',
'post_status' => '',
'orderby' => 'title',
'order' => 'ASC',);

query_posts($args); ?>

<?php if(have_posts()) : while (have_posts()) : the_post(); ?>

<a href="<?php the_permalink();?>"><?php the_title();?>:</a>

<?php     $inner_query = new WP_Query("post_type=page&posts_per_page=-1&post_parent={$id}&order_by=title&order=ASC"); ?>

<?php while ($inner_query->have_posts()) : $inner_query->the_post(); ?>

<a href="<?php the_permalink();?>"><?php the_title();?>:</a>

<?php endwhile; // end inner loop ?>
<?php endwhile; //end outer loop ?>     
<?php endif; // end outer if have_posts?>
Share
  1. Похоже, вы ищете рекурсивную функцию, то есть функцию, которая вызывает сама себя. Вот примерный план того, как это можно сделать:

    function wpse13669_show_all_children( $post_id, $current_level ) {
        $children = get_posts( array(
            'post_type' =>'page',
            'posts_per_page' =>-1,
            'post_parent' => $post_id,
            'order_by' => 'title',
            'order' => 'ASC' ) );
        if ( empty($children) ) return;
    
        echo '<ul class="children level-'.$current_level.'-children">';
    
        foreach ($children as $child) {
    
            /* Here would be the point where you
                do whatever you want to display the 
                posts. The variable $current_level can
                be used if you want to style different 
                levels in the hierarchy differently */
    
                echo '<li>';
    
            echo '<a href="'.get_permalink($child->ID).'">';
            echo apply_filters( 'the_title', $child->post_title );
            echo '</a>';
    
            // now call the same function for child of this child
            wpse13669_show_all_children( $child->ID, $current_level+1 );
    
                echo '</li>';
    
            }
    
        echo '</ul>';
    
        }
    

    Примечание: отредактировал мой код, чтобы показать тип вложенных <ul> списков, который, похоже, вы ищете. Если вы хотите увидеть, как WordPress делает подобные вещи внутри (это намного сложнее, чем это, но стоит выяснить, нужно ли вам делать что-то действительно нестандартное в вашем коде), вы должны просмотреть исходный код для class-wp -walker.php , где находится класс Walker, который обрабатывает все различные вложенные списки (меню, комментарии, списки страниц и т. д.) в WP.

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

    (в вашем основном цикле)

    wpse13669_show_all_children( $post->ID, 1 );
    
    • 0

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

You must login to add an answer.