首页 文章

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

提问于
浏览
146

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

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

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

Edit:

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

$wp_query->queried_object->post_name

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

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

19 回答

  • 2
    <?php wp_title(''); ?>
    

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

  • 1

    这是我的版本:

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

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

  • 4

    好的,你必须在循环之前获取页面 Headers .

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

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

    做一个

    print_r($wp_query)
    

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

  • 0

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

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

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

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

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

    为我工作并确保在您希望提取$ title的部分中声明第一个,这可以调整为返回不同的变量 .

    sean@loft6.co.uk

  • 5

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

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

    如果你在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() .

  • 3

    在循环内

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

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

  • 5

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

    global $post;
    echo $post->post_title;
    

    这将回显当前页面/帖子 Headers .

    希望这有帮助!!!!

  • 5

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

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

    EDIT:

    • 虽然似乎没有记录,但仅在使用永久链接时才设置 $pagename var . 我想这是因为如果你不需要页面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;  
    }
    
  • 165

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

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

    请注意,这是一个"dumb"解决方案 . 它还没有't know, for instance that the page with the 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' );
    }
    
  • 21

    试试这个:

    $pagename = get_query_var('pagename');
    
  • 0

    我获取页面的slug名称的方法

    $slug = basename(get_permalink());
    
  • 6

    我相信Roots的入门主题有一个很棒的功能,可以获得当前的页面 Headers ,非常黑客,覆盖所有基础,并且可以很容易地与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();
      }
    }
    
  • 1

    我知道这是旧的,但我遇到了这个,似乎最简单的是使用它 .

    <?php single_post_title(); ?>
    
  • 5

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

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

    这是 $wp_query->get_queried_object 的包装 . 这篇帖子让我在正确的方向,但似乎它需要这个更新 .

  • 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;
         }
    }
    

    最后,我意识到这可能不是_166504的问题,但如果您正在寻找管理页面名称,请使用全局 $pagenow .

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

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

  • 32

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

    echo $post->post_title

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

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

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

  • 0

    在循环开始之前显示 Headers :

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

    谢谢

相关问题