WordPressで現在のページ名を取得するにはどうすればよいですか?


162

WordPressテーマの現在のページ名を取得するために使用できるPHPコードは何ですか?

私がこれまで見てきたすべてのソリューション(the_title()get_page()->post_nameget_post()など)は、ポストのエントリが含まれているページでは動作しません。それらはすべて、最新のブログエントリの名前を返します。

別の言い方をすると、WordPressで「My News」という名前のページが作成されているとします。このページは「投稿ページ」として設定されています。いくつかの投稿をページに追加します。さて、最新の投稿の名前の代わりに文字列「my-news」を取得するためにどのAPIを使用できますか?


動作しているように見える次の変数を見つけました。

$wp_query->queried_object->post_name

これは実際にはページ名(スラッグ)のURLフレンドリーバージョンであり、これも私が探していたものです。これはデフォルトのテンプレート(Twenty Ten)でテストされました。下記の2つの変数が私のサイトで機能しない理由は本当にわかりません。先端のkeatchprint_r()感謝します

さて、なぜこの情報がそれほど深く隠されているのですか?


名前の用途:single_post_title( ''、false); スラグの場合:get_query_var( 'pagename');
jtmielczarek 2015年

回答:


182

WordPressグローバル変数$pagenameが利用できるはずです。指定したのと同じ設定で試しました。

$pagenameは、関数内のwp-includes / theme.phpファイルで定義されていますget_page_template()。これはもちろん、ページテーマファイルが解析される前に呼び出されるため、ページのテンプレート内の任意の時点で使用できます。

  • 文書化されていないよう$pagenameですが、varはパーマリンクを使用する場合にのみ設定されます。これは、これらを使用しない場合、WordPressはページスラッグを必要としないため、設定されないためだと思います。

  • $pagename ページを静的なフロントページとして使用する場合は設定されません。

    • これは/wp-includes/theme.php内のコードで、$pagename設定できないときに指摘したソリューションを使用します。

      $ pagename = get_query_var( 'pagename'); if(!$ pagename && $ id> 0){//フロントページとして静的ページが設定されている場合、$ pagenameは設定されません。クエリされたオブジェクトから取得$ post = $ wp_query-> get_queried_object(); $ pagename = $ post-> post_name; }


4
header.php内で使用される場合、$ pagenameは空です。デフォルトのテンプレート(twentyten)を使用して<body>タグの直後に使用しようとしましたが、設定されていません。ちなみに、その段階ではquery_vars変数は設定されていないようです。
バーナード

1
その変数が存在しない理由がわかりません。おそらく、設定を誤解していますか?ページテンプレート内でこれを実行しようとしていることを理解しました。header.phpの最初の行に "echo $ pagename"と書いても、値が得られるはずです。どのバージョンのWPを扱っていますか?
AJJ 2011年

1
get_query_var( 'pagename')を使用して、少し異なるアプローチを試すことができます。
AJJ 2011年

@AJweb:はい、作成中のテンプレート用ですが、header.php内のテストにはデフォルトのテンプレートを使用しています。ソリューションをテストしていないという印象を受けます。header.phpの<body>タグの直後に<h1> <?php echo $ pagename?> </ h1>を配置すると、ページ名が表示されますか?
バーナード

1
これは私にとってトリックでした:$pagename = $wp_query->queried_object->post_name;、前に設定すること忘れないでくださいglobal $wp_query;
サラン2013

38

ページのスラッグ名を取得するための私のアプローチ:

$slug = basename(get_permalink());

これは、かなりのURLを使用する場合にのみ機能しますか?
ベティ

24

わかりました、ループの前にページタイトルを取得する必要があります。

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

参照を確認してください:http : //codex.wordpress.org/Function_Reference/WP_Query#Properties

する

print_r($wp_query)

ループの前で、$wp_queryオブジェクトのすべての値を確認します。


1
これも機能しません。$ wp_queryオブジェクトを<body>タグの直後に印刷すると、最初の投稿オブジェクトはブログエントリであり、ページ自体ではないことがわかります。ただし、print_r()のヒントに感謝します。私が探している情報を持つ変数を見つけることができました(この情報を質問に入れてください)。
バーナード

おかげで、$ page_title varがヘッダーで機能することがわかりました。
クレア

22
<?php wp_title(''); ?>

これでうまくいきました。

私が正しく理解している場合、投稿エントリがあるページのページ名を取得する必要があります。


10

グローバル変数を使用して、現在のページ、投稿、またはカスタム投稿タイプを取得できます$post

echo $post->post_title

注:関数またはクラスでは、global $post;を使用する前に指定する必要があります$post

あなたのページの上のループを持っている場合は、必ずと各ループを終了させるwp_reset_postdata();セットに$post表示されているデフォルトのアイテム(ページ)に戻って。

注: 'post_title'変数は、カスタムループ/クエリでも使用できます...メニュー項目やメディアの添付ファイルを含みます... WordPressのすべてが 'post'です。


この回答は2012年のものです。この方法が最新のWPでも引き続き機能するかどうかについての知識はありますか?
マーティン

1
はい、そうです— WPの投稿タイプのコア処理は変更されていません
James

8

あなたのfunctions.phpファイル内から現在のページにアクセスすることを探しているなら(そう、ループ、前に$post前に、移入され$wp_query、あなたが本当に選択の余地を持っていないが、サーバー変数自体にアクセスするために...など、初期化される)と、クエリ文字列から要求されたページを抽出します。

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

これは「ばかげた」解決策であることに注意してください。たとえば、スラッグが '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' );
}

7

Rootsスターターテーマには、現在のページタイトルを取得するための素晴らしい機能があると思います。それは非常にハック可能で、すべてのベースをカバーし、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

私はもっ​​と簡単な解決策を考え出しました。

wp_title()からページ名の戻り値を取得します。空の場合、ホームページ名を印刷します。それ以外の場合は、wp_title()の値をエコーし​​ます。

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

最初の引数で区切りを削除し、変数への入力として使用するには、displayをfalseに設定することを忘れないでください。次に、見出しなどのタグの間にコードを配置します。

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

これは私にとっては上手くいき、最初のがを抽出したいセクションで宣言されていることを確認し$titleます。これは、さまざまな変数を返すように調整できます。




3

これが最も使いやすいようです:

<?php single_post_title(); ?>

1
この呼び出しは、投稿が含まれているページ名ではなく、最後の投稿名を返します。少なくとも、オンラインドキュメントからはテストせずに理解できます。
バーナード

これはまさに私が探していたものです。私は自分のページに新しいヘッダーを作成しましたが、これによりページの名前が期待どおりに取得されました。ありがとう!
AJヘルナンデス


2

ページIDやスラッグではなく、実際に照会されたページを探している場合の1つのオプションは、クエリをインターセプトすることです。

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の問題ではなかったと思いますが、管理ページの名前を探している場合は、グローバルを使用し$pagenowます。


2

WordPress ループ内:

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

これにより、現在のページタイトルが表示されます。

参考までに:get_the_title()


1

これが私のバージョンです:

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

get_query_var( 'pagename')はページスラッグを私に与えていました。したがって、上記はすべてのダッシュを置き換え、各単語の最初の文字を大文字にします。そのため、実際にはタイトルとして使用できます。


0

これは、2018年の時点で私が最終的に使用したものです:

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

0

私はこの機能をWordPressコーデックで見つけました、

問い合わせを受ける

これはラッパーです $wp_query->get_queried_object

この投稿は私を正しい方向に導きましたが、この更新が必要なようです。


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. これget_current_page()で、functions.phpの他の部分で関数を使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.