可以使用哪些php代码检索WordPress主题中的当前页面名称?
到目前为止我看到的所有解决方案(the_title()
,get_page()->post_name
,get_post()
等)都不适用于包含帖子条目的页面。他们都将返回最新博客条目的名称。
换句话说,假设您在WordPress中创建了一个名为“My News”的页面。 此页面设置为“帖子页面”。在页面中添加几个帖子。 现在,可以使用什么API来检索字符串“my-news”而不是最新帖子的名称?
修改
我发现以下变量似乎有效。
$wp_query->queried_object->post_name
这实际上是页面名称(slug)的URL友好版本,这也是我正在寻找的。这是使用默认模板(二十)测试的。我真的不确定为什么下面给出的两个变量在我的网站上不起作用。感谢ke print_r()
提示。
现在,为什么这个信息隐藏得如此之深?
答案 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()));?>">