是否只获取孙子页面,而不获取Page/Current Page的直接子页面?

时间:2015-11-23 作者:William Larsen Bang

我现在对javascript非常熟悉,但我对php和wordpress主题构建还不熟悉。我已经搜索了相当多的内容,但找不到一个解决方案,这似乎是一项非常简单的任务,我只想完成一个页面的所有子页面,而不是直接的子页面,如下所示:

Portfolio

<我的页面是“公文包”,我想“获取”页面,但只获取“公文包”中的孙页面,因此在这种情况下,它只返回:-“孙1A”、“孙1B”、“孙2A”、“孙2B”。

有什么建议吗?

3 个回复
SO网友:Pieter Goosen

没有本地的方法可以做到这一点。最简单的方法是:

只需查询所传递页面ID层次结构中的所有页面

然后返回数组中所有页面中的所有父ID($post\\u post对象的父属性

循环浏览页面,并将页面ID与父ID数组中的ID进行比较

任何ID位于父ID数组中的页面,我们只需跳过并排除

任何ID不在父ID数组中的页面,我们将使用它来构建新的数组,这些页面将是最低级别的页面

最简单的方法是构建我们自己的自定义函数,我们可以在任何页面模板中调用该函数。功能如下:

function get_lowest_level_pages( $page_id = \'\' )
{
    // Check if we have a page id, if not, return false
    if ( !$page_id )
            return false;

    // Validate the page id
    $page_id = filter_var( $page_id, FILTER_VALIDATE_INT );

    // Check if this is a page, if not, return false
    if ( !is_page() )
        return false;

    // Get all pages in hierarchy of the current page
    $args = [
        \'child_of\' => $page_id,
    ];
    $q = get_pages( $args );

    // Check if there are pages, if not, return false
    if ( !$q )
        return false;

    // Use wp_list_pluck to get all the post parents from all return pages
    $parents = wp_list_pluck( $q, \'post_parent\' );
    // Set the $new__page_array variable that will hold grandchildren/lowest level pages
    $new__page_array = [];

    // Loop through all the pages
    foreach ( $q as $page_object ) {
        // Simply skip any page if it has child page
        if ( in_array( $page_object->ID, $parents ) )
            continue;

        // Create a new array holding only grandchild pages
        $new__page_array[] = $page_object;
    }

    return $new__page_array; 
}
然后,您可以按如下方式使用它:(请记住传递您需要的父页面id,以便从中获取孙子女)

$page_id = get_queried_object_id(); // Returns the current page ID
$q = get_lowest_level_pages( $page_id );

if ( $q ) {
    foreach ( $q as $post ) {
        setup_postdata( $post );

        the_title();

    }
    wp_reset_postdata();
}

SO网友:John Priestakos

Use get_page_children

$all_wp_pages = get_all_page_ids();

// Get the page as an Object
$portfolio = get_page_by_title(\'Portfolio\');

// Filter through all pages and find Portfolio\'s children
$portfolio_children = get_page_children($portfolio->ID, $all_wp_pages);

foreach ($portfolio_children as $child) {

    $post_data = array(\'child_of\' => $child->ID);
    $grandchild = get_pages($post_data);
}

// echo what we get back from WP to the browser
echo \'<pre>\' . print_r($grandchild, true) . \'</pre>\';
SO网友:1inMillion

这是为了让你有个想法,还没有测试过这段代码,但也许你应该试试。

<?php

    $args = array(
    \'post_parent\' => 0, //post parent id
    \'post_type\'   => \'any\', 
    \'numberposts\' => -1,
    \'post_status\' => \'any\' 
); 
    $childen = get_children( $args, OBJECT );

    foreach($children as $child){

      $args = array(
    \'post_parent\' => $child->ID,
    \'post_type\'   => \'any\', 
    \'numberposts\' => -1,
    \'post_status\' => \'any\' 
); 
      $grand_children[] = get_children($args, OBJECT);
}
也许你可以这样试试。

相关推荐

无法在模板函数.php中使用IS_HOME

我试图在标题中加载一个滑块,但只在主页上加载。如果有帮助的话,我正在使用Ultralight模板。我正在尝试(在template functions.php中)执行以下操作:<?php if ( is_page( \'home\' ) ) : ?> dynamic_sidebar( \'Homepage Widget\' ); <?php endif; ?> 但这行不通。现在,通过快速的google,我似乎需要将请