wp_list_pages – Using a Walker to customize output order

I’m using wp_list_pages to create a navigation menu. I’ve run into a challenge with the menu order, though, and I am trying to figure out a way to take more control over the order of the menu.

Is it possible to customize the order of the wp_list_pages output using a Walker?

Read More

For example, I’d like to check if a given page in wp_list_pages results has a post_meta value of page_x and output that first, then do the same for another page, then, if none of the rules match, continue as normal.

Related posts

Leave a Reply

1 comment

  1. wp_list_pages( $args ) calls get_pages( $args ). You can filter the get_pages() output with a filter on get_pages.

    Let’s say you call wp_list_pages() like this:

    wp_list_pages(
        array(
            'please_filter_me' => TRUE
        )
    );
    

    You can sort the pages now with code like this (not tested):

    add_filter( 'get_pages', function( $pages, $args ) {
        // not our query
        if ( empty ( $args['please_filter_me'] ) )
            return $pages;
    
        $out = $top = array();
    
        foreach ( $pages as $page )
        {
            if ( get_post_meta( $page->ID, 'my_key', TRUE ) )
                $top[] = $page;
            else
                $out[] = $page;
        }
    
        return $top + $out;
    }, 10, 2 );