我需要使循环在父级的所有子级、每个子级的所有子级等中运行。我需要循环而不是像wp\\U list\\U pages这样的列表标记的原因是,我可以使用wp模板标记和函数显示与页面相关的任何信息。这是一种showcase风格的显示,它具有层次结构的内容,并且可以重新排列,因此页面>帖子可用于此用途。
我已经得到了一个循环来显示当前页面的子项,一个内部循环来显示子项,但这只是一个暴力原型,我需要将其提升到下一个级别。
我想我需要做的是使用1个以post\\u parent开头的循环(这样它就会显示子页面),但插入一个函数将post ID更改为找到的每个子页面,这样循环会继续向下钻取,直到用完为止,然后退出1级,转到下一个可用ID,等等。
我的问题是,我不是一个足够的WP程序员(或真正的程序员)来实现这一点。如果全部都在代码中,我打赌我可以解决,但WP显然有隐藏的函数,与have\\u post和the\\u post一起循环使用可用的post ID,这让我无法理解如何集成所需的内容。
这就是我目前的处境。任何帮助都将不胜感激!
<?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?>
最合适的回答,由SO网友:goldenapples 整理而成
听起来你在寻找一个递归函数,即一个调用自身的函数。以下是如何完成的大致概述:
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 file,其中Walker类处理整个WP中的所有各种嵌套列表(菜单、注释、页面列表等)如果您使用所需的输出结构定义该函数,并仅从循环中调用它,那么它应该满足您的要求。我在里面放了一个$current\\u level变量,这样您就可以轻松地设置不同于孙子的孩子的样式,等等。
(在主回路内)
wpse13669_show_all_children( $post->ID, 1 );