如何在 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

这是/wp-includes/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;

【讨论】:

$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-&gt;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 中获取当前页面名称?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 获取WordPress中的当前页面模板名称

Wordpress-如何从 term_ID 获取术语名称?

markdown 在wordpress中获取当前页面

如何在 laravel 5.7 中获取当前视图名称(页面名称)

获取活动页面的当前类别 ID

如何在 Gatsby 中获取所有 Wordpress 帖子和显示标签