Get Information About Top-Level Pages in WordPress

About a week ago, someone commented on my post about styling top-level pages differently in WordPress, asking how to get the slug for a top-level page while one of its descendant pages is being viewed.

It just so happened that I was in the process of working on a WordPress theme that needed to display the title of the top-level page on all of its descendants. As part of that process, I wrote a quick function that retrieves the top-level parent of any page on a WordPress site as a WordPress post object.

The function is written like:

function get_topLevel($current_post=NULL) {
	if(empty($current_post)) { global $post; $current_post = clone $post; }
	if(empty($current_post->post_parent)) { return $current_post; }
	while(!empty($current_post->post_parent)) {
		$current_post = get_post($current_post->post_parent);
	}
	return $current_post;
}

To use the function in your theme, simply copy the code above and paste it into your functions.php file. Then, you would call the function like:

$topLevel = get_topLevel(clone $post);

Then, if you need to get the slug of that page, you can do one of two things:

  1. Use the post_name property of the $topLevel object you just accessed. The post_name property is supposed to be an alias of the post slug, according to the quick reference for the WordPress post object on RazorLight Media’s website.
  2. Use a custom function to retrieve the slug from the permalink (example below).

Getting a Post’s Slug from Its Permalink

To get a post or page slug from its permalink in WordPress, you would normally use code similar to the following.

$permalink = get_permalink( $post->ID ); /* Retrieve the permalink */
$slug = basename( $permalink ); /* Get the slug from the permalink */

Of course, to make things more efficient, you could simply combine the basename() function and the get_permalink() function into one action like the following.

$slug = basename( get_permalink( $post->ID ) );

The basename() function is a native PHP function that strips all information except for the file or directory name from a URI. If you combine it with the WordPress get_permalink() function, it will, in effect, return the post or page slug.

Did you like this post? Get monthly summary of our new tutorials, posts and tips to your inbox!

No Responses

Post Your Comment

Your email address will not be published.