PluginProbe
Site Reviews / trunk
Site Reviews vtrunk
8.3.1 8.3.0 8.2.2 8.2.1 8.2.0 8.1.0 8.0.13 8.0.12 8.0.11 trunk 1.2.2 2.17.1 3.5.4 4.7.0 5.25.1 6.11.8 7.0.10 7.0.11 7.0.12 7.0.13 7.0.14 7.0.15 7.0.16 7.0.17 7.0.18 All 54 releases
site-reviews / plugin / Controllers / PrivacyController.php

PrivacyController.php in Site Reviews trunk, at plugin/Controllers/PrivacyController.php

150 lines 4.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace GeminiLabs\SiteReviews\Controllers;
4
5 use GeminiLabs\SiteReviews\Database;
6 use GeminiLabs\SiteReviews\Database\PostMeta;
7 use GeminiLabs\SiteReviews\Database\Query;
8 use GeminiLabs\SiteReviews\Database\ReviewManager;
9 use GeminiLabs\SiteReviews\Helpers\Cast;
10 use GeminiLabs\SiteReviews\Review;
11
12 class PrivacyController extends AbstractController
13 {
14 protected $itemsRemoved;
15 protected $itemsRetained;
16 protected $messages;
17 protected $perPage;
18
19 public function __construct()
20 {
21 $this->itemsRemoved = false;
22 $this->itemsRetained = false;
23 $this->messages = [];
24 $this->perPage = 100;
25 if (!glsr()->filterBool('personal-data/erase-all', true)) {
26 $this->itemsRetained = true;
27 $this->messages[] = _x('The email and associated name and IP address has been removed from all reviews, but the reviews themselves were not removed.', 'admin-text', 'site-reviews');
28 }
29 }
30
31 /**
32 * @see filterPersonalDataErasers
33 */
34 public function erasePersonalDataCallback(string $email, int $page = 1): array
35 {
36 $reviews = $this->reviews($email, $page);
37 array_walk($reviews, [$this, 'erasePersonalData']);
38 return [
39 'done' => count($reviews) < $this->perPage,
40 'items_removed' => $this->itemsRemoved,
41 'items_retained' => $this->itemsRetained,
42 'messages' => $this->messages,
43 ];
44 }
45
46 /**
47 * @see filterPersonalDataExporters
48 */
49 public function exportPersonalDataCallback(string $email, int $page = 1): array
50 {
51 $reviews = $this->reviews($email, $page);
52 $data = array_map([$this, 'exportPersonalData'], $reviews);
53 return [
54 'data' => $data,
55 'done' => count($reviews) < $this->perPage,
56 ];
57 }
58
59 /**
60 * @filter wp_privacy_personal_data_erasers
61 */
62 public function filterPersonalDataErasers(array $erasers): array
63 {
64 $erasers[glsr()->id] = [
65 'callback' => [$this, 'erasePersonalDataCallback'],
66 'eraser_friendly_name' => glsr()->name,
67 ];
68 return $erasers;
69 }
70
71 /**
72 * @filter wp_privacy_personal_data_exporters
73 */
74 public function filterPersonalDataExporters(array $exporters): array
75 {
76 $exporters[glsr()->id] = [
77 'callback' => [$this, 'exportPersonalDataCallback'],
78 'exporter_friendly_name' => glsr()->name,
79 ];
80 return $exporters;
81 }
82
83 /**
84 * @action admin_init
85 */
86 public function privacyPolicyContent(): void
87 {
88 $content = glsr()->build('partials/privacy-policy');
89 wp_add_privacy_policy_content(glsr()->name, wp_kses_post($content));
90 }
91
92 protected function erasePersonalData(Review $review): void
93 {
94 glsr()->action('personal-data/erase', $review, $this->itemsRetained);
95 if (!$this->itemsRetained) {
96 wp_delete_post($review->ID, true);
97 } else {
98 glsr(ReviewManager::class)->deleteRevisions($review->ID);
99 glsr(ReviewManager::class)->updateRating($review->ID, [
100 'email' => '',
101 'ip_address' => '',
102 'name' => '',
103 ]);
104 glsr(PostMeta::class)->delete($review->ID, 'geolocation');
105 glsr(PostMeta::class)->delete($review->ID, 'submitted');
106 glsr(PostMeta::class)->delete($review->ID, 'submitted_hash');
107 glsr(Database::class)->delete('stats', [
108 'rating_id' => $review->rating_id,
109 ]);
110 }
111 $this->itemsRemoved = true;
112 }
113
114 protected function exportPersonalData(Review $review): array
115 {
116 $data = [];
117 $fields = [ // order is intentional
118 'title' => _x('Review Title', 'admin-text', 'site-reviews'),
119 'content' => _x('Review Content', 'admin-text', 'site-reviews'),
120 'name' => _x('Name', 'admin-text', 'site-reviews'),
121 'email' => _x('Email', 'admin-text', 'site-reviews'),
122 'ip_address' => _x('IP Address', 'admin-text', 'site-reviews'),
123 'terms' => _x('Terms Accepted', 'admin-text', 'site-reviews'),
124 ];
125 foreach ($fields as $field => $name) {
126 if ($value = $review->$field) {
127 if ('terms' === $field && Cast::toBool($value)) {
128 $value = $review->date;
129 }
130 $data[] = ['name' => $name, 'value' => $value];
131 }
132 }
133 return [
134 'data' => glsr()->filterArray('personal-data/export', $data, $review),
135 'group_id' => glsr()->id,
136 'group_label' => _x('Reviews', 'admin-text', 'site-reviews'),
137 'item_id' => glsr()->post_type."-{$review->ID}",
138 ];
139 }
140
141 protected function reviews(string $email, int $page): array
142 {
143 return glsr(Query::class)->reviews([
144 'email' => $email,
145 'page' => $page,
146 'per_page' => $this->perPage,
147 ]);
148 }
149 }
150