★この記事は随分以前(およそ6年前)に書いたメモのようなもので、現在では非推奨になっている関数などについても書かれています。
★よろしければ以下のページをご参照ください。もう少しわかりやすく整理されていると思います。
2019年3月24日
今まで調べたことのメモ。
WordPress では、各ページにアクセスがあった時に、そのページの出力に必要な情報を読み込んでから、そのページの基となるテンプレートを呼び出すようになっている。
以下は WordPress で各ページにアクセスした時の処理のおおまかな流れ
このため、以下のようなループ構文をテンプレートファイルに記述すれば、投稿記事一覧などのそれぞれのページに必要なデータが表示される。
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<!-- 表示する内容 -->
<h2><?php the_title(); ?></h2>
<?php the_content(); ?>
<?php endwhile; ?>
<?php endif; ?>
| プロパティ名 | データ型 | 意味 |
|---|---|---|
| ID | int | 投稿ID |
| post_date | string | 投稿日時 |
| post_content | string | 投稿内容 the_content() で表示される内容 |
| post_title | string | 投稿タイトル the_title() で表示される内容 |
| post_excerpt | string | 投稿内容(抜粋) the_excerpt() で表示される内容 |
| post_name | string | スラッグ / 投稿名(パーマリンク設定で%postname%使用時) |
| post_modified | string | 更新日時 |
| post_parent | int | 親のポストID(0 は最上位の親) |
| guid | string | URL(パーマリンク) |
| menu_order | int | 順序 |
| post_type | string | 投稿情報タイプ(’post’,’page’, ‘カスタム投稿名’など) |
| post_mime_type | string | ポスト MIME タイプ(添付ファイルなど) |
| ancestors | array | 先祖のID 配列で保持 階層型ポストの場合のみ |
//wp-includes/query.php
function get_queried_object() {
global $wp_query;
return $wp_query->get_queried_object();
}
$cid = 0;
if(is_category()) { //カテゴリーアーカイブページを表示していれば
$cat = $wp_query->get_queried_object(); //現在のページの基になっているオブジェクトを取得して $cat に代入
$cid = $cat->tem_id; //カテゴリーIDを取得して $cid に代入
}
wp_list_categories(array('current_category' => $cid));
$pid = 0;
if(is_page()) { //固定ページを表示していれば
$page = $wp_query->get_queried_object(); //現在のページの基になっているオブジェクトを取得して $page に代入
$pid = $page->ID; //固定ページIDを取得して $page に代入
}
wp_dropdown_categories(array('selected' => $pid));
$taxonomy = $wp_query->get_queried_object();
$taxonomy->name;
テンプレートファイルに記述する「ループ」は、アクセスされたURLにしたがってWordPressが自動的に抽出した記事を出力するために使用する。
以下は index.php の例
//index.php
<h1><?php bloginfo('name'); ?></h1>
<h2>新着情報</h2>
<?php if(have_posts()) : ?> //新着情報(記事)があれば
<?php while(have_posts()) : the_post(); ?> //ループ開始(新着情報があるだけ繰り返す)
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<p class="data"><?php the_time('Y.m.d'); ?></p>
<?php the_excerpt(); ?>
<p class="more"><a href="<?php the_permalink(); ?>">続きを読む</a></p>
<?php endwhile; ?> //ループ終了
<div class="prev"><?php previous_posts_link('前のページへ'); ?></div>
<div class="next"><?php next_posts_link('次のページへ'); ?></div>
<?php else: ?> //新着情報(記事)がなければ
<p>現在表示する記事がありません。</p>
<?php endif; ?>
| 生成するページ | 標準で取得するデータ |
|---|---|
| トップページ | 最新の記事と記事に関するデータを取得 |
| カテゴリー別ページ | 当該カテゴリーに属する記事と記事に関するデータを取得 |
| 月別ページ | 当該年月に投稿された記事と記事に関するデータを取得 |
| 記事の個別ページ | 当該記事に関するデータを取得 |
| 固定ページ | 当該固定ページに関するデータを取得 |
<?php $my_query = new WP_Query( array( 'cat' => 1, 'posts_per_page' => 20)); if($my_query-> have_posts()): while($my_query-> have_posts()): $my_query-> the_post(); ?> //投稿のデータを出力するテンプレートタグ等 <?php endwhile; ?> <?php wp_reset_postdata(); ?> //$my_query->the_post() がグローバル変数の $post を上書きするのでリセット <?php else: ?> //投稿がない場合の処理 <?php endif; ?>
| キー | 値 | キーと値の例 | 動作 |
|---|---|---|---|
| numberposts | 投稿の数 | ‘numberposts’=>10 | 指定した件数の投稿を読み込む。-1を指定すると、すべての投稿を読み込む。デフォルトの値は5 (posts_per_page に対応) |
| category | カテゴリーのID | ‘category’=> 1 | 指定したIDのカテゴリーに属する投稿を読み込む。IDにマイナスの数値を渡すと、そのIDのカテゴリーを除外した投稿を読み込む。(複数指定する場合はカンマ「,」で区切る) (cat に対応) |
| include | 投稿のIDをコンマで区切った文字列か、IDの配列 | ‘include’=> ‘1,2,3’ | 指定したIDの投稿のみを読み込む (post__in に対応) |
| exclude | 投稿のIDをコンマで区切った文字列か、IDの配列 | ‘exclude’=>array(1,2,3) | 指定したIDの投稿を除外して読み込む (post__not_in に対応) |
get_posts 関数で読み込んだ投稿の出力
例:ブログの最新記事5件のタイトルを「 ul/li 」要素のリストにして出力する場合
<ul>
<?php
$my_posts = get_posts(array('numberposts' => 5)); //$posts = とは書かない(グローバル変数 $posts を上書きしない)
foreach($my_posts as $post) : setup_postdata($post); //グローバル変数 $post が上書きされる
?>
<li><?php the_title(); ?></li>
<?php endforeach; ?>
</ul>
wp_reset_postdata(); //$post を復元
<?php //新着情報(投稿)を出力する例 ?>
<?php
$arg = array(
'post_type'=>post,
'posts_per_page'=>5,
'paged' => get_query_var( 'paged' ), // ページネーションするなら必須($paged)
);
?>
<?php query_posts($arg); ?>
<?php if(have_posts()) : ?>
<ul>
<?php while(have_posts()) : the_post(); ?>
<li>
<span class="date"><?php the_time('Y.m.d'); ?></span>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php endwhile; ?>
</ul>
<?php else: ?>
<li>現在表示する記事がありません。</li>
<?php endif; ?>
<?php wp_reset_query(); ?>
WordPress ではテンプレートを適用する前に、ポストの抽出は済んでいるので、クエリを発行する前に、アクションフック pre_get_posts を使ってポストの抽出条件を変更した方が効率的(二重にクエリの呼び出しを行わないで済む)で、そのためには、is_main_query を利用する。
カテゴリーアーカイブで、1ページに表示するポスト数を変更し、ポストの表示を昇順に変更する場合の例
functions.php に以下を記述。
add_action( 'pre_get_posts', 'modify_category_query' ); // pre_get_postsにフック
function modify_category_query( $wp_query ) { // フック時に使う関数
if ( ! is_admin()&&$wp_query->is_category() && $wp_query->is_main_query() ) {
$wp_query->set( 'posts_per_page', 20 );
$wp_query->set( 'order', 'ASC' );
}
}
ホームでは通常の投稿の他に、カスタム投稿タイプ(news)の投稿を含め、カテゴリーアーカイブでは5件ずつ表示する場合の例
add_action( 'pre_get_posts', 'modify_my_main_queries' ); // pre_get_postsにフック
function modify_my_main_queries ( $query ) {// フック時に使う関数
if ( ! is_admin() && $query->is_main_query() ) {// 管理画面以外 かつ メインクエリー
if ( $query->is_home() ) {// ホームの時
$query->set( 'post_type', array( 'post', 'news' ) ); // 投稿とカスタム投稿タイプ news を含める
} elseif ( $query->is_category() ) {// カテゴリーアーカイブ
$query->set( 'posts_per_page', 5 );// 5件ずつ表示
}
}
}
また、is_main_query はメインクエリーを変更する物なので、1ページの中に複数のループを使う場合、何をメインにするかを決めて、メイン以外は get_posts あるいは WP Query クラスを使う。
is_home において、topics カテゴリーをメインとする場合の例
//functions.php
add_action( 'pre_get_posts', 'modify_my_query' );
function modify_my_query ( $query ) {
if ( ! is_admin() && $query->is_main_query() ) {
if ( $query->is_home() ) {
$query->set( 'category_name', 'topics' );
$query->set( 'posts_per_page', 5 );
}
}
}
?>
//メインはメインループを使い、その他は WP_Query で読み込む。
<?php if(have_posts()): ?>
<?php while(have_posts()): the_post(); ?>
<?php the_title(); ?>
<?php the_excerpt(); ?>
<?php endwhile; ?>
<?php endif; ?>
<?php
$args = array(
'category_name' => 'sports'
);
$my_query = new WP_Query( $args );
if ( $my_query->have_posts() ) {
while ( $my_query->have_posts() ) :
$my_query->the_post();
endwhile;
} else {
echo "※投稿がありません";
}
wp_reset_postdata();
| キー | 値 | キーと値の例 | 動作 |
|---|---|---|---|
| p | 投稿のID | ‘p’=>100 ‘p=7’ |
指定したIDの投稿を読み込む |
| name | 投稿のスラッグ | ‘name’=>’wordpress’ ‘name=about-my-life’ |
指定したスラッグの投稿を読み込む |
| post__in | 複数の投稿のIDからなる配列 | ‘post__in’=>array(1,3) | 指定したIDの投稿群を読み込む |
| post__not_in | 複数の投稿のIDからなる配列 | ‘post__not_in’=>array(1,3) | 指定したIDの投稿を除外した残りの投稿群を読み込む |
| post_status | 投稿の状態(デフォルト値は ‘publish’) publish:公開 private:非公開 draft:下書き future:予約 pending:レビュー待ち |
‘post_status’=>’draft" | 指定した状態の投稿を読み込む |
| post_type | 投稿タイプ(デフォルト値は ‘post’) post: 投稿 page: 固定ページ カスタム投稿タイプ名:カスタム投稿タイプ revision:履歴 (リビジョン) attachment:メディア any:履歴と ‘exclude_from_search’ がセットされているのも以外すべて |
‘post_type’ => ‘page’ ‘post_type=any’ ‘post_type’ =>array(‘wood’, ‘fabric’) (複数の投稿タイプの指定の例) |
指定した投稿タイプを読み込む |
| posts_per_page | 整数(-1を指定するとすべてのページを読み込む) | ‘posts_per_page=3’ ‘posts_per_page’ => 3 |
読み込む件数を指定 指定しなければ「設定」→「表示設定」の指定によって決まる |
| paged | 整数 | ‘paged’ => $paged
引数に paged=$paged を追加してみてもうまく動かない場合、 |
ページ番号 next_posts_link() などを使用する場合、ページ番号が入っていないと、常に1ページ目を取得しようとするので’paged’ => $pagedとする |
| post_parent | 親ページの投稿のID | ‘post_parent=93’ ‘post_parent’ => get_the_ID() |
親ページの投稿のIDを指定してその子ページを読み込む |
| page_id | 固定ページのID | ‘page_id’=>100 ‘page_id=7’ |
指定したIDの固定ページを読み込む |
| pagename | 固定ページのスラッグ | ‘pagename’=>’wordpress’ ‘pagename=contact’ ‘pagename=parent_slug/child_slug’ |
指定したスラッグの固定ページを読み込む。親ページのスラッグと子ページのスラッグをスラッシュで区切って指定することもできる。 |
| cat | カテゴリーのID | ‘cat=3’ ‘cat=2,6,17,38’ ‘cat’=>100 |
指定したIDのカテゴリーに属する投稿を読み込む。IDをコンマで区切って複数指定することも可能(その場合は、IDの並びの前後を「’」で囲む)。IDをマイナスで指定すると、そのカテゴリーに属する投稿を除外することも可能 |
| category_name | カテゴリーのスラッグ | ‘category_name’=>’wordpress’ ‘category_name=staff’ ‘category_name=news,products’ |
指定したスラッグのカテゴリーに属する投稿を読み込む。複数指定する場合は「,」で区切る |
| category__in | カテゴリーのIDの配列 | ‘category__in’=>array(1,3) | 指定したIDのカテゴリーのどれか1つに属する投稿を読み込む |
| category__not_in | カテゴリーのIDの配列 | ‘category__not_in’=>array(1,3) | 指定したIDのカテゴリーのどれにも属さない投稿を読み込む |
| category__and | カテゴリーのIDの配列 | ‘category__and’=>array(1,3) | 指定したIDのすべてのカテゴリーに属する投稿を読み込む |
| taxonomy | カスタム分類名 | ‘taxonomy’ => ‘カスタム分類名’ | 指定したカスタム分類名に属する投稿を読み込む |
| カスタムタクソノミー名 | タクソノミースラッグ | ‘カスタムタクソノミー名’ => ‘タクソノミースラッグ’ ‘people’ => ‘bob’ ‘people’ カスタムタクソノミーで ‘bob’ というスラッグのタグがつけられた投稿を表示 |
指定したカスタムタクソノミーのタクソノミースラッグに属する投稿を読み込む |
| tax_query | 投稿情報を絞り込むための指定の配列 | tax_query パラメータを参照 | 指定した投稿を読み込む |
| tag | タグのスラッグ | ‘tag’=>’wordpress’ ‘tag=cooking’ ‘tag=bread,baking’ 指定したタグのいずれかを含む投稿を表示 ‘tag=bread+baking+recipe’ 指定したのタグすべてを含む投稿を表示 |
指定したスラッグのタグが付いている投稿を読み込む。スラッグをコンマで区切って複数指定すると、どれかのタグが付いている投稿を読み込むことができる。 |
| tag__in | タグのIDの配列 | ‘tag__in’=>array(1,3) | 指定したIDのタグがどれか1つでも付いている投稿を読み込む |
| tag__not_in | タグのIDの配列 | ‘tag__not_in’=>array(1,3) | 指定したIDのタグがどれも付いていない投稿を読み込む |
| tag__and | タグのIDの配列 | ‘tag__and’=>array(1,3) | 指定したIDのタグがすべて付いている投稿を読み込む |
| tag_slug__in | タグのスラッグの配列 | ‘tag_slug__in’=>array(‘template’, ‘plugin’) | 指定したスラッグのタグがどれか1つ付いている投稿を読み込む |
| tag_slug__and | タグのスラッグの配列 | ‘tag_slug__and’=>array(‘template’, ‘plugin’) | 指定したスラッグのタグがすべてすべて付いている投稿を読み込む |
| author | ユーザーのID | ‘author=123’ ‘author=2,6,17,38’ (複数指定) ‘author’=>1 |
指定したIDのユーザーが書いた投稿を読み込む。IDをマイナスで指定すると、そのユーザーが書いた投稿を除外できる。 |
| author_name | ユーザーのナイスネーム | ‘author_name’=>’taro’ ‘author_name=taro’ |
指定したナイスネームのユーザーが書いた投稿を読み込む。 |
| year | 年 | ‘year’=>2012 ‘year=2012’ |
指定した年に書いた投稿を読み込む |
| monthnum | 月 | ‘monthnum’=>1 ‘monthnum=1’ |
指定した月に書いた投稿を読み込む |
| day | 日 | ‘day’=>1 ‘day=1’ |
指定した日に書いた投稿を読み込む |
| w | 週番号 | ‘w’=>1 ‘w=1’ |
指定した週番号の週にに書いた投稿を読み込む |
| hour | 時 | ‘hour’=>1 ‘hour=1’ |
指定した時に書いた投稿を読み込む |
| minute | 分 | ‘minute’=>1 ‘minute=1’ |
指定した分に書いた投稿を読み込む |
| second | 秒 | ‘second’=>1 ‘second=1’ |
指定した秒に書いた投稿を読み込む |
| order | ‘DESC’ (デフォルト)、’ASC’ | ‘order’ => ‘ASC’ ‘order=ASC’ |
投稿を読み込む際に、その並び順を指定する |
| orderby | author :ユーザーのID date :日付(デフォルト) title :タイトル menu_order :「順序」欄で設定した値(固定ページ) modified: 最終更新日時 parent :親固定ページのID ID :ページのID rand :ランダム meta_value :カスタムフィールドの値 comment_count :コメント数 none :並べ替えなし |
‘orderby’ => ‘title’, ‘order’ => ‘ASC’ ‘orderby=title&order=DESC’ ‘orderby=rand&posts_per_page=1’ (投稿をランダムに1件表示) |
投稿を読み込む際に、その並び順を指定する |
| offset | (整数)- 投稿の先頭からスキップする件数を指定 | ‘offset’ => 1 ‘offset=1’ |
表示される投稿の先頭から指定した件数をスキップする |
| meta_key | カスタムフィールドのキー | ‘meta_key’ => ‘color’ ‘meta_key=color’ |
カスタムフィールドの特定のキーを持つ記事を取得するように指定 |
| meta_value | カスタムフィールドの値 | ‘meta_value’ => ‘blue’ ‘meta_value=blue’ |
カスタムフィールドの特定の値を持つ記事を取得するように指定 |
| meta_compare | カスタムフィールドを比較するための演算子(WP_Query 参照) | ‘meta_compare’ => "!=’ ‘meta_compare=!=’ |
「カスタムフィールドの値が○○より大きい」など、大小比較を行うことができる(数値の比較には使えない) |
| ignore_sticky_posts | 真偽値。デフォルトは0(無視しない) | ‘ignore_sticky_posts’ => 1 | 先頭固定投稿の設定を無視するかどうか |
//使用例
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'people',
'field' => 'slug',
'terms' => 'bob'
)
)
);
$query = new WP_Query( $args );
// tax_query を使わないで書くと
$args = array(
'people' => 'bob'
);
$query = new WP_Query($args);
| ページの種類 | 条件分岐タグ | 高い ← 優先度 → 低い | ||||
|---|---|---|---|---|---|---|
| フロントページ | is_front_page | front-page.php | ※1固定ページ表示ルール | ※2ホームページ表示ルール | – | index.php |
| ホーム(メイン)ページ | is_home | home.php | – | – | – | |
| 固定ページ | is_page is_singular |
customname.php (カスタムページテンプレート) |
page-slug.php | page-id.php | page.php | |
| カテゴリー | is_category | category-slug.php | category-id.php | category.php | archive.php | |
| タグ | is_tag | tag-slug.php | tag-id.php | tag.php | ||
| カスタム分類 | is_tax | taxonomy-taxonomy–term.php | taxonomy-taxonomy.php | taxonomy.php | ||
| 作成者 | is_author | author-nicename.php | author- |
author.php | ||
| 日付 | is_date, is_month,… | date.php | – | – | ||
| アーカイブ | is_archive is_post_type_archive (カスタム投稿) |
archive-post_type.php | – | – | ||
| 検索結果 | is_search | search.php | – | – | – | |
| 404 (Not Found) | is_404 | 404.php | – | – | – | |
| 個別投稿 | is_single is_singular (カスタム投稿) |
single-post_type.php | – | – | single.php | |
| 添付ファイル | is_attachment is_singular |
image.php video.php audio.php application.php |
attachment.php | – | ||
トップページのテンプレート
個別投稿ページのテンプレート
固定ページのテンプレート
カスタムページテンプレート(カスタムテンプレート)
<?php /* Template Name: テンプレート名(日本語可) */ ?>
管理画面の「固定ページ」→「新規追加」または「編集」の右側にあるページ属性に「テンプレート」の項目が追加されるので、「テンプレート」のプルダウンから作成したテンプレートを選択する。
カテゴリーページのテンプレート
タグ表示ページのテンプレート
カスタム分類のテンプレート
ターム:カスタムタクソノミーで作成するタグ機能やカテゴリー機能を持ったもの
カスタム投稿タイプの一覧表示のテンプレート
日付表示テンプレート
各関数の戻り値は真偽値( true/false )になる。
| 条件タグ | 判断するページの種類 | パラメータ |
|---|---|---|
| is_home | メインページ | なし |
| is_front_page | フロントページ | なし |
| is_single | 投稿のページ | 投稿のID/スラッグ/名前 |
| is_page | 固定ページ | ページのID/スラッグ/名前 |
| is_singular | カスタム投稿タイプのページ | 投稿タイプ名(下記参照) |
| is_archive | アーカイブページ | なし |
| is_post_type_archive | カスタム投稿タイプアーカイブページ | カスタム投稿タイプ名 |
| is_category | カテゴリーのアーカイブページ | カテゴリーのID/スラッグ/名前 |
| in_category | 投稿がカテゴリーに属しているか | カテゴリーのID/スラッグ/名前。 2つ目のパラメータとして、投稿の ID かオブジェクト |
| is_tag | タグのアーカイブページ | タグのスラッグ |
| has_tag | 投稿にタグが付いているか | タグのID/スラッグ/名前。 2つ目のパラメータとして、投稿の ID かオブジェクト |
| is_author | ユーザーのアーカイブページ | ユーザーのID/ナイスネーム/ニックネーム |
| is_date | 日付系のアーカイブページ | なし |
| is_year | 年別のアーカイブページ | なし |
| is_month | 月別のアーカイブページ | なし |
| is_day | 日別のアーカイブページ | なし |
| is_search | 検索結果のページ | なし |
| is_404 | 404ページ | なし |
| is_preview | プレビューのページ | なし |
複数指定する場合は、パラメータにカテゴリーのID、スラッグや名前を入れた配列を渡す。
<?php if(in_category(array('template', 'plugin')): ?>
//スラッグまたは名前が「template」か「plugin」のカテゴリーの時に出力する内容
<?php endif; ?>
| パーツ | ファイル名 | 読み込むためのテンプレートタグ |
|---|---|---|
| ヘッダー | header.php | <?php get_header(); ?> |
| header-keyword.php | <?php get_header(‘keyword’); ?> | |
| フッター | footer.php | <?php get_footer(); ?> |
| footer-keyword.php | <?php get_footer(‘keyword’); ?> | |
| サイドバー | sidebar.php | <?php get_sidebar(); ?> |
| sidebar-keyword.php | <?php get_sidebar(‘keyword’); ?> | |
| 検索フォーム | searchform.php | <?php get_search_form(); ?> |
| コメント | comments.php | <?get_comments_template(); ?> |
| カスタム | aaa.php | <?php get_template_part(‘aaa’); ?> |
| aaa-bbb.php | <?php get_template_part(‘aaa’, ‘bbb’); ?> |