如何在 WordPress 中获取当前页面名称?
Posted
技术标签:
【中文标题】如何在 WordPress 中获取当前页面名称?【英文标题】:How can I get the current page name in WordPress? 【发布时间】:2011-06-17 17:52:18 【问题描述】:哪些 php 代码可用于检索 WordPress 主题中的当前页面名称?
到目前为止我看到的所有解决方案:
the_title()
get_page()->post_name
get_post()
等
但这些不适用于包含帖子条目的页面。它们都将返回最新博客条目的名称。
换一种说法,假设您在 WordPress 中创建了一个名为“我的新闻”的页面。该页面被设置为“发布页面”。在页面上添加几个帖子。 现在,可以使用什么 API 来检索字符串“my-news”而不是最新帖子的名称?
我发现以下变量似乎有效。
$wp_query->queried_object->post_name
这实际上是页面名称 (slug) 的 URL 友好版本,这也是我一直在寻找的。这是使用默认模板 (Twenty Ten) 测试的。我真的不确定为什么下面给出的两个变量在我的网站上不起作用。感谢keatch for the print_r()
tip。
现在,为什么这些信息隐藏得这么深?
【问题讨论】:
名称使用:single_post_title('', false);对于蛞蝓使用:get_query_var('pagename'); 这里有一篇关于可以使用的所有不同方法的详细帖子:benmarshall.me/get-current-page-name-wordpress 【参考方案1】:您应该可以使用 WordPress 全局变量 $pagename
。我刚刚尝试了您指定的相同设置。
$pagename
在文件 wp-includes/theme.php 中定义,在函数 get_page_template()
内,当然在解析页面主题文件之前调用它,因此它在模板中的任何位置都可用页面。
尽管似乎没有记录,但 $pagename
变量仅在您使用永久链接时才设置。我猜这是因为如果你不使用它们,WordPress 不需要页面 slug,所以它不会设置它。
如果您将该页面用作静态首页,则不设置$pagename
。
$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;
【讨论】:
$pagename 在 header.php 中使用时为空。我尝试使用默认模板(二十十)并在 标记之后立即使用它,但它没有设置。顺便说一句,在那个阶段似乎没有设置任何 query_vars 变量。 我看不出没有该变量的任何原因,也许我误解了您的设置?我了解您正在尝试在页面模板中执行此操作。即使你在 header.php 的第一行写了“echo $pagename”,它也应该给你这个值。您正在处理哪个版本的 WP? 您可以使用 get_query_var('pagename') 尝试稍微不同的方法。 @AJweb:是的,这是我正在构建的模板,但我在 header.php 中使用默认模板进行测试。我的印象是您尚未测试您的解决方案。当您在 header.php 中的 标记之后放置 时,您是否看到页面名称? 这对我有用:$pagename = $wp_query->queried_object->post_name;
,只是别忘了在之前设置global $wp_query;
!【参考方案2】:
在循环开始前显示标题:
$page_title = $wp_query->post->post_title;
【讨论】:
【参考方案3】:我们只需要使用“post”全局变量:
global $post;
echo $post->post_title;
这将回显当前页面/帖子标题。
【讨论】:
html GET 怎么样?【参考方案4】:我相信Roots starter theme 有一个很棒的功能来获取当前页面的标题。它非常易于破解,涵盖所有基础,并且可以与wp_title
挂钩轻松使用。
/**
* 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();
【讨论】:
【参考方案5】:这是我的版本:
$title = ucwords(str_replace('-', ' ', get_query_var('pagename')));
get_query_var('pagename') 只是给了我页面 slug。所以上面替换了所有的破折号,并将每个单词的第一个字母大写 - 所以它实际上可以用作标题。
【讨论】:
【参考方案6】:这似乎是最容易使用的:
<?php single_post_title(); ?>
【讨论】:
此调用返回最后一个帖子名称,而不是包含帖子的页面名称,至少这是我从在线文档中了解到的,没有测试它。 这正是我想要的。我为我的页面创建了一个新的标题,这按预期提取了页面的名称。谢谢!【参考方案7】:WordPress Loop内:
if ( have_posts() ) : while ( have_posts() ) : the_post();
/******************************************/
echo get_the_title();
/******************************************/
endwhile; endif;
这将显示当前页面标题。
供参考:get_the_title()
【讨论】:
【参考方案8】:我想出了一个更简单的解决方案。
从 wp_title() 中获取页面名称的返回值。如果为空,则打印主页名称,否则回显 wp_title() 值。
<?php $title = wp_title('', false); ?>
请记住删除与第一个参数的分隔,然后将 display 设置为 false 以用作变量的输入。然后在你的标题等标签之间插入代码。
<?php if ( $title == "" ) : echo "Home"; else : echo $title; endif; ?>
这对我来说是一种享受,并确保在您希望提取 $title
的部分中声明第一个,这可以调整为返回不同的变量。
【讨论】:
【参考方案9】:如果您在 functions.php 中,这也有效。这不是最好的方法,因为您必须使用全局数组,但它确实有效。
首先,我们需要添加一个过滤器。必须存在比 template_include 更好的过滤器,但我不知道所有这些。请指点我正确的。
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;
避免直接使用变量
function get_current_page( $echo = false )
if( !isset( $GLOBALS['current_page'] ) )
return false;
return $GLOBALS['current_page'];
现在您可以在functions.php的任何其他部分使用函数get_current_page()
。
【讨论】:
【参考方案10】:我现在在 WordPress 编解码器上找到了这个功能,
get queried
这是$wp_query->get_queried_object
的包装器。
这篇文章让我找到了正确的方向,但它似乎需要这次更新。
【讨论】:
【参考方案11】:您可以通过全局变量$post
获取当前页面、帖子或自定义帖子类型:
echo $post->post_title
注意:在函数或类中,您需要在尝试使用 $post
之前指定 global $post;
。
如果您的页面上有循环,请确保以wp_reset_postdata();
结束每个循环,以将$post
设置回显示的默认项目(页面)。
注意,“post_title”变量也可用于任何自定义循环/查询...包括菜单项和媒体附件... WordPress 中的所有内容都是“帖子”。
【讨论】:
这个答案来自 2012 年,是否知道这种方法是否仍然适用于更新的 WP? 是的,WP 对帖子类型的核心处理没有改变【参考方案12】:用途:
$title = get_the_title($post);
$parent_title = get_the_title($post->post_parent);
echo $title;
echo $parent_title;
【讨论】:
解释一下。【参考方案13】:我获取页面slug名称的方法:
$slug = basename(get_permalink());
【讨论】:
这只有在他们使用漂亮的 url 时才有效,不是吗?【参考方案14】:<?php wp_title(''); ?>
这对我有用。
如果我理解正确,您希望在包含帖子条目的页面上获取页面名称。
【讨论】:
【参考方案15】:好的,你必须在循环之前获取页面标题。
$page_title = $wp_query->post->post_title;
检查参考:http://codex.wordpress.org/Function_Reference/WP_Query#Properties。
做一个
print_r($wp_query)
在循环之前查看$wp_query
对象的所有值。
【讨论】:
这也不起作用。如果我在 标记之后打印 $wp_query 对象,我会看到第一个帖子对象是博客条目,而不是页面本身。但是,感谢 print_r() 提示。我可以找出包含我正在寻找的信息的变量(将此信息放在问题中)。 在标题中回显 $page_title var 对我有用,谢谢。【参考方案16】:这是我最终使用的,截至 2018 年:
<section id="top-<?=(is_front_page() ? 'home' : basename(get_permalink()));?>">
【讨论】:
【参考方案17】:如果您正在寻找实际查询的页面,而不是页面 ID 或 slug,则一种选择是拦截查询:
add_action('parse_request', 'show_query', 10, 1);
在您的函数中,您可以访问 $wp 对象,并且可以通过以下方式获取页面名称或帖子名称:
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'];
另一方面,如果您确实需要发布数据,那么首先获取它(并且可以说在这种情况下是最好的)是:
add_action('wp', 'show_page_name', 10, 1);
function show_page_name($wp)
if ( ! is_admin() )
global $post;
echo $post->ID, " : ", $post->post_name;
最后,我意识到这可能不是 OP 的问题,但如果您正在寻找 Admin 页面名称,请使用全局 $pagenow
。
【讨论】:
【参考方案18】:如果您希望从您的 functions.php 文件中访问当前页面(因此,之前循环,在填充 $post
之前,在初始化 $wp_query
之前,等等。 ..) 你真的别无选择,只能自己访问服务器变量并从查询字符串中提取请求的页面。
$page_slug = trim( $_SERVER["REQUEST_URI"] , '/' )
请注意,这是一个“愚蠢”的解决方案。它不知道,例如带有 slug 'coming-soon' 的页面也是p=6
。它假定您的永久链接设置为pagename
(无论如何都应该如此!)。
不过,如果您有一个可控的场景,这可能是一个有用的小技巧。我在希望将未登录的访问者重定向到“即将推出”页面的情况下使用它;但我必须确保我没有将它们扔进可怕的“重定向循环”,所以我需要从这条规则中排除“即将推出”页面:
global $pagenow;
if (
! is_admin() &&
'wp-login.php' != $pagenow &&
'coming-soon' != trim( $_SERVER["REQUEST_URI"] , '/' ) &&
! is_user_logged_in()
)
wp_safe_redirect( 'coming-soon' );
【讨论】:
【参考方案19】:试试这个:
$pagename = get_query_var('pagename');
【讨论】:
解释清楚(回复editing your answer,cmets 中没有)。以上是关于如何在 WordPress 中获取当前页面名称?的主要内容,如果未能解决你的问题,请参考以下文章