WP_Posts_List_Table::_display_rows_hierarchical( array $pages, int $pagenum = 1, int $per_page = 20 )

In this article

This function’s access is marked private. This means it is not intended for use by plugin or theme developers, only in other core functions. It is listed here for completeness.

Parameters

$pagesarrayrequired
$pagenumintoptional

Default:1

$per_pageintoptional

Default:20

Source

private function _display_rows_hierarchical( $pages, $pagenum = 1, $per_page = 20 ) {
	global $wpdb;

	$level = 0;

	if ( ! $pages ) {
		$pages = get_pages( array( 'sort_column' => 'menu_order' ) );

		if ( ! $pages ) {
			return;
		}
	}

	/*
	 * Arrange pages into two parts: top level pages and children_pages.
	 * children_pages is two dimensional array. Example:
	 * children_pages[10][] contains all sub-pages whose parent is 10.
	 * It only takes O( N ) to arrange this and it takes O( 1 ) for subsequent lookup operations
	 * If searching, ignore hierarchy and treat everything as top level
	 */
	if ( empty( $_REQUEST['s'] ) ) {
		$top_level_pages = array();
		$children_pages  = array();

		foreach ( $pages as $page ) {
			// Catch and repair bad pages.
			if ( $page->post_parent === $page->ID ) {
				$page->post_parent = 0;
				$wpdb->update( $wpdb->posts, array( 'post_parent' => 0 ), array( 'ID' => $page->ID ) );
				clean_post_cache( $page );
			}

			if ( $page->post_parent > 0 ) {
				$children_pages[ $page->post_parent ][] = $page;
			} else {
				$top_level_pages[] = $page;
			}
		}

		$pages = &$top_level_pages;
	}

	$count      = 0;
	$start      = ( $pagenum - 1 ) * $per_page;
	$end        = $start + $per_page;
	$to_display = array();

	foreach ( $pages as $page ) {
		if ( $count >= $end ) {
			break;
		}

		if ( $count >= $start ) {
			$to_display[ $page->ID ] = $level;
		}

		++$count;

		if ( isset( $children_pages ) ) {
			$this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page, $to_display );
		}
	}

	// If it is the last pagenum and there are orphaned pages, display them with paging as well.
	if ( isset( $children_pages ) && $count < $end ) {
		foreach ( $children_pages as $orphans ) {
			foreach ( $orphans as $op ) {
				if ( $count >= $end ) {
					break;
				}

				if ( $count >= $start ) {
					$to_display[ $op->ID ] = 0;
				}

				++$count;
			}
		}
	}

	$ids = array_keys( $to_display );
	_prime_post_caches( $ids );
	$_posts = array_map( 'get_post', $ids );
	update_post_author_caches( $_posts );

	if ( ! isset( $GLOBALS['post'] ) ) {
		$GLOBALS['post'] = reset( $ids );
	}

	foreach ( $to_display as $page_id => $level ) {
		echo "\t";
		$this->single_row( $page_id, $level );
	}
}

User Contributed Notes

You must log in before being able to contribute a note or feedback.