Использование цикла для отображения всех уровней подстраниц под родительской страницей? На полпути туда
Мне нужно, чтобы цикл проходил через всех детей одного из родителей, всех детей каждого ребенка и т. Д. Причина, по которой мне нужен цикл вместо тега списка, такого как 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?>
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 );