WordPress

最終更新日:
公開日:

ワークショップ

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

編集した内容をデータベースに登録する(2)

お問い合わせ管理プラグインの編集ページで入力された編集内容をデータベースに登録する機能を実装していきます。

この記事のポイント

  • WordPressでデータベースのデータを更新するときはwpdbクラスupdateメソッドを使う
  • updateメソッドは自動的にプリペアドステートメントを実行する

目次

編集内容をデータベースに反映する

前回の「編集した内容をデータベースに登録する(1)」では、編集ページのフォームに入力された内容に対してバリデーションによる確認を行う機能を実装しました。

前回作成したコード:GitHub

今回はバリデーションで問題がないことを確認できた入力内容を、データベースに登録する機能を実装していきます。
データベースに登録した後はトップページに戻り、正常に編集が完了した旨のメッセージを表示します。

編集内容を登録したらトップページに戻る
編集内容を登録したらトップページに戻る

データを更新するメソッドを作成する

まずはデータベースに編集したデータを登録する機能を実装します。
データベースの操作についてはclass.cm-db.phpに集約しているため、このクラスに新しいメソッドを作成します。

class.cm-db.phpをコードエディタで開いて、以下のコードを追加してください。

class.cm-db.php

<?php

----- 省略 -----

	public static function getAllData() {

		global $wpdb;
		$res = null;

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

		return $res;
	}


	public static function updateData( $id=null, $name=null, $email=null, $content=null) {

		global $wpdb;
		$res = null;

		if( $id === null ) {
			return false;
		}

		$res = $wpdb->update(
			'contact',
			array(
				'name' => $name,
				'email' => $email,
				'content' => $content
			),
			array(
				'id' => $id,
			),
			array(
				'%s',
				'%s',
				'%s',
			)
		);

		return $res;
	}

}

今回はcontactテーブルにすでに登録されているデータを更新するため、wpdbクラスupdateメソッドを使用します。
updateメソッドの使い方は以下のようになります。

updateメソッドの使い方

$wpdb->update(
	'tableName',
	array(
		'columnName1' => 'value1',
		'columnName2' => 'value2',
	),
	array(
		'whereColumnName' => 'whereValue'
	),
	array(
		'%s',
		'%d'
	)
);

第1パラメータのtableNameには更新するデータが入っているテーブル名を指定します。

第2パラメータには更新したいカラム名と値のセットを連想配列の形で指定します。
第2パラメータに指定した値の型を、先頭から順に対応させる形で第4パラメータに指定します。
文字列なら%s、数値なら%d、不動小数点数は%fになります。

第3パラメータは更新するデータを特定するためのカラム名と値をセットで指定します。
SQLのWHERE句に該当し、idカラムのようなデータを一意に特定できる値を指定します。

class.cm-db.phpのコードに戻ると、新しくupdateDataメソッドを定義し、その中で$idがちゃんと渡されていることを確認してからwpdbクラスupdateメソッドに入力値を渡して実行します。

updateメソッドにはテーブル名にcontactを指定し、続いて名前($name)、メールアドレス($email)、お問い合わせ内容($content)の3つを更新する値としてセットします。
更新するデータを特定するために第3パラメータに先ほど値を確認した$idを渡して、等しいidカラムを持つデータに対して編集内容を登録するという流れです。

なお、wpdbクラスupdateメソッドは内部でプリペアドステートメントを使用する実装になっているため、ここでは特に気にせずに値を渡すだけで安全にSQLが実行できます。

データを更新する

class.cm-db.phpに編集内容を登録するupdateDataメソッドを定義しました。
このメソッドをcontactManager.phpから呼び出してデータを登録してみましょう。

contactManager.phpを開いて、バリデーションの後にコードを追加してください。

contactManager.php

<?php

----- 省略 -----

if( is_admin() && !empty($_POST['edit_token']) ) {

	if( $_SESSION['edit_token'] === $_POST['edit_token'] ) {

		if( empty($_POST['name']) ) {

			$error[] = '名前を入力してください。';

		} else {

			if( CM_MAX_NAME_LIMIT < mb_strlen($_POST['name']) ) {
				$error[] = '名前は'.CM_MAX_NAME_LIMIT.'文字以内で入力してください。';
			}
		}

		if( empty($_POST['email']) ) {

			$error[] = 'メールアドレスを入力してください。';

		} else {
			
			if( CM_MAX_EMAIL_LIMIT < mb_strlen($_POST['email']) ) {
				$error[] = 'メールアドレスは'.CM_MAX_EMAIL_LIMIT.'文字以内で入力してください。';
			}
		}

		if( empty($_POST['content']) ) {

			$error[] = 'お問い合わせ内容を入力してください。';

		} else {

			if( CM_MAX_CONTENT_LIMIT < mb_strlen($_POST['content']) ) {
				$error[] = 'お問い合わせ内容は'.CM_MAX_CONTENT_LIMIT.'文字以内で入力してください。';
			}
		}

		if( empty($error) ) {

			$res = Cm_Db::updateData( $_POST['id'], $_POST['name'], $_POST['email'], $_POST['content']);

			if( $res !== false ) {
				$_SESSION['success_message'] = '編集を完了しました。';
			}

		} else {

			$_SESSION['error_message'] = $error;
			$page_title = 'お問い合わせ管理 編集';
			$view = 'edit';
		}

	} else {

		$_SESSION['error_message'][] = '編集に失敗しました。';
		$page_title = 'お問い合わせ管理 編集';
		$view = 'edit';
	}

}

----- 省略 -----

updateDataメソッドの戻り値を$resで受け取り、falseでなければ正常に登録が完了したと判断して$_SESSION['success_message']に成功のメッセージを入れます。
この後はトップページが表示されるため、こちらのメッセージはviewsフォルダindex.phpで表示するように設定していきましょう。

views/index.php

<?php

$contact_data = Cm_Db::getAllData();

$success_message = null;

if( !empty($_SESSION['success_message']) ) {
	$success_message = $_SESSION['success_message'];
	unset($_SESSION['success_message']);
}

?>

<?php if( !empty($success_message) ): ?>
	<p class="message success_message"><?php echo $success_message; ?></p>
<?php endif; ?>

<?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>  <a href="<?php echo Cm::getBaseUrl(); ?>&cm=delete&id=<?php echo htmlspecialchars( $data['id'], ENT_QUOTES); ?>">削除</a>
		</td>
	</tr>
	<?php endforeach; ?>
</table>
<?php endif; ?>

empty関数で$_SESSION['success_message']にメッセージが入っているか確認し、入っていたら取り出して$success_messageに入れます。
メッセージは1度のみ表示されるように、メッセージを取り出したタイミングでunset関数より$_SESSION['success_message']は削除しておきます。

その後、p要素$success_messageを出力することでトップページにメッセージが表示されます。

トップページに成功のメッセージを表示
トップページに成功のメッセージを表示

お問い合わせプラグインにお問い合わせを編集する機能が実装できました。
次回からは選択したお問い合わせを削除する機能の実装を進めていきます。

今回作成したコード:GitHub

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

コメントありがとうございます!
運営の参考にさせていただきます。

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