How can I get the current page name in WordPress?
Asked Answered
A

19

184

What PHP code can be used to retrieve the current page name in a WordPress theme?

All the solutions I have seen so far:

  • the_title()
  • get_page()->post_name
  • get_post()
  • etc.

But these don't work for a page that contains post entries. They will all return the name of the latest blog entry.

Stated another way, assume that you have a page created in WordPress with the name "My News". This page is set as the "post page". Add a couple of posts to the page. Now, what API can be used to retrieve the string "my-news" instead of the name of the latest post?


I've found the following variable which seems to work.

$wp_query->queried_object->post_name

This is actually the URL friendly version of the page name (slug), which is what I was looking for too. This was tested with the default template (Twenty Ten). I'm really not sure why the two variables given below do not work on my site. Thanks to keatch for the print_r() tip.

Now, why is this information hidden so deep down?

Adulteress answered 29/1, 2011 at 12:58 Comment(2)
for the Name use: single_post_title( '', false ); for the slug use: get_query_var('pagename');Graminivorous
Here's a detailed post about all the different methods that can be used: benmarshall.me/get-current-page-name-wordpressSmackdab
M
207

The WordPress global variable $pagename should be available for you. I have just tried with the same setup you specified.

$pagename is defined in the file wp-includes/theme.php, inside the function get_page_template(), which is of course is called before your page theme files are parsed, so it is available at any point inside your templates for pages.

  • Although it doesn't appear to be documented, the $pagename var is only set if you use permalinks. I guess this is because if you don't use them, WordPress doesn't need the page slug, so it doesn't set it up.

  • $pagename is not set if you use the page as a static front page.

  • This is the code inside /wp-includes/theme.php, which uses the solution you pointed out when $pagename can't be set:

--

if ( !$pagename && $id > 0 ) {
  // If a static page is set as the front page, $pagename will not be set. Retrieve it from the queried object
  $post = $wp_query->get_queried_object();
  $pagename = $post->post_name;
}
Mondragon answered 29/1, 2011 at 15:58 Comment(9)
$pagename is empty when used inside header.php. I've tried using the default template (twentyten) and using it immediately after the <body> tag but it is not set. Incidentally, none of the query_vars variables seem to be set at that stage.Adulteress
I can't see any reason for the absence of that variable, perhaps I have misunderstood your setup? I understood you are trying to do this inside a page template. Even if you write "echo $pagename" in the first line of header.php it should give you the value. What version of WP are you dealing with?Mondragon
You could try a slightly different approach using get_query_var('pagename').Mondragon
@AJweb: Yes, it's for a template that I'm building but I'm using the default template for testing, inside header.php. I get the impression that you haven't tested your solution. Do you see the page name when you put an <h1><?php echo $pagename ?></h1> right after the <body> tag in header.php ?Adulteress
@Alkaline: Your are right in one thing: My solutions don't work with all setups of WP. But you are wrong in thinking that I hadn't checked my solutions, I did. I post my findings in an edit of my answer so I can format it properly.Mondragon
@AJweb: Thanks for the extra research. It adds crucial information. I am using static pages and that explains why $pagename isn't available.Adulteress
This did the trick for me: $pagename = $wp_query->queried_object->post_name;, just don't forget to set global $wp_query; before!Kotz
Is there any tool/browser pugin to get the actual page name?Evetta
Code example above is helpful, but it's actually located in wp-includes/template.php, not theme.php.Balcony
N
46

My approach to get the slug name of the page:

$slug = basename(get_permalink());
Neom answered 30/9, 2011 at 11:10 Comment(1)
This works only if they use pretty url, doesn't it?Nuzzi
B
28
<?php wp_title(''); ?>

This worked for me.

If I understand correctly, you want to get the page name on a page that has post entries.

Barbwire answered 10/3, 2011 at 17:24 Comment(0)
M
26

Ok, you must grab the page title before the loop.

$page_title = $wp_query->post->post_title;

Check for the reference: http://codex.wordpress.org/Function_Reference/WP_Query#Properties.

Do a

print_r($wp_query)

before the loop to see all the values of the $wp_query object.

Marbling answered 29/1, 2011 at 15:9 Comment(2)
This doesn't work either. If I print the $wp_query object right after the <body> tag I see that the first post object is the blog entry, not the page itself. However, thanks for the print_r() tip. I could find out the variable that has the info I'm looking for (putting this info in the question).Adulteress
echoing out that $page_title var worked for me in the header, thanks.Paleozoic
A
12

You can get the current page, post, or custom post type with the global variable $post:

echo $post->post_title

Note: In a function or class you'll need to specify global $post; prior to trying to use $post.

If you have loops on your page, make sure you end each loop with wp_reset_postdata(); to set $post back to the default item being displayed (the page).

Note, the 'post_title' variable is also available for any custom loop / query... including menu items and media attachments... everything in WordPress is a 'post'.

Ampoule answered 9/3, 2012 at 2:46 Comment(2)
This answer is from 2012, is there any knowledge as to if this method will still work with more recent WP?Walcoff
Yep it will—WP's core handling of post types has not changedAmpoule
P
12

We just need to use the "post" global variable:

global $post;
echo $post->post_title;

This will echo the current page/post title.

Paraph answered 22/5, 2014 at 13:22 Comment(1)
What about HTML GET?Danidania
P
9

If you're looking to access the current page from within your functions.php file (so, before the loop, before $post is populated, before $wp_query is initialized, etc...) you really have no choice but to access the server variables themselves and extract the requested page from the query string.

$page_slug = trim( $_SERVER["REQUEST_URI"] , '/' )

Note that this is a "dumb" solution. It doesn't know, for instance that the page with the slug 'coming-soon' is also p=6. And it assumes that your permalink settings are set to pagename (which they should be anyway!).

Still, can be a useful little trick if you have a controlled scenario. I'm using this in a situation where I wish to redirect non-logged in visitors to a "coming soon" page; but I have to make sure that I'm not throwing them into the dreaded "redirect loop", so I need to exclude the "coming soon" page from this rule:

global $pagenow;
if (
        ! is_admin() &&
        'wp-login.php' != $pagenow &&
        'coming-soon' != trim( $_SERVER["REQUEST_URI"] , '/' ) &&
        ! is_user_logged_in()
){
   wp_safe_redirect( 'coming-soon' );
}
Proposition answered 4/4, 2013 at 20:57 Comment(0)
F
7

I believe that the Roots starter theme has a fantastic function to get the current page title. It is very hackable, covers all bases, and can be easily used with the wp_title hook.

/**
 * Page titles
 */
function roots_title() {
  if (is_home()) {
    if (get_option('page_for_posts', true)) {
      echo get_the_title(get_option('page_for_posts', true));
    } else {
      _e('Latest Posts', 'roots');
    }
  } elseif (is_archive()) {
    $term = get_term_by('slug', get_query_var('term'), get_query_var('taxonomy'));
    if ($term) {
      echo $term->name;
    } elseif (is_post_type_archive()) {
      echo get_queried_object()->labels->name;
    } elseif (is_day()) {
      printf(__('Daily Archives: %s', 'roots'), get_the_date());
    } elseif (is_month()) {
      printf(__('Monthly Archives: %s', 'roots'), get_the_date('F Y'));
    } elseif (is_year()) {
      printf(__('Yearly Archives: %s', 'roots'), get_the_date('Y'));
    } elseif (is_author()) {
      $author = get_queried_object();
      printf(__('Author Archives: %s', 'roots'), $author->display_name);
    } else {
      single_cat_title();
    }
  } elseif (is_search()) {
    printf(__('Search Results for %s', 'roots'), get_search_query());
  } elseif (is_404()) {
    _e('Not Found', 'roots');
  } else {
    the_title();
  }
}
Furred answered 27/2, 2014 at 13:6 Comment(1)
May I ask, what is so fantastic about this function? It's basically defining titles by hand. Do SEO plugins play along with that?Socinian
P
6

Try this:

$pagename = get_query_var('pagename');
Pearcy answered 10/9, 2012 at 10:41 Comment(1)
An explanation would be in order (respond by editing your answer, not here in comments).Danidania
M
5

I have come up with a simpler solution.

Get the returned value of the page name from wp_title(). If empty, print homepage name, otherwise echo the wp_title() value.

<?php $title = wp_title('', false); ?>

Remember to remove the separation with the first argument and then set display to false to use as an input to the variable. Then just bung the code between your heading, etc. tags.

<?php if ( $title == "" ) : echo "Home"; else : echo $title; endif; ?>

It worked a treat for me and ensuring that the first is declared in the section where you wish to extract the $title, this can be tuned to return different variables.

Montiel answered 9/9, 2013 at 2:42 Comment(0)
A
4

Use:

$title = get_the_title($post);
$parent_title = get_the_title($post->post_parent);

echo $title;
echo $parent_title;
Astronautics answered 27/10, 2011 at 18:40 Comment(1)
An explanation would be in order.Danidania
T
3

This seems to be the easiest to use:

<?php single_post_title(); ?>
Terbecki answered 29/1, 2014 at 22:47 Comment(2)
This call returns the last post name, not the page name that contains the posts, at least that's what I understand from the online doc without testing it.Adulteress
This is exactly what I was looking for. I made a new header for my page and this pulled the name of the page as expected. Thanks!Marrero
H
3

Show the title before the loop starts:

$page_title = $wp_query->post->post_title;
Hallo answered 24/5, 2017 at 5:54 Comment(0)
P
2

One option, if you're looking for the actual queried page, rather than the page ID or slug is to intercept the query:

add_action('parse_request', 'show_query', 10, 1);

Within your function, you have access to the $wp object and you can get either the pagename or the post name with:

function show_query($wp){
     if ( ! is_admin() ){ // heck we don't need the admin pages
         echo $wp->query_vars['pagename'];
         echo $wp->query_vars['name'];
     }
}

If, on the other hand, you really need the post data, the first place to get it (and arguably in this context, the best) is:

add_action('wp', 'show_page_name', 10, 1);

function show_page_name($wp){
     if ( ! is_admin() ){
        global $post;
        echo $post->ID, " : ", $post->post_name;
     }
}

Finally, I realize this probably wasn't the OP's question, but if you're looking for the Admin page name, use the global $pagenow.

Proposition answered 2/9, 2011 at 20:57 Comment(0)
D
2

Within the WordPress Loop:

if ( have_posts() ) : while ( have_posts() ) : the_post();
/******************************************/
echo get_the_title();
/******************************************/
endwhile; endif;

This will show you the current page title.

For reference: get_the_title()

Dishonor answered 19/12, 2013 at 8:3 Comment(0)
M
2

Here's my version:

$title = ucwords(str_replace('-', ' ', get_query_var('pagename')));

get_query_var('pagename') was just giving me the page slug. So the above replaces all the dashes, and makes the first letter of each word uppercase - so it can actually be used as a title.

Macilroy answered 7/2, 2014 at 16:9 Comment(1)
Yes this is working as charm. I was not able to get the page name for blog page. Now i can. Thank youBeggar
C
0

I've now found this function on WordPress Codec,

get queried

which is a wrapper for $wp_query->get_queried_object.

This post put me in the right direction, but it seems that it needs this update.

Cambrian answered 23/5, 2012 at 15:12 Comment(0)
B
0

This also works if you are in the functions.php. It is not the best approach since you have to use the global array, but it works.

  1. First, we need to add a filter. There must exist a better filter to use than the template_include, but I don't know all of them. Please point me to the right one.

    add_filter( 'template_include', 'var_template_include', 1000 );
    function var_template_include( $template ){
        global $wp_query;
        $GLOBALS['current_page'] = $wp_query->get_queried_object()->post_name;
        return $template;
    }
    
  2. Avoid using the variable directly

    function get_current_page( $echo =  false ) {
        if( !isset( $GLOBALS['current_page'] ) )
            return false;
        return $GLOBALS['current_page'];
    }
    
  3. Now you can use the function get_current_page() in any other part of the functions.php.

Botanist answered 21/6, 2013 at 6:53 Comment(0)
B
0

This is what I ended up using, as of 2018:

<section id="top-<?=(is_front_page() ? 'home' : basename(get_permalink()));?>">
Bendigo answered 6/12, 2018 at 9:47 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.