如何在 WordPress 中获得当前页面的名称?

什么 PHP 代码可以用来检索 WordPress 主题中的当前页面名称?

我目前看到的所有解决方案:

  • the_title()
  • get_page()->post_name
  • get_post()
  • 等等。

但是这些对于包含文章条目的页面不起作用。它们都将返回最新博客条目的名称。

换句话说,假设你在 WordPress 中创建了一个名为“ My News”的页面。此页被设置为“发布页”。在页面中添加一些文章。 现在,什么 API 可以用来检索字符串“ my-news”而不是最新帖子的名称?


我发现了下面这个变量似乎有效。

$wp_query->queried_object->post_name

这实际上是页面名称(slug)的 URL 友好版本,这也是我一直在寻找的。这是用默认模板(二十十)测试的。我真的不知道为什么下面给出的两个变量在我的网站上不起作用。感谢 对于 print_r()的提示

为什么这些信息隐藏得这么深?

475222 次浏览

好,你必须抓住页面标题 之前的循环。

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

检查参考: http://codex.wordpress.org/Function_Reference/WP_Query#Properties

做一个

print_r($wp_query)

在循环之前查看 $wp_query对象的所有值。

WordPress 全局变量 $pagename应该是可用的。我刚刚尝试使用了您指定的相同设置。

$pagename是在函数 get_page_template()内部的 wp-include/theme.php 文件中定义的,当然在解析页面主题文件之前会调用这个函数,因此它可以在页面模板内的任何位置使用。

  • 虽然似乎没有文档说明,但是只有在使用永久链接时才设置 $pagename变量。我猜这是因为如果你不使用它们,WordPress 就不需要页面缓冲,所以它不会设置它。

  • 如果将该页用作静态首页,则不设置 $pagename

  • 这是/wp-include/theme.php 中的代码,它使用了在无法设置 $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;
}
<?php wp_title(''); ?>

这招对我很管用。

如果我理解正确的话,您希望获取具有文章条目的页面上的页面名称。

如果您正在查找实际查询的页面,而不是页面 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 的问题,但是如果您正在寻找 管理员页面名称,那么使用全局 $pagenow

我获取页面名称的方法:

$slug = basename(get_permalink());

用途:

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


echo $title;
echo $parent_title;

可以使用全局变量 $post获取当前页面、帖子或自定义帖子类型:

echo $post->post_title

注意: 在函数或类中,在尝试使用 $post之前,您需要指定 global $post;

如果页面上有循环,请确保每个循环都以 wp_reset_postdata();结束,以便将 $post设置回显示的默认项(页面)。

注意,‘ post _ title’变量也可用于任何自定义循环/查询... 包括菜单项和媒体附件... WordPress 中的所有东西都是‘ post’。

我在 WordPress 编解码器上找到了这个函数,

被质疑

这是 $wp_query->get_queried_object的包装。

这篇文章让我找到了正确的方向,但是看起来它需要这个更新。

试试这个:

$pagename = get_query_var('pagename');

如果您希望从 function. php 文件中访问当前页面(比如,之前循环,在填充 $post之前,在初始化 $wp_query之前,等等)。.)您实际上别无选择,只能访问服务器变量本身并从查询字符串中提取请求的页面。

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

请注意,这是一个“愚蠢”的解决方案。例如,它不知道带有蛞蝓‘ 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' );
}

如果您在 Functions.php 中,这也可以工作。这不是最好的方法,因为必须使用全局数组,但它是有效的。

  1. 首先,我们需要添加一个过滤器。必须有一个比 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;
    }
    
  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.

我想出了一个更简单的解决办法。

从 wp _ title ()获取页面名称的返回值。如果为空,则打印主页名称,否则回显 wp _ title ()值。

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

请记住删除与第一个参数的分离,然后将 display 设置为 false 以用作变量的输入。然后把代码放在你的标题等标签之间。

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

它对我很有用,并且确保第一个声明在您希望提取 $title的部分中,这可以调优以返回不同的变量。

WordPress < em > Loop 内:

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

这将显示当前页面的标题。

参考资料: 获取 _ title ()

这似乎是最容易使用的:

<?php single_post_title(); ?>

我的版本是这样的:

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

Get _ query _ var (‘ pagename’)只是给了我一个页面缓冲。所以上面的代替了所有的破折号,使每个单词的第一个字母大写-所以它实际上可以用作一个标题。

我相信,起点主题有一个奇妙的功能,以获得目前的页面标题。它非常容易被黑客攻击,覆盖所有的基地,可以很容易地与 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();
}
}

我们只需要使用“ post”全局变量:

global $post;
echo $post->post_title;

这将回显当前页面/文章标题。

在循环开始前显示标题:

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

截至2018年,我最终使用的是:

<section id="top-<?=(is_front_page() ? 'home' : basename(get_permalink()));?>">