wordpress WordPress の基本的な動作

2013年6月10日

今まで調べたことのメモ。

基本的な動作

WordPress では、各ページにアクセスがあった時に、そのページの出力に必要な情報を読み込んでから、そのページの基となるテンプレートを呼び出すようになっている。

  • WordPressは,wp,wp_rewrite,wp_query という3つのクラスにより,リクエストされたURIを処理する。(リクエストされたURIをこれらの機能に渡すことで何をするか決定する)
  • wp_rewrite クラス:ルーティング機能
  • wp_query クラス:投稿を読み込む際に使われるクラス。wp_rewrite クラスが解析した結果を受け取り,記事やページを抽出し、抽出された記事やページは,その属性によってテンプレートを使ってHTMLへと変換される。
  • あるURLにアクセスすると URLから必要なデータのクエリを発行し、グローバル変数 $wp_query に格納して、テンプレート階層に従ってデータを表示する。
  • グローバル変数 $wp_query には「posts」というプロパティがあり、そこにすべての投稿のデータ格納されていて、個々の投稿のデータは「post」というプロパティに格納されている。

以下は WordPress で各ページにアクセスした時の処理のおおまかな流れ

  1. ページのアドレスを基に必要なデータのクエリを発行
  2. WP_Query オブジェクトで、ページの出力に必要な情報を読み込む(グローバル変数 $wp_query に格納)
  3. ページの種類に応じたテンプレートに処理を移し出力する

このため、以下のようなループ構文をテンプレートファイルに記述すれば、投稿記事一覧などのそれぞれのページに必要なデータが表示される。

<?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>
    <!-- 表示する内容 -->
    <h2><?php the_title(); ?></h2>
        <?php the_content(); ?>
    <?php endwhile; ?>
<?php endif; ?>

WP_Queryのメソッドとプロパティ

プロパティ

  • $query:$wp_query オブジェクトに渡されたクエリストリング。
    例:URL が「/?p=8」なら、[p] =>8
  • $query_vars:解析された $query を保持する連想配列。クエリ変数と対応する値の配列。 print_r($wp_query->query_vars);で確認できる。
    query_vars の値を取得するには、 get_query_var() を使用。
    「パーマリンクの設定」がデフォルトかそうでないかにより得られる値が変わる。
    例:デフォルトの場合、$m に年月の値が「201301」の形式で格納され($year、$monthnumには「0」が入る)、 デフォルト以外では $year に年の値が「2013」という形で、 $monthnum に月の値が「01」という形で入る
  • $queried_object:リクエストがカテゴリー、作者ページ、パーマリンク、または固定ページだった場合に適用される。リクエストされたクエリの情報を含む。
  • $queried_object_id:リクエストがカテゴリー、作者ページ、パーマリンク、または固定ページだった場合、対応する ID を含む。
  • $posts:要求された投稿をデータベースから取得したもの。クエリーを実行して取得した記事オブジェクトの配列。
  • $post_count:表示される投稿の数。
  • $found_posts:現在のクエリ変数に一致する投稿の合計数。
  • $max_num_pages:ページの合計数。$found_posts を $posts_per_page で割った結果。
  • $current_post: 表示されようとしている投稿の数。
  • $post: 現在表示されている投稿(の記事オブジェクト)。

メソッド

  • init():オブジェクトを初期化して、すべてのプロパティをnull、ゼロ、falseにセットする。
  • parse_query($query):リクエストを定義するクエリ文字列を受け取り、それを解析して$posts、$post_count、$post、$current_post以外のすべてのプロパティを返す。
  • get($query_var):指定されたクエリ変数を取得する。
  • next_post():(ループ内でのみ使用可能) $posts で次の投稿に進む。$current_post を1つ増やし、$post を (新規の) 現在の投稿オブジェクトに設定する (グローバル $post 変数を設定はせず、WP_Query オブジェクトのインスタンス変数のみに適用される) 。現在の投稿オブジェクトを返す。
  • the_post():(ループ内でのみ使用可能)次の投稿に進み、グローバル変数$postを設定する。
  • have_posts():(ループ内か、ループの前でのみ使用可能) 表示する投稿が残っているかを示す。
  • rewind_posts():$current_postと$postをリセットする。
  • get_queried_object():$queried_objectを設定し、それがまだ設定されていなければ、返す。
  • get_queried_object_id():$queried_object_idを設定し、それがまだ設定されていなければ返す。

主なグローバル変数(グローバルオブジェクト)

  • $wp_query:WP_Query オブジェクト(現在のクエリ)。 query_posts()で上書きされる。
  • $wp_the_query:WP_Query オブジェクト。URL のバックアップ用クエリ
  • $posts:クエリーを実行して取得した記事オブジェクトの配列。
  • $post:現在の記事オブジェクト。the_post(), WP_Query::the_post()で上書きされる。

上書きされたグローバル変数の復元

  • 以下の関数で復元できる。
  • wp_reset_query(): $wp_query , $post を復元。
  • query_posts($query_string):クエリ条件をリセット(あまり使用しない)
  • wp_reset_postdata() : $post を復元。

$post – 投稿オブジェクト

  • 現在の投稿情報を保持するグローバル変数
  • the_post によって更新される
主なプロパティ
プロパティ名 データ型 意味
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 配列で保持 階層型ポストの場合のみ

現在表示しているページの(基になっている)オブジェクトの取得

get_queried_object()
リクエストした(現在表示している)ページのオブジェクトを取得する。
($wp_query->get_queried_object のラッパー: wp-includes/query.php に定義されている)
パラメータ:なし
戻り値:ページリクエストに応じた情報(オブジェクト)
//wp-includes/query.php 
function get_queried_object() {
  global $wp_query;
  return $wp_query->get_queried_object();
}

get_queried_object の戻り値

  • カテゴリ、タグ、などタクソノミーのアーカイブページ:タクソノミーオブジェクト(get_term 、 get_category 関数でも取得可能)
  • 投稿ページ:投稿オブジェクト
  • 投稿タイプアーカイブページ:投稿タイプオブジェクト(get_post_type_object 関数でも取得可能)
  • 固定ページ:固定ページオブジェクト(get_page 関数でも取得可能)

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; ?>
  • 表示される投稿の件数は、管理画面「設定→表示設定」の「1ページに表示する最大投稿数」で設定されている。
  • WordPressはURLの情報から自身がどの投稿タイプのどの記事を取得して、テンプレートファイルで制御するのかを決定する。
  • 例えばURLからページ種類が「シングルページ」と判断した場合は、記事に指定されたIDを元に投稿を1つだけ取得する。これによりループは投稿の1件だけを表示する。
  • the_post():次の投稿に進み、グローバル変数$postを設定する。
  • have_posts(): 表示する投稿が残っているかを示す。

標準で取得されるデータ

生成するページ 標準で取得するデータ
トップページ 最新の記事と記事に関するデータを取得
カテゴリー別ページ 当該カテゴリーに属する記事と記事に関するデータを取得
月別ページ 当該年月に投稿された記事と記事に関するデータを取得
記事の個別ページ 当該記事に関するデータを取得
固定ページ 当該固定ページに関するデータを取得

マルチループ

メインループ
WordPressがアクセスされたURLを元にページ種類を解析して自動的に抽出した記事のループ(前述のループ)
マルチループ
メインループ以外の記事を取得したい(異なる投稿タイプ内で別の投稿タイプを表示する)ときに使用する。マルチループを作成するには、query_posts, get_posts, WP_Query オブジェクトを使っての読み込み等を使用。

投稿の読み込み(WP_Query, get_posts)

WP_Query オブジェクトを使った投稿の読み込みと出力
テンプレートの中で「WP_Query」オブジェクトを独自に作り、自力で投稿などを読み込むこともできる。このようにすれば、WordPress があらかじめ読み込んだ投稿などとは別に、必要な情報を読み込んで出力することができる。
  • 読み込む投稿を指定する条件を、連想配列の形でコンストラクタのパラメータに渡す。
  • 生成された WP_Query オブジェクトを変数に代入する
  • 変数 = new WP_Query( array( 読み込む投稿を指定する条件));
  • 「have_posts」と「the_post」の関数の前に、「$オブジェクトの変数名 -> 」を付加する必要がある。(生成した WP_Query オブジェクトのメソッドの呼び出し)
 <?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; ?>
get_posts での複数の投稿の読み込み
get_posts 関数は、WP_Query オブジェクトの簡易版のような存在。内部的には WP_Query オブジェクトを作成して投稿を読み込むので、パラメータの指定方法は、WP_Query オブジェクトや query_posts() の場合とほぼ同じ。但し、WP_Query オブジェクトにはないパラメータもいくつか用意されている。
get_posts 関数特有のパラメータ
キー キーと値の例 動作
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 関数で読み込んだ投稿の出力

  • 戻り値の投稿のオブジェクトの配列を変数に代入する際は、変数名をグローバル変数の「$posts」にしない。(上書きされる)
  • foreach 文で配列から投稿を1つずつ読み込み、変数 $post に代入しながら、繰り返しを行う
  • 繰り返しの先頭で「setup_postdata」という関数を実行し、パラメータとして変数 $post を渡して、投稿の情報を初期化しループ内で使用するテンプレートタグで「$post」の内容を出力できるようにする。
  • 繰り返しの中では、the_title などのテンプレートタグを使って、投稿の情報を出力できる。
  • グローバル変数 $post が上書きされるで、wp_reset_postdata() でリセットする。

例:ブログの最新記事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 を復元

WordPress ループで出力する内容を置き換える(query_posts)

  • query_posts() 関数はメインの WordPress ループを変更するためのもので新たなループを作るためのものではない。
  • query_posts() 関数はページのメインクエリを上書きし、新しい WP_Query オブジェクトを作成し、$wp_query に割り当てるので $wp_query の値は上書きされる。
  • query_posts() 関数を使うと、通常出力する投稿が置き換えられるだでけでなく、現在のページを管理する情報も置き換えられる( $wp_query の値が変更される)ので、ページの種類を判別する関数などもすべて影響を受ける。
  • そこで必要な処理がすべて終わったら、クエリをリセットする(通常出力する投稿を扱う状態に戻す)ように指定するために、wp_reset_query() 関数を実行する。
  • メインループの他で query_posts() を使用すると、メインループが不正な状態になり期待する結果が得られなくなるので注意が必要。
<?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(); ?>

is_main_query と pre_get_posts でポストの抽出条件を変更

WordPress ではテンプレートを適用する前に、ポストの抽出は済んでいるので、クエリを発行する前に、アクションフック pre_get_posts を使ってポストの抽出条件を変更した方が効率的(二重にクエリの呼び出しを行わないで済む)で、そのためには、is_main_query を利用する。

  • pre_get_posts に定義した関数は、管理画面を含むすべての記事の取得のタイミングで呼ばれる。
  • is_main_query()でメインループ用の取得処理であることを判定する。
  • $wp_query には、URLを元にWordPressが解析したメインループ用の条件が入っているので、$wp_query に条件を「set」することで、条件の追加や変更ができる。
  • 設定する条件は、query_posts の引数と同じものが使える。
  • 複数ある場合は $query->set( ‘パラメーター名’, ‘内容’); を追加する。

カテゴリーアーカイブで、1ページに表示するポスト数を変更し、ポストの表示を昇順に変更する場合の例

  • ! is_admin() で管理画面でないことを判定。
  • is_main_query() でメインループ用の取得処理であることを判定。
  • is_category() でカテゴリーページであることを判定。
  • $wp_query に条件 ‘posts_per_page’と’order’を「set」

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();

get_posts(), query_posts()のパラメータ

get_posts(), query_posts()で指定できるパラメータ
キー キーと値の例 動作
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 を追加してみてもうまく動かない場合、
$paged = get_query_var(‘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 先頭固定投稿の設定を無視するかどうか

query_posts() の tax_query パラメータ

  • taxonomy(対象とするタクソノミー): タクソノミー名(’category’、’post_tag’、’post_format’なども指定可能)
  • field(terms に指定するフィールド): term_id(デフォルト), slug, name, term_taxonomy_id
  • terms(対象とするタームの値): ターム名、スラッグ、ターム idなど 。複数ある場合は配列で指定。
  • include_children (階層化タクソノミーの場合、子供を含めて演算 するかどうか):true(デフォルト), false
  • operator(ターム間の演算子): IN(デフォルト), NOT IN, AND(大文字)
  • relation(タクソノミー間の演算子): AND(デフォルト), OR(大文字)
//使用例
$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);

WordPress ループの内側の入れ子ループ

  • get_posts(), get_children() は query_posts(), WP_Query()の WordPress ループの内側で入れ子ループとしても利用できる。
  • 但し、query_posts(), get_posts(), WP_Query() の同じ関数/クラスでループを入れ子にしてはならない。

テンプレートファイルの優先順位

テンプレート階層
ページの種類 条件分岐タグ 高い ← 優先度 → 低い
フロントページ 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-taxonomyterm.php taxonomy-taxonomy.php taxonomy.php
作成者 is_author author-nicename.php author-id.php 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
  • 太字の箇所は、id 名やスラッグ名、カスタム名の値を指定
  • フロントページ:特定のページをトップページに表示するときに使う。「管理画面」→「設定」→「表示設定」の「フロントページの表示」で指定したページが表示される。詳細は下記「トップページのテンプレート」参照。
  • ホームページ:Webサイトのトップページに使う。「管理画面」→「設定」→「一般設定」の「サイトのアドレス(URL)」に設定されているURLにアクセスされた際に表示するページ。
  • ※1:固定ページ表示ルール:「管理画面」→「設定」→「表示設定」の「フロントページの表示」が「固定ページ」で「フロントページ」が設定(選択)されている場合
  • ※2:ホームページ表示ルール:「管理画面」→「設定」→「表示設定」の「フロントページの表示」が「固定ページ」で「投稿ページ」が設定(選択)されている場合

トップページのテンプレート

  1. front-page.php
  2. home.php
  3. index.php
  • front-page.php が存在する場合は「管理画面」→「設定」→「表示設定」の「フロントページの表示」で「固定ページ」を選択している場合でも、front- page.php が優先される。(home.php、index.php に対しては固定ページが優先される)
  • front-page.php と home.php の両方がある場合は front-page.php がトップページに表示される
  • front-page.php と home.php がない場合は index.php がトップページに表示される

個別投稿ページのテンプレート

  1. single-{post_type(カスタム投稿名)}.php
  2. single.php
  3. index.php
  • 通常の投稿記事の個別ページで使用するテンプレートは「single.php」
  • スラッグや id で振り分けることはできないので、表示をページに合わせて分ける場合は条件分岐タグによる切り替えを行う
    (in_category などを使ってカテゴリーにより分岐し、get_template_part タグを利用してカスタムパーツテンプレートを読み込むなど。その際、カスタムパーツテンプレートのファイル名は「sgl-xxx.php」などとした方が、カスタム投稿のテンプレートと区別がつきやすい。)
  • カスタム投稿を利用した場合は「single-カスタム投稿名.php(single-{post_type}.php)」のテンプレートで専用のテンプレートを利用できる

固定ページのテンプレート

  1. カスタムテンプレートページ作成画面の「ページテンプレート」メニューで選択したテンプレートのファイル名
    (次項カスタムテンプレートページ参照)
  2. page-slug.php
  3. page-id.php
  4. page.php(固定ページの汎用テンプレート)
  5. index.php
  • 固定ページは、テンプレート階層でもっとも優先順位の高い「ページテンプレート」を、ページごとに設定することができる。

カスタムページテンプレート(カスタムテンプレート)

  • カスタムテンプレートは特定の「固定ページ」の生成に利用できるテンプレートで、任意のファイル名をつけて作成する。
  • テーマフォルダの中に、customname(任意のファイル名).php というファイルを作成し、以下のようにテンプレート名を指定する。(この名前は、管理画面「固定ページ」の編集画面のテンプレートのプルダウンに表示される)
  • (ファイル名とテンプレート名が同一である必要はない。)
  • Template Name: 「Template Name」と「:」の間にスペースを入れてはならない
<?php
/*
Template Name: テンプレート名(日本語可)
*/
?>

管理画面の「固定ページ」→「新規追加」または「編集」の右側にあるページ属性に「テンプレート」の項目が追加されるので、「テンプレート」のプルダウンから作成したテンプレートを選択する。

カテゴリーページのテンプレート

  1. category-slug.php
  2. category-id.php
  3. category.php(カテゴリーの汎用テンプレート)
  4. archive.php(汎用アーカイブテンプレート。タグ・日別・アーカイブなどと共用)
  5. index.php
  • カテゴリー記事の一覧などに使用するテンプレート
  • すべてのカテゴリーを1つのデザインで表示する場合は、「category.php」のみで問題ないが、カテゴリーによりデザインを変更する場合は、条件分岐でデザインを変更するか、カテゴリーのスラッグや id を使用してテンプレートを分けることができる

タグ表示ページのテンプレート

  1. tag-slug.php
  2. tag-id.php
  3. tag.php(タグの汎用テンプレート)
  4. archive.php(汎用アーカイブテンプレート。カテゴリー・日別・アーカイブなどと共用)
  5. index.php
  • タグとは関連記事をまとめたりする際の目印のような機能
  • タグのスラッグや id を使用してテンプレートを分けることができる

カスタム分類のテンプレート

  1. taxonomy-{taxonomy}-{term}.php
    カスタムタクソノミー名が「topicscat」、ターム(スラッグ)が「economy」の場合:taxonomy-topicscat-economy.php
  2. taxonomy-{taxonomy}.php
    カスタムタクソノミー名が「topicscat」の場合:taxonomy-topicscat.php
  3. taxonomy.php
  4. archive.php
  5. index.php

ターム:カスタムタクソノミーで作成するタグ機能やカテゴリー機能を持ったもの

カスタム投稿タイプの一覧表示のテンプレート

  1. archive-{post_type(カスタム投稿名)}.php
  2. archive.php(汎用アーカイブテンプレート。カテゴリー・タグ・日別・アーカイブなどと共用)
  • カスタム投稿タイプのインデックスページ(一覧ページ)は archive-投稿タイプ名.php というテンプレートで扱うことができる。(3.1以降)
  • カスタム投稿タイプのアーカイブを表示するためには、カスタム投稿タイプを登録のとき、register_post_type() の引数に、‘has_archive’ => true を指定する

日付表示テンプレート

  1. date.php
  2. archive.php
  3. index.php
  • ブログなどで日時別の一覧を表示するときに使用する。
  • 通常サイトでは更新情報の一覧を年/月ごとに表示する場合などに使用。

条件分岐タグ

  • 下の階層のテンプレートファイル内で、条件タグを使うことにより、それより上位のページの種類を判定し、分岐することができる。
  • テンプレート階層と条件分岐タグを組み合わせることで、テンプレートファイルの数を減らし共通化を図ることができる。
  • 基本的には大きく表示が異なる場合は、テンプレート階層を使用し、一部の表示を変更する場合は、条件分岐タグを使用すると効率がよい。

条件タグの種類

各関数の戻り値は真偽値( 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; ?>
is_singular($post_type)
パラメータ
$post_type(オプション):投稿タイプ名(カスタム投稿タイプ名、page, post, attachment, revision, nav_menu)
戻り値
指定したタイプの投稿を出力している場合は true、していなければ false
  • is_single()、is_page() 、is_attachment() のいずれかが真である場合 (固定ページ、個別投稿ページ、添付ファイルページである場合) true を返す。
  • 個々の投稿や固定ページを出力しているかどうかを判断する関数として is_single や is_page があるが、個々のカスタム投稿タイプのページを出力しているかどうかを判断するには、is_singular を使う。

パーツテンプレート(モジュールテンプレート)

パーツテンプレート一覧
パーツ ファイル名 読み込むためのテンプレートタグ
ヘッダー 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’); ?>