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


162

哪些PHP代码可用于检索WordPress主题中的当前页面名称?

到目前为止,(我所看到的所有解决方案the_title()get_page()->post_nameget_post(),等)不工作,包含交条目的页面。他们都将返回最新博客条目的名称。

换句话说,假设您在WordPress中创建了一个名为“我的新闻”的页面。该页面被设置为“发布页面”。在页面上添加几个帖子。现在,可以使用什么API来检索字符串“ my-news”而不是最新帖子的名称?


我发现以下似乎有效的变量。

$wp_query->queried_object->post_name

这实际上是页面名称(子标签)的URL友好版本,这也是我一直在寻找的内容。已使用默认模板(二十)进行了测试。我真的不确定为什么下面给出的两个变量在我的网站上不起作用。感谢keatchprint_r()小费

现在,为什么这些信息隐藏得如此深入?


名称使用:single_post_title(``,false); 对于子弹使用:get_query_var('pagename');
jtmielczarek,2015年

Answers:


182

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

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

  • 尽管似乎没有记录在案,但$pagename仅在使用永久链接时才设置var。我猜这是因为如果您不使用它们,WordPress不需要页面插件,因此它不会进行设置。

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

    • 这是/wp-includes/theme.php中的代码,它使用您指出的$pagename无法设置的解决方案:

      $ pagename = get_query_var('pagename'); if(!$ pagename && $ id> 0){//如果将静态页面设置为首页,则不会设置$ pagename。从查询的对象$ post = $ wp_query-> get_queried_object();中检索它。$ pagename = $ post-> post_name; }


4
在header.php中使用时,$ pagename为空。我尝试使用默认模板(二十),并在<body>标记后立即使用它,但未设置它。顺便说一下,在那个阶段似乎没有设置任何query_vars变量。
伯纳德

1
我看不到缺少该变量的任何原因,也许我误解了您的设置?我了解您正在尝试在页面模板中执行此操作。即使您在header.php的第一行中写入“ echo $ pagename”,它也应该为您提供值。您正在处理什么版本的WP?
AJJ 2011年

1
您可以尝试使用get_query_var('pagename')稍有不同的方法。
AJJ 2011年

@AJweb:是的,它是针对我正在构建的模板,但是我使用的是header.php内部的默认模板进行测试。我得到的印象是您尚未测试解决方案。在header.php中的<body>标记之后放置<h1> <?php echo $ pagename?> </ h1>时,您是否看到页面名称?
伯纳德

1
这对我来说是成功的窍门:$pagename = $wp_query->queried_object->post_name;不要忘了先设置global $wp_query;
萨拉(Saran)2013年

38

我获取页面的名字的方法:

$slug = basename(get_permalink());

仅当他们使用漂亮的url时才有效,不是吗?
贝蒂

24

好的,您必须在循环之前获取页面标题。

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

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

做一个

print_r($wp_query)

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


1
这也不起作用。如果在<body>标记后立即打印$ wp_query对象,我会看到第一个发布对象是博客条目,而不是页面本身。但是,感谢您的print_r()技巧。我可以找出具有所需信息的变量(将此信息放入问题中)。
伯纳德

回显标题中的$ page_title var对我有用,谢谢。
克莱尔

22
<?php wp_title(''); ?>

这对我有用。

如果我理解正确,则希望在具有帖子条目的页面上获取页面名称。


10

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

echo $post->post_title

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

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

请注意,“ post_title”变量也可用于任何自定义循环/查询...包括菜单项和媒体附件... WordPress中的所有内容均为“ post”。


这个答案是从2012年开始的,是否知道此方法是否仍适用于最新的WP?
马丁

1
是的,WP对帖子类型的核心处理没有改变
James

8

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

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

请注意,这是一个“愚蠢”的解决方案。它不知道,例如,标有“即将到来”的页面也是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' );
}

7

我相信Roots入门主题具有出色的功能来获取当前页面标题。它很容易被入侵,涵盖所有基础,并且可以很容易地与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

我想出了一个更简单的解决方案。

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

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

请记住要删除第一个参数的分隔,然后将display设置为false用作变量的输入。然后,仅将标题之间的代码打乱,等等。

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

它为我工作,并确保您要提取的部分中声明了第一个 $title,可以对其进行调整以返回不同的变量。




3

这似乎是最容易使用的:

<?php single_post_title(); ?>

1
该调用返回的是最后一个帖子的名称,而不是包含帖子的页面名称,至少这是我从在线文档中了解到的,而没有对其进行测试。
伯纳德

这正是我想要的。我为页面创建了一个新标题,这按预期拉出了页面的名称。谢谢!
AJ Hernandez


2

一种选择是,如果要查找实际的查询页面,而不是页面ID或标签,则是拦截查询:

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页面名称,请使用global $pagenow



1

这是我的版本:

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

get_query_var('pagename')只是给了我页面。因此,上面的代码替换了所有的破折号,并使每个单词的第一个字母变为大写-因此它实际上可以用作标题。


0

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

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

0

我现在在WordPress编解码器上找到了此功能,

被查询

这是的包装$wp_query->get_queried_object

这篇文章将我带往正确的方向,但似乎需要此更新。


0

如果您在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. 避免直接使用变量

    function get_current_page( $echo =  false ) {
        if( !isset( $GLOBALS['current_page'] ) )
            return false;
        return $GLOBALS['current_page'];
    }
  3. 现在,您可以在functions.php get_current_page()的任何其他部分中使用该函数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.