Displaying Page Title on index.php
-
22-04-2021 - |
Вопрос
I have my posts page set as index.php
, and on there I have my main heading (as I do on all pages).
I'm having trouble displaying the page's heading however. The page is called 'Blog' in WordPress, and has been specified as the posts page.
If I output the page heading with wp_title('');
, I get the title of the page — 'Blog' — but with the site name after it (perhaps due to Yoast SEO plugin).
If I use the_title()
then it gives me the title of the most recent blog post, even though I'm calling the function outside of the loop.
So I've had to resort to simple hardcoding <h1>Blog</h1>
which is far from ideal.
Is there a way I can pull in the name of the page title dynamically but just the page title on it's own?
Решение
Strange. Outside the loop, the_title() should give you the current page name, if you really are on a page, and not viewing a specific post. If it gives post title instead, it may mean that you are somehow inside a loop. But if that were true, wp_title shouldn't show "Blog".
See if other options give the same result:
//the_title();
single_post_title();
echo $post->post_name; // I think this shows the url page name
Also check for is_page(). You might try the is_page('Blog') test.
if (is_page('blog')) {
echo 'Blog';
}
else {
the_title();
}
just to see what happens.
Другие советы
It's correct that the_title()
on blog page will return the most recent post's title and hence it can't be used.
When a page is set as a "posts page" from reading settings, WP calls home.php
template file (or index.php
if home.php
doesn't exist) instead of page.php
(see: Template Hierarchy).
So, is_page()
conditional won't work on blog page because it's not a page anymore.
The only way to output the actual page title is to use single_post_title();
single_post_title()
is a part of the general-template.php file which clearly states that
If we're on the blog page and that page is not the homepage or a single page that is designated as the homepage, use the container page's title.
You can review the code and comments here https://core.trac.wordpress.org/browser/tags/4.4/src/wp-includes/general-template.php#L871
$our_title = get_the_title( get_option('page_for_posts', true) );
I know it's been a while since the OP, but I'm hoping this helps others that came here looking for the same thing.
single_post_title() works for pages until you get to blog and category pages (and presumably product & tag pages in woocommerce)
So first simply check if it's a page, otherwise use the wp_title function
if (is_page()) {
single_post_title();
} else {
echo rtrim(wp_title('', false), '- ');
}
I did need to remove the site title from my settings, but I was manually adding it on either side of this function anyway.