6

我在我的 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 来查看其他页面是否甚至在数组中,但它们不是。我不确定问题可能是什么。

4

5 回答 5

24

get_page_children()或没有任何问题new WP_Query()。默认情况下WP_Query,只返回最后x创建的页数。这是强加给的限制WP_Query

get_page_children()只需获取由返回的 pages 数组WP_Query并从该列表中过滤子页面。根据 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>';
    } 
于 2013-01-23T05:44:04.570 回答
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()可能会破坏您的主循环!

希望有帮助!- 一个

于 2013-01-18T00:59:51.237 回答
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();
于 2014-05-20T08:21:37.560 回答
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();
于 2018-10-20T12:55:54.057 回答
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>';
}
于 2015-12-03T18:16:00.287 回答