Мне нужно, чтобы цикл проходил через всех дочерних элементов родителя, всех дочерних элементов каждого дочернего элемента и т. д. Причина, по которой мне нужен цикл вместо тега списка, такого как 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?>
Похоже, вы ищете рекурсивную функцию, то есть функцию, которая вызывает сама себя. Вот примерный план того, как это можно сделать:
Примечание: отредактировал мой код, чтобы показать тип вложенных
<ul>
списков, который, похоже, вы ищете. Если вы хотите увидеть, как WordPress делает подобные вещи внутри (это намного сложнее, чем это, но стоит выяснить, нужно ли вам делать что-то действительно нестандартное в вашем коде), вы должны просмотреть исходный код для class-wp -walker.php , где находится класс Walker, который обрабатывает все различные вложенные списки (меню, комментарии, списки страниц и т. д.) в WP.Если вы определите эту функцию с желаемой структурой вывода и просто вызовете ее из своего цикла, она должна делать то, что вы ищете. Я поместил туда переменную $current_level только для того, чтобы вы могли легко стилизовать дочерние элементы, отличные от дочерних, и так далее.
(в вашем основном цикле)
Теперь видите? В отличие от Loop WP, ЭТО я понимаю! Спасибо, Яблоки!
Хорошо, следующий вопрос — как мне принять этот ответ / дать вам очки кармы / отправить вам файлы cookie?
Ха, я знаю, что ты имеешь в виду. Мне гораздо проще использовать операторы foreach для любых вторичных циклов… глобальные переменные, которые переопределяются в стандартном
the_post()
цикле, всегда меня смущают. Рядом с ответом должен быть флажок, где вы можете его принять…Упс, проблемо! Я обнаружил, что, несмотря на то, что эта функция вызывается из цикла, очевидно, что стандартные теги WP в ней не работают (т.е. the_permalink(), the_title(), comments_number() и т.д.).
В отношении вышеизложенного — я попытался добавить ‘setup_postdata ($ child);’ в цикл foreach, но это не помогло. Я часами ловил рыбу, пытаясь понять это сам (пытался заменить foreach другим циклом, который работал для тегов, но не смог передать идентификатор сообщения по мере необходимости). Так что я действительно застрял 🙁 Можете ли вы дать совет, как я могу это исправить?