Themergency fooplugins.com

WordPress Quick Tip - Is Page Downstream

| 2 Comments

Using WordPress conditional tags can be quite helpful when working within plugins or themes. For instance, within the loop, you might want to know if you are dealing with a specific page:

if ( is_page(13) ) {
    //do some stuff to page with id of 13
}

Pretty simple and everyone knows this. But what if I want to know if I am dealing with a child of page 13? Also pretty easy:

if ( $post->post_parent == 13 ) {
    //do some stuff to a direct child of page 13
}

Combine both to check if we are dealing with either page 13 or a child of page 13:

if ( is_page(13) || $post->post_parent == 13 ) {
    //do some stuff to page 13 or children of page 13
}

But I want to go one step further! What if I want to know if I am dealing with a child of a child of page 13? And I don’t care how many levels deep, so it could be a child of a child of a child…

This is what you could use:

if ( in_array(13, $post->ancestors) ) {
    //do some stuff to a child of page 13 (any level deep)
}

(Obviously, this will also return true for direct children of page 13)

Now, let’s combine all this together into a useful helper function:

function is_page_downstream($id) {
    global $post;
    if (!is_page()) return false;
    return is_page($id) || in_array($id, $post->ancestors);
}

An example

Working with the below page structure, I want to know when I am on page ‘Top Level’ or any downstream page underneath ‘Top Level’, no matter how deep the level of nesting.

is_page_downstream(63) will return true for all pages with id in (63, 65, 76, 78, 67, 81, 84)

And it will return false for pages with id in (23, 27)

Notes & Credit

Please note this was tested on WordPress 3.3.1. Also, credit must go to this post on CSS Tricks for helping me put this post together.

1 comments
  Livefyre
  • Get Livefyre
  • FAQ
rvoodoo
rvoodoo

This has just found a happy home in my site functionality plugins. Thanks!