protected function customNestedSort( $xml ) {
		$array = [];

		//first, put them in ascending menu_order
		usort(
			$xml, function ( $a, $b ) {
				return ( $a['menu_order'] - $b['menu_order'] );
			}
		);

		// Start with book info
		foreach ( $xml as $p ) {
			if ( 'metadata' === $p['post_type'] ) {
				$array[] = $p;
				break;
			}
		}

		//now, list all front matter
		foreach ( $xml as $p ) {
			if ( 'front-matter' === $p['post_type'] ) {
				$array[] = $p;
			}
		}

		//now, list all parts, then their associated chapters
		foreach ( $xml as $p ) {
			if ( 'part' === $p['post_type'] ) {
				$array[] = $p;
				foreach ( $xml as $psub ) {
					if ( 'chapter' === $psub['post_type'] && $psub['post_parent'] === $p['post_id'] ) {
						$array[] = $psub;
					}
				}
			}
		}

		//now, list all back matter
		foreach ( $xml as $p ) {
			if ( 'back-matter' === $p['post_type'] ) {
				$array[] = $p;
			}
		}

		// Glossary
		foreach ( $xml as $p ) {
			if ( 'glossary' === $p['post_type'] ) {
				$array[] = $p;
			}
		}

		// Remaining custom post types
		$custom_post_types = apply_filters( 'pb_import_custom_post_types', [] );

		foreach ( $xml as $p ) {
			if ( in_array( $p['post_type'], $custom_post_types, true ) ) {
				$array[] = $p;
			}
		}

		return $array;
	}
protected function customNestedSort( $xml ) {
		$array = [];

		//first, put them in ascending menu_order
		usort(
			$xml, function ( $a, $b ) {
				return ( $a['menu_order'] - $b['menu_order'] );
			}
		);

		// Start with book info
		foreach ( $xml as $p ) {
			if ( 'metadata' === $p['post_type'] ) {
				$array[] = $p;
				break;
			}
		}

		//now, list all front matter
		foreach ( $xml as $p ) {
			if ( 'front-matter' === $p['post_type'] ) {
				$array[] = $p;
			}
		}

		//now, list all parts, then their associated chapters
		foreach ( $xml as $p ) {
			if ( 'part' === $p['post_type'] ) {
				$array[] = $p;
				foreach ( $xml as $psub ) {
					if ( 'chapter' === $psub['post_type'] && $psub['post_parent'] === $p['post_id'] ) {
						$array[] = $psub;
					}
				}
			}
		}

		//now, list all back matter
		foreach ( $xml as $p ) {
			if ( 'back-matter' === $p['post_type'] ) {
				$array[] = $p;
			}
		}

		// Glossary
		foreach ( $xml as $p ) {
			if ( 'glossary' === $p['post_type'] ) {
				$array[] = $p;
			}
		}

		// Remaining custom post types
		$custom_post_types = apply_filters( 'pb_import_custom_post_types', [] );

		foreach ( $xml as $p ) {
			if ( in_array( $p['post_type'], $custom_post_types, true ) ) {
				$array[] = $p;
			}
		}

		return $array;
	}
protected function customNestedSort ( $ xml ) { $ array = [ ] ; //first, put them in ascending menu_order usort ( $ xml , function ( $ a , $ b ) { return ( $ a [ 'menu_order' ] - $ b [ 'menu_order' ] ) ; } ) ; // Start with book info foreach ( $ xml as $ p ) { if ( 'metadata' === $ p [ 'post_type' ] ) { $ array [ ] = $ p ; break ; } } //now, list all front matter foreach ( $ xml as $ p ) { if ( 'front-matter' === $ p [ 'post_type' ] ) { $ array [ ] = $ p ; } } //now, list all parts, then their associated chapters foreach ( $ xml as $ p ) { if ( 'part' === $ p [ 'post_type' ] ) { $ array [ ] = $ p ; foreach ( $ xml as $ psub ) { if ( 'chapter' === $ psub [ 'post_type' ] && $ psub [ 'post_parent' ] === $ p [ 'post_id' ] ) { $ array [ ] = $ psub ; } } } } //now, list all back matter foreach ( $ xml as $ p ) { if ( 'back-matter' === $ p [ 'post_type' ] ) { $ array [ ] = $ p ; } } // Glossary foreach ( $ xml as $ p ) { if ( 'glossary' === $ p [ 'post_type' ] ) { $ array [ ] = $ p ; } } // Remaining custom post types $ custom_post_types = apply_filters ( 'pb_import_custom_post_types' , [ ] ) ; foreach ( $ xml as $ p ) { if ( in_array ( $ p [ 'post_type' ] , $ custom_post_types , true ) ) { $ array [ ] = $ p ; } } return $ array ; }
Custom sort for the xml posts to put them in correct nested order

@param array $xml

@return array sorted $xml
Custom sort for the xml posts to put them in correct nested order