Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
WordPress conditional function to check if a page is a parent/child/ancestor. In other words, if the page is within a tree of another page, show the code. Other code I've seen either only work with IDs, only check if it's a child, or detect all subpages (even outside of the direct tree).
/* =BEGIN: Check If Page Is Child
Source: http://bavotasan.com/2011/is_child-conditional-function-for-wordpress/
---------------------------------------------------------------------------------------------------- */
function is_child( $page_id_or_slug ) { // $page_id_or_slug = The ID of the page we're looking for pages underneath
global $post; // load details about this page
if ( !is_numeric( $page_id_or_slug ) ) { // Used this code to change a slug to an ID, but had to change is_int to is_numeric for it to work.
$page = get_page_by_path( $page_id_or_slug );
$page_id_or_slug = $page->ID;
}
if ( is_page() && ( $post->post_parent == $page_id_or_slug ) )
return true; // we're at the page or at a sub page
else
return false; // we're elsewhere
};
/* =BEGIN: Check If Page Is Parent/Child/Ancestor
Source: http://css-tricks.com/snippets/wordpress/if-page-is-parent-or-child/#comment-172337
---------------------------------------------------------------------------------------------------- */
function is_tree( $page_id_or_slug ) { // $page_id_or_slug = The ID of the page we're looking for pages underneath
global $post; // load details about this page
if ( !is_numeric( $page_id_or_slug ) ) { // Used this code to change a slug to an ID, but had to change is_int to is_numeric for it to work: http://bavotasan.com/2011/is_child-conditional-function-for-wordpress/
$page = get_page_by_path( $page_id_or_slug );
$page_id_or_slug = $page->ID;
}
if ( is_page() && ( $post->post_parent == $page_id_or_slug || (is_page( $page_id_or_slug ) || in_array($page_id_or_slug, $post->ancestors) ) ) )
return true; // we're at the page or at a sub page
else
return false; // we're elsewhere
};
<?php if ( is_tree( 'subpage' ) ) { // Using the slug /subpage/, but you could also use the ID of /subpage/ ?>
[[... insert your code here ...]]
<?php } ?>
@ericrasch

This comment has been minimized.

Copy link
Owner Author

ericrasch commented Feb 6, 2013

Arrays like is_tree('subpage1','subpage2','subpage3') don't work. Wish it did.

@ericrasch

This comment has been minimized.

Copy link
Owner Author

ericrasch commented Feb 8, 2013

To make the is_tree function in an is_child, just remove the last || is_page( $page_id_or_slug ) call. This will just the child pages of the parent and will not include the parent.

@ericrasch

This comment has been minimized.

Copy link
Owner Author

ericrasch commented Mar 20, 2013

Found out is_tree was fully checking all the ancestors, fixed line 12 of is_tree.php (source: http://css-tricks.com/snippets/wordpress/if-page-is-parent-or-child/#comment-125480).

@ericrasch

This comment has been minimized.

Copy link
Owner Author

ericrasch commented Mar 20, 2013

NOTE: If you want to use is_child or is_tree on child or subpages, you need to include the parent slug, too. Ex: is_tree( 'usa/texas' ) would cover /texas and /texas/houston.

@germanny

This comment has been minimized.

Copy link

germanny commented Mar 6, 2014

You may want to consider adding a check to see if $page returns something; if it doesn't, it returns a vague error that's not easily to troubleshoot. (example https://gist.github.com/germanny/9399616#file-is_child-php-L10)

error is:

Notice: Trying to get property of non-object in /vagrant/web/wp-content/themes/bc-theme/functions.php on line 178

If $page isn't set (such as if the page suddenly doesn't exist), then it just continues on gracefully.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.