1

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?

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.

1 Answer 1

3

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 );
1
  • This looks awesome. Been a long time since I had this question and I think I rolled a work-around.. I'm going to accept it for posterity, though, and reference back when I run into this again. Commented Jan 21, 2014 at 0:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.