5.2 Добавление Экспортера Личных Данных в ваш плагин

В WordPress 4.9.6 были добавлены новые инструменты, облегчающие соблюдение таких законов, как Общее Положение Европейского Союза о Защите Данных, или сокращенно GDPR.

Среди инструментов, добавленных в WordPress 4.9.6, появился инструмент Экспорт Персональных Данных (Personal Data Export), который поддерживает экспорт всех персональных данных для данного пользователя в ZIP-файл.

В дополнение к персональным данным, хранящимся в таких объектах, как комментарии WordPress, плагины могут также подключаться к функции экспортера, чтобы экспортировать персональные данные, которые они собирают, будь то в нечто вроде postmeta или даже в совершенно новый Пользовательский Тип Данных (Custom Post Type, CPT).

“Ключом” для всех экспортируемых данных является адрес электронной почты пользователя – он был выбран потому, что поддерживает экспорт персональных данных как для полноправных зарегистрированных пользователей, так и для незарегистрированных (например, как комментатор, вышедший из системы).

Однако, поскольку сборка экспорта персональных данных может быть интенсивным процессом и, вероятно, будет содержать конфиденциальные данные, мы не хотим просто генерировать их и отправлять по электронной почте запрашивающей стороне без подтверждения запроса, поэтому пользовательский интерфейс, с которым сталкивается администратор, запускает все запросы.

Администратор вводит имя пользователя или адрес электронной почты, который делает запрос, а затем отправляет ссылку для подтверждения своего запроса.

После подтверждения запроса администратор может сгенерировать и скачать или отправить непосредственно по электронной почте ZIP-файл экспорта личных данных для пользователя, или сделать экспорт в любом случае, если возникает необходимость. Внутри ZIP-файла, который получает пользователь, он найдет “мини-сайт” с индексной HTML-страницей, содержащей его персональные данные, организованные в группы (например, группа для комментариев и т.д.).

Независимо от того, загружает ли администратор ZIP-файл экспорта персональных данных или отправляет его непосредственно запрашивающему лицу, способ сборки экспорта персональных данных идентичен – и полагается на перехват “экспортера” обратных вызовов для выполнения грязной работы по сбору всех данных для экспорта.

Когда администратор нажимает на ссылку загрузки или электронной почты, начинается цикл AJAX, который повторяется над всеми экспортерами, зарегистрированными в системе, по одному. В дополнение к экспортерам, встроенным в ядро, плагины могут регистрировать свои собственные обратные вызовы экспортеров.

Интерфейс обратного вызова экспортера разработан таким образом, чтобы быть как можно более простым. Обратный вызов экспортера получает адрес электронной почты, с которым мы работаем, а также параметр страницы. Параметр страницы (который начинается с 1) используется для того, чтобы избежать подключаемых модулей, которые могут вызвать таймауты при попытке экспортировать все личные данные, которые они собрали за один раз. Хорошо себя зарекомендовавший плагин ограничит количество данных, которые он пытается стереть на одной странице (например, 100 сообщений, 200 комментариев и т.д.).

Обратный вызов экспортера отвечает всеми данными, которые у него есть для этого адреса электронной почты и страницы, и независимо от того, сделано это или нет. Если обратный вызов экспортера сообщит о том, что это не было сделано, то он будет вызван снова (в отдельном запросе) с параметром страницы, увеличенным на 1. Ожидается, что обратный вызов экспортера вернет массив элементов для экспорта. Каждый элемент содержит идентификатор группы, для группы которой элемент является частью (например, комментарии, записи, заказы и т.д.), необязательной групповой меткой (translated), идентификатором элемента (например, comment-133), а затем массивом имен, пар значений, содержащим данные, которые должны быть экспортированы для этого элемента.

Примечательно, что значением может быть путь к медиафайлу, в этом случае ссылка на медиафайл будет добавлена в индексную HTML-страницу при экспорте.

Когда все экспортеры были вызваны для завершения, WordPress сначала собирает HTML-документ “index”, который служит сердцем экспортного отчета. Если плагин сообщает дополнительные данные для элемента, который WordPress или другой плагин уже добавил, то все данные для этого элемента будут представлены вместе.

Экспорт кэшируется на сервере в течение 3 дней, а затем удаляется.

Плагин может зарегистрировать одного или нескольких экспортеров, но большинству плагинов понадобится только один. Поработаем над гипотетическим плагином, который добавляет данные о местоположении комментатора к комментариям.

Во-первых, предположим, что плагин использовал add_comment_meta для добавления данных о местоположении, используя meta_key из latitude (широты) и longitude (долготы).

Первое, что нужно сделать плагину, это создать функцию экспортера, которая будет принимать адрес электронной почты и страницу, например:

function my_plugin_exporter( $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' );
 
      // Plugins can add as many items in the item data array as they want
      $data = array(
        array(
          'name' => __( 'Commenter Latitude' ),
          'value' => $latitude
        ),
        array(
          'name' => __( 'Commenter Longitude' ),
          '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.

При регистрации вы указываете дружественное имя для экспорта (для помощи в отладке – это дружественное имя в данный момент никому не показывается) и обратного вызова, например.

function register_my_plugin_exporter( $exporters ) {
  $exporters['my-plugin-slug'] = array(
    'exporter_friendly_name' => __( 'Comment Location Plugin' ),
    'callback' => 'my_plugin_exporter',
  );
  return $exporters;
}
 
add_filter(
  'wp_privacy_personal_data_exporters',
  'register_my_plugin_exporter',
  10
);

И это все! Теперь ваш плагин будет предоставлять данные для экспорта!

Наверх ↑