get_page_children()不返回所有子页面

时间:2013-01-08 21:10:57

标签: php wordpress

我在我的Wordpress主题中,我正在获取子页面以显示其信息。这就是我现在所拥有的:

<?php 
                $my_wp_query = new WP_Query();
                $all_wp_pages = $my_wp_query->query(array('post_type' => 'page'));

                $staff = get_page_children(8, $all_wp_pages);

                foreach($staff as $s){
                    $page = $s->ID;
                    $page_data = get_page($page);
                    $content = $page_data->post_content;
                    $content = apply_filters('the_content',$content);
                    $content = str_replace(']]>', ']]>', $content);
                    echo '<div class="row-fluid"><span class="span4">'; 
                    echo get_the_post_thumbnail( $page ); 
                    echo '</span><span class="span8">'.$content.'</span></div>';
                } 
        ?>

我有五个应该出现的子页面,但只有三个正在返回。我在$ staff上使用print_r来查看其他页面是否在数组中,但它们不是。我不确定问题是什么。

5 个答案:

答案 0 :(得分:24)

get_page_children()new WP_Query()没有错。默认情况下,WP_Query仅返回创建的最后x个页面。这是对WP_Query施加的限制。

get_page_children()只需获取WP_Query返回的pages数组,并过滤​​该列表中的子页面。根据WordPress Codex:get_page_children“...不会进行任何SQL查询来获取孩子。”

要解决此问题,只需使用:

    $query = new WP_Query( 'posts_per_page=-1' );

您的代码包含修复程序:

    <?php 
    $my_wp_query = new WP_Query();
    $all_wp_pages = $my_wp_query->query(array('post_type' => 'page', 'posts_per_page' => -1));

    $staff = get_page_children(8, $all_wp_pages);

    foreach($staff as $s){
        $page = $s->ID;
        $page_data = get_page($page);
        $content = $page_data->post_content;
        $content = apply_filters('the_content',$content);
        $content = str_replace(']]>', ']]>', $content);
        echo '<div class="row-fluid"><span class="span4">'; 
        echo get_the_post_thumbnail( $page ); 
        echo '</span><span class="span8">'.$content.'</span></div>';
    } 
    ?>

这是一个帮助函数,只要你需要获取页面子项

就可以调用它
    function my_get_page_children( $page_id, $post_type = 'page' ) {
        // Set up the objects needed
        $custom_wp_query = new WP_Query();
        $all_wp_pages    = $custom_wp_query->query( array( 'post_type' => $post_type, 'posts_per_page' => -1 ) );

        // Filter through all pages and find specified page's children
        $page_children = get_page_children( $page_id, $all_wp_pages );

        return $page_children;
    }

实施例

使用辅助函数

进行编码
    foreach(my_get_page_children(8) as $s){
        $page = $s->ID;
        $page_data = get_page($page);
        $content = $page_data->post_content;
        $content = apply_filters('the_content',$content);
        $content = str_replace(']]>', ']]>', $content);
        echo '<div class="row-fluid"><span class="span4">'; 
        echo get_the_post_thumbnail( $page ); 
        echo '</span><span class="span8">'.$content.'</span></div>';
    } 

答案 1 :(得分:3)

我有一个类似的问题 - 看起来像get_page_children表现得很奇怪...(在我的情况下,一个页面有三个孩子它返回三个,另一个有四个它返回零! - 无法解决它..)

我通过使用自定义查询来解决它:

$params = array(
'post_type'=>'page',
'post_parent'=> 8,
);
$staff = query_posts($params);

此处类似:http://www.sanraul.com/2010/08/28/get-page-children/

注意:根据您使用此处的位置,您可能还需要wp_reset_query(); - 否则query_posts()可能会破坏您的主循环!

希望有所帮助! - A

答案 2 :(得分:0)

$curID = get_the_ID();

query_posts(
    array(
        'post_type'=>'page',
        'post_parent'=>$curID,
        'orderby' => 'menu_order',
        'order' => 'ASC'
    )
);

echo '<ul>';
while ( have_posts() ) : the_post();
    echo '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
endwhile;
echo '</ul>';

wp_reset_query();

答案 3 :(得分:0)

见以下编辑

刚刚经历并解决了这个问题后,我想我会分享我必须采取的方法。

最初,我使用新的WP_Query来获取所有页面,然后将查询结果提供给get_page_children():

$all_pages = new WP_Query( array( 'post_type' => 'page' ) );
wp_reset_postdata();
$page_id = get_the_ID();

// pass $all_pages as the second parameter
$page_children = get_page_children( $page_id, $all_pages );

foreach ( $page_children as $childObj ) {
    echo '<a href="' . $childObj->guid . '">' . $childObj->post_title . '</a>'
}

无论出于何种原因,上述代码对我都不起作用。

相反,我将$ all_pages的'posts'对象作为第二个参数传递,如下所示:

$all_pages = new WP_Query( array( 'post_type' => 'page' ) );
wp_reset_postdata();
$page_id = get_the_ID();

// pass the posts object of $all_pages as the second parameter
$page_children = get_page_children( $page_id, $all_pages->posts );

foreach ( $page_children as $childObj ) {
    echo '<a href="' . $childObj->guid . '">' . $childObj->post_title . '</a>';
}

我希望这有助于某人!

修改 在使用get_page_children()函数遇到更多麻烦之后,我选择了一个完全不同的路径,它一直在努力实现相同的最终结果:

$page = get_queried_object();
$children = get_pages( 'child_of=' . $page->ID . '&parents=' . $page->ID );

// loop through the child page links
foreach ( $children as $child ) {
    echo '<a href="' . get_permalink( $child->ID ) . '">' . get_the_title( $child->ID ) . '</a>';
}

答案 4 :(得分:0)

您可以简单地使用

$args = array(
        'post_parent' => $parent_id ,
        'post_type'   => 'page', 
        'numberposts' => -1,
        'post_status' => 'publish' 
    );
    $children = get_children( $args );

$ children变量将为您提供父ID的所有子页面。如果您使用的是WP_Query,请确保在代码后重设查询以获取更多信息 https://developer.wordpress.org/reference/functions/get_page_children/

在您的functions.php文件中使用此代码,并使用父页面ID调用函数

    function load_clildren( $parent_id=null ){
    $parent_id  =   ( $parent_id ) ? $parent_id : $post->ID;

    $args = array(
        'post_parent' => $parent_id ,
        'post_type'   => 'page', 
        'numberposts' => -1,
        'post_status' => 'publish' 
    );
    $children = get_children( $args );
    return $children;
}

函数调用方法

$ch_pages   =   load_clildren( $parent_id );

或 在父页面中使用

$ch_pages   =   load_clildren();