Use `wp_parse_id_list()` when parsing `exclude_tree` in `get_pages()`. Add unit tests to ensure a URL string, array with string as value, and array with array as value for `exclude_tree` can be used to specify multiple IDs.
Props cgaffga, roothorick, hakre, tbrams for patches across the years. Fixes #9153. git-svn-id: https://develop.svn.wordpress.org/trunk@27767 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
parent
42055c8c93
commit
115f291221
|
@ -3742,7 +3742,7 @@ function get_pages( $args = array() ) {
|
|||
'sort_column' => 'post_title', 'hierarchical' => 1,
|
||||
'exclude' => array(), 'include' => array(),
|
||||
'meta_key' => '', 'meta_value' => '',
|
||||
'authors' => '', 'parent' => -1, 'exclude_tree' => '',
|
||||
'authors' => '', 'parent' => -1, 'exclude_tree' => array(),
|
||||
'number' => '', 'offset' => 0,
|
||||
'post_type' => 'page', 'post_status' => 'publish',
|
||||
);
|
||||
|
@ -3924,17 +3924,20 @@ function get_pages( $args = array() ) {
|
|||
if ( $child_of || $hierarchical )
|
||||
$pages = get_page_children($child_of, $pages);
|
||||
|
||||
if ( !empty($exclude_tree) ) {
|
||||
$exclude = (int) $exclude_tree;
|
||||
$children = get_page_children($exclude, $pages);
|
||||
$excludes = array();
|
||||
foreach ( $children as $child )
|
||||
$excludes[] = $child->ID;
|
||||
$excludes[] = $exclude;
|
||||
$num_pages = count($pages);
|
||||
if ( ! empty( $exclude_tree ) ) {
|
||||
$exclude = wp_parse_id_list( $exclude_tree );
|
||||
foreach( $exclude as $id ) {
|
||||
$children = get_page_children( $id, $pages );
|
||||
foreach ( $children as $child ) {
|
||||
$exclude[] = $child->ID;
|
||||
}
|
||||
}
|
||||
|
||||
$num_pages = count( $pages );
|
||||
for ( $i = 0; $i < $num_pages; $i++ ) {
|
||||
if ( in_array($pages[$i]->ID, $excludes) )
|
||||
unset($pages[$i]);
|
||||
if ( in_array( $pages[$i]->ID, $exclude ) ) {
|
||||
unset( $pages[$i] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -236,4 +236,36 @@ class Tests_Post_getPages extends WP_UnitTestCase {
|
|||
|
||||
_unregister_post_type( $type );
|
||||
}
|
||||
|
||||
function test_exclude_tree() {
|
||||
$post_id1 = $this->factory->post->create( array( 'post_type' => 'page' ) );
|
||||
$post_id2 = $this->factory->post->create( array( 'post_type' => 'page', 'post_parent' => $post_id1 ) );
|
||||
$post_id3 = $this->factory->post->create( array( 'post_type' => 'page' ) );
|
||||
$post_id4 = $this->factory->post->create( array( 'post_type' => 'page', 'post_parent' => $post_id3 ) );
|
||||
|
||||
$all = get_pages();
|
||||
|
||||
$this->assertCount( 4, $all );
|
||||
|
||||
$exclude1 = get_pages( "exclude_tree=$post_id1" );
|
||||
$this->assertCount( 2, $exclude1 );
|
||||
|
||||
$exclude2 = get_pages( array( 'exclude_tree' => $post_id1 ) );
|
||||
$this->assertCount( 2, $exclude2 );
|
||||
|
||||
$exclude3 = get_pages( array( 'exclude_tree' => array( $post_id1 ) ) );
|
||||
$this->assertCount( 2, $exclude3 );
|
||||
|
||||
$exclude4 = get_pages( array( 'exclude_tree' => array( $post_id1, $post_id2 ) ) );
|
||||
$this->assertCount( 2, $exclude4 );
|
||||
|
||||
$exclude5 = get_pages( array( 'exclude_tree' => array( $post_id1, $post_id3 ) ) );
|
||||
$this->assertCount( 0, $exclude5 );
|
||||
|
||||
$post_id5 = $this->factory->post->create( array( 'post_type' => 'page' ) );
|
||||
$post_id6 = $this->factory->post->create( array( 'post_type' => 'page', 'post_parent' => $post_id5 ) );
|
||||
|
||||
$exclude6 = get_pages( array( 'exclude_tree' => array( $post_id1, $post_id3 ) ) );
|
||||
$this->assertCount( 2, $exclude6 );
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue