テンプレート内で投稿IDを取得する


wordpressのテンプレートを触っていると現在表示されている投稿IDを取得したくなるときがあります。今回は投稿IDの取得方法を調査してみます。
※wordpress 3.0.2 で解析しています。

投稿を表示するテンプレートの基本構成

  • have_posts関数で投稿があるかどうか調べます。投稿の有無で投稿のある場合の処理と投稿のない場合の処理に分かれます。
  • 投稿は一覧のときは複数表示するので1つとは限りません。よって投稿がある場合、取得した投稿の分だけ繰り返し処理を行います。「while~endwhile」の間が繰り返し処理です。単体ページの場合でも繰り返しが1回であるというだけで記述は同じです。
  • 投稿IDの取得処理の記述場所ですが、まず投稿がないと駄目なので赤い枠の中になり、さらに投稿ごとに投稿IDが違うので図の青枠「各投稿の処理」部分に記述します。

投稿IDを取得する

wordpressには「the_ID」という関数があります。この関数はループ内(※上図の青枠)で使え、記事のIDを出力します。残念ながらこの関数はブラウザにIDを表示する専用で、引数により取得や表示の切り替えができませんでした。「the_ID」関数を解析してみます。

/**
 * Display the ID of the current item in the WordPress Loop.
 *
 * @since 0.71
 * @uses $id
 */
function the_ID() {
    global $id;
    echo $id;
}

the_ID」関数は wp-includes > post-template.php に記述されています。
内容はグローバル変数の$idを出力しているだけです。$idがグローバルってことはテンプレート内でも取得できるのではないかと思い上図の青枠の部分に

<?php echo $id ?>

と記述してみました。なんと取得できました。$id みたいなよく使いそうな変数をグローバルにするのかと少し不満ですが、独自プログラムを記述するときは変数IDを使わないように気をつけようと思います。

では次にこのグローバル変数idに値がどこで代入されているのか解析してみます。

/**
 * Iterate the post index in the loop.
 *
 * @see WP_Query::the_post()
 * @since 1.5.0
 * @uses $wp_query
 */
function the_post() {
    global $wp_query;
    $wp_query->the_post();
}

テンプレートでは投稿の繰り返しごとにthe_post関数が呼ばれています。
「the_post」関数は wp-includes > query.php に記述されています。

グローバルオブジェクトの the_postメソッドを呼び出しているだけなので、このメソッドについてみてきます。

function the_post() {
   global $post;
   $this->in_the_loop = true;

   if ( $this->current_post == -1 ) // loop has just started
   do_action_ref_array('loop_start', array(&$this));

   $post = $this->next_post();
   setup_postdata($post);
 }

「the_post」メソッドも wp-includes > query.php に記述されています。
WP_Queryクラス内のメソッドです。新しい投稿データを取得するメソッドのようです。

さらにsetup_postdata関数に続いているのでみてみます。

function setup_postdata($post) {
   global $id, $authordata, $day, $currentmonth, $page, $pages, $multipage, $more, $numpages;
   $id = (int) $post->ID;

この関数は長いので一部だけ抽出しました。
「the_post」メソッドも wp-includes > query.php に記述されています。
この関数は投稿データをグローバル変数に代入していく処理を行っているようです。3行目では$post->IDの値をグローバル変数idに代入しています。

この$postですが、setup_postdata関数では引数で取得するローカル変数ですが、上記the_postメソッドではグローバルで取得できてます。
ということはテンプレート内でも取得できるのではないかと思い上図の青枠の部分に

<?php echo $post->ID; ?>

と記述してみました。なんと取得できました。

最後に解析しながら気づいたのですが、wordpress関数に「get_the_ID」という関数があることがわかりました。

/**
 * Retrieve the ID of the current item in the WordPress Loop.
 *
 * @since 2.1.0
 * @uses $id
 *
 * @return unknown
 */
function get_the_ID() {
	global $id;
	return $id;
}

まさに投稿IDを取得する関数です。現在の記事のID(数値)を返し、ループのなかでのみ使用することができます。

まとめ

今回の解析結果では投稿IDを取得する方法は3つあることがわかりました。

  1. グローバル変数 $id を使う
  2. グローバル変数 $post->ID を使う
  3. wordpressのget_the_ID関数を使う

グローバル変数はもしかしたらバージョンアップを繰り返している間に仕様が変わるかもしれないので、get_the_ID関数を使うのが良いと思います。変数の仕様変更も関数が吸収してくれるでしょう。


「テンプレート内で投稿IDを取得する」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です