web-dev-qa-db-ja.com

WordPressで現在のページ名を取得する方法

WordPressテーマの現在のページ名を取得するためにどのようなPHPコードを使用できますか?

これまで見てきた解決策(the_title()get_page()->post_nameget_post()など)はすべて、投稿エントリを含むページに対しては機能しません。それらはすべて最新のブログエントリの名前を返します。

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

編集:

私はうまくいくように思われる次の変数を見つけました。

$wp_query->queried_object->post_name

これは実際にはページ名(slug)のURLフレンドリバージョンです。これも私が探していたものです。これはデフォルトのテンプレート(20)でテストされました。以下の2つの変数が私のサイトでうまくいかないのはよくわかりません。 print_r()チップをありがとう。

では、なぜこの情報はそれほど深く隠されているのでしょうか。

154
Alkaline

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;  
    }
    
176
AJJ

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

$slug = basename(get_permalink());
35
goksel

さて、あなたはループの前にページタイトルをつかむ必要があります。

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

参照を確認します。 http://codex.wordpress.org/Function_Reference/WP_Query#Properties

する

print_r($wp_query)

ループの前に$ wp_queryオブジェクトのすべての値を確認する

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

これは私のために働いた、私が正しく理解しているならば、あなたは投稿エントリーを持っているページのページ名を得たいですか?

20
GregB

現在のページ、投稿、またはカスタム投稿の種類をグローバル変数$ postで取得できます。

echo $post->post_title

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

ページにループがある場合は、表示されているデフォルトのアイテム(ページ)に$ postを戻すために、必ず各ループをwp_reset_postdata();で終了してください。

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

7
James

Functions.phpファイル内から現在のページにアクセスしようとしているのであれば(つまり、beforeループ、$postが移入される前、$wp_queryが初期化される前など)、実際には存在しません。ただし、サーバー変数自体にアクセスし、要求されたページをクエリ文字列から抽出します。

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

これは「愚かな」解決策であることに注意してください。たとえば、スラッグ「間もなく開始」のページも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
Tom Auger

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();
  }
}
6
Sy Holloway

私はもっ​​と簡単な解決策を思いついた。

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

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

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

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

私のために御馳走を働いて、最初のものがあなたが$ titleを抽出したいセクションで宣言されることを確実にして、これは異なる変数を返すように調整することができます。

[email protected]

5
Tech1337

これを試して:

$pagename = get_query_var('pagename');
5

「post」グローバル変数を使用するだけです。

global $post;
echo $post->post_title;

これは現在のページ/投稿のタイトルを反映します。

この助けを願っています!!!!

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

これが役立つことを願っています! ;)

4
Jerad Rutnam

私はこれが古いことを知っています、しかし私はこれに遭遇しました、そして最も簡単なのはこれを使うことのようです。

<?php single_post_title(); ?>
3
Bowenac

ループが始まる前にタイトルを表示する:

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

ありがとうございました

2
Ajay Malhotra

ループ内

<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

2
Umair Hamid

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

1
Tom Auger

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

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

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

1
gray

これは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()関数を使うことができます。

0
toto_tico

私はWordpress Codecでこの関数を見つけました:

問い合わせを受けるhttp://codex.wordpress.org/Function_Reference/wp_list_pages

これは$wp_query->get_queried_objectのラッパーです。この記事は私を正しい方向に導いてくれましたが、それにはこのアップデートが必要なようです。

0
Sandra

これは、2018年の時点で私が使用したものです。

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