問題描述

可以使用什麼 PHP 代碼來檢索 WordPress 主題中的當前頁面名稱?

目前為止所有的解決方案 (the_title()get_page()->post_nameget_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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。