Removing hierarchical pages in the permalink

I have several pages set up in a hierarchy on my site. Currently the site’s pages and URLs look like this.

Page name        | Current URL           | Preferred URL 
-----------------|----------------------------------------
Page AAA         | /pageAAA/             | /pageAAA/
|-- Page BBB     | /pageAAA/pageBBB/     | /pageBBB/
Page CCC         | /pageCCC/             | /pageCCC/
Page DDD         | /pageDDD/             | /pageDDD/
|-- Page EEE     | /pageDDD/pageEEE/     | /pageEEE/

I would like to strip the page hierarchy from the URL and just use the page name instead. Currently this is not a problem for the “POSTS” as I have set the “Permalink” to /%postname%/

Edit: The reason that I want to do this is; I am importing a existing site into wordpress. The Existing site has a hierarchy for the pages (menu) but a flat url structure. I do not know if this has any added benefit for SEO but I want to keep the URL structure the same as the old site

Solutions Collecting From Web of "Removing hierarchical pages in the permalink"

I’d be curious if someone can find a better solution to this. Here’s what I came up with:

function wpse_91821_flatten_page_paths( $wp ) {
    if ( false !== strpos( $wp->matched_query, 'pagename=' ) && isset( $wp->query_vars['pagename'] ) && $wp->query_vars['pagename'] && false === strpos( $wp->query_vars['pagename'], '/' ) ) {
        if ( !get_page_by_path( $wp->query_vars['pagename'] ) ) {
            $page = get_posts( array(
                'name'        => $wp->query_vars['pagename'],
                'post_type'   => 'page',
                'post_status' => 'publish',
                'numberposts' => 1
            ) );
            if ( $page && isset( $page[0] ) ) {
                $wp->query_vars['pagename'] = get_page_uri( $page[0]->ID );
                $wp->request = $wp->query_vars['pagename'];
            }
        }
    }
}
add_action( 'parse_request', 'wpse_91821_flatten_page_paths', 5 );

What I’m doing here is intercepting parse_request and if it’s a pagename request, and the pagename doesn’t have a “/” in it, then I check to see if I can find a post with the correct name. If I find a page, I set the query var, which allows the rest of the request chain to proceed as normal, because WordPress thinks the request is the full hierarchical one.

You’d also want to add a filter to post_type_link so that your links are generated correctly (otherwise they’ll continue to be hierarchical).

I wouldn’t change page permalink behavior. Much simpler/safer solution will be to set flat page hierarchy (if you really want it to be flat).

If you want to have hierarchy in menu, you can still have it – you can create custom menu and display it with wp_nav_menu function.