WP_Posts_List_Table::_display_rows_hierarchical()privateWP 1.0

Method of the class: WP_Posts_List_Table{}

No Hooks.

Return

null. Nothing (null).

Usage

// private - for code of main (parent) class only
$result = $this->_display_rows_hierarchical( $pages, $pagenum, $per_page );
$pages(array) (required)
-
$pagenum(int)
-
Default: 1
$per_page(int)
-
Default: 20

Notes

  • Global. wpdb. $wpdb WordPress database abstraction object.
  • Global. WP_Post. $post Global post object.

WP_Posts_List_Table::_display_rows_hierarchical() code WP 6.5.2

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 );
	}
}