Wp使用wp查询获取父页面的所有子页面

时间:2011-11-30 作者:phpuser

这是我的密码

$my_wp_query = new WP_Query();
$all_wp_pages = $my_wp_query->query(array(\'post_type\' => \'page\',\'post_parent\'=>$parid,\'orderby\'=>\'title\',\'order\'=>\'ASC\' ));
它仅显示第一级子页。我需要所有的子页面,子页面。。。以及所有。我搜索了一个解决方案,我可以使用get\\u pages和wp\\u list\\u pages获取所有子页面。

但我真的需要按自定义post元值对顺序进行排序。所以我必须使用自定义查询。

请帮忙。谢谢

6 个回复
SO网友:Chip Bennett

为什么不直接使用get_pages()?

e、 g。

<?php
// Determine parent page ID
$parent_page_id = ( \'0\' != $post->post_parent ? $post->post_parent : $post->ID );
// Get child pages as array
$page_tree_array = get_pages( array(
    \'child_of\' => $parent_page_id;
) );
?>
但如果真的要WP_Query() 对象,请使用类似的方法:

<?php
// Determine parent page ID
$parent_page_id = ( \'0\' != $post->post_parent ? $post->post_parent : $post->ID );
// Build WP_Query() argument array
$page_tree_query_args = array(
    \'post_parent\' => $parent_page_id;
);
// Get child pages as a WP_Query() object
$page_tree_query = new WP_Query( $page_tree_query_args );
?>

SO网友:Tom J Nowell

你所面临的问题是“我如何做X?”这不是一步一步的行动,而是一个多步骤的过程,需要将其分解。

您不需要这样做:

get all the posts that are a child of X ordered by meta
您需要执行以下操作:

get all the posts that are a child of X
    for each child, get all the posts that are a child
        foreach child of that child get all the posts that are a child
            ...
                hmmm we don\'t have any more children left

Take our list of posts and order them by meta
因此,要理解如何无限地执行它,直到到达终点,而不必对其进行硬编码,您需要理解递归函数。

e、 g。

function make_zero( $amount ) {
    $amount = $amount - 1;
    if ( $amount > 1 ){
        return make_zero( $amount );
    }
    return $amount;
}
将递归应用于此问题以获得解决方案$parid, 你的贴子元有一个键$metakey.

让我们将其传递到函数中以获取其子级。

$children = get_children_with_meta( $parid, $metakey );
然后我们将对$children数组进行排序,键将是post id,值将是meta值。

asort($children);
让我们将函数定义为:

function get_children_with_meta( $parent_id, $metakey ) {
    $q = new WP_Query( array( \'post_parent\' => $parent_id, \'meta_key\' => $metakey ));
    if ( $q->have_posts() ) {
        $children - array();
        while ( $q->have_posts() ) {
            $q->the_post();
            $meta_value = get_post_meta(get_the_ID(), $metakey, true );
            $children[get_the_ID() ] = $meta_value;
        }
        return $children;
    } else {
        // there are no children!!
        return array();
    }
}
这将为您提供一个post ID和值的数组,按从低到高的顺序排列。您可以使用其他PHP排序函数从高到低进行排序。

那么孩子们的孩子们呢

在循环的中间,我们需要进行递归调用,传入子ID而不是父ID。

因此:

$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
变成这样:

$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;

// now get the childrens children
$grandchildren = get_children_with_meta( get_the_ID(), $metakey );

// merge the grandchildren and the children into the same list
$children = array_merge( $children, $grandchildren );
通过此修改,函数现在检索子对象、子对象、子对象的子对象。。。。。等

最后,可以修剪数组上的值以获得如下ID:

$post_ids = array_keys( $children );
$q = new WP_Query( array( \'post__in\' => $post_ids );
// etc
使用此策略,您可以用任何其他度量替换元键值,或者以其他方式使用递归函数。

由于完整的代码只需要几秒钟的基本理解和快速复制粘贴,我不会用完整的复制粘贴代码块来侮辱你的智慧。

优点通过修改,可以对任何post类型和形式的数据进行修改,以生成嵌套标记。通过将返回的数组置于瞬态中,可以轻松缓存以加快速度。可以通过将分页应用于WP\\U查询的末尾来设置分页您已经找到了它们,因此性能成本不会按比例增加您想要的内容将生成大量查询,而且由于涉及到潜在的深度,因此成本固有

    我的建议

    我建议您要么扁平化页面层次结构,要么使用分类法。E、 g.如果你正在对帖子进行评级,请使用带有1、2、3、4和5等术语的页面评级分类法。这将为你提供开箱即用的帖子列表。

    或者,使用导航菜单并完全绕过此问题

SO网友:tfrommen

递归获取所有当前子页get_children. 将以下内容放入functions.php:

function get_all_subpages($page, $args = \'\', $output = OBJECT) {
    // Validate \'page\' parameter
    if (! is_numeric($page))
        $page = 0;

    // Set up args
    $default_args = array(
        \'post_type\' => \'page\',
    );
    if (empty($args))
        $args = array();
    elseif (! is_array($args))
        if (is_string($args))
            parse_str($args, $args);
        else
            $args = array();
    $args = array_merge($default_args, $args);
    $args[\'post_parent\'] = $page;

    // Validate \'output\' parameter
    $valid_output = array(OBJECT, ARRAY_A, ARRAY_N);
    if (! in_array($output, $valid_output))
        $output = OBJECT;

    // Get children
    $subpages = array();
    $children = get_children($args, $output);
    foreach ($children as $child) {
        $subpages[] = $child;

        if (OBJECT === $output)
            $page = $child->ID;
        elseif (ARRAY_A === $output)
            $page = $child[\'ID\'];
        else
            $page = $child[0];

        // Get subpages by recursion
        $subpages = array_merge($subpages, get_all_subpages($page, $args, $output));
    }

    return $subpages;
}
如何使用该功能可以在任何地方使用上述功能,例如:

$all_current_subpages = get_all_subpages(0);
该函数确实支持args 参数(查询字符串或数组)和output 类型(见上文)。

所以你也可以这样使用它:

$args = array(
    \'post_status\' => \'private\',
    \'order_by\' => \'post_date\',
    \'order\' => \'DESC\',
);
$all_current_subpages = get_all_subpages(42, $args, ARRAY_A);
由于依赖性get_children => get_posts => WP_Query 您可以按照这个问题的作者最初的要求使用元值。

SO网友:Nicü

我制作了一个递归函数,它获取父页的所有子ID。在获得ID后,我们对页面进行查询,并可以按元键/值对结果进行排序。

// Gets all the children ids of post_parent
function _get_children_ids( $post_parent ) {
    $results = new WP_Query( array(
        \'post_type\' => \'page\',
        \'post_parent\' => $post_parent
    ) );

    $child_ids = array();
    if ( $results->found_posts > 0 )
        foreach ( $results->posts as $post ) // add each child id to array
            $child_ids[] = $post->ID;

    if ( ! empty( $child_ids ) )
        foreach ( $child_ids as $child_id ) // add further children to array
            $child_ids = array_merge( $child_ids, _get_children_ids( $child_id ) );

    return $child_ids;
}

$children_ids = _get_children_ids( 9 ); // use your numeric page id or get_the_id()

$results = new WP_Query( array(
    \'post_type\'   => \'page\',
    \'post__in\'   => $children_ids
    #\'meta_key\'   => \'meta_key\', // your meta key
    #\'orderby\'    => \'meta_key\',
    /* \'meta_query\' => array( // optional meta_query
        array(
            \'key\' => \'meta_key\', // key
            \'value\' => array(3, 4), // values
            \'compare\' => \'IN\', // operator
        )
    ) */
) );

var_dump( $results );
如果需要以分层方式按元键/值对子级进行排序,则应将元键和order\\u by值传递给\\u get\\u children\\u id函数中的WP\\u查询(而不是最终的WP\\u查询)。

否则,获取所有子id的更简单方法是:

$children = get_pages( \'child_of=9\');

$children_ids = array();
if ( ! empty( $children ) )
    foreach ( $children as $post )
        $children_ids[] = $post->ID;

SO网友:Kris Nielsen

不确定这是否正是您想要的,但您可以使用wp\\u list\\u pages函数,并使用“child\\u of”和“depth”参数。

有关更多信息,请参阅Codex上的以下页面:http://codex.wordpress.org/Function_Reference/wp_list_pages

SO网友:Bipin

I MAKE THIS WORKING, JUST COPY PASTE THE CODE TO YOUR PAGE.PHP FILE

//REDIRECT TO FIRST CHILD FROM PARENT PAGE

// Build WP_Query() argument array
$page_tree_query_args = array(
    \'post_parent\' => $post -> ID,
    \'post_type\' => \'page\',
    \'order\' => \'asc\'
);
// Get child pages as a WP_Query() object
$page_tree_query = new WP_Query( $page_tree_query_args );
if(!empty($page_tree_query -> posts)){
    $first_subpage = $page_tree_query -> posts[0] -> ID;
    wp_redirect( get_permalink( $first_subpage ) );
    exit;   
}
结束

相关推荐

如何将META_QUERY更改为SQL wpdb Query?

我想提取与3个元数据字段(bed\\u value、bath\\u value、rob\\u value)相关的帖子。变量数据为$beddrooms、$bathroms,&;rob,我对join和like结构有些困惑。未工作元查询如下$args = array( \'meta_query\' => array( \'relation\' => \'OR\', array(