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

时间:2011-01-29 12:58:35

标签: wordpress wordpress-theming

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

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

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

修改

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

$wp_query->queried_object->post_name

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

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

19 个答案:

答案 0 :(得分:175)

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

$pagename在函数get_page_template()内的wp-includes / theme.php文件中定义,当然在解析页面主题文件之前调用它,因此它随时可用在页面模板中。

编辑:

  • 虽然似乎没有记录,但只有在使用固定链接时才会设置$pagename var。我想这是因为如果你不使用它们,WP不需要页面slug,所以它不会设置它。

  • 如果您将该页面用作静态首页,则不会设置
  • $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;  
    }
    

答案 1 :(得分:34)

获取页面的slug名称的方法

$slug = basename(get_permalink());

答案 2 :(得分:22)

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

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

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

做一个

print_r($wp_query)
在循环之前

查看$ wp_query对象的所有值

答案 3 :(得分:20)

<?php wp_title(''); ?>

这对我有用,如果我理解正确,你想在有帖子条目的页面上获取页面名称吗?

答案 4 :(得分:7)

如果您要从functions.php文件中访问当前页面(那么,在循环之前,在填充$post之前,$wp_query之前初始化等...)你真的别无选择,只能自己访问服务器变量并从查询字符串中提取所请求的页面。

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

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

答案 5 :(得分:7)

您可以使用全局变量$ post。

获取当前页面,帖子或自定义帖子类型

echo $post->post_title

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

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

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

答案 6 :(得分:6)

我相信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();
  }
}

答案 7 :(得分:5)

试试这个:

$pagename = get_query_var('pagename');

答案 8 :(得分:5)

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

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

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

请记住使用第一个arg删除分隔,然后将display设置为false以用作变量的输入。然后在标题等标签之间插入代码。

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

为我做了一个款待,并确保在你希望提取$ title的部分中声明第一个,这可以调整为返回不同的变量。

sean@loft6.co.uk

答案 9 :(得分:5)

我们只需要使用&#34; post&#34;全局变量。

global $post;
echo $post->post_title;

这将回显当前页面/帖子标题。

希望这有帮助!!!!

答案 10 :(得分:4)


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

    echo $title;
    echo $parent_title;

希望这会有所帮助!! ;)

答案 11 :(得分:3)

我知道这已经过时了,但是我遇到了这个问题,看起来最简单的就是使用它。

<?php single_post_title(); ?>

答案 12 :(得分:2)

在循环中

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

这将显示当前页面标题。 为了参考 http://codex.wordpress.org/Function_Reference/get_the_title

答案 13 :(得分:2)

在循环开始前显示标题:

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

谢谢

答案 14 :(得分:1)

一个选项,如果您正在查找实际查询的页面,而不是页面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

答案 15 :(得分:1)

这是我的版本:

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

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

答案 16 :(得分:0)

我现在在Wordpress Codec找到了这个函数:

被查询 http://codex.wordpress.org/Function_Reference/wp_list_pages

$wp_query->get_queried_object的包装器。这篇文章让我朝着正确的方向前进,但似乎需要这个更新。

答案 17 :(得分: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()

答案 18 :(得分:0)

这是我最终在2018年使用的内容:

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