WordPress

最終更新日:
公開日:

ワークショップ

オリジナルのWordPressプラグインを作る(11)

お問い合わせのデータをデータベースから取得する

お問い合わせのデータをデータベースから取得して、プラグインページのトップページに表示する機能を実装します。

この記事のポイント

  • データベースの操作をするメソッドは専用のクラスを作って役割分担を明確にする
  • データベースから取得したデータをページに出力するときはhtmlspecialchars関数で記号をエスケープする

目次

データベースからお問い合わせのデータを取得する

前回の「プラグインのトップページを表示する」ではプラグインのトップページをビューファイルindex.phpで用意し、Cmクラスを使って表示するようにしてきました。

前回作成したコード:GitHub

今回はお問い合わせのデータをデータベースから取得して、トップページの一覧に表示できるようにしていきます。
前半はデータベースからデータを取得する機能を実装し、後半では以下のように一覧にデータを表示する機能を実装していきます。

データベースから取得したデータを一覧に表示

データベースの処理を担当するクラスを作成する

プラグイン内のデータベースとやり取りするメソッドを集めたCm_Dbクラスを作成していきます。
Cm_Dbクラスにはお問い合わせのデータを取得、編集、削除するメソッドを実装していきます。
今回はまず、データを取得するメソッドを実装しましょう。

プラグインフォルダに新しくclass.cm-db.phpを作成してください。
作成したらclass.cm-db.phpをコードエディタで開いて、以下のコードを入力してください。

class.cm-db.php

<?php

class Cm_Db {

	public static function getAllData() {

		global $wpdb;
		$res = null;

		$res = $wpdb->get_results( "SELECT * FROM contact ORDER BY id DESC", ARRAY_A);

		return $res;
	}

}

getAllDataメソッドはWordPressが用意するwpdbクラスを使って、contactテーブルから登録の新しい順(idカラムの降順)にデータを全て取得します。

wpdbクラスget_resultsメソッドは該当するデータを全て取得します。
また、2つ目のパラメータには戻り値の形式を指定でき、今回は連想配列で取得できるようにARRAY_Aを指定しています。
他にもオブジェクト形式にするOBJECTOBJECT_K、多次元配列にするARRAY_Nを指定することができます。

Note

データの全件取得は固定のSQLになるため、ここではプリペアドステートメントは使いません。
次回以降にidカラムの値を指定して特定のデータのみ取得するときや、更新と削除を実行するときはプリペアドステートメントを使用します。

続いて、Cm_Dbクラスを呼び出せるようにcontactManager.phpにコードを追加していきます。
以下のように、class.cm.phpを読み込むコードの下に1行追加してください。

contactManager.php

<?php
/*
Plugin Name: Contact Manager
Description: お問い合わせを管理するためのプラグイン
Version: 0.1
Author: GRAYCODE
Author URI: https://gray-code.com
Licence: GPL v2 or later
Licence URI: https://www.gnu.org/licenses/gpl-2.0.html
*/

define( 'CM_VERSION', '0.1.1' );
define( 'CM_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );

require_once( CM_PLUGIN_DIR . 'class.cm.php' );
require_once( CM_PLUGIN_DIR . 'class.cm-db.php' );

function cm_option_page_html() {

$page_title = 'お問い合わせ管理';
$view = 'index';

----- 省略 -----
}

これで、プラグイン内からCm_Db::getAllData()のようにメソッドを呼び出せるようになりました。
実際にビューのviews/index.phpよりCm_Db::getAllDataメソッドを呼び出してみましょう。

views/index.php

<?php

$contact_data = Cm_Db::getAllData();
var_dump($contact_data);

 ?>

<table class="data_table">
	<tr>
		<th>日時</th><th>お名前</th><th>メールアドレス</th><th>お問い合わせ内容</th><th></th>
	</tr>
	<tr>
		<td>2022-04-07 00:00:00</td>
		<td>テスト太郎</td>
		<td>taro@gray-code.com</td>
		<td>テストです。</td>
		<td>
			<a href="#">編集</a>&nbsp;&nbsp;<a href="#">削除</a>
		</td>
	</tr>
	<tr>
		<td>2022-04-07 01:01:00</td>
		<td>テスト花子</td>
		<td>hanako@gray-code.com</td>
		<td>テストです。</td>
		<td>
			<a href="#">編集</a>&nbsp;&nbsp;<a href="#">削除</a>
		</td>
	</tr>
	<tr>
		<td>2022-04-07 02:02:00</td>
		<td>テスト健太</td>
		<td>kenta@gray-code.com</td>
		<td>テストです。</td>
		<td>
			<a href="#">編集</a>&nbsp;&nbsp;<a href="#">削除</a>
		</td>
	</tr>
</table>

Cm_Db::getAllDataメソッドで取得したデータは$contact_dataに入れておきます。
このデータを使ってこれから一覧のHTMLに表示していきますが、一旦確認のためにvar_dump関数で変数の中身を出力してみましょう。
以下のように、たくさんのテキストがずらっと出力されていることを確認できれば正常にデータを取得できています。
見づらいですが、テキストをよく見るとcontactテーブルに入っているデータが連想配列の形で出力されています。

データの出力例

トップページにデータを表示する

データベースからお問い合わせのデータが取得できたので、続いてトップページの一覧にデータが表示されるようにしていきます。
views/index.phpを以下のように修正してください。

views/index.php

<?php

$contact_data = Cm_Db::getAllData();
// var_dump($contact_data); この行は確認用だったので削除して大丈夫です

?>

<?php if( !empty($contact_data) && 0 < count($contact_data) ): ?>
<table class="data_table">
	<tr>
		<th>日時</th><th>お名前</th><th>メールアドレス</th><th>お問い合わせ内容</th><th></th>
	</tr>
	<?php foreach( $contact_data as $data): ?>
	<tr>
		<td><?php echo htmlspecialchars($data['created'], ENT_QUOTES); ?></td>
		<td><?php echo htmlspecialchars( $data['name'], ENT_QUOTES); ?></td>
		<td><?php echo htmlspecialchars( $data['email'], ENT_QUOTES); ?></td>
		<td><?php echo nl2br( htmlspecialchars( $data['content'], ENT_QUOTES)); ?></td>
		<td>
			<a href="<?php echo Cm::getBaseUrl(); ?>&cm=edit&id=<?php echo htmlspecialchars( $data['id'], ENT_QUOTES); ?>">編集</a>&nbsp;&nbsp;<a href="<?php echo Cm::getBaseUrl(); ?>&cm=delete&id=<?php echo htmlspecialchars( $data['id'], ENT_QUOTES); ?>">削除</a>
		</td>
	</tr>
	<?php endforeach; ?>
</table>
<?php endif; ?>

table要素を囲んでいるif文empty関数を使ってお問い合わせのデータを取得できているか確認しています。
取得できていたらtable要素され、取得できていなかったときは何も出力せずに終了します。

foreach文では取得したデータを1行ずつ取り出して出力していきます。
データを出力するときは必ずhtmlspecialchars関数で記号をエスケープしてから出力します。
また、お問い合わせ内容に限ってはテキストに改行を含む可能性があるため、nl2br関数を使って改行をbr要素に置き換えて改行を有効にしましょう。

「編集」と「削除」のリンクについては、CmクラスgetBaseUrlメソッドでプラグインのURLを出力してからGETパラメータを設定します。
編集のリンクではGETパラメータに「cm=edit」、削除のリンクでは「cm=delete」と付けていますが、これは後ほど表示するページを判定するときに使います。

2つのリンクに共通の「id=n」はお問い合わせデータのidカラムです。
編集や削除のリンクを押したときに、お問い合わせのデータを絞り込むために使用します。

ここまでの変更を保存して、ブラウザでお問い合わせプラグインのページを表示してみてください。
以下のようにcontactテーブルのデータが一覧で表示されているでしょうか。

トップページにお問い合わせのデータが表示される

トップページからサイトのお問い合わせページに寄せられたお問い合わせ内容を確認できるようになりました。
次回は一覧の「編集」リンクを押したらお問い合わせ内容の編集をするページを表示できるようにしていきます。

今回作成したコード:GitHub

前のページへ 一覧に戻る 次のページへ