WordPress

最終更新日:
公開日:

ワークショップ

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

お問い合わせのデータを削除する

お問い合わせ管理プラグインの削除ページから、お問い合わせデータをデータベースから削除する機能を実装します。

この記事のポイント

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

目次

選択したお問い合わせのデータを削除する

前回の「お問い合わせの削除ページを作成する」では、プラグインにお問い合わせを削除するページを実装しました。

前回作成したコード:GitHub

今回は削除ページで削除ボタンを押すと、データベースからお問い合わせのデータを削除する機能を実装していきます。

削除ボタンを押すと削除を実行して、トップページに戻る
削除ボタンを押すと削除を実行して、トップページに戻る

今回でお問い合わせプラグインの一通りの機能が揃いますので、本ワークショップ「オリジナルのWordPressプラグインを作る」の最終回になります。

データを削除するメソッドを実装する

削除ページで削除ボタンを押した後の処理を実装していきましょう。
まずは、データベースから指定したidカラムを持つデータを削除するメソッドを実装していきます。

データベースの操作を担当するclass.cm-db.phpをコードエディタで開いて、updateDataメソッドの下に以下のコードを記述してください。

class.cm-db.php

<?php

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

	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;
	}


	public static function deleteData( $id=null) {

		global $wpdb;
		$res = null;

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

		$res = $wpdb->delete(
			'contact',
			array(
				'id' => $id,
			),
		);

		return $res;
	}

}

定義したdeleteDataメソッドはパラメータで受け取った$idを使ってデータを検索し、削除を実行します。
戻り値は削除した行の数を返し、エラーが発生したらfalseを返します。

削除を実行するときはwpdbクラスdeleteメソッドを使います。
deleteメソッドの使い方は以下のようになります。

deleteメソッドの使い方

$wpdb->delete(
	'tableName',
	array(
		'whereColumnName' => 'whereValue'
	),
	array(
		'%d'
	)
);

まず、第1パラメータに削除するデータが入っているテーブルを指定します。
第2パラメータは削除するデータを検索する条件、そして第3パラメータは第2パラメータで指定したwhereValueのフォーマットを指定します。

削除するデータを検索する条件に複数指定するときは複数指定することも可能です。
ただし、指定した条件の数だけ第3パラメータのフォーマットも指定する必要がある点に注意してください。
フォーマットは編集のときのupdateメソッドと同様に、文字列なら%s、数値は%d、浮動小数点数は%fを指定します。

deleteメソッドupdateメソッドと同様、メソッド内で自動的にプリペアドステートメントを実行します。
そのため、今回もデータのエスケープや手動のプリペアドステートメントの設定は必要ありません。

削除ページからPOSTパラメータを受け取る

データを削除するメソッドが用意できたところで、続いて削除ページで削除ボタンが押された後の実装を進めていきます。
削除ボタンが押されると、お問い合わせプラグインにPOSTパラメータが送信されるため、編集ページのときと同じように$_POSTの値を参照して削除を実行するようにします。

具体的には、contactManager.phpで編集ページのセッショントークンを確認するif文の後にelseif文を追加して、そこで削除ページのセッショントークンを確認するようにします。

contactManager.phpを開いて、以下のコードを追加してください。

contactManager.php

<?php

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

		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';
	}

} else if( is_admin() && !empty($_POST['delete_token']) ) {

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

		// ここに削除するコードを追加する

	} else {

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

}

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

変数名がdelete_tokenに置き換わっただけで、セッショントークンの確認は編集ページと全く同じ内容です。
続いて、$_SESSION['delete_token']$delete_tokenのセッショントークンが一致したときに先ほどCm_Dbクラスに作成したdeleteDataメソッドを実行するコードを追加します。

contactManager.php

<?php

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

} else if( is_admin() && !empty($_POST['delete_token']) ) {

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

		if( !empty($_POST['id']) ) {

			$res = Cm_Db::deleteData( $_POST['id']);

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

	} else {

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

}

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

deleteDataメソッドを呼び出す前に、empty関数を使ってPOSTパラメータのidが渡されているか確認します。
$_POST['id']があったら、その値をCm_DbクラスdeleteDataメソッドにパラメータとして渡して呼び出します。

deleteDataメソッドの戻り値は削除した行数を返しますが、削除が実行できなかったときはfalseを返します。
そこで、if文で戻り値がfalseじゃないか確認し、正常に削除できていたら削除完了のメッセージをセッション$_SESSION['success_message']にセットします。
$_SESSION['success_message']にセットしたメッセージはトップページに戻って表示しますが、編集ページで完了メッセージを表示するときに実装したものがそのまま使えるため、トップページのビューファイルは変更する必要はありません。

削除ページにエラーメッセージを表示する

最後に、セッショントークンが一致しなかったときに削除ページへ戻ってエラーメッセージを表示するようにします。
viewsフォルダdelete.phpを開いて、以下のコードを追加してください。

views/delete.php

<?php

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

$_SESSION['delete_token'] = bin2hex(openssl_random_pseudo_bytes(24));

if( !empty($_GET['id']) ) {

	$data = Cm_Db::getDataFromId($_GET['id']);

} else if( !empty($_POST['id']) ) {

	$data = Cm_Db::getDataFromId($_POST['id']);
}

?>

<p class="link_back"><a href="<?php echo Cm::getBaseUrl(); ?>">戻る</a></p>

<div class="form_area">

<?php if( !empty($_SESSION['error_message']) ): ?>
<ul class="message error_list">
	<?php foreach( $_SESSION['error_message'] as $message ): ?>
		<li><?php echo $message; ?></li>
	<?php endforeach; ?>
</ul>
<?php unset($_SESSION['error_message']); ?>
<?php endif; ?>

<?php if( !empty($data) ): ?>

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

if( !empty($_GET['id']) ) {」の後に、エラーで削除ページへ戻ってきたときのためにelseif文を追加しています。
ここでは$_POST['id']の値が渡されているか確認し、もし渡されていた場合はgetDataFromIdメソッドでページに表示するお問い合わせのデータを取得します。

エラーメッセージを表示する仕組みは編集ページと全く同じです。
empty関数$_SESSION['error_message']にメッセージが入っているか確認し、入っていたらforeach文で1つずつ取り出して出力していきます。

ここまでの変更を保存して、ブラウザでプラグインを表示して試しにお問い合わせを削除してみてください。
正常に削除できた場合はトップページに戻り、一覧から削除したお問い合わせが表示されなくなります。
一方で、もしセッショントークンの値が一致しない理由で削除ページに戻った場合は以下のようにメッセージが表示されます。

セッショントークンが一致しないときにエラーメッセージを表示
セッショントークンが一致しないときにエラーメッセージを表示

今回で、当ワークショップは完了となります。
「お問い合わせプラグインの作成」を題材に、WordPressのプラグイン作成をハンズオンで進めて参りました。
最後まで進めてこられた方は、WordPressのプラグイン作成に必要なファイルやコード、そしてプラグイン内のページの切り替えやデータベース操作方法などを一通り行なってきました。
今後は、WordPressを使っていて「こんなプラグインあったらいいな」と思ったら、オリジナルのプラグインを作成できるのではないかと思います。

もしフィードバック等がございましたら、ページ下のGoodボタン、Badボタンを押した後に表示されるフォームからか、またはお問い合わせフォームよりお気軽にお送りくださいませ。
当ワークショップに最後までお付き合いいただき、ありがとうございました。

今回作成したコード:GitHub

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

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

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

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