WordPress 4.9.6では、欧州連合 (EU) の一般データ保護規則 (General Data Protection Regulation、略して GDPR) のような法律への準拠を容易にするための新しいツールが追加されました。追加されたツールの中には、指定したユーザーの個人データの消去/匿名化をサポートする、個人データ削除ツールがあります。これは登録されたユーザーアカウントを削除するものではありません – これはまだ、管理者が行うかどうかを選択できる別のステップです。
WordPress のコメントなどに保存された個人データに加えて、プラグインもまた消去機能にフックして、自身が収集した個人データ – 投稿メタから、まったく新規のカスタム投稿タイプさえも – を消去できます。
エクスポーターと同様、すべての消去機能の「キー」はユーザーのメールアドレスです – これは、本格的な登録ユーザーだけでなく、未登録ユーザー (たとえば、ログアウトしたコメント投稿者など) の個人データの消去にも対応しているためです。
しかし、個人データの消去は破壊的なプロセスであるため、リクエストを確認せずに消去することはしたくありません。そのため、管理者向けのユーザーインターフェイスでは、管理者がリクエストを行うユーザー名またはメールアドレスを入力し、リクエストを確認するためにクリックするリンクを送信することで、すべてのリクエストを開始します。リクエストが確認されると、管理者はそのユーザーの個人データ消去するか、または、必要に応じて強制消去を開始できます。
個人データの消去方法は、個人データ・エクスポーターの方法と似ています – そして、データを消去するという面倒な作業をするために「消去機能」コールバックをフックすることに依存しています。管理者が個人データの削除リンクをクリックすると、AJAX ループが始まり、システムに登録されているすべての消去機能を一度に1つずつ繰り返します。コアに内蔵された消去機能に加えて、プラグインは消去機能のための独自のコールバックを登録できます。
消去機能コールバックのインターフェースは、できるだけシンプルに設計されています。消去機能コールバックは、扱うメールアドレスとページパラメータを受け取ります。(1から始まる) ページパラメータは、プラグインが収集したすべての個人データを一度に消去しようとしてタイムアウトを引き起こす可能性を避けるために使用されます。良いプラグインは、ページごとに消去しようとするデータ量を制限します (たとえば、100投稿、200コメントなど)。
消去機能コールバックは、個人データを含むアイテムが消去されたかどうか、個人データを含むアイテムが保持されたかどうか、管理者に提示するメッセージの配列 (アイテムが保持された理由を説明する)、および完了したかどうかを返します。消去機能コールバックが完了していないことを報告した場合、ページパラメータを1増やして (別のリクエストで) 再度呼び出されます。
すべての消去機能が完了するまで呼び出されると、管理者ユーザーインターフェイスが更新され、検出されたすべての個人データが消去されたかどうか、および個人データが保持された理由を説明するメッセージが表示されます。
コメント投稿者の位置情報をコメントに追加するプラグインを想定してみましょう。このプラグインは add_comment_meta
を使って meta_key
の latitude
と longitude
を用いて位置情報を追加したとします。
プラグインが最初に行う必要があるのは、メールアドレスとページを受け付ける消去機能のための関数を作成することです:
/**
* Removes any stored location data from a user's comment meta for the supplied email address.
*
* @param string $email_address email address to manipulate
* @param int $page pagination
*
* @return array
*/
function wporg_remove_location_meta_from_comments_for_email( $email_address, $page = 1 ) {
$number = 500; // Limit us to avoid timing out
$page = (int) $page;
$comments = get_comments(
array(
'author_email' => $email_address,
'number' => $number,
'paged' => $page,
'order_by' => 'comment_ID',
'order' => 'ASC',
)
);
$items_removed = false;
foreach ( (array) $comments as $comment ) {
$latitude = get_comment_meta( $comment->comment_ID, 'latitude', true );
$longitude = get_comment_meta( $comment->comment_ID, 'longitude', true );
if ( ! empty( $latitude ) ) {
delete_comment_meta( $comment->comment_ID, 'latitude' );
$items_removed = true;
}
if ( ! empty( $longitude ) ) {
delete_comment_meta( $comment->comment_ID, 'longitude' );
$items_removed = true;
}
}
// Tell core if we have more comments to work on still
$done = count( $comments ) < $number;
return array(
'items_removed' => $items_removed,
'items_retained' => false, // always false in this example
'messages' => array(), // no messages in this example
'done' => $done,
);
}
次にプラグインが行うべきことは、フィルター wp_privacy_personal_data_erasers
を使用して消去機能の配列をフィルタリングしてコールバックを登録することです。
登録の際には、消去機能のフレンドリーな名前 (デバッグを助けるため – このフレンドリーな名前は、現時点では誰にも表示されません) とコールバックを指定します。
/**
* Registers all data erasers.
*
* @param array $exporters
*
* @return mixed
*/
function wporg_register_privacy_erasers( $erasers ) {
$erasers['my-plugin-slug'] = array(
'eraser_friendly_name' => __( 'Comment Location Plugin', 'text-domain' ),
'callback' => 'wporg_remove_location_meta_from_comments_for_email',
);
return $erasers;
}
add_filter( 'wp_privacy_personal_data_erasers', 'wporg_register_privacy_erasers' );
以上で完了です ! これで、プラグインが個人データをきれいにしてくれます !