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


Мне нужно, чтобы цикл проходил через всех детей одного из родителей, всех детей каждого ребенка и т. Д. Причина, по которой мне нужен цикл вместо тега списка, такого как 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?>
 4
Author: dains, 2011-03-31

1 answers

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

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 );
 7
Author: goldenapples, 2011-04-05 20:24:14