WordPressをいじっていると、投稿ページや固定ページなど、そのページが持つ情報を取得するというのは日常茶飯事かと思います。
しかし、ひとつの情報に対し、取得する方法が複数あってなにかとややこしい。
テンプレートタグや関数を使えばいいってのはわかるんだけど、綴りとか覚えきれなくて同じことを何度も調べなおしてしまったり。ていうか、似たような関数いっぱいあるけど違いが分からないまま、その時調べて出てきたやつを使ってるけどいいのだろうか...。
と、いうことで、自分でも散らかった知識を整理するために今回は固定ページ・投稿ページの様々な情報を取得する方法をまとめていこうと思います。
この記事では「ループ」という表現を多用しています。もしWordPress初心者の方が見ておられましたら、予備知識としてWordPressのループについて勉強してみてください。
基本的な情報を一括で取得
まずは投稿・固定ページに共通する、 基本情報(投稿のIDやタイトルやなど)の取得方法をまとめていきます。
- $post
- get_post()
- get_post_field()
上記3つのいずれかを使用することで基本情報は簡単に取得できます。
ただし、get_post_field()
については内部でget_post()
を使用しており、機能面についてはCodexで以下のようにに書かれています。
get_post_field() fetches the whole post using get_post(). So there is no performance advantage.
ようするに、get_post_field()が優れていることは特にないということですので、今回は説明を省略し、グローバル変数$post
およびget_post()
について説明していくこととします。
グローバル変数 $post
ループ内であれば、現在の投稿の基本情報は、すでに $post
というグローバル変数に格納されています。
取得できる情報一覧
$post->ID //投稿ID (int)
$post->post_author //投稿者ID (string)
$post->post_date //投稿日時 (string)
$post->post_date_gmt //投稿日時(GMT) (string)
$post->post_content //投稿内容 (string)
$post->post_title //投稿タイトル (string)
$post->post_excerpt //投稿内容(抜粋) (string)
$post->post_status //投稿状態('publish'、'private'など) (string)
$post->comment_status //コメント投稿状態('open'など) (string)
$post->ping_status //トラックバック/ピンバック受付状態('open'など) (string)
$post->post_password //パスワード(公開状態がパスワード保護時) (string)
$post->post_name //スラッグ名(パーマリンク設定で%postname%使用時) (string)
$post->to_ping //ピン通知 URL (string)
$post->pinged //ピン通知済み URL (string)
$post->post_modified //更新日時 (string)
$post->post_modified_gmt //更新日時(GMT) (string)
$post->post_content_filtered //フィルター? (string)
$post->post_parent //親ID (固定ページや添付ファイルなどで使用) (int)
$post->guid //ページURL (デフォルト型) (string)
$post->menu_order //固定ページの表示順序 (int)
$post->post_type //投稿情報タイプ('post'、'page'など) (string)
$post->post_mime_type //添付ファイルのときMIMEタイプ (string)
$post->comment_count //コメント数 (int)
$post->filter //適用されたフィルター名('raw'など) (string)
$post->ancestors //親やその親ページの投稿IDの配列(固定ページで親ページがある場合など) (array)
以上のような情報が、簡単に取得できます。
*ancestorsについての謎 : var_dump( $post ); しても出力されないが、普通に echo $post->ancestors; すると表示される…。何故だかわかる人いらっしゃいませんか(笑)
よく使うものをピックアップすると次のような感じでしょうか。
$ID = $post->ID; // ページID
$title = $post->post_title; // タイトル
$date = $post->post_date; // 投稿日時
$content = $post->post_content; // コンテンツ内容
$slug = $post->post_name; // スラッグ
$parent = $post->post_parent; // 親のID
$url = $post->guid; // ページURL
*$post などのグローバル関数はバージョンアップに伴って使用の変更があるかもしれないので、この下にあるget_post()や後述する専用の関数を使用するほうが安全だという意見もあるようです。また、初心者の方は意図せずしてグローバル変数を汚染してしまうことを防ぐためにも、不用意に使用すべきではないかもしれません。
get_post()
先ほどの $post
は、ループ内のその投稿についての情報しか取得できませんが、 get_post()
を使用すると、引数に投稿IDを渡すことでその投稿に関する情報を簡単に取得できます。
ループ中であれば、引数を省略すると自動的にその投稿に関する情報を取得できます。
例 : よく使う情報の取得
$post_data = get_post();
$ID = $post_data->ID; // ページID
$title = $post_data->post_title; // タイトル
$date = $post_data->post_date; // 投稿日時
$content = $post_data->post_content; // コンテンツ内容
$slug = $post_data->post_name; // スラッグ
$parent = $post_data->post_parent; // 親のID
$url = $post_data->guid; // ページURL
そのほか、取得できる情報は $post
と同じです。
* get_posts() という、get_post()と見た目が非常に似ている関数もありますが、これは全くの別物ですので注意しましょう。
おまけ : get_page()は避ける
get_post() の固定ページ用として、 get_page()
という関数があります。が、この関数は バージョン 3.5から get_page() は非推奨になっています。
固定ページでも get_post()
で問題なく情報が取得できるので、こちらを使いましょう。
基本情報の中から個別の情報だけを取得
先程の get_post()
は投稿が持つ基本的な情報を全て取得してきますが、IDやタイトルなど、特定の情報にフォーカスして取得や出力を行う関数もあります。
よく使うもの
たぶんよく使うものリスト(取得)
get_the_ID(); //現在の投稿ID(引数はありません)
get_the_title(); //タイトル
get_the_date(); //投稿日
get_the_time(); //投稿日時
get_the_modified_time(); //更新日
get_the_content(); //本文
get_post_ancestors(); //親ID(先祖全て)
get_permalink(); //URL
これらの関数は、ループ中に使用するのであれば投稿IDに関する引数は必要ありません。自動的にループ中の投稿IDが渡されます。
投稿ID以外にも引数を指定できるものもあります。特に覚えておく必要はなさそうなのでここでは記載しませんが「引数は投稿IDだけじゃないんだな」と、頭の片隅にでも置いておきましょう。
また、上記の関数たちの多くは、頭の get_
を外すと 出力してくれるようになります。
例: get_the_title() と the_title()
echo get_the_title(); //タイトルを出力するにはechoがいる
the_title(); //出力に echo が不要。
$postを使用するよりもこれらの関数を使用することを推奨しているサイトをよく見かけます。実際、 $post->ID
では意図した動作をしてくれないが、 get_the_ID()
だと普通に動作する、という場合もあったりしますので、これらの個別関数を使用する方が無難かもしれません。(もしくは get_post()を使用する)
パーマリンク・URLの取得関数について
上記には get_permalink()
のみ記載していますが、パーマリンク・URLを取得できる関数は他にもいくつかあってややこしいです。
基本的には get_permalink()
だけ覚えていればいいと思いますが、ややこしい関数たちを別の記事でまとめてみましたので、時間があれば是非チェックしてみてください。
アイキャッチ画像の取得・出力
WordPressの投稿や固定ページには、以下のコードを functions.php
に記述することで「 アイキャッチ画像」というものが設定できるようになります。
アイキャッチ画像を有効化するコード
add_theme_support('post-thumbnails');
ほとんどの無料テーマではデフォルトで有効化されているかと思います。
このアイキャッチ画像を表示したい時、WordPressが用意してくれている the_post_thumbbail()
という関数があります。
アイキャッチ画像を出力する
the_post_thumbnail();
ループ内であればこの関数を呼び出すだけで、アイキャッチ画像のimgタグが出力されるのですごく簡単です。
が、 出力がすごく汚いです。
もう一度言います。 すっごく、汚いです。
なので、綺麗な出力ができるようにオリジナルの関数を作ってしまうのがいいかと思います。
以下の記事で、出力を綺麗にする方法をすでにメモしていますので是非参考にしてみてください。
固定ページ特有の情報
固定ページでのみ取得できる情報に関してまとめていきます。
親情報
現在のページの親ページの情報で、まず簡単に取得できるのは 一つ上の親ページの投稿ID です。
一つ上の親ページの投稿IDは、 get_post()->post_parent
で簡単に取得できます。
親ページの タイトルや本文などを取得したい場合は、 親ページの投稿IDをさらに get_post() などに渡すことで取得できます。
例1 : 直近(一つ上)の親情報を取得
<?php
$parent_id = get_post()->post_parent; // 親ページのIDを取得
$parent_slug = get_post($parent_id)->post_name; // 親ページのスラッグを取得
$parent_title = get_post($parent_id)->post_title; // 親ページのタイトルを取得
$parent_url = get_permalink($parent_id); // 親ページの URL を表示
?>
全親ページの情報
先程、一つ上の親ページは、 get_post()->post_parent
でIDを取得できると説明しました。
さらに親の情報などを取得したい場合、この作業を繰り返してももちろん大丈夫ですが、
全ての親ページの投稿IDを取得できる、 get_post_ancestors()
という便利な関数があります。
最上位の親の情報が取得したい場合などは、この関数を使用すると便利です。
この関数の使い方に関しては、名前のよく似た get_ancestors()
という関数があって少しややこしかったので、両者を比較しながら別の記事でまとめてみました。そちらを参考にしてみてください。
固定ページテンプレート情報
次は「 固定ページテンプレート」の情報についてです。
固定ページテンプレートは、任意のphpファイル(第二階層まで)の冒頭で以下のような宣言をすることで作成できます。
例:「Myテンプレート」という名前の固定ページテンプレートを作成する
<?php
/*
Template name: Myテンプレート
*/
このようにして、オリジナルのテンプレートを作成できます。
デフォルトテンプレートは page.php です。
そして、 現在の固定ページに適用されているテンプレートがどのファイルで宣言されているのかという情報は グローバル変数 $template
で取得できます。
$template
で取得できる値は、テンプレート宣言ファイルの 絶対パス(サーバーのルートからのパス) です。
絶対パスをそのまま取得するとすごく長くなるので、以下のようにして 最後のファイル名だけを取得しておくのが定番の扱い方。
例:テンプレートファイル名を取得する
<?php
global $template; //$templateの呼び出し
$template_name = basename($template, '.php'); //絶対パスが長いのでファイル名の部分のみ取得
?>
これによって、例えば $template
に「 /home/user/.../my_template.php 」という絶対パスが入っているならば、「 my_template 」の部分だけが $template_name
に代入されます。
* basename($template, '.php') の第二引数部分 、'.php' の記述をなくせば、「 my_template.php」 が取得されます。
デフォルトテンプレートではもちろん、上記の例だと $template_name
が 「 page 」となります。
カスタムフィールド
次は、カスタムフィールドの情報を取得する方法をまとめていきます。
主に、以下の3つの関数を使用する事でカスタムフィールドの値は取得できます。
- get_post_custom()
- get_post_meta()
- post_custom()
ひとつずつ説明していきます。
get_post_custom()
1つ目。投稿IDを指定して、その投稿および固定ページが持つ 全てのカスタムフィールドの情報を配列で取得します。
get_post_custom( $post_id );
ループ中であれば引数は省略できます。
戻り値:
カスタムフィールドが一つでもあれば 配列、一つも設定されていない場合は false となります。
返す値がなかった場合、 空の配列を、もしくは$single が true なら 空の文字列 を返します。
get_post_meta()
2つ目。投稿IDに加え、 キーを指定して特定のカスタムフィールドの値を取得
get_post_meta( $post_id, $key, $single );
引数が3つあるので表でまとめます。
引数 | 説明 |
---|---|
$post_id | カスタムフィールドを取得したい投稿のID。 初期値: なし |
$key | カスタムフィールドのキー。 初期値: '' |
$single | 真偽値を指定。true をセットした場合、指定した$keyに対して先頭の値を文字列として出力します。false または値をセットしなかった場合、関数はカスタムフィールドの配列を返します。 初期値: false |
戻り値:
第3引数の$singleが false の場合、 値が一つでも複数でも、 配列で取得します。
$singleが true の場合、 文字列です。
例:現在の投稿の"brand"というキーのカスタムフィールドを取得
//値が一つの場合
$brand = get_post_meta( get_the_ID(), 'brand', true );
echo $brand;
//値が複数の場合
$brands = get_post_meta( get_the_ID(), 'brand');
foreach( $brands as $brand ){
echo $brand;
}
この例では第一引数に get_the_ID()
を使用していることに注目してください。
これは、第一 引数($post_id) について Codex日本語版に以下のような注意書きがあったからです。
ループ内で投稿の ID を取得するには get_the_ID() を、サブループ内では投稿オブジェクトの ID プロパティ(例: $my_post_object->ID)を使用してください。グローバルの $post->IDを使うこともできますが、これは常にあなたが意図したものとは限りません。
もし挙動が意図したものにならない場合、第一引数の指定の仕方が$post->IDになっていないか、見直してみるといいかもしれないですね。
第二引数以降を省略すると?
投稿IDだけを指定してキーなどを指定しなかった場合は、その投稿が持つ すべてのカスタムフィールドの値を配列として返します。
つまり、一つ目に説明した get_post_custom()
と同じ結果が得られます。
post_custom()
キーを指定して特定のカスタムフィールドの値を取得します。
post_custom( $key );
引数は1つだけで、カスタムフィールドのキーを指定します。
投稿IDは指定できません。つまり、 この関数が使用できるのはループ内限定です。
戻り値:
値が1つの場合は文字列を、 複数の場合は配列を返します。
指定されたカスタムフィールドが無い場合、 false を返します。
つまり、値が1つの場合も複数の場合も考えられるようなカスタムフィールドでは、戻り値の型(文字列なのか配列なのか)が定まりません。
そういうカスタムフィールドの値を取得する場合は、2つ目に説明した get_post_meta()
を使用しましょう。
投稿タイプ
続いて、投稿に紐づいた 投稿タイプ(ポストタイプ)についての情報の扱い方をまとめていきます。
- 投稿タイプのスラッグを取得できる
get_post_type()
- 投稿タイプのアーカイブページのURLを取得できる
get_post_type_archive_link()
- 投稿タイプの情報をオブジェクトで取得できる
get_post_type_object()
上記3つについて、それぞれ説明していきます。
get_post_type()
1つ目。指定した投稿がどの投稿タイプのものなのかを スラッグで取得する関数です。
get_post_type( $post );
引数は一つ。 投稿IDまたは オブジェクトを指定できます。
ループ内で省略すると、 現在の投稿IDが参照されます。
戻り値
以下のように、投稿タイプに合わせてどの値になるかが決まっています。
- 普通の投稿ページ : 'post'
- 固定ページ : 'page'
- 添付ファイル : 'attachment'
- リビジョン : 'revision'
- ナビゲーションメニューバー : 'nav_menu_item'
- カスタム投稿タイプのページ : 'そのスラッグ'
投稿ページ以外などで使用して上記のいずれも取得できない場合、false
を返してくれます。
使用例:現在の投稿の投稿タイプスラッグを取得
$post_slug = get_post_type( get_the_ID() );
*基本的にループ中であれば、上記のget_the_ID()はなくても大丈夫です。
get_post_type_archive_link()
2つ目。 投稿タイプのアーカイブページへのURLを取得する関数です。
get_post_type_archive_link( $post_type );
引数は一つで、 投稿タイプのスラッグを指定することができます。
先ほどのget_post_type()
と組み合わせて使用することが多いかと思います。
使用例:現在の投稿の投稿タイプのアーカーブページURLを取得
$post_slug = get_post_type(); //まずは投稿タイプのスラッグを取得
$post_url = get_post_type_archive_link($post_slug); //アーカイブURL取得
get_post_type_object()
3つ目。 投稿タイプの情報オブジェクトを取得します。投稿タイプの様々な情報を一気に取得できます。
get_post_type_object( $post_type );
引数は一つ。 投稿タイプのスラッグを指定します。
これまた1つ目に説明した get_post_type()
と組み合わせて使用することが多いですね。
主に、投稿タイプ名(ラベル名)を取得する時に使用します。
例 : 現在の投稿のカスタム投稿タイプの名前(ラベル名)をリンク付きで出力
<?php
$post_slug = get_post_type(); //投稿タイプのスラッグを取得
$post_url = get_post_type_archive_link($post_slug); //アーカイブリンク取得
$post_label = get_post_type_object($post_slug)->label; //投稿タイプ名を取得
echo '<a href="'.$post_url.'">'.$post_label.'</a>'; //出力
?>
ラベル名の他にも、 get_post_type_object()
で取得したオブジェクトには多くの情報が詰まっていますが、今回は割愛します。詳しく知りたい方は、 Codex日本語版をご覧ください。
カテゴリー
投稿に紐づくカテゴリ情報についての扱い方をまとめていきます。
- 投稿に紐づくカテゴリをすべてカテゴリアーカイブへのリンク付きで出力する
the_category()
- 上記のthe_category()を出力せず取得できる
get_the_category_list()
- より詳細に情報を扱える
get_the_category()
get_the_category()
を使用する時のカテゴリアーカイブのURL取得方法- 親カテゴリの情報を取得する方法
上記5つについてそれぞれ説明していきます。
the_category()
1つ目。指定した投稿に紐づくカテゴリ全てを、 カテゴリアーカイブへのリンク付きで出力する関数。
(簡単に使える分、扱える情報は少ないです。)
the_category() の形式
the_category( $separator, $parents, $post_id );
引数については以下の表をご覧ください。
引数 | 説明 |
---|---|
$separator | カテゴリへのリンクを区切る文字列や記号。デフォルトでは番号なしリスト(<ul>)でリンクを出力。 初期値 : 空の文字列 |
$parents | 記事が子カテゴリに属するときの表示の仕方。オプションは以下: 'multiple' - 親と子のカテゴリへのリンクを別々に表示し、見た目は「親/子」になります。 'single' - 子カテゴリへのリンクのみを表示しますが、見た目は「親/子」になります。 初期値 : 空の文字列 |
$post_id | カテゴリを取得する投稿ID。 デフォルトでは現在の投稿について。 初期値 : false |
引数に何も指定せずにそのまま呼び出すと
デフォルト設定の ulタグによるリスト形式で出力されます。
普通にテキストを並べたい場合
$separatorに区切り文字を指定する。
例 : 「 , 」区切り文字でカテゴリを羅列表示(親なし&あり)
//「 , 」 区切りで表示させる(カテゴリ1, カテゴリ2, カテゴリ3)
<?php the_category(', '); ?>
//「 , 」 区切りかつ、親カテゴリも表示( 親A/子a, 親A/子b, 親B/子c )
<?php the_category(', ', 'multiple');
get_the_category_list()
2つ目。 the_category()
で出力していた内容を、 出力せずに取得する関数です。
the_category()
と同じ引数で使用できるので、細かな説明は省きます。
get_the_category_list() の形式
get_the_category_list( $separator, $parents, $post_id );
get_the_category()
3つ目。 投稿に紐づくカテゴリ全てのオブジェクトを配列で取得します 。1つ目の the_category()
よりも詳細な情報を扱いたい時や、出力の形式をもっと自由にしたい場合は、この関数を使用します。
get_the_category() の形式
get_the_category( $post_id );
引数には「 投稿ID」を指定します。
取得できる情報オブジェクトの配列は以下の通りです。
投稿に紐づいているカテゴリそれぞれに対し、カテゴリID・カテゴリ名・カテゴリスラッグなどの情報が取得できます。
get_the_category()で取得できる配列の形式
array(1) {
[0]=>
object(WP_Term)# (16) {
["term_id"] =>//カテゴリID (int)
["name"] =>//カテゴリ名 (string)
["slug"] =>//カテゴリスラッグ (string)
["term_group"] =>//カテゴリグループID (int)
["term_taxonomy_id"] =>//タクソノミーID (int)
["taxonomy"] =>//タクソノミー名"category" (string)
["description"] =>//カテゴリの説明 (string)
["parent"] =>//親ID (int / array)
["count"] =>//投稿数 (int)
["filter"] =>//フィルタ (string)
["cat_ID"] =>//"term_id" と同じ
["category_count"] =>//"count" と同じ
["category_description"] =>//"description" と同じ
["cat_name"] =>//"name" と同じ
["category_nicename"] =>//"slug" と同じ
["category_parent"] =>//"parent" と同じ
}
}
カテゴリを設定している数に応じて、配列にWP_Termオブジェクトが格納されます。
実際の使用例は次のカテゴリアーカイブのURLの取得方法を説明してから紹介しようと思います。
カテゴリアーカイブのURLの取得方法
3つ目の get_the_category()
を使用して、投稿に紐づくカテゴリを カテゴリアーカイブへのリンク付きで出力したい場合、 get_the_category()
で取得できるオブジェクトにはアーカイブURLの情報がないので、別の関数を使用して取得します。
get_category_link()
という関数です。
get_category_link()の形式
get_category_link( $category_id );
引数には「 カテゴリID」を指定します。
実際に、使用例を見てみましょう。
例1 : カテゴリID, カテゴリ名, スラッグ, アーカイブURLを取得( 1つの場合/複数の場合 )
<?php
$categories = get_the_category();
//カテゴリの1つ目だけ
$cat_id = $categories[0]->cat_ID; //カテゴリID
$cat_name = $categories[0]->name; //カテゴリ名
$cat_slug = $categories[0]->slug; //カテゴリのスラッグ
$cat_link = get_category_link($cat_id); //アーカイブURL
//設定されているカテゴリ全部( 1つでも )
foreach ($categories as $cat):
$cat_id = $cat->term_id; //カテゴリID
$cat_name = $cat->name; //カテゴリ名
$cat_slug = $cat->slug; //カテゴリのスラッグ
$cat_link = get_category_link($cat_id); //アーカイブURL
endforeach;
?>
例2 : 複数のカテゴリ情報をアーカーブページへのリンク付きのリストで呼び出す。
<?php
$categories = get_the_category();
if($categories):
echo '<ul>';
foreach($categories as $cat):
$cat_name = $cat->name;
$cat_link = get_tag_link($cat->term_id);
echo '<li><a href="'.$cat_link.'">'.$cat_name.'</a></li>';
endforeach;
echo '</ul>';
endif;
?>
親カテゴリの情報を知りたい時は
get_the_category()
を使用しても、親カテゴリに関する情報は その カテゴリID しか取得できません。
なので、親カテゴリのさらに詳しい情報を取得したい場合、このカテゴリIDを利用してさらに情報を取得する必要があります。
get_the_category()
は 引数に「投稿ID」を指定してその投稿に紐づくカテゴリの情報を取得できましたが、 引数に「カテゴリID」を指定して、そのカテゴリの情報を取得できる get_category()
という関数があります。
これを使用することで、親カテゴリの情報も詳細に取得することができます。
例 : 親情報をオブジェクトで取得( 親ID = $parent_cat_id に代入済みとして)
$parent_cat = get_category( $parent_cat_id ); //親カテゴリの情報オブジェクトを取得
$parent_cat_name = $parent_cat->name; //親カテゴリ名を取得
get_category()
について詳しくは以下の記事でまとめているので参考にしてみて下さい。
タグ
次はタグ情報についてまとめます。
取得方法はカテゴリとほぼ同じで 、使用する関数がタグ版のものに変わるだけです。
- 投稿に紐づくタグをすべてタグアーカイブへのリンク付きで出力する
the_tags()
- 上記のthe_tags()を出力せず取得できる
get_the_tag_list()
- より詳細に情報を扱える
get_the_tags()
- get_the_tags()を使用する時のタグアーカイブのURL取得方法
上記4つについて、さらっと説明していきます。
the_tags()
1つ目。投稿に紐づくタグをすべてリンク付きで出力してくれます。
the_tags() の形式
the_tags( $before, $sep, $after );
引数 | 説明 |
---|---|
$before | タグ一覧の前に表示する文字列。 初期値 : "Tags: " |
$sep | 各タグリンクの間に表示する文字列・記号。 初期値 : "," |
$after | 後のタグに続けて表示する文字列。 初期値 : 空文字 |
例 : タグを / で区切って表示させたあと、改行させる
the_tags('タグ: ', '/', '<br>');
get_the_tag_list()
2つ目。 the_tags()
の取得版ですね。同じ引数で使用でき、出力はせずに取得できます。
get_the_tag_list() の形式
get_the_tag_list( $separator, $parents, $post_id );
説明は省きます。
get_the_tags()
3つ目。 投稿に紐づくタグ全てのオブジェクトを配列で取得します 。 the_tags()
よりも詳細な情報を扱いたい時や、出力の仕方をもっと自由にしたい場合は、この関数を使用します。
get_the_tags() の形式
get_the_tags( $post_id );
引数には「 投稿ID」を指定します。
取得できる情報オブジェクトの配列は以下の通りです。
投稿に紐づいているタグそれぞれに対し、タグID・タグ名・タグスラッグなどの情報が取得できます。
get_the_tags()で取得できる配列の形式
array(1) {
[0]=>
object(WP_Term)# (10) {
["term_id"] =>//タグID (int)
["name"] =>//タグ名 (string)
["slug"] =>//タグスラッグ (string)
["term_group"] =>//タググループID (int)
["term_taxonomy_id"] =>//タクソノミーID (int)
["taxonomy"] =>//タクソノミー名"post_tag" (string)
["description"] =>//タグの説明 (string)
["parent"] =>//親ID 0 (int)
["count"] =>//投稿数 (int)
["filter"] =>//フィルタ (string)
}
}
カテゴリの時の get_the_category()
とほぼ同じですが、タグには親がないので、 "parent" は必ず 0 を返すことに注意。
タグアーカイブのURLの取得方法
get_tag_link()
という関数があります。
get_tag_link()の形式
get_tag_link( $tag_id );
引数には「 タグID」を指定します。
実際に、使用例を見てみましょう。
例1 : タグID, タグ名, スラッグ, アーカイブURLを取得
<?php
$tags = get_the_tags();
foreach ($tags as $tag):
$tag_id = $tag->term_id; //タグID
$tag_name = $tag->name; //タグ名
$tag_slug = $tag->slug; //タグのスラッグ
$tag_link = get_tag_link($tag_id); //アーカイブURL
endforeach;
?>
例2 : 複数のタグ情報をアーカーブページへのリンク付きのリストで呼び出す。
<?php
$tags = get_the_tags();
if($tags):
echo '<ul>';
foreach($tags as $tag):
$tag_name = $tag->name;
$tag_link = get_tag_link($tag->term_id);
echo '<li><a href="'.$tag_link.'">'.$tag_name.'</a></li>';
endforeach;
echo '</ul>';
endif;
?>
(カスタム)タクソノミー
続いて、 カスタムタクソノミーについてです。
カテゴリ・タグの情報の扱い方とほとんど同じで、関数の名前も似ています。
- 投稿に紐づくタグをすべてタグアーカイブへのリンク付きで出力する
the_terms()
- 上記のthe_terms()を出力せず取得できる
get_the_terms_list()
- より詳細に情報を扱える
get_the_terms()
- get_the_terms()を使用する時にタームアーカイブURLを取得する
get_term_link()
上記4つについて説明していきます。
また、カテゴリもタグもカスタムタクソノミーも全て タクソノミーの一種 ですので、この章ではカスタムタクソノミーに限った話ではなく、カテゴリやタグも含めた、 タクソノミー全般的な情報の扱いの話になります。
基本知識
カテゴリやタグは、タクソノミーの一種で、デフォルトで用意されているもの。
「 カスタムタクソノミー」はカテゴリ・タグの他に、自分で作成したタクソノミーのこと。
つまり、この章でメモしていく関数はタクソノミーに関する情報を扱うものですので、 カテゴリやタグの情報も同様に扱えます。
ここまででメモしてきたカテゴリ・タグ情報を取得する関数も、この章でメモしている関数を応用したものにすぎません。
また、タクソノミーの値を タームと言います。
「ダンスジャンル」というタクソノミーを作成したとして、その具体的なものとして選択する「ヒップホップ」や「ブレイク」、「ハウス」といったものがタームとなります。
上記のことをまず予備知識として頭に入れておくと、混乱しにくいかもしれないです。
the_terms()
1つ目。指定した投稿に紐づく 指定したタクソノミーのターム全てを、タームアーカイブへのリンク付きで出力する関数。
(簡単に使える分、扱える情報は少ないです。)
the_terms() の形式
the_terms( $id, $taxonomy, $before, $sep, $after );
引数 | 説明 |
---|---|
$id | 投稿 ID 初期値 : 0 |
$taxonomy | タクソノミースラッグ。 初期値 : 空文字 |
$before | 先頭のタームの前に表示する文字列。 初期値 : ', ' |
$sep | タームを区切る文字列。 初期値 : 空文字 |
$after | 最後のタームに続けて表示する文字列。 初期値 : 空文字 |
カテゴリ・タグの時と少し違うのは、 第二引数にタクソノミー名(slug)が必要なところです。
これにより、どのタクソノミーに関する情報がを出力するかを指定できます。
*$taxonomyに 'category' を指定すると設定されているカテゴリ情報を、$taxonomyに 'post_tag' を指定すると設定されているタグ情報を出力してくれます。
例 : 「 / 」区切りでタグを出力
the_terms( $post->ID, 'post_tag', 'タグ: ', ' / ' );
get_the_term_list()
2つ目。 the_terms()
の取得版です。同じ引数で使用でき、出力はせずに取得できます。
get_the_term_list( $separator, $parents, $post_id );
使い方はほぼ同じなので説明は省きます。
「the_terms() = echo get_the_term_list()」 です。
get_the_terms()
3つ目。 投稿に紐づく、指定したタクソノミーのターム全てのオブジェクトを配列で取得します 。1つ目の the_terms()
よりも詳細な情報を扱いたい時や、出力の形式をもっと自由にしたい場合は、この関数を使用します。
get_the_terms() の形式
get_the_terms( $id, $taxonomy );
カテゴリやタグの時と違い、 引数が2つあります。
第一引数はこれまで通り「 投稿ID」を指定し、第二引数には「 タクソノミーのスラッグ」を指定します。
get_the_terms() で取得できる情報は次の通りです。
array(1) {
[0]=>
object(WP_Term)# (10) {
["term_id"] =>//タームID (int)
["name"] =>//ターム名 (string)
["slug"] =>//タームスラッグ (string)
["term_group"] =>//タームグループID (int)
["term_taxonomy_id"] =>//タクソノミーID (int)
["taxonomy"] =>//タクソノミー名 (string)
["description"] =>//タームの説明 (string)
["parent"] =>//親ID 0 (int)
["count"] =>//投稿数 (int)
["filter"] =>//フィルタ (string)
}
}
使用例は次のタームアーカイブのURLの取得方法を説明してから紹介します。
タームアーカイブのURLの取得方法
get_term_link()
という関数があります。
カテゴリやタグの時とは少し扱い方が異なりますので、少し詳しく説明します。
get_term_link() の形式
get_term_link( $term, $taxonomy );
このように、カテゴリやタグの時とは違い、 引数が2つあり、第二引数には「 タクソノミーのスラッグ」を指定する必要があります。
また、 第一引数は投稿IDではなく投稿オブジェクトでも指定可能になり、さらに、 オブジェクトで指定する場合は第二引数を省略することができます。
さて、 get_the_terms()
と get_termlink()
の使用例を見てみましょう。
例1 : "example"という名前のタクソノミーに関するタームの、ID, 名前, スラッグ, アーカイブURLを取得
<?php
$terms = get_the_terms($post->ID, 'example');
foreach ($terms as $term):
$term_id = $term->term_id; //タームID
$term_name = $term->name; //ターム名
$term_slug = $term->slug; //タームのスラッグ
$term_link = get_term_link($term_id, 'example'); //アーカイブURL
endforeach;
?>
例2:"example"という名前のタクソノミーに関するターム情報をリンク付きのリストで出力する。
<?php
$terms = get_the_terms($post->ID, 'example');
if($terms):
echo '<ul>';
foreach($terms as $term):
$term_name = $term->name;
$term_link = get_term_link( $term ); //$termはオブジェクトなので第二引数は省略可
echo '<li><a href="'.$term_link.'">'.$term_name.'</a></li>';
endforeach;
echo '</ul>';
endif;
?>
例2では、 get_term_link()
の第一引数に投稿オブジェクトを渡しているので、第二引数が省略されています。
第一引数にタームIDを指定する場合、「 get_tag_link( $term->term_id, 'example' ); 」となります。
まとめ
最後に、各情報の扱いで使用できる関数などを簡単にまとめておきます。
基本情報
$post
から取得get_post()
でもOK- 個別の情報取得は
get_the_title()
,get_the_content()
など - アイキャッチ画像の出力は
the_post_thumbnail()
があるが、自作関数を作るとより綺麗なソースが出力可能 - ページURLは
get_permalink()
だけ覚えていればOK
親ページ情報 (固定ページ)
- 親ページの情報はまず親の投稿IDを取得する
- IDを元に
get_post()
で情報を取得 - 全親IDの取得は
get_post_ancestors()
テンプレートファイル名 (固定ページ)
global $template
を呼び出す。- 最後のファイル名だけが欲しい場合は
basename($template, '.php')
で取得
カスタムフィールド
- とりあえず全情報 が欲しい時は
get_post_custom()
- 特定のキー・投稿IDを指定できる
get_post_meta()
- ループ内限定だがサクッと使える
post_custom()
投稿タイプ
- まずは
get_post_type()
でスラッグを取得 - 投稿タイプアーカイブページのURL取得は
get_post_type_archive_link()
- スラッグを指定して投稿タイプの情報を取得するには
get_post_type_object()
カテゴリ
- リスト形式での簡単な出力・取得は
the_category()
とget_the_category_list()
- より詳細な情報を取得するなら
get_the_category()
- カテゴリアーカイブURLの取得は
get_category_link()
タグ
- リスト形式での簡単な出力・取得は
the_tags()
とget_the_tag_list()
- より詳細な情報を取得するなら
get_the_tags()
- アーカイブURLの取得は
get_tag_link()
タクソノミー
- リスト形式での簡単な出力・取得は
the_terms()
とget_the_term_list()
- より詳細な情報を取得するなら
get_the_terms()
- アーカイブURLの取得は
get_term_link()
その他の情報
アーカイブページでの各情報の取得
アーカイブページの種類によってタイトルやスラッグ、投稿タイプやカテゴリ・タグ情報などをどう取得するのかをまとめてみました。
サイト自体の情報
home_url() や blog_info()などを用います。以下のページにてすでにまとめてありますので、是非参考にしてみてください。