WordPressのアーカイブページで、カテゴリ・タグや投稿タイプなど、様々な情報を取得する方法をまとめていきます。
表示中のアーカイブページが投稿タイプのアーカイブページなのか、カテゴリ・タグのアーカイブページなのか、日付アーカイブページなのかによって、そのタイトルやスラッグの取得方法が異なります。
そのためややこしく思えるのですが、一度じっくり向き合って理解し、関数を自作してしまえば情報の取得方法に迷うことはもうありません。
まずはどのようなアーカイブページがWordPressにはあるのかを知り、それぞれのページで取得できる情報は何か、その情報はどんな関数を使用すれば取得できるのか。一つずつ整理していきましょう。
アーカイブページの種類について
ひとえにアーカイブページと言っても、アーカイブページにはいくつか種類があり、具体的には以下のようなアーカイブページがあります。
- カテゴリアーカイブ
- タグアーカイブ
- カスタムタクソノミーアーカイブ
- カスタム投稿タイプアーカイブ
- 投稿者アーカイブ
- 日付アーカイブ(以下の3種類がある)
- 年別アーカイブ
- 月別アーカイブ
- 日別アーカイブ
これらのアーカイブページの種類によって、取得できる情報や使える関数が異なり、少しややこしい...。
なので、その辺の知識を今後迷わないようにまとめていこう、というのが今回の主旨となります。
それぞれのアーカイブページにアクセスするURL
それぞれのアーカイブページを確認できるURLも覚えておきましょう。(パーマリンクをカスタマイズしている場合は以下と異なる場合があります。)
- カテゴリアーカイブ: ドメイン/category/カテゴリスラッグ
-
タグアーカイブ: ドメイン/tag/タグスラッグ
- カスタムタクソノミーアーカイブ: ドメイン/タクソノミースラッグ/タームスラッグ
- カスタム投稿タイプアーカイブ: ドメイン/投稿タイプスラッグ
- 投稿者アーカイブ: ドメイン/author/ユーザー名
- 日付アーカイブ
- 年別アーカイブ: ドメイン/date/年
- 月別アーカイブ: ドメイン/date/年/月
- 日別アーカイブ: ドメイン/date/年/月/日 - 投稿タイプの日付アーカイブ: ドメイン/date/.../?post_type=投稿タイプスラッグ
どの種類のアーカイブページなのかを知るための条件分岐タグ
まずは どの種類のアーカイブページなのかによって処理内容を分岐させるため、アーカイブページで有効な条件分岐タグを知っておかなくてはなりません。
アーカイブページで使える条件分岐タグ一覧
is_archive() //アーカイブページかどうか
is_category() //カテゴリアーカイブかどうか
is_tag() //タグアーカイブかどうか
is_tax() //タクソノミーアーカイブかどうか
is_post_type_archive() //投稿タイプアーカイブかどうか
is_author() //投稿者アーカイブかどうか
is_date() //日付アーカイブかどうか
is_year() //年別アーカイブかどうか
is_month() //月別アーカイブかどうか
is_day() //日別アーカイブかどうか
それぞれについて詳しくは各自Codexなどで調べて見てください。
非推奨になった条件分岐タグ
下記はすでに非推奨となっていますので、使用は避けましょう。
is_term()
is_taxonomy()
アーカイブページのタイトルを取得する
さて、どんなアーカイブページがあるか分かったところで、本題に入っていきましょう。
まずはアーカイブページのタイトルを取得する方法をまとめていきます。
例えば、アーカイブページは「〇〇の記事一覧」のようにページタイトルをつけていくと思うのですが、
「〇〇」の中はカテゴリアーカイブでは カテゴリ名ですし、投稿タイプアーカイブでは 投稿タイプ名・日付アーカイブではその 日付など、 アーカイブページの種類によってどの情報を入れるかが変わってきますよね。
カテゴリ・タグ・タクソノミーアーカイブでターム名を取得する
実はこれら3種類のタイトルに関しては、同じ関数で簡単に取得できます。
カテゴリ・タグ・タクソノミーアーカイブでターム名を取得する関数
$term_name = single_term_title( '', false );
なんとこれだけ!
single_term_title()
の詳しい説明は Codexの関数リファレンスをご覧ください。
投稿タイプアーカイブで投稿タイプ名を取得する
投稿タイプアーカイブページでは投稿タイプ名を取得したいですよね。実はこれも、簡単に取得してくれる関数があります!
投稿タイプアーカイブで投稿タイプ名を取得する関数
$post_type_name = post_type_archive_title('',false);
これだけ。こちらも、詳しくは Codexの関数リファレンスをご覧ください。
投稿者アーカイブで投稿者名を取得する
投稿者アーカイブでは、投稿者名(ユーザー名)を取得しましょう。
投稿者情報を取得するには、 get_queried_object()
という関数で 投稿者アーカイブの情報全体をオブジェクトで取得し、その中から投稿者名を指定する方法になります。
投稿者アーカイブで投稿者名を取得
$author_name = get_queried_object()->data->display_name;
「 display_name」とは、管理画面上で「 ブログ上の表示名」とされている設定で選択している表示です。
日付アーカイブの日付を取得する
日付アーカイブでは、年別アーカイブでは「〇年」、月別アーカイブでは「〇年〇月」、日別アーカイブでは「〇年〇月〇日」という部分を取得してみます。
いずれも、 get_query_var()
という関数を利用して取得できます。
日付アーカイブで日付を取得
if (is_year()) {
$date_name = get_query_var('year').'年';
} elseif (is_month()) {
$date_name = get_query_var('year').'年'.get_query_var('monthnum').'月';
}else{
$date_name = get_query_var('year').'年'.get_query_var('monthnum').'月'.get_query_var('day').'日';
}
まとめ:自作関数でどのアーカイブページでもタイトルを取得できるようにしてみる
ここまでの内容を、それぞれのアーカイブページに合わせて使用していくわけですが、それらを一つの関数にまとめておくと便利です。
僕が個人的に作成した関数 get_archive_title()
を紹介しますので、好きにカスタマイズして使ってください。
archive.phpにて、以下のように呼び出して使用します。(「〇〇の記事一覧」と表示したい場合)
<h1>
<?php echo get_archive_title()."の記事一覧"; ?>
</h1>
get_archive_title()のソースコード
function get_archive_title() {
//アーカイブページじゃない場合、 false を返す
if (!is_archive()) return false;
//日付アーカイブページなら
if (is_date()) {
if (is_year()) {
$date_name = get_query_var('year').'年';
} elseif (is_month()) {
$date_name = get_query_var('year').'年'.get_query_var('monthnum').'月';
}else{
$date_name = get_query_var('year').'年'.get_query_var('monthnum').'月'.get_query_var('day').'日';
}
//日付アーカイブページかつ、投稿タイプアーカイブページでもある場合
if (is_post_type_archive()) {
return $date_name."の".post_type_archive_title('',false);
}
return $date_name;
}
//投稿タイプのアーカイブページなら
if (is_post_type_archive()) {
return post_type_archive_title('',false);
}
//投稿者アーカイブページなら
if (is_author()) {
return "投稿者".get_queried_object()->data->display_name;
}
//それ以外(カテゴリ・タグ・タクソノミーアーカイブページ)
return single_term_title('',false);
}
}
アーカイブページのスラッグを取得する
カテゴリアーカイブならばそのカテゴリのスラッグ・投稿タイプであればその投稿タイプのスラッグを取得したい場合がけっこうあったので、それらを取得する方法をまとめていこうと思います。
また、ここでいうスラッグとは、「 どのアーカイブページであるかを特定できる文字列」ということにします。
表示しているのがどのページなのかをbody部分にクラス名としてつけておくことでデザインを管理したい場合など、この章の最後でまとめる関数が便利なんじゃないかなと思います。(実際に私はそんな感じで使用しています。)
カテゴリ・タグ・タクソミーアーカイブでタームスラッグを取得する
get_queried_object()
を使用し、アーカイブページの情報をオブジェクトで取得してからタームスラッグを取得する方法が便利です。カテゴリ・タグ・タクソミーアーカイブで共通して使えます。
カテゴリ・タグ・タクソミーアーカイブでタームスラッグを取得
$term = get_queried_object();
$term_sug = $term->slug;
投稿タイプアーカイブで投稿タイプのスラッグを取得する
投稿タイプのスラッグに関しては、 get_query_var( 'post_type' )
で取得する方法があります。
get_post_type()
でも取得できるのですが、投稿がまだ0件だった場合、falseになってしまうので get_query_var( 'post_type' )
が無難でしょう。
投稿タイプアーカイブで投稿が0件でも問題なく投稿タイプのスラッグを取得
$post_type_slug = get_query_var( 'post_type' );
if (is_array($post_type)) {
$post_type_slug = reset( $post_type );
}
投稿タイプが配列で返されても確実に文字列で取得できるように、配列ならreset() をかけています。
アーカイブページで配列になることはないと思うのですが、 Codexのget_post_type_objectに関するページ内、「ア ーカイブページでカスタム投稿タイプのスラッグを取得」の章にてこのような使い方をしていたので、一応真似しています。
投稿者アーカイブでユーザー名を取得
投稿者アーカイブはURLにユーザー名が使用されているので、それに倣うとしましょう。
投稿者アーカイブのタイトルの取得と同様、get_queried_object()を使用します。今回は「ブログ上の表示名」ではなく「ユーザー名」を取得したいので、「display_name」ではなく、「 user_nicename」を指定します。
投稿者アーカイブで投稿者名を取得
$author_name = get_queried_object()->data->user_nicename;
日付アーカイブの"スラッグ"について
日付アーカイブに関しては日付アーカイブだということが分かれば十分だと仮定して、後述する関数では「 date」という文字列を取得することにします。
もしもそれ以上に細かく取得する場合、例えば is_year()
が true なら 「 year」 を返す、などとしてもいいですし、タイトルを取得した時のように get_query_var()
を使用して、「2018_4_1」のような詳しい日付を返してもいいかもしれません。
まとめ:自作関数でどのアーカイブページでもスラッグを取得できるようにしてみる
スラッグの取得についても関数にしてみました。
個人的に作成した関数 get_archive_slug()
を紹介しますので、好きにカスタマイズして使ってください。
投稿タイプアーカイブかつ 日付アーカイブの場合、どちらのスラッグを取得したいかによって順番を変えてください。もしくは両方を合わせた文字列を返すなど、用途に合わせてお使いください。
get_archive_slug()のソースコード
function get_archive_slug() {
//アーカイブページでない場合、false を返す
if (!is_archive()) return false;
//日付アーカイブページなら
if (is_date()) {
return "date";
}
//投稿タイプアーカイブページなら
if (is_post_type_archive()) {
$post_type = get_query_var( 'post_type' );
if (is_array($post_type)) {
$post_type = reset( $post_type );
}
return $post_type;
}
//投稿者アーカイブページなら
if (is_author()) {
return get_queried_object()->data->user_nicename;
}
//それ以外(カテゴリ・タグ・タクソノミーアーカイブページ)
$term = get_queried_object();
return $term->slug;
}
注意:投稿者アーカイブページについて
投稿者アーカイブページを有効にしているのなら、セキュリティ面に注意が必要です。
「 ドメイン/?author=1」で 管理者の投稿者アーカイブページアクセスできるのですが、表示されるURLは「 ドメイン/author/管理者ユーザー名」となるので、 管理者のユーザー名が簡単にバレてしまいます。
ブルートフォース攻撃の格好の餌食となるわけです。あとはパスワードさえ知ってしまえばいいのですから。
これは、放置しておくわけにはいきません。対策方法を2つ、メモしておきます。
ログインに必要な情報をユーザー名ではなくメールアドレスに限定する
対策方法の1つです。WordPressへログインするには「ユーザー名またはメールアドレス」と、「パスワード」が必要です。
投稿者アーカイブにてユーザー名がバレてしまうのであれな、ユーザー名ではログインできないようにしてしまおう、という対策ですね。
WordPressプラグインの Force Email Loginをインストールすれば簡単に実装できます。
また、functions.phpでのカスタマイズも簡単なので、プラグイン嫌い派の人たちは以下をコピペでも大丈夫です。
functions.phpに記述
function force_email_login( $user, $user_name, $pass ) {
// ユーザ情報を'email'を対象に検索
$user = get_user_by('email',$user_name);
// メールアドレスが存在する場合
if(!empty($user->user_login)) {
$user_name = $user->user_login;
} else {
// 該当するユーザが存在しない場合は強制的に空文字にして認証失敗させる
$user_name = '';
}
return wp_authenticate_username_password( null, $user_name, $pass );
}
add_filter('authenticate', 'force_email_login', 20, 3);
こちらのサイトを参考にさせていただきました。
投稿者アーカイブページ自体を無効にする
そもそも投稿者アーカイブページが不要な場合はこの対象方法がおすすめ。
キャッシュを無効にしてTOPページへ強制リダイレクト
function custom_handle_redirect() {
if (is_author()) {
nocache_headers();
wp_redirect( home_url() );
exit;
}
}
add_action( 'parse_query', 'custom_handle_redirect' );
調べると404扱いにするコードがけっこう出回ってたんですが、404.phpがテーマファイルにない場合、URLはそのままで記事一覧も出力されてしまう(archive.phpの内容が出力された)ので、強制リダイレクトのコードにしています。
まとめ
アーカイブページでの情報の扱いについては最初は複雑に感じるかもしれませんが、慣れてくればどうってことないです。
- アーカイブページの種類を知る
- 条件分岐タグを知る
- 各アーカイブページでどんな情報が取れるかの知る
- 自分が良く扱う情報については関数にして使いまわせるようにしてしまう
というように、「情報を集め、整理し、自分なりの関数を作る。」という作業を繰り返すことでWordPressへの理解が進み、どんどん楽しくなってくると思います。是非自分なりの関数を作ってみてください。
おまけ:投稿ページでの様々な情報の扱い方ついて
今回はアーカイブページの話でしたが、投稿や固定ページで取得できる様々な情報についても下記の記事にてまとめていますので、是非参考にしてみてください。