2024年06月13日
4.DBからの読込関数
WordPress文書の読込方法には下記の2つがあります。
1.メインクエリ: WordPressが利用しているquery_posts()
2.サブクエリ : ユーザが定義したWP_Query()
ここではこれらを使った文書の読み込み方法を解説します。
1.メインクエリ query_posts()
ここではWordPressがquery_posts()を使ってDBから読み込んだ文書を取り出して表示する方法を解説しています。
文書の取り出しには Whileループ を利用します。
この Whileループ は下表のグローバル変数 $wp_query の内部ポインタを利用して $post に文書情報を取り込む処理になります。
グローバル変数 | 解説 |
$wp_query | DBに問い合わせした結果の総ての文書を管理しているオブジェクト
例えばカテゴリ表示の場合は、対象のカテゴリの文書が総て登録されています。 |
$post | $wp_queryの内部ポインタの文書情報が取り出されたオブジェクト
始めは先頭の文書情報が取り込まれています。 |
WordPressでは上記のグローバル変数を制御する関数として下記の関数が用意されています。
WordPress関数 | 解説 |
have_posts() | $wp_queryに文書ががあるか否かをチェックする関数です。
あった場合は true、無い場合は false を返します。 |
the_post() | Whileループ の中で使える関数です。
$wp_query の内部ポインタが指しているデータを $post に取り込みます。 更に、$wp_query の内部ポインタを1つ更新します。 |
以下にWordPressの各テンプレートの中で、上記関数をどの様に使っていくのか?を解説していきます。
page.php、single.phpの場合
これらのテンプレートの場合には、既に $post の中に文書がセットされているので Whileループ を回す必要はありません。
<?php // ドキュメント内のタイトルや本文等を表示します。 ?>
しかし、the_date() の様に Whileループ の中でしか使えない関数がある為、再読み込みを行うのが一般的です。
<?php while ( have_posts() ) : // whileの条件式にhave_postsを指定している。 the_post(); // 投稿の情報を1個ずつ呼び出し[$post]にセットし、[$wp_query]の内部ポインタを1つ更新します。 // ドキュメント内のタイトルや本文、作成日等を表示します。 endwhile; ?>
■但し、対象ドキュメントは1個しかないので[whileループ]は1回しか回りません。
上記をHTMLベースで記述すると下記になります。
<?php while( have_posts() ):the_post(); ?> <!-- ドキュメント内のタイトルや本文、更新日付等を表示します。 --> <?php endwhile; ?>
■have_posts()の命令の終わりは(:コロン)です。
■the_post()やendwhileの命令の終わりは(;セミコロン)です。
serch.phpの場合
ドキュメントを検索した結果は下記のケースが考えられます。
①検索対象のドキュメントがあった場合
②検索対象のドキュメントが無かった場合
この場合のプログラムは下記の様になります。
<?php if ( have_posts() ) : // ループできる文書があるか否か while ( have_posts() ) : // whileの条件式にhave_postsを指定している the_post(); // 投稿の情報を1個ずつ呼び出し[$post]にセットし、[$wp_query]の内部ポインタを1つ更新します。 //ドキュメント内のタイトルや本文、更新日付等を表示します。 endwhile; else : // ループできる文書が無い場合 echo '検索結果が見つかりませんでした。' ; endif; ?>
上記をHTMLベースで記述すると下記になります。
<?php if(have_posts()):?> <?php while( have_posts() ):the_post();?> <!-- ドキュメント内のタイトルや本文、更新日付等を表示します。 --> <?php endwhile;?> <?php else:?> <p>検索結果が見つかりませんでした。</p> <?php endif;?>
category.php、tag.phpの場合
カテゴリ表示やタグ表示の場合は、そのカテゴリのドキュメントが無いのも情報になります。
よってプログラムは下記になります。
<?php while ( have_posts() ) : // whileの条件式にhave_postsを指定している the_post(); // 投稿の情報を1個ずつ呼び出す // ドキュメント内の情報の表示等を記述します。 endwhile; ?>
上記をHTMLベースで記述すると下記になります。
<?php while( have_posts() ):the_post(); ?> <!-- ドキュメント内のタイトルや本文、更新日付等を表示します。 --> <?php endwhile; ?>
メモ
query_posts()は、WordPress本体が利用しているクエリーですが、ユーザがこれを利用する事もできます。
しかしユーザが利用した場合は、最後に wp_reset_query() を必ず実行して下さい。
これを行わないと、メインクエリーのデータが壊れるので、WordPressの挙動がおかしくなります。
よってあまりお勧めはしません。
ユーザが利用する場合は WP_Query() を利用するのが良いと思います。
2.サブクエリ WP_Query()
ここではWordPressがquery_posts()でDBから文書を読み込む以外に、WP_Query() を使って新たにDBから文書を取り出して表示する方法を解説しています。
例えば、投稿や固定ページに関連ドキュメント一覧を表示する例がこれにあたります。
①固定ページに関連ドキュメントを読み出す。
下記は固定ページのタイトルと同じカテゴリ名を持つドキュメントを検索し一覧表示する例です。
<?php $page_title = get_the_title(); // 固定ページのタイトル取得 $cat_id = get_cat_ID($page_title); // 固定ページのタイトル名からカテゴリIDを取得 $args = array( 'cat'=>cat_id, // カテゴリIDでDBから検索する 'order' =>'asc', // 並び順は昇順 'orderby'=>'title', // 並び順はタイトル名順 'posts_per_page'=> -1,// 総てを表示する ); $my_query = new WP_Query( $args );// DBからデータを取得 ?> <?php while ($my_query->have_posts()):$my_query->the_post(); ?> <?php the_title();?> <?php endwhile;?> <?php wp_reset_postdata(); ?> <!-- WP_Query()のリセット -->
■2~3行目:固定ページのタイトルと同じ名前のカテゴリIDを取得する。
■4~9行目:$args の中にどの様なリストを抽出するかの条件をセットします。
詳細は wp_query() を参照してください。
■10行目:DBから情報を呼び出して $my_query にオブジェクトとしてセットします。
■12~14行目:オブジェクトから have_posts() と the_post() でデータを取り出して処理します。
取り出したデータは、メインクエリーの時と同じ関数で処理できます。
■15行目:最後にWP_Queryのエリアをリセットします。
②投稿ページに関連ドキュメントを読み出す。
下記は、投稿と同じカテゴリの文書を呼び出して一覧表示する事例です。
但し、現在の文書は一覧リストから削除します。
<?php $cat = get_the_category(); // カテゴリ情報の取得 $cat_id = $cat[0] -> cat_ID;// カテゴリIDを取得 $args = array( 'cat' => $cat_id, // カテゴリIDでDBから検索する 'post__not_in' => $cat_id, // 現在の文書は無視する 'order' => 'asc', // 並び順は昇順 'orderby' => 'title', // 並び順はタイトル名順 'posts_per_page'=> -1,// 総てを表示する ); $my_query = new WP_Query( $args ); ?> <?php while ($my_query->have_posts()):$my_query->the_post(); ?> <?php the_title();?> <?php endwhile;?> <?php wp_reset_postdata(); ?>
■2~3行目:文書のカテゴリIDを取得しています。
■4~10行目:$args の中にどの様なリストを抽出するかの条件をセットします。
詳細は wp_query() を参照してください。
■11行目:DBから情報を呼び出して $my_query にオブジェクトとしてセットします。
■13~15行目:オブジェクトから have_posts() と the_post() データを取り出します。
取り出したデータは、メインクエリーの時と同じ関数で処理できます。
■16行目:最後にWP_Queryのエリアをリセットします。