问题描述
可以使用什么 PHP 代码来检索 WordPress 主题中的当前页面名称?
目前为止所有的解决方案 (the_title(),get_page()->post_name,get_post()等) 不适用于包含帖子的页面。他们将返回最新博客条目的名称。
换句话说,假设您在 WordPress 中创建了一个名称为”My News” 的页面。此页面设置为”post page” 。在页面中添加几个帖子。现在,可以使用什么 API 来检索字符串”my-news” 而不是最新帖子的名称?
编辑:
我发现以下变量似乎工作。
$wp_query->queried_object->post_name
这实际上是 URL 的友好版本的页面名称 (slug),这也是我正在寻找的。这是使用默认模板 (twentyten) 进行测试的。我真的不知道为什么下面给出的两个变量在我的网站上不起作用。谢谢 print_r()提示。
现在,为什么这个信息隐藏得如此之深?
最佳解决方案
WP 全局变量 $pagename 应该适用于您,我刚刚尝试使用与您指定的相同的设置。
$pagename 在文件 wp-includes /theme.php 中定义,函数 get_page_template()内部,当然是在您的页面主题文件被解析之前调用,因此它可以在您的模板页面的任何位置使用。
编辑:
-
虽然它似乎没有被记录,但
$pagename变量只有在使用固定链接时才会设置。我猜这是因为如果你不使用它们,WP 不需要页面插件,所以它不会设置它。 -
如果将页面用作静态首页,则不会设置
$pagename。 -
这是/wp-includes/theme.php 中的代码,它使用
$pagename无法设置时指出的解决方案:$pagename = get_query_var('pagename'); 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; }
次佳解决方案
我的方法来获取页面的名字
$slug = basename(get_permalink());
第三种解决方案
好的,你必须在循环之前抓住页面标题。
$page_title = $wp_query->post->post_title;
检查参考:http://codex.wordpress.org/Function_Reference/WP_Query#Properties 。
做一个
print_r($wp_query)
在循环之前查看 $ wp_query 对象的所有值
第四种方案
<?php wp_title(''); ?>
这对我来说是有效的,如果我理解正确,你想在有邮件的页面上获取页面名称?
第五种方案
您可以使用全局变量 $ post 获取当前页面,帖子或自定义帖子类型。
echo $post->post_title
注意:在函数或类中,您需要在尝试使用 $ post 之前指定 global $post; 。
如果您的页面上有循环,请确保使用 wp_reset_postdata(); 结束每个循环,将 $ post 设置为显示的默认项目 (页面) 。
注意,’post_title’ 变量也可用于任何自定义循环/查询.. 包括菜单项和媒体附件.. WordPress 中的所有内容都是’post’ 。
第六种方案
尝试这个:
$pagename = get_query_var('pagename');
第七种方案
如果你正在从你的 functions.php 文件中访问当前的页面 (所以在循环之前,填充 $post 之前,在 $wp_query 被初始化之前,等等),你真的别无选择,只能访问服务器变量并从查询字符串中提取所请求的页面。
$page_slug = trim( $_SERVER["REQUEST_URI"] , '/' )
请注意,这是一个 「愚蠢」 的解决方案。它不知道,例如,带有 「coming-soon」 的页面也是 p=6 。而且它假设你的永久链接设置设置为 pagename(他们应该是反正!) 。
不过,如果您有一个受控的场景,可以是一个有用的小技巧。我正在使用这种情况,我希望将访问者中的 non-logged 重定向到”coming soon” 页面; 但是我必须确保我没有把它们抛到可怕的”redirect loop” 中,所以我需要从这个规则中排除”coming soon” 页面:
global $pagenow;
if (
! is_admin() &&
'wp-login.php' != $pagenow &&
'coming-soon' != trim( $_SERVER["REQUEST_URI"] , '/' ) &&
! is_user_logged_in()
){
wp_safe_redirect( 'coming-soon' );
}
第八种方案
$title = get_the_title($post);
$parent_title = get_the_title($post->post_parent);
echo $title;
echo $parent_title;
希望这将有助于! 😉
第九种方案
我相信 Roots 的初学者主题有一个奇妙的功能,以获得当前的页面标题,非常黑客,涵盖所有基础,可以很容易地与 wp_title 钩子
https://github.com/roots/roots/blob/6.5.0/lib/titles.php 。
/**
* 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();
}
}
第十种方案
我们只需要使用”post” 全局变量。
global $post;
echo $post->post_title;
这将回应当前的页面/帖子标题。
希望这个帮助!!!!
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。