問題描述
可以使用什麼 PHP 代碼來檢索 WordPress 主題中的當前頁面名稱?
目前為止所有的解決方案 (the_title(),get_page()->post_name,get_post()等) 不適用於包含帖子的頁面。他們將返回最新博客條目的名稱。
換句話説,假設您在 WordPress 中創建了一個名稱為”My News” 的頁面。此頁面設置為”post page” 。在頁面中添加幾個帖子。現在,可以使用什麼 API 來檢索字符串”my-news” 而不是最新帖子的名稱?
編輯:
我發現以下變量似乎工作。
$wp_query->queried_object->post_name
這實際上是 URL 的友好版本的頁面名稱 (slug),這也是我正在尋找的。這是使用默認模板 (twentyten) 進行測試的。我真的不知道為什麼下面給出的兩個變量在我的網站上不起作用。謝謝 print_r()提示。
現在,為什麼這個信息隱藏得如此之深?
最佳解決方案
WP 全局變量 $pagename 應該適用於您,我剛剛嘗試使用與您指定的相同的設置。
$pagename 在文件 wp-includes /theme.php 中定義,函數 get_page_template()內部,當然是在您的頁面主題文件被解析之前調用,因此它可以在您的模板頁面的任何位置使用。
編輯:
-
雖然它似乎沒有被記錄,但
$pagename變量只有在使用固定鏈接時才會設置。我猜這是因為如果你不使用它們,WP 不需要頁面插件,所以它不會設置它。 -
如果將頁面用作靜態首頁,則不會設置
$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; }
次佳解決方案
我的方法來獲取頁面的名字
$slug = basename(get_permalink());
第三種解決方案
好的,你必須在循環之前抓住頁面標題。
$page_title = $wp_query->post->post_title;
檢查參考:http://codex.wordpress.org/Function_Reference/WP_Query#Properties 。
做一個
print_r($wp_query)
在循環之前查看 $ wp_query 對象的所有值
第四種方案
<?php wp_title(''); ?>
這對我來説是有效的,如果我理解正確,你想在有郵件的頁面上獲取頁面名稱?
第五種方案
您可以使用全局變量 $ post 獲取當前頁面,帖子或自定義帖子類型。
echo $post->post_title
注意:在函數或類中,您需要在嘗試使用 $ post 之前指定 global $post; 。
如果您的頁面上有循環,請確保使用 wp_reset_postdata(); 結束每個循環,將 $ post 設置為顯示的默認項目 (頁面) 。
注意,’post_title’ 變量也可用於任何自定義循環/查詢.. 包括菜單項和媒體附件.. WordPress 中的所有內容都是’post’ 。
第六種方案
嘗試這個:
$pagename = get_query_var('pagename');
第七種方案
如果你正在從你的 functions.php 文件中訪問當前的頁面 (所以在循環之前,填充 $post 之前,在 $wp_query 被初始化之前,等等),你真的別無選擇,只能訪問服務器變量並從查詢字符串中提取所請求的頁面。
$page_slug = trim( $_SERVER["REQUEST_URI"] , '/' )
請注意,這是一個 「愚蠢」 的解決方案。它不知道,例如,帶有 「coming-soon」 的頁面也是 p=6 。而且它假設你的永久鏈接設置設置為 pagename(他們應該是反正!) 。
不過,如果您有一個受控的場景,可以是一個有用的小技巧。我正在使用這種情況,我希望將訪問者中的 non-logged 重定向到”coming soon” 頁面; 但是我必須確保我沒有把它們拋到可怕的”redirect loop” 中,所以我需要從這個規則中排除”coming soon” 頁面:
global $pagenow;
if (
! is_admin() &&
'wp-login.php' != $pagenow &&
'coming-soon' != trim( $_SERVER["REQUEST_URI"] , '/' ) &&
! is_user_logged_in()
){
wp_safe_redirect( 'coming-soon' );
}
第八種方案
$title = get_the_title($post);
$parent_title = get_the_title($post->post_parent);
echo $title;
echo $parent_title;
希望這將有助於! 😉
第九種方案
我相信 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();
}
}
第十種方案
我們只需要使用”post” 全局變量。
global $post;
echo $post->post_title;
這將回應當前的頁面/帖子標題。
希望這個幫助!!!!
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。