WordPress 4.9.6では、欧州連合の一般データ保護規則(GDPR)などの法律に準拠するための新しいツールが追加されました。追加されたツールの中には、特定のユーザーのすべての個人データをZIPファイルでエクスポートすることをサポートする個人データエクスポートツールがあります。WordPressのコメントなどに保存されている個人データに加えて、プラグインはエクスポータ機能にフックして、ポストメタやまったく新しいカスタム投稿タイプ(CPT)などで収集した個人データをエクスポートすることもできます。

    すべてのエクスポートの「キー」はユーザーのメールアドレスです。これは、完全に登録されたユーザーと未登録のユーザー(例:ログアウトしたコメント者)の両方の個人データをエクスポートすることをサポートするために選ばれました。

    ただし、個人データエクスポートを組み立てることは負荷の高いプロセスであり、機密データが含まれる可能性があるため、リクエストを確認せずに単に生成してリクエスト者にメールで送信したくありません。そのため、管理者向けのユーザーインターフェースは、すべてのリクエストを管理者がリクエストを行うユーザー名またはメールアドレスを入力することから始め、その後、リクエストを確認するためのリンクをクリックするように送信します。

    リクエストが確認されると、管理者はユーザーの個人データエクスポートZIPファイルを生成してダウンロードするか、直接メールで送信することができます。また、必要に応じてエクスポートを行うこともできます。ユーザーが受け取るZIPファイルの中には、個人データがグループ(例:コメント用のグループなど)に整理されたインデックスHTMLページを含む「ミニウェブサイト」が見つかります。

    管理者が個人データエクスポートZIPファイルをダウンロードするか、リクエスト者に直接送信するかにかかわらず、個人データエクスポートの組み立て方は同じです。これは、すべてのデータを収集するための「エクスポータ」コールバックにフックすることに依存しています。管理者がダウンロードまたはメールリンクをクリックすると、AJAXループが開始され、システムに登録されたすべてのエクスポータを1つずつ繰り返します。コアに組み込まれたエクスポータに加えて、プラグインは独自のエクスポータコールバックを登録できます。

    エクスポータコールバックインターフェースは、できるだけシンプルに設計されています。エクスポータコールバックは、作業中のメールアドレスとページパラメータを受け取ります。ページパラメータ(1から始まる)は、プラグインが一度に収集したすべての個人データをエクスポートしようとすることでタイムアウトを引き起こすのを避けるために使用されます。適切に動作するプラグインは、ページごとに消去しようとするデータの量を制限します(例:100件の投稿、200件のコメントなど)。

    エクスポータコールバックは、そのメールアドレスとページに対して持っているデータと、処理が完了したかどうかを返します。エクスポータコールバックが完了していないと報告した場合、ページパラメータが1増加した状態で再度呼び出されます。エクスポータコールバックは、エクスポート用のアイテムの配列を返すことが期待されています。各アイテムには、そのアイテムが属するグループの識別子(例:コメント、投稿、注文など)、オプションのグループラベル(翻訳済み)、アイテム識別子(例:comment-133)、およびそのアイテムのエクスポート用データを含む名前と値のペアの配列が含まれます。

    値がメディアパスである場合、メディアファイルへのリンクがエクスポートのインデックスHTMLページに追加されることは注目に値します。

    すべてのエクスポータが完了するまで呼び出されると、WordPressは最初にエクスポートレポートの中心となる「インデックス」HTMLドキュメントを組み立てます。プラグインがWordPressまたは別のプラグインがすでに追加したアイテムに対して追加データを報告した場合、そのアイテムのすべてのデータが一緒に表示されます。

    エクスポートはサーバー上で3日間キャッシュされ、その後削除されます。

    プラグインは1つ以上のエクスポータを登録できますが、ほとんどのプラグインは1つだけで十分です。コメントに対してコメント者の位置データを追加する仮想プラグインを考えてみましょう。

    まず、プラグインがadd_comment_metaを使用してmeta_keylatitudelongitudeを使用して位置データを追加したと仮定します。

    プラグインが最初に行う必要があるのは、メールアドレスとページを受け入れるエクスポータ関数を作成することです。例:

    1. /**
    2. * Export user meta for a user using the supplied email.
    3. *
    4. * @param string $email_address email address to manipulate
    5. * @param int $page pagination
    6. *
    7. * @return array
    8. */
    9. function wporg_export_user_data_by_email( $email_address, $page = 1 ) {
    10. $number = 500; // Limit us to avoid timing out
    11. $page = (int) $page;
    12. $export_items = array();
    13. $comments = get_comments(
    14. array(
    15. 'author_email' => $email_address,
    16. 'number' => $number,
    17. 'paged' => $page,
    18. 'order_by' => 'comment_ID',
    19. 'order' => 'ASC',
    20. )
    21. );
    22. foreach ( (array) $comments as $comment ) {
    23. $latitude = get_comment_meta( $comment->comment_ID, 'latitude', true );
    24. $longitude = get_comment_meta( $comment->comment_ID, 'longitude', true );
    25. // Only add location data to the export if it is not empty.
    26. if ( ! empty( $latitude ) ) {
    27. // Most item IDs should look like postType-postID. If you don't have a post, comment or other ID to work with,
    28. // use a unique value to avoid having this item's export combined in the final report with other items
    29. // of the same id.
    30. $item_id = "comment-{$comment->comment_ID}";
    31. // Core group IDs include 'comments', 'posts', etc. But you can add your own group IDs as needed
    32. $group_id = 'comments';
    33. // Optional group label. Core provides these for core groups. If you define your own group, the first
    34. // exporter to include a label will be used as the group label in the final exported report.
    35. $group_label = __( 'Comments', 'text-domain' );
    36. // Plugins can add as many items in the item data array as they want.
    37. $data = array(
    38. array(
    39. 'name' => __( 'Commenter Latitude', 'text-domain' ),
    40. 'value' => $latitude,
    41. ),
    42. array(
    43. 'name' => __( 'Commenter Longitude', 'text-domain' ),
    44. 'value' => $longitude,
    45. ),
    46. );
    47. $export_items[] = array(
    48. 'group_id' => $group_id,
    49. 'group_label' => $group_label,
    50. 'item_id' => $item_id,
    51. 'data' => $data,
    52. );
    53. }
    54. }
    55. // Tell core if we have more comments to work on still.
    56. $done = count( $comments ) > $number;
    57. return array(
    58. 'data' => $export_items,
    59. 'done' => $done,
    60. );
    61. }

    次に、プラグインはwp_privacy_personal_data_exportersフィルターを使用してエクスポータ配列をフィルタリングすることでコールバックを登録する必要があります。

    登録時には、エクスポートのフレンドリーネーム(デバッグを助けるため – このフレンドリーネームは現時点では誰にも表示されません)とコールバックを提供します。例:

    1. /**
    2. * Registers all data exporters.
    3. *
    4. * @param array $exporters
    5. *
    6. * @return mixed
    7. */
    8. function wporg_register_user_data_exporters( $exporters ) {
    9. $exporters['my-plugin-slug'] = array(
    10. 'exporter_friendly_name' => __( 'Comment Location Plugin', 'text-domain' ),
    11. 'callback' => 'my_plugin_exporter',
    12. );
    13. return $exporters;
    14. }
    15. add_filter( 'wp_privacy_personal_data_exporters', 'wporg_register_user_data_exporters' );

    これで完了です!あなたのプラグインは、エクスポート用のデータを提供するようになります!