【问题标题】:How can I get the current page name in WordPress?如何在 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

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

【问题讨论】:

标签: wordpress wordpress-theming custom-wordpress-pages page-title


【解决方案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 中,这也有效。这不是最好的方法,因为您必须使用全局数组,但它确实有效。

            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()

            【讨论】:

              【解决方案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');
                        

                        【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2016-12-18
                        • 2019-04-06
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-09-02
                        • 2012-01-06
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多