WordPress 4.9.6では、欧州連合 (EU) の一般データ保護規則 (General Data Protection Regulation、略して GDPR) のような法律への準拠を容易にするための新しいツールが追加されました。追加されたツールの中には、指定したユーザーのすべての個人データを ZIP ファイルに書き出すことをサポートする、個人データ書き出しツールがあります。WordPress のコメントなどに保存された個人データに加えて、プラグインもまたエクスポーター機能にフックして、自身が収集した個人データ – 投稿メタから、まったく新規のカスタム投稿タイプさえも – を書き出すことができます。
すべての書き出しの「キー」は、ユーザーのメールアドレスです – これは、本格的な登録ユーザーだけでなく、未登録ユーザー (たとえば、ログアウトしたコメント投稿者など) の個人データの書き出しにも対応しているためです。
しかし、個人データの書き出しを作成するのは集中的なプロセスであり、機密データを含む可能性が高いため、リクエストを確認することなく、ただデータを生成してリクエスト者にメールで送信することはしたくありません。そのため、管理者向けのユーザーインターフェイスでは、管理者がリクエストを行うユーザー名またはメールアドレスを入力し、リクエストを確認するためにクリックするリンクを送信することで、すべてのリクエストを開始します。
リクエストが確認されると、管理者はユーザーの個人データ書き出し ZIP ファイルを生成してダウンロードするか、直接メールで送信するか、または、必要に応じて書き出しを行うことができます。ユーザーが受け取る ZIP ファイルの中には、個人データをグループ (たとえば、コメントのグループなど) に編成したインデックス HTML ページを含む「ミニ Web サイト」があります。
管理者が個人データ書き出し ZIP ファイルをダウンロードする場合も、要求者に直接送信する場合も個人データ書き出しの組み立て方は同じで、書き出すためのすべてのデータを収集するという面倒な仕事のために、「エクスポーター」コールバックのフックに依存します。管理者がダウンロードまたは電子メールのリンクをクリックすると、AJAX ループが始まり、システムに登録されているすべてのエクスポーターを一度に1つずつ繰り返します。コアに内蔵されたエクスポーターに加えて、プラグインは独自のエクスポーター・コールバックを登録できます。
エクスポーター・コールバックのインターフェースはできるだけシンプルに設計されています。エクスポーター・コールバックは、扱うメールアドレスとページパラメータを受け取ります。(1から始まる) ページパラメータは、プラグインが収集したすべての個人データを一度に書き出そうとしてタイムアウトを引き起こす可能性を避けるために使用されます。お行儀の良いプラグインは、ページごとに消去しようとするデータ量を制限します (たとえば、100投稿、200コメントなど)。
エクスポーター・コールバックは、そのメールアドレスとページが完了したかどうかのデータを返します。エクスポーター・コールバックが完了していないことを報告した場合、ページパラメータを1増やして (別のリクエストで) 再度呼び出されます。エクスポーター・コールバックは、書き出されるアイテムの配列を返すことが期待されています。各項目には、そのアイテムが属するグループ (たとえば、コメント、投稿、注文など)、省略可能なグループラベル (翻訳済み)、アイテムの識別子 (たとえば、comment-133)、そしてそのアイテムの書き出されるデータを含む名前と値のペアの配列、のグループ識別子が含まれます。
注目すべきは、この値がメディア・パスである可能性があることで、この場合、メディアファイルへのリンクが書き出しのインデックス HTML ページに追加されます。
すべてのエクスポーターが完了するまで呼び出されると、WordPress はまず、書き出しレポートの中心となる「インデックス」HTML ドキュメントを作成します。WordPress や他のプラグインがすでに追加したアイテムについて、プラグインが追加データを報告する場合、そのアイテムについてのすべてのデータが一緒に表示されます。
書き出しは3日間サーバーにキャッシュされ、その後削除されます。
プラグインは1つ以上のエクスポーターを登録できますが、ほとんどのプラグインは1つだけでよいでしょう。コメント投稿者の位置情報をコメントに追加するプラグインを想定してみましょう。
まず、プラグインが add_comment_meta
を使って meta_key
の latitude
と longitude
を用いて位置情報を追加したとします。
プラグインが最初に行う必要があるのは、メールアドレスとページを受け付けるエクスポーター関数を作成することです:
/**
* Export user meta for a user using the supplied email.
*
* @param string $email_address email address to manipulate
* @param int $page pagination
*
* @return array
*/
function wporg_export_user_data_by_email( $email_address, $page = 1 ) {
$number = 500; // Limit us to avoid timing out
$page = (int) $page;
$export_items = array();
$comments = get_comments(
array(
'author_email' => $email_address,
'number' => $number,
'paged' => $page,
'order_by' => 'comment_ID',
'order' => 'ASC',
)
);
foreach ( (array) $comments as $comment ) {
$latitude = get_comment_meta( $comment->comment_ID, 'latitude', true );
$longitude = get_comment_meta( $comment->comment_ID, 'longitude', true );
// Only add location data to the export if it is not empty.
if ( ! empty( $latitude ) ) {
// Most item IDs should look like postType-postID. If you don't have a post, comment or other ID to work with,
// use a unique value to avoid having this item's export combined in the final report with other items
// of the same id.
$item_id = "comment-{$comment->comment_ID}";
// Core group IDs include 'comments', 'posts', etc. But you can add your own group IDs as needed
$group_id = 'comments';
// Optional group label. Core provides these for core groups. If you define your own group, the first
// exporter to include a label will be used as the group label in the final exported report.
$group_label = __( 'Comments', 'text-domain' );
// Plugins can add as many items in the item data array as they want.
$data = array(
array(
'name' => __( 'Commenter Latitude', 'text-domain' ),
'value' => $latitude,
),
array(
'name' => __( 'Commenter Longitude', 'text-domain' ),
'value' => $longitude,
),
);
$export_items[] = array(
'group_id' => $group_id,
'group_label' => $group_label,
'item_id' => $item_id,
'data' => $data,
);
}
}
// Tell core if we have more comments to work on still.
$done = count( $comments ) > $number;
return array(
'data' => $export_items,
'done' => $done,
);
}
次にプラグインが行うべきことは、フィルター wp_privacy_personal_data_exporters
を使用してエクスポーター配列をフィルタリングしてコールバックを登録することです。
登録の際には、書き出しのためのフレンドリーな名前 (デバッグを助けるため – このフレンドリーな名前は、現時点では誰にも表示されません) とコールバックを指定します。
/**
* Registers all data exporters.
*
* @param array $exporters
*
* @return mixed
*/
function wporg_register_user_data_exporters( $exporters ) {
$exporters['my-plugin-slug'] = array(
'exporter_friendly_name' => __( 'Comment Location Plugin', 'text-domain' ),
'callback' => 'my_plugin_exporter',
);
return $exporters;
}
add_filter( 'wp_privacy_personal_data_exporters', 'wporg_register_user_data_exporters' );
以上で完了です ! これで、プラグインが書き出し用のデータを提供します !