Version Description
- Add Spanish support (Thanks @elarequi!)
- Lower required PHP version to 5.6.0
- Re-add container alias for DataSubjectManager
- Fix for installer giving the option to add links to footer for unsupported themes
- Fix PHP notice in WPML module
Download this release
Release Info
Developer | indrek_k |
Plugin | The GDPR Framework By Data443 |
Version | 1.0.5 |
Comparing to | |
See all releases |
Code changes from version 1.0.4 to 1.0.5
- assets/conditional-show.js +102 -102
- assets/gdpr-admin.css +362 -362
- assets/gdpr-admin.js +102 -102
- assets/gdpr-installer.css +550 -550
- assets/gdpr-installer.js +58 -58
- assets/gdpr-rhino.svg +42 -42
- assets/privacy-tools.css +30 -30
- bootstrap.php +53 -71
- gdpr-framework.php +95 -73
- languages/gdpr-framework-de_DE.mo +0 -0
- languages/gdpr-framework-de_DE.po +1306 -0
- languages/gdpr-framework-es_ES.mo +0 -0
- languages/gdpr-framework-es_ES.po +1750 -0
- languages/gdpr-framework.pot +1284 -1284
- license.txt +198 -198
- readme.txt +91 -85
- src/Admin/AdminError.php +16 -16
- src/Admin/AdminHelper.php +57 -57
- src/Admin/AdminNotice.php +41 -41
- src/Admin/AdminTab.php +157 -157
- src/Admin/AdminTabGeneral.php +277 -277
- src/Admin/Modal.php +41 -41
- src/Admin/WordpressAdmin.php +156 -156
- src/Admin/WordpressAdminPage.php +147 -147
- src/Components/Consent/AdminTabConsent.php +181 -181
- src/Components/Consent/ConsentManager.php +317 -317
- src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php +436 -436
- src/Components/PrivacyPolicy/PolicyGenerator.php +44 -44
- src/Components/PrivacyPolicy/PrivacyPolicy.php +92 -92
- src/Components/PrivacyToolsPage/PrivacyToolsPage.php +14 -14
- src/Components/PrivacyToolsPage/PrivacyToolsPageController.php +278 -278
- src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php +45 -45
- src/Components/Support/AdminTabSupport.php +34 -34
- src/Components/Support/Support.php +18 -18
- src/Components/WordpressComments/WordpressComments.php +172 -172
- src/Components/WordpressUser/Controllers/DashboardDataPageController.php +197 -197
- src/Components/WordpressUser/Controllers/DashboardProfilePageController.php +123 -123
- src/Components/WordpressUser/DataManager.php +151 -151
- src/Components/WordpressUser/RegistrationForm.php +50 -50
- src/Components/WordpressUser/WordpressUser.php +111 -111
- src/DataSubject/AdminTabDataSubject.php +126 -126
- src/DataSubject/DataExporter.php +138 -138
- src/DataSubject/DataRepository.php +191 -191
- src/DataSubject/DataSubjectAdmin.php +17 -17
- src/DataSubject/DataSubjectAuthenticator.php +130 -130
- src/DataSubject/DataSubjectIdentificator.php +184 -184
- src/Helpers.php +170 -170
- src/Installer/Installer.php +303 -303
- src/Installer/InstallerStep.php +200 -200
- src/Installer/Steps/ConfigurationPages.php +61 -61
- src/Installer/Steps/ConfigurationSettings.php +71 -71
- src/Installer/Steps/Consent.php +30 -30
- src/Installer/Steps/Integrations.php +47 -48
- src/Installer/Steps/PolicyContents.php +31 -31
- src/Installer/Steps/PolicySettings.php +215 -215
- src/Modules/ContactForm7/ContactForm7.php +108 -108
- src/Modules/WPML/WPML.php +153 -153
- src/Router.php +166 -166
- src/Setup.php +94 -93
- src/SetupAdmin.php +62 -62
- src/Updater/Updater.php +47 -0
- src/View.php +64 -64
- vendor/autoload.php +1 -1
- vendor/composer/autoload_real.php +7 -7
- vendor/composer/autoload_static.php +3 -3
- views/admin/consent.php +105 -105
- views/admin/data-subjects/search-form.php +18 -18
- views/admin/data-subjects/search-results.php +33 -33
- views/admin/general/delete-action-email.php +7 -7
- views/admin/general/delete-action-reassign.php +11 -11
- views/admin/general/delete-action.php +2 -2
- views/admin/general/description-data-page.php +3 -3
- views/admin/general/description-delete-action.php +3 -3
- views/admin/general/description-export-action.php +3 -3
- views/admin/general/description-terms-page.php +3 -3
- views/admin/general/enable.php +13 -13
- views/admin/general/export-action-email.php +7 -7
- views/admin/general/stylesheet.php +10 -10
- views/admin/general/theme-compatibility.php +10 -10
- views/admin/modals/footer.php +6 -6
- views/admin/modals/header.php +5 -5
- views/admin/modals/test.php +8 -8
- views/admin/notices/disclaimer.php +16 -16
- views/admin/notices/error.php +3 -3
- views/admin/notices/header.php +4 -4
- views/admin/notices/help.php +3 -3
- views/admin/notices/helper-autoinstall.php +10 -10
- views/admin/notices/helper-policy.php +9 -9
- views/admin/notices/helper-tools.php +10 -10
- views/admin/privacy-policy/description-policy-page.php +3 -3
- views/admin/privacy-policy/dpa.php +2 -2
- views/admin/privacy-policy/generated.php +21 -21
- views/admin/privacy-policy/header.php +3 -3
- views/admin/settings-page.php +46 -46
- views/admin/support/contents.php +62 -62
- views/admin/wizard-buttons.php +5 -5
- views/email/action-export.php +9 -9
- views/email/action-forget.php +13 -13
- views/email/identify-data-subject.php +11 -11
- views/email/no-data.php +6 -6
- views/email/request-export.php +14 -14
- views/email/request-forget.php +14 -14
- views/global/country-options.php +23 -23
- views/global/delete-action.php +20 -20
- views/global/export-action.php +14 -14
- views/global/html-data.php +38 -38
- views/installer/continue-notice.php +10 -10
- views/installer/footer.php +41 -41
- views/installer/header.php +64 -64
- views/installer/steps/configuration-pages.php +37 -37
- views/installer/steps/configuration-settings.php +87 -87
- views/installer/steps/consent.php +87 -87
- views/installer/steps/disclaimer.php +21 -21
- views/installer/steps/finish.php +69 -69
- views/installer/steps/integrations.php +52 -52
- views/installer/steps/policy-contents.php +25 -25
- views/installer/steps/policy-settings.php +185 -185
- views/installer/steps/welcome.php +18 -18
- views/installer/welcome-notice.php +16 -16
- views/modules/contact-form-7/content-privacy.php +5 -5
- views/modules/contact-form-7/generator-privacy.php +17 -17
- views/modules/wordpress-comments/terms-checkbox.php +20 -20
- views/modules/wordpress-user/dashboard/data-page/form-consent.php +39 -39
- views/modules/wordpress-user/dashboard/data-page/form-delete.php +30 -30
- views/modules/wordpress-user/dashboard/data-page/header.php +3 -3
- views/modules/wordpress-user/dashboard/form-export.php +24 -24
- views/modules/wordpress-user/dashboard/profile-page/form-delete.php +29 -29
- views/modules/wordpress-user/dashboard/profile-page/header.php +8 -8
- views/modules/wordpress-user/dashboard/profile-page/table-consent.php +18 -18
- views/modules/wordpress-user/registration-terms-checkbox.php +21 -21
- views/policy/policy.php +283 -283
- views/privacy-tools/form-consent.php +39 -39
- views/privacy-tools/form-delete.php +18 -18
- views/privacy-tools/form-export.php +26 -26
- views/privacy-tools/form-identify.php +30 -28
- views/privacy-tools/notice-admin-role.php +6 -6
- views/privacy-tools/notices.php +25 -25
- views/privacy-tools/privacy-tools.php +13 -13
- views/themes/storefront/footer.php +8 -8
- views/themes/twentyseventeen/footer.php +9 -9
- views/themes/twentysixteen/footer.php +12 -12
assets/conditional-show.js
CHANGED
@@ -1,102 +1,102 @@
|
|
1 |
-
jQuery(function ($) {
|
2 |
-
|
3 |
-
var trigger = function () {
|
4 |
-
$('.js-gdpr-conditional').each(function () {
|
5 |
-
conditionalShow($(this));
|
6 |
-
});
|
7 |
-
};
|
8 |
-
|
9 |
-
var conditionalShow = function ($el) {
|
10 |
-
var type = $el.prop('tagName');
|
11 |
-
if ('SELECT' === type) {
|
12 |
-
conditionalShowSelect($el);
|
13 |
-
} else if ('INPUT' === type) {
|
14 |
-
if ('checkbox' === $el.attr('type')) {
|
15 |
-
conditionalShowCheckbox($el);
|
16 |
-
} else if ('radio' === $el.attr('type')) {
|
17 |
-
conditionalShowRadio($el);
|
18 |
-
} else {
|
19 |
-
console.log('Unknown element type: ' + type);
|
20 |
-
}
|
21 |
-
} else {
|
22 |
-
console.log('Unknown element type: ' + type);
|
23 |
-
}
|
24 |
-
};
|
25 |
-
|
26 |
-
var conditionalShowSelect = function ($el) {
|
27 |
-
$targets = [];
|
28 |
-
$el.find('option').each(function () {
|
29 |
-
if ($(this).data('show')) {
|
30 |
-
$targets.push($(this).data('show'));
|
31 |
-
}
|
32 |
-
});
|
33 |
-
|
34 |
-
$.each($targets, function (i, e) {
|
35 |
-
$(e).hide();
|
36 |
-
});
|
37 |
-
|
38 |
-
if ($el.is(':visible')) {
|
39 |
-
$el.find('option:selected').each(function () {
|
40 |
-
if ($(this).data('show')) {
|
41 |
-
$($(this).data('show')).show();
|
42 |
-
}
|
43 |
-
});
|
44 |
-
}
|
45 |
-
}
|
46 |
-
|
47 |
-
var conditionalShowCheckbox = function ($el) {
|
48 |
-
if ($el.is(':checked') && $el.is(':visible')) {
|
49 |
-
if ($el.data('show')) {
|
50 |
-
if (isChange) {
|
51 |
-
$($el.data('show')).addClass('slidePadding').slideDown();
|
52 |
-
} else {
|
53 |
-
$($el.data('show')).show();
|
54 |
-
}
|
55 |
-
}
|
56 |
-
} else {
|
57 |
-
if ($el.data('show')) {
|
58 |
-
if (isChange) {
|
59 |
-
$($el.data('show')).addClass('slidePadding').slideUp();
|
60 |
-
} else {
|
61 |
-
$($el.data('show')).hide();
|
62 |
-
}
|
63 |
-
}
|
64 |
-
}
|
65 |
-
};
|
66 |
-
|
67 |
-
var conditionalShowRadio = function ($el) {
|
68 |
-
$el.closest('fieldset').find('input[type=radio]').each(function (i, el) {
|
69 |
-
if ($(el).is(':checked') && $el.is(':visible')) {
|
70 |
-
if ($(el).data('show')) {
|
71 |
-
if (isChange) {
|
72 |
-
$($(el).data('show')).addClass('slidePadding').slideDown();
|
73 |
-
} else {
|
74 |
-
$($(el).data('show')).show();
|
75 |
-
}
|
76 |
-
}
|
77 |
-
} else {
|
78 |
-
if ($(el).data('show')) {
|
79 |
-
if (isChange) {
|
80 |
-
$($(el).data('show')).addClass('slidePadding').slideUp();
|
81 |
-
} else {
|
82 |
-
$($(el).data('show')).hide();
|
83 |
-
}
|
84 |
-
}
|
85 |
-
}
|
86 |
-
});
|
87 |
-
};
|
88 |
-
|
89 |
-
var isChange = false;
|
90 |
-
|
91 |
-
$('.js-gdpr-conditional').each(function () {
|
92 |
-
$(this).on('change', function () {
|
93 |
-
isChange = true;
|
94 |
-
conditionalShow($(this));
|
95 |
-
|
96 |
-
// Hacky solution for 2nd layer of nested items
|
97 |
-
trigger();
|
98 |
-
});
|
99 |
-
conditionalShow($(this));
|
100 |
-
});
|
101 |
-
|
102 |
-
});
|
1 |
+
jQuery(function ($) {
|
2 |
+
|
3 |
+
var trigger = function () {
|
4 |
+
$('.js-gdpr-conditional').each(function () {
|
5 |
+
conditionalShow($(this));
|
6 |
+
});
|
7 |
+
};
|
8 |
+
|
9 |
+
var conditionalShow = function ($el) {
|
10 |
+
var type = $el.prop('tagName');
|
11 |
+
if ('SELECT' === type) {
|
12 |
+
conditionalShowSelect($el);
|
13 |
+
} else if ('INPUT' === type) {
|
14 |
+
if ('checkbox' === $el.attr('type')) {
|
15 |
+
conditionalShowCheckbox($el);
|
16 |
+
} else if ('radio' === $el.attr('type')) {
|
17 |
+
conditionalShowRadio($el);
|
18 |
+
} else {
|
19 |
+
console.log('Unknown element type: ' + type);
|
20 |
+
}
|
21 |
+
} else {
|
22 |
+
console.log('Unknown element type: ' + type);
|
23 |
+
}
|
24 |
+
};
|
25 |
+
|
26 |
+
var conditionalShowSelect = function ($el) {
|
27 |
+
$targets = [];
|
28 |
+
$el.find('option').each(function () {
|
29 |
+
if ($(this).data('show')) {
|
30 |
+
$targets.push($(this).data('show'));
|
31 |
+
}
|
32 |
+
});
|
33 |
+
|
34 |
+
$.each($targets, function (i, e) {
|
35 |
+
$(e).hide();
|
36 |
+
});
|
37 |
+
|
38 |
+
if ($el.is(':visible')) {
|
39 |
+
$el.find('option:selected').each(function () {
|
40 |
+
if ($(this).data('show')) {
|
41 |
+
$($(this).data('show')).show();
|
42 |
+
}
|
43 |
+
});
|
44 |
+
}
|
45 |
+
}
|
46 |
+
|
47 |
+
var conditionalShowCheckbox = function ($el) {
|
48 |
+
if ($el.is(':checked') && $el.is(':visible')) {
|
49 |
+
if ($el.data('show')) {
|
50 |
+
if (isChange) {
|
51 |
+
$($el.data('show')).addClass('slidePadding').slideDown();
|
52 |
+
} else {
|
53 |
+
$($el.data('show')).show();
|
54 |
+
}
|
55 |
+
}
|
56 |
+
} else {
|
57 |
+
if ($el.data('show')) {
|
58 |
+
if (isChange) {
|
59 |
+
$($el.data('show')).addClass('slidePadding').slideUp();
|
60 |
+
} else {
|
61 |
+
$($el.data('show')).hide();
|
62 |
+
}
|
63 |
+
}
|
64 |
+
}
|
65 |
+
};
|
66 |
+
|
67 |
+
var conditionalShowRadio = function ($el) {
|
68 |
+
$el.closest('fieldset').find('input[type=radio]').each(function (i, el) {
|
69 |
+
if ($(el).is(':checked') && $el.is(':visible')) {
|
70 |
+
if ($(el).data('show')) {
|
71 |
+
if (isChange) {
|
72 |
+
$($(el).data('show')).addClass('slidePadding').slideDown();
|
73 |
+
} else {
|
74 |
+
$($(el).data('show')).show();
|
75 |
+
}
|
76 |
+
}
|
77 |
+
} else {
|
78 |
+
if ($(el).data('show')) {
|
79 |
+
if (isChange) {
|
80 |
+
$($(el).data('show')).addClass('slidePadding').slideUp();
|
81 |
+
} else {
|
82 |
+
$($(el).data('show')).hide();
|
83 |
+
}
|
84 |
+
}
|
85 |
+
}
|
86 |
+
});
|
87 |
+
};
|
88 |
+
|
89 |
+
var isChange = false;
|
90 |
+
|
91 |
+
$('.js-gdpr-conditional').each(function () {
|
92 |
+
$(this).on('change', function () {
|
93 |
+
isChange = true;
|
94 |
+
conditionalShow($(this));
|
95 |
+
|
96 |
+
// Hacky solution for 2nd layer of nested items
|
97 |
+
trigger();
|
98 |
+
});
|
99 |
+
conditionalShow($(this));
|
100 |
+
});
|
101 |
+
|
102 |
+
});
|
assets/gdpr-admin.css
CHANGED
@@ -1,362 +1,362 @@
|
|
1 |
-
/** Admin notice **/
|
2 |
-
.notice-gdpr {
|
3 |
-
border-left-color: #0095a8;
|
4 |
-
overflow: hidden;
|
5 |
-
}
|
6 |
-
|
7 |
-
.notice-gdpr img {
|
8 |
-
width: 100px;
|
9 |
-
margin: 25px 0;
|
10 |
-
float: left;
|
11 |
-
}
|
12 |
-
|
13 |
-
.notice-gdpr .gdpr-content {
|
14 |
-
float: left;
|
15 |
-
width: calc(100% - 120px);
|
16 |
-
padding-left: 20px;
|
17 |
-
padding-bottom: 15px;
|
18 |
-
}
|
19 |
-
|
20 |
-
/** Modal window **/
|
21 |
-
.gdpr-modal {
|
22 |
-
max-width: 1200px;
|
23 |
-
}
|
24 |
-
|
25 |
-
.gdpr-modal li {
|
26 |
-
list-style-type: disc;
|
27 |
-
margin-left: 20px;
|
28 |
-
}
|
29 |
-
|
30 |
-
.gdpr-modal-footer {
|
31 |
-
background: #fcfcfc;
|
32 |
-
border-top: 1px solid #dfdfdf;
|
33 |
-
padding: 10px 0;
|
34 |
-
}
|
35 |
-
|
36 |
-
/** General **/
|
37 |
-
.gdpr-framework-wrap table {
|
38 |
-
table-layout: fixed;
|
39 |
-
border-spacing: 0;
|
40 |
-
}
|
41 |
-
|
42 |
-
.gdpr-framework-wrap input {
|
43 |
-
margin: 0;
|
44 |
-
}
|
45 |
-
|
46 |
-
.gdpr-framework-wrap .gdpr-select {
|
47 |
-
width: 300px;
|
48 |
-
max-width: 90%;
|
49 |
-
height: 32px;
|
50 |
-
border-color: #ddd;
|
51 |
-
background-color: #fff;
|
52 |
-
border: 1px solid #aaa;
|
53 |
-
border-radius: 4px;
|
54 |
-
box-sizing: border-box;
|
55 |
-
cursor: pointer;
|
56 |
-
display: block;
|
57 |
-
padding: 0 6px;
|
58 |
-
color: #666;
|
59 |
-
}
|
60 |
-
|
61 |
-
.gdpr-framework-wrap .select2-container {
|
62 |
-
display: block;
|
63 |
-
width: 300px;
|
64 |
-
max-width: 100%;
|
65 |
-
|
66 |
-
}
|
67 |
-
|
68 |
-
.gdpr-framework-wrap .select2-container--default .select2-selection--single .select2-selection__arrow,
|
69 |
-
.gdpr-framework-wrap .select2-container--default .select2-selection--single {
|
70 |
-
height: 32px !important;
|
71 |
-
}
|
72 |
-
|
73 |
-
.gdpr-framework-wrap .select2-container--default .select2-selection--single .select2-selection__arrow b {
|
74 |
-
border-width: 6px 3px 0 3px;
|
75 |
-
margin-left: -2px;
|
76 |
-
margin-top: -3px;
|
77 |
-
border-color: #666 transparent transparent transparent;
|
78 |
-
}
|
79 |
-
|
80 |
-
.gdpr-framework-wrap .select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
|
81 |
-
border-color: transparent transparent #666 transparent;
|
82 |
-
border-width: 0 3px 6px 3px;
|
83 |
-
}
|
84 |
-
|
85 |
-
.gdpr-framework-wrap input {
|
86 |
-
border-radius: 4px;
|
87 |
-
border: 1px solid #aaa;
|
88 |
-
box-shadow: none;
|
89 |
-
height: 32px;
|
90 |
-
line-height: 28px;
|
91 |
-
min-width: 300px;
|
92 |
-
max-width: 100%;
|
93 |
-
}
|
94 |
-
|
95 |
-
.gdpr-framework-wrap textarea {
|
96 |
-
border-radius: 4px;
|
97 |
-
border: 1px solid #aaa;
|
98 |
-
box-shadow: none;
|
99 |
-
height: 32px;
|
100 |
-
line-height: 28px;
|
101 |
-
}
|
102 |
-
|
103 |
-
.gdpr-framework-wrap .select2-container input {
|
104 |
-
min-width: 0;
|
105 |
-
}
|
106 |
-
|
107 |
-
.gdpr-framework-wrap input[type=checkbox] {
|
108 |
-
line-height: initial;
|
109 |
-
height: 16px;
|
110 |
-
min-width: 0;
|
111 |
-
}
|
112 |
-
|
113 |
-
.gdpr-framework-wrap input[type=submit] {
|
114 |
-
min-width: 0;
|
115 |
-
}
|
116 |
-
|
117 |
-
.gdpr-framework-wrap input[type=button] {
|
118 |
-
min-width: 0;
|
119 |
-
}
|
120 |
-
|
121 |
-
.gdpr-framework-wrap .wp-editor-wrap {
|
122 |
-
width: 720px;
|
123 |
-
max-width: 100%;
|
124 |
-
}
|
125 |
-
|
126 |
-
.gdpr-framework-wrap .nav-tab-highlight {
|
127 |
-
background: #ffa200;
|
128 |
-
color: #fff;
|
129 |
-
font-weight: 700;
|
130 |
-
border-bottom: 1px solid #ccc;
|
131 |
-
}
|
132 |
-
|
133 |
-
.gdpr-framework-wrap .nav-tab-highlight:hover {
|
134 |
-
background: #ffc35c;
|
135 |
-
color: #fff;
|
136 |
-
}
|
137 |
-
|
138 |
-
.gdpr-framework-wrap .nav-tab-highlight:focus {
|
139 |
-
box-shadow: 0 0 2px 1px #5b9cd9;
|
140 |
-
}
|
141 |
-
|
142 |
-
/* Consent tables */
|
143 |
-
.gdpr-framework-wrap .gdpr-consent,
|
144 |
-
.gdpr-framework-wrap .gdpr-consent-admin {
|
145 |
-
table-layout: auto;
|
146 |
-
}
|
147 |
-
|
148 |
-
.gdpr-consent-user {
|
149 |
-
border-collapse: collapse;
|
150 |
-
}
|
151 |
-
|
152 |
-
.gdpr-consent-user th {
|
153 |
-
padding-bottom: 10px;
|
154 |
-
}
|
155 |
-
|
156 |
-
.gdpr-consent-user td,
|
157 |
-
.gdpr-consent-user th {
|
158 |
-
border: 1px solid #ccc;
|
159 |
-
}
|
160 |
-
|
161 |
-
.gdpr-consent-user tr:first-child th {
|
162 |
-
border: 0;
|
163 |
-
}
|
164 |
-
|
165 |
-
.gdpr-consent th {
|
166 |
-
text-align: left;
|
167 |
-
}
|
168 |
-
|
169 |
-
.gdpr-consent td {
|
170 |
-
padding-right: 16px;
|
171 |
-
}
|
172 |
-
|
173 |
-
.gdpr-consent-admin th {
|
174 |
-
text-align: left;
|
175 |
-
padding-bottom: 16px;
|
176 |
-
}
|
177 |
-
|
178 |
-
.gdpr-consent-admin + .button {
|
179 |
-
margin-top: 16px;
|
180 |
-
}
|
181 |
-
|
182 |
-
.gdpr-consent-admin td {
|
183 |
-
padding-right: 16px;
|
184 |
-
vertical-align: top;
|
185 |
-
padding-bottom: 20px;
|
186 |
-
}
|
187 |
-
|
188 |
-
.gdpr-framework-wrap .gdpr-consent-admin input {
|
189 |
-
min-width: 0;
|
190 |
-
}
|
191 |
-
|
192 |
-
.gdpr-consent-table-desc {
|
193 |
-
width: 450px;
|
194 |
-
}
|
195 |
-
|
196 |
-
.gdpr-consent-table-input {
|
197 |
-
width: 200px;
|
198 |
-
}
|
199 |
-
|
200 |
-
.gdpr-consent-table-input input {
|
201 |
-
width: 100%;
|
202 |
-
}
|
203 |
-
|
204 |
-
.gdpr-consent-table-desc textarea {
|
205 |
-
width: 100%;
|
206 |
-
min-height: 100px;
|
207 |
-
}
|
208 |
-
|
209 |
-
.gdpr-consent-add-button {
|
210 |
-
text-align: right;
|
211 |
-
width: 1051px;
|
212 |
-
}
|
213 |
-
|
214 |
-
.gdpr-consent-user {
|
215 |
-
table-layout: auto;
|
216 |
-
}
|
217 |
-
|
218 |
-
.gdpr-consent-user td {
|
219 |
-
padding: 15px;
|
220 |
-
}
|
221 |
-
|
222 |
-
.gdpr-consent-user-title {
|
223 |
-
width: 200px;
|
224 |
-
}
|
225 |
-
|
226 |
-
.gdpr-consent-user-desc {
|
227 |
-
width: 450px;
|
228 |
-
}
|
229 |
-
|
230 |
-
/* support page */
|
231 |
-
.gdpr-framework-wrap .align-center {
|
232 |
-
text-align: center;
|
233 |
-
}
|
234 |
-
|
235 |
-
.gdpr-framework-wrap .section {
|
236 |
-
margin: 25px 0;
|
237 |
-
max-width: 720px;
|
238 |
-
}
|
239 |
-
|
240 |
-
.gdpr-framework-wrap .row {
|
241 |
-
box-sizing: border-box;
|
242 |
-
display: -webkit-box;
|
243 |
-
display: -ms-flexbox;
|
244 |
-
display: flex;
|
245 |
-
-ms-flex-wrap: wrap;
|
246 |
-
flex-wrap: wrap;
|
247 |
-
margin-right: -8px;
|
248 |
-
margin-left: -8px;
|
249 |
-
-webkit-box-pack: center !important;
|
250 |
-
-ms-flex-pack: center !important;
|
251 |
-
justify-content: center !important;
|
252 |
-
}
|
253 |
-
|
254 |
-
.gdpr-framework-wrap .col {
|
255 |
-
box-sizing: border-box;
|
256 |
-
position: relative;
|
257 |
-
width: 100%;
|
258 |
-
min-height: 1px;
|
259 |
-
padding-right: 8px;
|
260 |
-
padding-left: 8px;
|
261 |
-
margin-bottom: 15px;
|
262 |
-
}
|
263 |
-
|
264 |
-
@media (min-width: 576px) {
|
265 |
-
.gdpr-framework-wrap .col {
|
266 |
-
-webkit-box-flex: 0;
|
267 |
-
-ms-flex: 0 0 50%;
|
268 |
-
flex: 0 0 50%;
|
269 |
-
max-width: 50%;
|
270 |
-
}
|
271 |
-
}
|
272 |
-
|
273 |
-
@media (min-width: 768px) {
|
274 |
-
.gdpr-framework-wrap .col {
|
275 |
-
-webkit-box-flex: 0;
|
276 |
-
-ms-flex: 0 0 33.33333%;
|
277 |
-
flex: 0 0 33.33333%;
|
278 |
-
max-width: 33.33333%;
|
279 |
-
}
|
280 |
-
}
|
281 |
-
|
282 |
-
.gdpr-framework-wrap .col .button {
|
283 |
-
display: block;
|
284 |
-
text-align: center;
|
285 |
-
}
|
286 |
-
|
287 |
-
.gdpr-framework-wrap .col_image {
|
288 |
-
background-position: center;
|
289 |
-
background-repeat: no-repeat;
|
290 |
-
background-size: cover;
|
291 |
-
border-radius: 6px;
|
292 |
-
background-color: #e5e5e5;
|
293 |
-
padding-bottom: 60%;
|
294 |
-
margin-bottom: 15px;
|
295 |
-
position: relative;
|
296 |
-
}
|
297 |
-
|
298 |
-
.gdpr-framework-wrap .col_image:after {
|
299 |
-
content: '';
|
300 |
-
position: absolute;
|
301 |
-
top: 0;
|
302 |
-
left: 0;
|
303 |
-
width: 100%;
|
304 |
-
height: 100%;
|
305 |
-
background-color: #ffa200;
|
306 |
-
opacity: .15;
|
307 |
-
}
|
308 |
-
|
309 |
-
.gdpr-framework-wrap .col .button {
|
310 |
-
font-size: 14px;
|
311 |
-
line-height: 28px;
|
312 |
-
padding: 4px 15px;
|
313 |
-
height: auto;
|
314 |
-
border: 1px solid #ccc;
|
315 |
-
box-shadow: 0 1px 0 #ccc;
|
316 |
-
-webkit-box-shadow: 0 1px 1px #ccc;
|
317 |
-
transition: .1s;
|
318 |
-
}
|
319 |
-
|
320 |
-
.gdpr-framework-wrap .col .button:hover {
|
321 |
-
box-shadow: 0 1px 1px #ccc;
|
322 |
-
-webkit-box-shadow: 0 1px 1px #ccc;
|
323 |
-
border: 1px solid #ccc;
|
324 |
-
background: #fff;
|
325 |
-
}
|
326 |
-
|
327 |
-
.gdpr-framework-wrap .col .button:focus {
|
328 |
-
box-shadow: 0 0 2px 1px #5b9cd9;
|
329 |
-
}
|
330 |
-
|
331 |
-
.gdpr-framework-wrap .col .button-primary {
|
332 |
-
background-color: #ffa200;
|
333 |
-
border-color: #ffa200;
|
334 |
-
color: #fff;
|
335 |
-
text-shadow: none;
|
336 |
-
-webkit-box-shadow: 0 1px 1px #ccc;
|
337 |
-
box-shadow: 0 1px 1px #ccc;
|
338 |
-
}
|
339 |
-
|
340 |
-
.gdpr-framework-wrap .col .button-primary:hover {
|
341 |
-
background: #ffc35c;
|
342 |
-
border-color: #ffc35c;
|
343 |
-
color: #fff;
|
344 |
-
}
|
345 |
-
|
346 |
-
.gdpr-framework-wrap .col .button-primary:active,
|
347 |
-
.gdpr-framework-wrap .col .button-primary:focus {
|
348 |
-
background-color: #ffa200;
|
349 |
-
border-color: #ccc;
|
350 |
-
color: #fff;
|
351 |
-
box-shadow: 0 0 2px 1px #5b9cd9;
|
352 |
-
}
|
353 |
-
|
354 |
-
.gdpr-framework-wrap .col p {
|
355 |
-
font-size: 14px;
|
356 |
-
line-height: 26px;
|
357 |
-
color: #555;
|
358 |
-
}
|
359 |
-
|
360 |
-
.gdpr-framework-wrap .col p:last-child {
|
361 |
-
margin-bottom: 0;
|
362 |
-
}
|
1 |
+
/** Admin notice **/
|
2 |
+
.notice-gdpr {
|
3 |
+
border-left-color: #0095a8;
|
4 |
+
overflow: hidden;
|
5 |
+
}
|
6 |
+
|
7 |
+
.notice-gdpr img {
|
8 |
+
width: 100px;
|
9 |
+
margin: 25px 0;
|
10 |
+
float: left;
|
11 |
+
}
|
12 |
+
|
13 |
+
.notice-gdpr .gdpr-content {
|
14 |
+
float: left;
|
15 |
+
width: calc(100% - 120px);
|
16 |
+
padding-left: 20px;
|
17 |
+
padding-bottom: 15px;
|
18 |
+
}
|
19 |
+
|
20 |
+
/** Modal window **/
|
21 |
+
.gdpr-modal {
|
22 |
+
max-width: 1200px;
|
23 |
+
}
|
24 |
+
|
25 |
+
.gdpr-modal li {
|
26 |
+
list-style-type: disc;
|
27 |
+
margin-left: 20px;
|
28 |
+
}
|
29 |
+
|
30 |
+
.gdpr-modal-footer {
|
31 |
+
background: #fcfcfc;
|
32 |
+
border-top: 1px solid #dfdfdf;
|
33 |
+
padding: 10px 0;
|
34 |
+
}
|
35 |
+
|
36 |
+
/** General **/
|
37 |
+
.gdpr-framework-wrap table {
|
38 |
+
table-layout: fixed;
|
39 |
+
border-spacing: 0;
|
40 |
+
}
|
41 |
+
|
42 |
+
.gdpr-framework-wrap input {
|
43 |
+
margin: 0;
|
44 |
+
}
|
45 |
+
|
46 |
+
.gdpr-framework-wrap .gdpr-select {
|
47 |
+
width: 300px;
|
48 |
+
max-width: 90%;
|
49 |
+
height: 32px;
|
50 |
+
border-color: #ddd;
|
51 |
+
background-color: #fff;
|
52 |
+
border: 1px solid #aaa;
|
53 |
+
border-radius: 4px;
|
54 |
+
box-sizing: border-box;
|
55 |
+
cursor: pointer;
|
56 |
+
display: block;
|
57 |
+
padding: 0 6px;
|
58 |
+
color: #666;
|
59 |
+
}
|
60 |
+
|
61 |
+
.gdpr-framework-wrap .select2-container {
|
62 |
+
display: block;
|
63 |
+
width: 300px;
|
64 |
+
max-width: 100%;
|
65 |
+
|
66 |
+
}
|
67 |
+
|
68 |
+
.gdpr-framework-wrap .select2-container--default .select2-selection--single .select2-selection__arrow,
|
69 |
+
.gdpr-framework-wrap .select2-container--default .select2-selection--single {
|
70 |
+
height: 32px !important;
|
71 |
+
}
|
72 |
+
|
73 |
+
.gdpr-framework-wrap .select2-container--default .select2-selection--single .select2-selection__arrow b {
|
74 |
+
border-width: 6px 3px 0 3px;
|
75 |
+
margin-left: -2px;
|
76 |
+
margin-top: -3px;
|
77 |
+
border-color: #666 transparent transparent transparent;
|
78 |
+
}
|
79 |
+
|
80 |
+
.gdpr-framework-wrap .select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
|
81 |
+
border-color: transparent transparent #666 transparent;
|
82 |
+
border-width: 0 3px 6px 3px;
|
83 |
+
}
|
84 |
+
|
85 |
+
.gdpr-framework-wrap input {
|
86 |
+
border-radius: 4px;
|
87 |
+
border: 1px solid #aaa;
|
88 |
+
box-shadow: none;
|
89 |
+
height: 32px;
|
90 |
+
line-height: 28px;
|
91 |
+
min-width: 300px;
|
92 |
+
max-width: 100%;
|
93 |
+
}
|
94 |
+
|
95 |
+
.gdpr-framework-wrap textarea {
|
96 |
+
border-radius: 4px;
|
97 |
+
border: 1px solid #aaa;
|
98 |
+
box-shadow: none;
|
99 |
+
height: 32px;
|
100 |
+
line-height: 28px;
|
101 |
+
}
|
102 |
+
|
103 |
+
.gdpr-framework-wrap .select2-container input {
|
104 |
+
min-width: 0;
|
105 |
+
}
|
106 |
+
|
107 |
+
.gdpr-framework-wrap input[type=checkbox] {
|
108 |
+
line-height: initial;
|
109 |
+
height: 16px;
|
110 |
+
min-width: 0;
|
111 |
+
}
|
112 |
+
|
113 |
+
.gdpr-framework-wrap input[type=submit] {
|
114 |
+
min-width: 0;
|
115 |
+
}
|
116 |
+
|
117 |
+
.gdpr-framework-wrap input[type=button] {
|
118 |
+
min-width: 0;
|
119 |
+
}
|
120 |
+
|
121 |
+
.gdpr-framework-wrap .wp-editor-wrap {
|
122 |
+
width: 720px;
|
123 |
+
max-width: 100%;
|
124 |
+
}
|
125 |
+
|
126 |
+
.gdpr-framework-wrap .nav-tab-highlight {
|
127 |
+
background: #ffa200;
|
128 |
+
color: #fff;
|
129 |
+
font-weight: 700;
|
130 |
+
border-bottom: 1px solid #ccc;
|
131 |
+
}
|
132 |
+
|
133 |
+
.gdpr-framework-wrap .nav-tab-highlight:hover {
|
134 |
+
background: #ffc35c;
|
135 |
+
color: #fff;
|
136 |
+
}
|
137 |
+
|
138 |
+
.gdpr-framework-wrap .nav-tab-highlight:focus {
|
139 |
+
box-shadow: 0 0 2px 1px #5b9cd9;
|
140 |
+
}
|
141 |
+
|
142 |
+
/* Consent tables */
|
143 |
+
.gdpr-framework-wrap .gdpr-consent,
|
144 |
+
.gdpr-framework-wrap .gdpr-consent-admin {
|
145 |
+
table-layout: auto;
|
146 |
+
}
|
147 |
+
|
148 |
+
.gdpr-consent-user {
|
149 |
+
border-collapse: collapse;
|
150 |
+
}
|
151 |
+
|
152 |
+
.gdpr-consent-user th {
|
153 |
+
padding-bottom: 10px;
|
154 |
+
}
|
155 |
+
|
156 |
+
.gdpr-consent-user td,
|
157 |
+
.gdpr-consent-user th {
|
158 |
+
border: 1px solid #ccc;
|
159 |
+
}
|
160 |
+
|
161 |
+
.gdpr-consent-user tr:first-child th {
|
162 |
+
border: 0;
|
163 |
+
}
|
164 |
+
|
165 |
+
.gdpr-consent th {
|
166 |
+
text-align: left;
|
167 |
+
}
|
168 |
+
|
169 |
+
.gdpr-consent td {
|
170 |
+
padding-right: 16px;
|
171 |
+
}
|
172 |
+
|
173 |
+
.gdpr-consent-admin th {
|
174 |
+
text-align: left;
|
175 |
+
padding-bottom: 16px;
|
176 |
+
}
|
177 |
+
|
178 |
+
.gdpr-consent-admin + .button {
|
179 |
+
margin-top: 16px;
|
180 |
+
}
|
181 |
+
|
182 |
+
.gdpr-consent-admin td {
|
183 |
+
padding-right: 16px;
|
184 |
+
vertical-align: top;
|
185 |
+
padding-bottom: 20px;
|
186 |
+
}
|
187 |
+
|
188 |
+
.gdpr-framework-wrap .gdpr-consent-admin input {
|
189 |
+
min-width: 0;
|
190 |
+
}
|
191 |
+
|
192 |
+
.gdpr-consent-table-desc {
|
193 |
+
width: 450px;
|
194 |
+
}
|
195 |
+
|
196 |
+
.gdpr-consent-table-input {
|
197 |
+
width: 200px;
|
198 |
+
}
|
199 |
+
|
200 |
+
.gdpr-consent-table-input input {
|
201 |
+
width: 100%;
|
202 |
+
}
|
203 |
+
|
204 |
+
.gdpr-consent-table-desc textarea {
|
205 |
+
width: 100%;
|
206 |
+
min-height: 100px;
|
207 |
+
}
|
208 |
+
|
209 |
+
.gdpr-consent-add-button {
|
210 |
+
text-align: right;
|
211 |
+
width: 1051px;
|
212 |
+
}
|
213 |
+
|
214 |
+
.gdpr-consent-user {
|
215 |
+
table-layout: auto;
|
216 |
+
}
|
217 |
+
|
218 |
+
.gdpr-consent-user td {
|
219 |
+
padding: 15px;
|
220 |
+
}
|
221 |
+
|
222 |
+
.gdpr-consent-user-title {
|
223 |
+
width: 200px;
|
224 |
+
}
|
225 |
+
|
226 |
+
.gdpr-consent-user-desc {
|
227 |
+
width: 450px;
|
228 |
+
}
|
229 |
+
|
230 |
+
/* support page */
|
231 |
+
.gdpr-framework-wrap .align-center {
|
232 |
+
text-align: center;
|
233 |
+
}
|
234 |
+
|
235 |
+
.gdpr-framework-wrap .section {
|
236 |
+
margin: 25px 0;
|
237 |
+
max-width: 720px;
|
238 |
+
}
|
239 |
+
|
240 |
+
.gdpr-framework-wrap .row {
|
241 |
+
box-sizing: border-box;
|
242 |
+
display: -webkit-box;
|
243 |
+
display: -ms-flexbox;
|
244 |
+
display: flex;
|
245 |
+
-ms-flex-wrap: wrap;
|
246 |
+
flex-wrap: wrap;
|
247 |
+
margin-right: -8px;
|
248 |
+
margin-left: -8px;
|
249 |
+
-webkit-box-pack: center !important;
|
250 |
+
-ms-flex-pack: center !important;
|
251 |
+
justify-content: center !important;
|
252 |
+
}
|
253 |
+
|
254 |
+
.gdpr-framework-wrap .col {
|
255 |
+
box-sizing: border-box;
|
256 |
+
position: relative;
|
257 |
+
width: 100%;
|
258 |
+
min-height: 1px;
|
259 |
+
padding-right: 8px;
|
260 |
+
padding-left: 8px;
|
261 |
+
margin-bottom: 15px;
|
262 |
+
}
|
263 |
+
|
264 |
+
@media (min-width: 576px) {
|
265 |
+
.gdpr-framework-wrap .col {
|
266 |
+
-webkit-box-flex: 0;
|
267 |
+
-ms-flex: 0 0 50%;
|
268 |
+
flex: 0 0 50%;
|
269 |
+
max-width: 50%;
|
270 |
+
}
|
271 |
+
}
|
272 |
+
|
273 |
+
@media (min-width: 768px) {
|
274 |
+
.gdpr-framework-wrap .col {
|
275 |
+
-webkit-box-flex: 0;
|
276 |
+
-ms-flex: 0 0 33.33333%;
|
277 |
+
flex: 0 0 33.33333%;
|
278 |
+
max-width: 33.33333%;
|
279 |
+
}
|
280 |
+
}
|
281 |
+
|
282 |
+
.gdpr-framework-wrap .col .button {
|
283 |
+
display: block;
|
284 |
+
text-align: center;
|
285 |
+
}
|
286 |
+
|
287 |
+
.gdpr-framework-wrap .col_image {
|
288 |
+
background-position: center;
|
289 |
+
background-repeat: no-repeat;
|
290 |
+
background-size: cover;
|
291 |
+
border-radius: 6px;
|
292 |
+
background-color: #e5e5e5;
|
293 |
+
padding-bottom: 60%;
|
294 |
+
margin-bottom: 15px;
|
295 |
+
position: relative;
|
296 |
+
}
|
297 |
+
|
298 |
+
.gdpr-framework-wrap .col_image:after {
|
299 |
+
content: '';
|
300 |
+
position: absolute;
|
301 |
+
top: 0;
|
302 |
+
left: 0;
|
303 |
+
width: 100%;
|
304 |
+
height: 100%;
|
305 |
+
background-color: #ffa200;
|
306 |
+
opacity: .15;
|
307 |
+
}
|
308 |
+
|
309 |
+
.gdpr-framework-wrap .col .button {
|
310 |
+
font-size: 14px;
|
311 |
+
line-height: 28px;
|
312 |
+
padding: 4px 15px;
|
313 |
+
height: auto;
|
314 |
+
border: 1px solid #ccc;
|
315 |
+
box-shadow: 0 1px 0 #ccc;
|
316 |
+
-webkit-box-shadow: 0 1px 1px #ccc;
|
317 |
+
transition: .1s;
|
318 |
+
}
|
319 |
+
|
320 |
+
.gdpr-framework-wrap .col .button:hover {
|
321 |
+
box-shadow: 0 1px 1px #ccc;
|
322 |
+
-webkit-box-shadow: 0 1px 1px #ccc;
|
323 |
+
border: 1px solid #ccc;
|
324 |
+
background: #fff;
|
325 |
+
}
|
326 |
+
|
327 |
+
.gdpr-framework-wrap .col .button:focus {
|
328 |
+
box-shadow: 0 0 2px 1px #5b9cd9;
|
329 |
+
}
|
330 |
+
|
331 |
+
.gdpr-framework-wrap .col .button-primary {
|
332 |
+
background-color: #ffa200;
|
333 |
+
border-color: #ffa200;
|
334 |
+
color: #fff;
|
335 |
+
text-shadow: none;
|
336 |
+
-webkit-box-shadow: 0 1px 1px #ccc;
|
337 |
+
box-shadow: 0 1px 1px #ccc;
|
338 |
+
}
|
339 |
+
|
340 |
+
.gdpr-framework-wrap .col .button-primary:hover {
|
341 |
+
background: #ffc35c;
|
342 |
+
border-color: #ffc35c;
|
343 |
+
color: #fff;
|
344 |
+
}
|
345 |
+
|
346 |
+
.gdpr-framework-wrap .col .button-primary:active,
|
347 |
+
.gdpr-framework-wrap .col .button-primary:focus {
|
348 |
+
background-color: #ffa200;
|
349 |
+
border-color: #ccc;
|
350 |
+
color: #fff;
|
351 |
+
box-shadow: 0 0 2px 1px #5b9cd9;
|
352 |
+
}
|
353 |
+
|
354 |
+
.gdpr-framework-wrap .col p {
|
355 |
+
font-size: 14px;
|
356 |
+
line-height: 26px;
|
357 |
+
color: #555;
|
358 |
+
}
|
359 |
+
|
360 |
+
.gdpr-framework-wrap .col p:last-child {
|
361 |
+
margin-bottom: 0;
|
362 |
+
}
|
assets/gdpr-admin.js
CHANGED
@@ -1,102 +1,102 @@
|
|
1 |
-
jQuery(function ($) {
|
2 |
-
|
3 |
-
// Handler to open the modal dialog
|
4 |
-
$(document).on('click', '.gdpr-open-modal', function (e) {
|
5 |
-
$($(this).data('gdpr-modal-target')).dialog('open');
|
6 |
-
e.preventDefault();
|
7 |
-
});
|
8 |
-
|
9 |
-
// Initialize all modals on page
|
10 |
-
$('.gdpr-modal').each(function (i, e) {
|
11 |
-
var $base = $(this);
|
12 |
-
|
13 |
-
$base.dialog({
|
14 |
-
title: $base.data('gdpr-title'),
|
15 |
-
dialogClass: 'wp-dialog',
|
16 |
-
autoOpen: false,
|
17 |
-
draggable: false,
|
18 |
-
width: 'auto',
|
19 |
-
modal: true,
|
20 |
-
resizable: false,
|
21 |
-
closeOnEscape: true,
|
22 |
-
position: {
|
23 |
-
my: "center",
|
24 |
-
at: "center",
|
25 |
-
of: window
|
26 |
-
},
|
27 |
-
create: function () {
|
28 |
-
// style fix for WordPress admin
|
29 |
-
$('.ui-dialog-titlebar-close').addClass('ui-button');
|
30 |
-
},
|
31 |
-
open: function () {
|
32 |
-
// Bind a click on the overlay to close the dialog
|
33 |
-
$('.ui-widget-overlay').bind('click', function () {
|
34 |
-
$base.dialog('close');
|
35 |
-
});
|
36 |
-
|
37 |
-
// Bind a custom close button to close the dialog
|
38 |
-
$base.find('.gdpr-close-modal').bind('click', function (e) {
|
39 |
-
$base.dialog('close');
|
40 |
-
e.preventDefault();
|
41 |
-
});
|
42 |
-
|
43 |
-
// Fix overlay CSS issues in admin
|
44 |
-
$('.wp-dialog').css('z-index', 9999);
|
45 |
-
$('.ui-widget-overlay').css('z-index', 9998);
|
46 |
-
},
|
47 |
-
close: function () {
|
48 |
-
$('.wp-dialog').css('z-index', 101);
|
49 |
-
$('.ui-widget-overlay').css('z-index', 100);
|
50 |
-
}
|
51 |
-
});
|
52 |
-
});
|
53 |
-
|
54 |
-
/**
|
55 |
-
* https://github.com/DubFriend/jquery.repeater
|
56 |
-
*/
|
57 |
-
$('.js-gdpr-repeater').each(function () {
|
58 |
-
var $repeater = $(this).repeater({
|
59 |
-
isFirstItemUndeletable: true
|
60 |
-
});
|
61 |
-
|
62 |
-
if (typeof window.repeaterData[$(this).data('name')] !== undefined) {
|
63 |
-
$repeater.setList(window.repeaterData[$(this).data('name')]);
|
64 |
-
}
|
65 |
-
});
|
66 |
-
|
67 |
-
/**
|
68 |
-
* Init select2
|
69 |
-
*/
|
70 |
-
$('.js-gdpr-select2').select2({
|
71 |
-
width: 'style'
|
72 |
-
});
|
73 |
-
|
74 |
-
/**
|
75 |
-
* Auto-fill DPA info
|
76 |
-
*/
|
77 |
-
$('.js-gdpr-country-selector').on('change', function () {
|
78 |
-
var dpaData, $website, $email, $phone;
|
79 |
-
var countryCode = $(this).val();
|
80 |
-
|
81 |
-
if (!window.gdprDpaData[countryCode]) {
|
82 |
-
return;
|
83 |
-
}
|
84 |
-
|
85 |
-
dpaData = window.gdprDpaData[countryCode];
|
86 |
-
|
87 |
-
$website = $('#gdpr_dpa_website');
|
88 |
-
if ('' === $website.data('set')) {
|
89 |
-
$website.val(dpaData['website']);
|
90 |
-
}
|
91 |
-
|
92 |
-
$email = $('#gdpr_dpa_email');
|
93 |
-
if ('' === $email.data('set')) {
|
94 |
-
$email.val(dpaData['email']);
|
95 |
-
}
|
96 |
-
|
97 |
-
$phone = $('#gdpr_dpa_phone');
|
98 |
-
if ('' === $phone.data('set')) {
|
99 |
-
$phone.val(dpaData['phone']);
|
100 |
-
}
|
101 |
-
});
|
102 |
-
});
|
1 |
+
jQuery(function ($) {
|
2 |
+
|
3 |
+
// Handler to open the modal dialog
|
4 |
+
$(document).on('click', '.gdpr-open-modal', function (e) {
|
5 |
+
$($(this).data('gdpr-modal-target')).dialog('open');
|
6 |
+
e.preventDefault();
|
7 |
+
});
|
8 |
+
|
9 |
+
// Initialize all modals on page
|
10 |
+
$('.gdpr-modal').each(function (i, e) {
|
11 |
+
var $base = $(this);
|
12 |
+
|
13 |
+
$base.dialog({
|
14 |
+
title: $base.data('gdpr-title'),
|
15 |
+
dialogClass: 'wp-dialog',
|
16 |
+
autoOpen: false,
|
17 |
+
draggable: false,
|
18 |
+
width: 'auto',
|
19 |
+
modal: true,
|
20 |
+
resizable: false,
|
21 |
+
closeOnEscape: true,
|
22 |
+
position: {
|
23 |
+
my: "center",
|
24 |
+
at: "center",
|
25 |
+
of: window
|
26 |
+
},
|
27 |
+
create: function () {
|
28 |
+
// style fix for WordPress admin
|
29 |
+
$('.ui-dialog-titlebar-close').addClass('ui-button');
|
30 |
+
},
|
31 |
+
open: function () {
|
32 |
+
// Bind a click on the overlay to close the dialog
|
33 |
+
$('.ui-widget-overlay').bind('click', function () {
|
34 |
+
$base.dialog('close');
|
35 |
+
});
|
36 |
+
|
37 |
+
// Bind a custom close button to close the dialog
|
38 |
+
$base.find('.gdpr-close-modal').bind('click', function (e) {
|
39 |
+
$base.dialog('close');
|
40 |
+
e.preventDefault();
|
41 |
+
});
|
42 |
+
|
43 |
+
// Fix overlay CSS issues in admin
|
44 |
+
$('.wp-dialog').css('z-index', 9999);
|
45 |
+
$('.ui-widget-overlay').css('z-index', 9998);
|
46 |
+
},
|
47 |
+
close: function () {
|
48 |
+
$('.wp-dialog').css('z-index', 101);
|
49 |
+
$('.ui-widget-overlay').css('z-index', 100);
|
50 |
+
}
|
51 |
+
});
|
52 |
+
});
|
53 |
+
|
54 |
+
/**
|
55 |
+
* https://github.com/DubFriend/jquery.repeater
|
56 |
+
*/
|
57 |
+
$('.js-gdpr-repeater').each(function () {
|
58 |
+
var $repeater = $(this).repeater({
|
59 |
+
isFirstItemUndeletable: true
|
60 |
+
});
|
61 |
+
|
62 |
+
if (typeof window.repeaterData[$(this).data('name')] !== undefined) {
|
63 |
+
$repeater.setList(window.repeaterData[$(this).data('name')]);
|
64 |
+
}
|
65 |
+
});
|
66 |
+
|
67 |
+
/**
|
68 |
+
* Init select2
|
69 |
+
*/
|
70 |
+
$('.js-gdpr-select2').select2({
|
71 |
+
width: 'style'
|
72 |
+
});
|
73 |
+
|
74 |
+
/**
|
75 |
+
* Auto-fill DPA info
|
76 |
+
*/
|
77 |
+
$('.js-gdpr-country-selector').on('change', function () {
|
78 |
+
var dpaData, $website, $email, $phone;
|
79 |
+
var countryCode = $(this).val();
|
80 |
+
|
81 |
+
if (!window.gdprDpaData[countryCode]) {
|
82 |
+
return;
|
83 |
+
}
|
84 |
+
|
85 |
+
dpaData = window.gdprDpaData[countryCode];
|
86 |
+
|
87 |
+
$website = $('#gdpr_dpa_website');
|
88 |
+
if ('' === $website.data('set')) {
|
89 |
+
$website.val(dpaData['website']);
|
90 |
+
}
|
91 |
+
|
92 |
+
$email = $('#gdpr_dpa_email');
|
93 |
+
if ('' === $email.data('set')) {
|
94 |
+
$email.val(dpaData['email']);
|
95 |
+
}
|
96 |
+
|
97 |
+
$phone = $('#gdpr_dpa_phone');
|
98 |
+
if ('' === $phone.data('set')) {
|
99 |
+
$phone.val(dpaData['phone']);
|
100 |
+
}
|
101 |
+
});
|
102 |
+
});
|
assets/gdpr-installer.css
CHANGED
@@ -1,550 +1,550 @@
|
|
1 |
-
.gdpr-installer-container {
|
2 |
-
max-width: 720px;
|
3 |
-
margin: 30px auto;
|
4 |
-
font-size: 14px;
|
5 |
-
}
|
6 |
-
|
7 |
-
.gdpr-step-button-prev {
|
8 |
-
display: block;
|
9 |
-
float: left;
|
10 |
-
}
|
11 |
-
|
12 |
-
.gdpr-step-button-next {
|
13 |
-
display: block;
|
14 |
-
float: right;
|
15 |
-
}
|
16 |
-
|
17 |
-
.gdpr-header {
|
18 |
-
margin: 0 auto 30px;
|
19 |
-
overflow: hidden;
|
20 |
-
padding: 0 16px;
|
21 |
-
text-align: center;
|
22 |
-
}
|
23 |
-
|
24 |
-
.gdpr-header_left {
|
25 |
-
float: left;
|
26 |
-
width: 100%;
|
27 |
-
}
|
28 |
-
|
29 |
-
.gdpr-header_right {
|
30 |
-
float: left;
|
31 |
-
width: 100%;
|
32 |
-
}
|
33 |
-
|
34 |
-
@media (min-width: 576px) {
|
35 |
-
.gdpr-header {
|
36 |
-
text-align: left;
|
37 |
-
}
|
38 |
-
|
39 |
-
.gdpr-header_left {
|
40 |
-
width: 175px;
|
41 |
-
padding-right: 15px;
|
42 |
-
padding-top: 25px;
|
43 |
-
}
|
44 |
-
|
45 |
-
.gdpr-header_right {
|
46 |
-
width: calc(100% - 235px);
|
47 |
-
}
|
48 |
-
}
|
49 |
-
|
50 |
-
@media (min-width: 768px) {
|
51 |
-
.gdpr-header {
|
52 |
-
padding: 0;
|
53 |
-
}
|
54 |
-
}
|
55 |
-
|
56 |
-
.gdpr-logo {
|
57 |
-
width: 100px;
|
58 |
-
}
|
59 |
-
|
60 |
-
.gdpr-header h1 {
|
61 |
-
font-size: 1.8em;
|
62 |
-
line-height: normal;
|
63 |
-
margin-top: 15px;
|
64 |
-
margin-bottom: 20px;
|
65 |
-
font-weight: 700;
|
66 |
-
}
|
67 |
-
|
68 |
-
.gdpr-header h2 {
|
69 |
-
float: left;
|
70 |
-
}
|
71 |
-
|
72 |
-
.gdpr-installer .gdpr-content {
|
73 |
-
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .13);
|
74 |
-
box-shadow: 0 1px 3px rgba(0, 0, 0, .13);
|
75 |
-
padding: 16px;
|
76 |
-
margin: 0 0 20px;
|
77 |
-
background: #fff;
|
78 |
-
overflow: hidden;
|
79 |
-
zoom: 1;
|
80 |
-
}
|
81 |
-
|
82 |
-
.gdpr-installer .spacer {
|
83 |
-
margin-top: 2em;
|
84 |
-
}
|
85 |
-
|
86 |
-
.gdpr-installer .gdpr-content p {
|
87 |
-
font-size: 14px;
|
88 |
-
line-height: 26px;
|
89 |
-
color: #555;
|
90 |
-
}
|
91 |
-
|
92 |
-
.gdpr-installer .gdpr-content p:last-child {
|
93 |
-
margin-bottom: 0;
|
94 |
-
}
|
95 |
-
|
96 |
-
.gdpr-content a {
|
97 |
-
color: #0095a7;
|
98 |
-
font-weight: 700;
|
99 |
-
text-decoration: none;
|
100 |
-
box-shadow: none;
|
101 |
-
}
|
102 |
-
|
103 |
-
.gdpr-content a:hover,
|
104 |
-
.gdpr-content a:focus {
|
105 |
-
outline: none;
|
106 |
-
text-decoration: none;
|
107 |
-
color: #000;
|
108 |
-
}
|
109 |
-
|
110 |
-
.gdpr-installer .gdpr-content li {
|
111 |
-
margin-left: 20px;
|
112 |
-
list-style-type: disc;
|
113 |
-
}
|
114 |
-
|
115 |
-
.gdpr-installer .gdpr-content select {
|
116 |
-
height: 32px;
|
117 |
-
border-color: #ddd;
|
118 |
-
background-color: #fff;
|
119 |
-
border: 1px solid #aaa;
|
120 |
-
border-radius: 4px;
|
121 |
-
box-sizing: border-box;
|
122 |
-
cursor: pointer;
|
123 |
-
display: block;
|
124 |
-
padding: 0 6px;
|
125 |
-
color: #666;
|
126 |
-
}
|
127 |
-
|
128 |
-
.select2-container .select2-selection--single {
|
129 |
-
height: 32px !important;
|
130 |
-
}
|
131 |
-
|
132 |
-
.gdpr-installer .gdpr-content h1 {
|
133 |
-
font-weight: 700;
|
134 |
-
line-height: normal;
|
135 |
-
}
|
136 |
-
|
137 |
-
.gdpr-installer .gdpr-content h2 {
|
138 |
-
font-size: 22px;
|
139 |
-
line-height: 32px;
|
140 |
-
font-weight: 700;
|
141 |
-
}
|
142 |
-
|
143 |
-
.gdpr-installer .gdpr-content h3 {
|
144 |
-
font-size: 18px;
|
145 |
-
line-height: 22px;
|
146 |
-
font-weight: 700;
|
147 |
-
}
|
148 |
-
|
149 |
-
.wp-core-ui .button {
|
150 |
-
font-size: 14px;
|
151 |
-
line-height: 28px;
|
152 |
-
padding: 4px 15px;
|
153 |
-
height: auto;
|
154 |
-
border: 1px solid #ccc;
|
155 |
-
box-shadow: 0 1px 0 #ccc;
|
156 |
-
-webkit-box-shadow: 0 1px 1px #ccc;
|
157 |
-
transition: .1s;
|
158 |
-
}
|
159 |
-
|
160 |
-
.wp-core-ui .button:hover {
|
161 |
-
box-shadow: 0 1px 1px #ccc;
|
162 |
-
-webkit-box-shadow: 0 1px 1px #ccc;
|
163 |
-
border: 1px solid #ccc;
|
164 |
-
background: #fff;
|
165 |
-
}
|
166 |
-
|
167 |
-
.wp-core-ui .button:focus {
|
168 |
-
box-shadow: 0 0 2px 1px #5b9cd9;
|
169 |
-
}
|
170 |
-
|
171 |
-
.wp-core-ui .button-gdpr {
|
172 |
-
background: #0095a8;
|
173 |
-
border-color: #0095a8;
|
174 |
-
-webkit-box-shadow: 0 1px 1px #ccc;
|
175 |
-
box-shadow: 0 1px 1px #ccc;
|
176 |
-
color: #fff;
|
177 |
-
text-decoration: none;
|
178 |
-
transition: .1s;
|
179 |
-
}
|
180 |
-
|
181 |
-
.wp-core-ui .button-gdpr:hover {
|
182 |
-
background: #79c2cb;
|
183 |
-
border-color: #79c2cb;
|
184 |
-
color: #fff;
|
185 |
-
}
|
186 |
-
|
187 |
-
.wp-core-ui .button-gdpr:active,
|
188 |
-
.wp-core-ui .button-gdpr:focus {
|
189 |
-
background: #0095a8;
|
190 |
-
border-color: #ccc;
|
191 |
-
color: #fff;
|
192 |
-
box-shadow: 0 0 2px 1px #5b9cd9;
|
193 |
-
}
|
194 |
-
|
195 |
-
.wp-core-ui .button-primary {
|
196 |
-
background-color: #ffa200;
|
197 |
-
border-color: #ffa200;
|
198 |
-
color: #fff;
|
199 |
-
text-shadow: none;
|
200 |
-
-webkit-box-shadow: 0 1px 1px #ccc;
|
201 |
-
box-shadow: 0 1px 1px #ccc;
|
202 |
-
}
|
203 |
-
|
204 |
-
.wp-core-ui .button-primary:hover {
|
205 |
-
background: #ffc35c;
|
206 |
-
border-color: #ffc35c;
|
207 |
-
color: #fff;
|
208 |
-
}
|
209 |
-
|
210 |
-
.wp-core-ui .button-primary:active,
|
211 |
-
.wp-core-ui .button-primary:focus {
|
212 |
-
background-color: #ffa200;
|
213 |
-
border-color: #ccc;
|
214 |
-
color: #fff;
|
215 |
-
box-shadow: 0 0 2px 1px #5b9cd9;
|
216 |
-
}
|
217 |
-
|
218 |
-
.wp-core-ui.gdpr-installer .button-right {
|
219 |
-
float: right;
|
220 |
-
}
|
221 |
-
|
222 |
-
.wp-core-ui .button.button-gdpr-large {
|
223 |
-
font-size: 14px;
|
224 |
-
padding: 4px 15px;
|
225 |
-
height: auto;
|
226 |
-
}
|
227 |
-
|
228 |
-
.gdpr-footer-links {
|
229 |
-
text-align: center;
|
230 |
-
}
|
231 |
-
|
232 |
-
.wp-core-ui .button-center {
|
233 |
-
display: block;
|
234 |
-
margin: 25px auto 10px;
|
235 |
-
}
|
236 |
-
|
237 |
-
.gdpr-installer label {
|
238 |
-
color: #666;
|
239 |
-
font-size: 14px;
|
240 |
-
font-weight: 500;
|
241 |
-
margin-bottom: .5em;
|
242 |
-
margin-top: 1em;
|
243 |
-
display: block;
|
244 |
-
cursor: pointer;
|
245 |
-
}
|
246 |
-
|
247 |
-
.gdpr-installer input[type=text],
|
248 |
-
.gdpr-installer input[type=email] {
|
249 |
-
border: 1px solid #aaa;
|
250 |
-
border-color: #ddd;
|
251 |
-
border-radius: 4px;
|
252 |
-
height: 30px;
|
253 |
-
width: calc(100% - 8px - 24px - 2px);
|
254 |
-
padding-left: 8px;
|
255 |
-
padding-right: 24px;
|
256 |
-
color: #444;
|
257 |
-
background-color: #fff;
|
258 |
-
display: inline-block;
|
259 |
-
}
|
260 |
-
|
261 |
-
.gdpr-installer input + em {
|
262 |
-
display: block;
|
263 |
-
margin-top: 5px;
|
264 |
-
}
|
265 |
-
|
266 |
-
.gdpr-installer .select2 + em {
|
267 |
-
display: block;
|
268 |
-
margin-top: 5px;
|
269 |
-
}
|
270 |
-
|
271 |
-
.gdpr-installer textarea {
|
272 |
-
width: calc(100% - 8px - 24px - 2px);
|
273 |
-
height: 80px;
|
274 |
-
}
|
275 |
-
|
276 |
-
.gdpr-installer .select2-container {
|
277 |
-
display: block;
|
278 |
-
width: 300px;
|
279 |
-
max-width: 100%;
|
280 |
-
}
|
281 |
-
|
282 |
-
.gdpr-select {
|
283 |
-
width: 300px;
|
284 |
-
max-width: 100%;
|
285 |
-
}
|
286 |
-
|
287 |
-
.hidden {
|
288 |
-
display: none;
|
289 |
-
}
|
290 |
-
|
291 |
-
.gdpr-installer fieldset {
|
292 |
-
margin: -20px 0 0 0;
|
293 |
-
}
|
294 |
-
|
295 |
-
.wp-core-ui .button-side {
|
296 |
-
min-width: 220px;
|
297 |
-
text-align: center;
|
298 |
-
margin-right: 15px;
|
299 |
-
}
|
300 |
-
|
301 |
-
.align-center {
|
302 |
-
text-align: center;
|
303 |
-
}
|
304 |
-
|
305 |
-
.section {
|
306 |
-
margin: 25px 0;
|
307 |
-
}
|
308 |
-
|
309 |
-
.row {
|
310 |
-
box-sizing: border-box;
|
311 |
-
display: -webkit-box;
|
312 |
-
display: -ms-flexbox;
|
313 |
-
display: flex;
|
314 |
-
-ms-flex-wrap: wrap;
|
315 |
-
flex-wrap: wrap;
|
316 |
-
margin-right: -8px;
|
317 |
-
margin-left: -8px;
|
318 |
-
-webkit-box-pack: center !important;
|
319 |
-
-ms-flex-pack: center !important;
|
320 |
-
justify-content: center !important;
|
321 |
-
}
|
322 |
-
|
323 |
-
.col {
|
324 |
-
box-sizing: border-box;
|
325 |
-
position: relative;
|
326 |
-
width: 100%;
|
327 |
-
min-height: 1px;
|
328 |
-
padding-right: 8px;
|
329 |
-
padding-left: 8px;
|
330 |
-
margin-bottom: 15px;
|
331 |
-
}
|
332 |
-
|
333 |
-
@media (min-width: 576px) {
|
334 |
-
.col {
|
335 |
-
-webkit-box-flex: 0;
|
336 |
-
-ms-flex: 0 0 50%;
|
337 |
-
flex: 0 0 50%;
|
338 |
-
max-width: 50%;
|
339 |
-
}
|
340 |
-
}
|
341 |
-
|
342 |
-
@media (min-width: 768px) {
|
343 |
-
.col {
|
344 |
-
-webkit-box-flex: 0;
|
345 |
-
-ms-flex: 0 0 33.33333%;
|
346 |
-
flex: 0 0 33.33333%;
|
347 |
-
max-width: 33.33333%;
|
348 |
-
}
|
349 |
-
}
|
350 |
-
|
351 |
-
.wp-core-ui .col .button {
|
352 |
-
display: block;
|
353 |
-
text-align: center;
|
354 |
-
}
|
355 |
-
|
356 |
-
.col_image {
|
357 |
-
background-position: center;
|
358 |
-
background-repeat: no-repeat;
|
359 |
-
background-size: cover;
|
360 |
-
border-radius: 6px;
|
361 |
-
background-color: #e5e5e5;
|
362 |
-
padding-bottom: 60%;
|
363 |
-
margin-bottom: 15px;
|
364 |
-
position: relative;
|
365 |
-
}
|
366 |
-
|
367 |
-
.col_image:after {
|
368 |
-
content: '';
|
369 |
-
position: absolute;
|
370 |
-
top: 0;
|
371 |
-
left: 0;
|
372 |
-
width: 100%;
|
373 |
-
height: 100%;
|
374 |
-
background-color: #ffa200;
|
375 |
-
opacity: .15;
|
376 |
-
}
|
377 |
-
|
378 |
-
/* jQuery UI hacks */
|
379 |
-
.ui-tabs {
|
380 |
-
position: relative;
|
381 |
-
padding: .2em;
|
382 |
-
}
|
383 |
-
|
384 |
-
.ui-tabs-nav {
|
385 |
-
margin: 0;
|
386 |
-
padding: .2em .2em 0;
|
387 |
-
}
|
388 |
-
|
389 |
-
.ui-helper-clearfix {
|
390 |
-
min-height: 0;
|
391 |
-
}
|
392 |
-
|
393 |
-
.ui-helper-reset {
|
394 |
-
margin: 0;
|
395 |
-
padding: 0;
|
396 |
-
border: 0;
|
397 |
-
outline: 0;
|
398 |
-
line-height: 1.3;
|
399 |
-
text-decoration: none;
|
400 |
-
font-size: 100%;
|
401 |
-
list-style: none;
|
402 |
-
}
|
403 |
-
|
404 |
-
.ui-helper-clearfix:before, .ui-helper-clearfix:after {
|
405 |
-
content: "";
|
406 |
-
display: table;
|
407 |
-
border-collapse: collapse;
|
408 |
-
}
|
409 |
-
|
410 |
-
.ui-helper-clearfix:after {
|
411 |
-
clear: both;
|
412 |
-
}
|
413 |
-
|
414 |
-
.ui-tabs .ui-tabs-nav li {
|
415 |
-
list-style: none;
|
416 |
-
float: left;
|
417 |
-
position: relative;
|
418 |
-
top: 0;
|
419 |
-
margin: 1px .2em 0 0;
|
420 |
-
border-bottom-width: 0;
|
421 |
-
padding: 0;
|
422 |
-
white-space: nowrap;
|
423 |
-
background: #eee;
|
424 |
-
}
|
425 |
-
|
426 |
-
.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
|
427 |
-
float: left;
|
428 |
-
padding: .5em 1em;
|
429 |
-
text-decoration: none;
|
430 |
-
}
|
431 |
-
|
432 |
-
.ui-tabs .ui-tabs-nav li.ui-tabs-active {
|
433 |
-
background: #fff;
|
434 |
-
}
|
435 |
-
|
436 |
-
.handle {
|
437 |
-
cursor: move;
|
438 |
-
}
|
439 |
-
|
440 |
-
.gdpr-table {
|
441 |
-
width: 100%;
|
442 |
-
}
|
443 |
-
|
444 |
-
.gdpr-footer-links {
|
445 |
-
padding-bottom: 50px;
|
446 |
-
}
|
447 |
-
|
448 |
-
.slidePadding {
|
449 |
-
display: block;
|
450 |
-
padding-top: 1px;
|
451 |
-
padding-bottom: 1px;
|
452 |
-
}
|
453 |
-
|
454 |
-
.gdpr-installer p.error {
|
455 |
-
font-size: 16px;
|
456 |
-
font-weight: 700;
|
457 |
-
color: #e34639;
|
458 |
-
}
|
459 |
-
|
460 |
-
/* gdpr-breadcrumbs */
|
461 |
-
.gdpr-breadcrumbs {
|
462 |
-
margin-bottom: 22px;
|
463 |
-
}
|
464 |
-
|
465 |
-
.gdpr-breadcrumbs:after {
|
466 |
-
display: block;
|
467 |
-
clear: both;
|
468 |
-
content: '';
|
469 |
-
}
|
470 |
-
|
471 |
-
.gdpr-breadcrumbs_unit {
|
472 |
-
box-sizing: border-box;
|
473 |
-
float: left;
|
474 |
-
width: 50%;
|
475 |
-
font-size: 14px;
|
476 |
-
line-height: 26px;
|
477 |
-
padding-right: 15px;
|
478 |
-
}
|
479 |
-
|
480 |
-
.gdpr-breadcrumbs_unit:nth-child(3),
|
481 |
-
.gdpr-breadcrumbs_unit:nth-child(4) {
|
482 |
-
margin-top: 10px;
|
483 |
-
}
|
484 |
-
|
485 |
-
.gdpr-breadcrumbs_item {
|
486 |
-
background-color: #dddddd;
|
487 |
-
padding: 2px 0;
|
488 |
-
text-align: center;
|
489 |
-
position: relative;
|
490 |
-
color: #555555;
|
491 |
-
padding-left: 8px;
|
492 |
-
}
|
493 |
-
|
494 |
-
.gdpr-breadcrumbs_item:after {
|
495 |
-
position: absolute;
|
496 |
-
right: -15px;
|
497 |
-
top: 0;
|
498 |
-
content: '';
|
499 |
-
width: 0;
|
500 |
-
height: 0;
|
501 |
-
border-style: solid;
|
502 |
-
border-width: 15px 0 15px 15px;
|
503 |
-
border-color: transparent transparent transparent #dddddd;
|
504 |
-
}
|
505 |
-
|
506 |
-
.gdpr-breadcrumbs_item:before {
|
507 |
-
position: absolute;
|
508 |
-
left: 0;
|
509 |
-
top: 0;
|
510 |
-
content: '';
|
511 |
-
width: 0;
|
512 |
-
height: 0;
|
513 |
-
border-style: solid;
|
514 |
-
border-width: 15px 0 15px 15px;
|
515 |
-
border-color: transparent transparent transparent #f1f1f1;
|
516 |
-
}
|
517 |
-
|
518 |
-
.gdpr-breadcrumbs_unit.active .gdpr-breadcrumbs_item {
|
519 |
-
background-color: #0095a8;
|
520 |
-
color: #fff;
|
521 |
-
font-weight: 700;
|
522 |
-
}
|
523 |
-
|
524 |
-
.gdpr-breadcrumbs_unit.active .gdpr-breadcrumbs_item:after {
|
525 |
-
border-color: transparent transparent transparent #0095a8;
|
526 |
-
}
|
527 |
-
|
528 |
-
.gdpr-breadcrumbs_unit:first-child .gdpr-breadcrumbs_item:before,
|
529 |
-
.gdpr-breadcrumbs_unit:last-child .gdpr-breadcrumbs_item:after {
|
530 |
-
display: none;
|
531 |
-
}
|
532 |
-
|
533 |
-
.gdpr-breadcrumbs_unit:last-child {
|
534 |
-
padding: 0;
|
535 |
-
}
|
536 |
-
|
537 |
-
.gdpr-breadcrumbs_unit:last-child .gdpr-breadcrumbs_item {
|
538 |
-
padding-left: 0;
|
539 |
-
}
|
540 |
-
|
541 |
-
@media (min-width: 576px) {
|
542 |
-
.gdpr-breadcrumbs_unit {
|
543 |
-
width: 25%;
|
544 |
-
}
|
545 |
-
|
546 |
-
.gdpr-breadcrumbs_unit:nth-child(3),
|
547 |
-
.gdpr-breadcrumbs_unit:nth-child(4) {
|
548 |
-
margin-top: 0;
|
549 |
-
}
|
550 |
-
}
|
1 |
+
.gdpr-installer-container {
|
2 |
+
max-width: 720px;
|
3 |
+
margin: 30px auto;
|
4 |
+
font-size: 14px;
|
5 |
+
}
|
6 |
+
|
7 |
+
.gdpr-step-button-prev {
|
8 |
+
display: block;
|
9 |
+
float: left;
|
10 |
+
}
|
11 |
+
|
12 |
+
.gdpr-step-button-next {
|
13 |
+
display: block;
|
14 |
+
float: right;
|
15 |
+
}
|
16 |
+
|
17 |
+
.gdpr-header {
|
18 |
+
margin: 0 auto 30px;
|
19 |
+
overflow: hidden;
|
20 |
+
padding: 0 16px;
|
21 |
+
text-align: center;
|
22 |
+
}
|
23 |
+
|
24 |
+
.gdpr-header_left {
|
25 |
+
float: left;
|
26 |
+
width: 100%;
|
27 |
+
}
|
28 |
+
|
29 |
+
.gdpr-header_right {
|
30 |
+
float: left;
|
31 |
+
width: 100%;
|
32 |
+
}
|
33 |
+
|
34 |
+
@media (min-width: 576px) {
|
35 |
+
.gdpr-header {
|
36 |
+
text-align: left;
|
37 |
+
}
|
38 |
+
|
39 |
+
.gdpr-header_left {
|
40 |
+
width: 175px;
|
41 |
+
padding-right: 15px;
|
42 |
+
padding-top: 25px;
|
43 |
+
}
|
44 |
+
|
45 |
+
.gdpr-header_right {
|
46 |
+
width: calc(100% - 235px);
|
47 |
+
}
|
48 |
+
}
|
49 |
+
|
50 |
+
@media (min-width: 768px) {
|
51 |
+
.gdpr-header {
|
52 |
+
padding: 0;
|
53 |
+
}
|
54 |
+
}
|
55 |
+
|
56 |
+
.gdpr-logo {
|
57 |
+
width: 100px;
|
58 |
+
}
|
59 |
+
|
60 |
+
.gdpr-header h1 {
|
61 |
+
font-size: 1.8em;
|
62 |
+
line-height: normal;
|
63 |
+
margin-top: 15px;
|
64 |
+
margin-bottom: 20px;
|
65 |
+
font-weight: 700;
|
66 |
+
}
|
67 |
+
|
68 |
+
.gdpr-header h2 {
|
69 |
+
float: left;
|
70 |
+
}
|
71 |
+
|
72 |
+
.gdpr-installer .gdpr-content {
|
73 |
+
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .13);
|
74 |
+
box-shadow: 0 1px 3px rgba(0, 0, 0, .13);
|
75 |
+
padding: 16px;
|
76 |
+
margin: 0 0 20px;
|
77 |
+
background: #fff;
|
78 |
+
overflow: hidden;
|
79 |
+
zoom: 1;
|
80 |
+
}
|
81 |
+
|
82 |
+
.gdpr-installer .spacer {
|
83 |
+
margin-top: 2em;
|
84 |
+
}
|
85 |
+
|
86 |
+
.gdpr-installer .gdpr-content p {
|
87 |
+
font-size: 14px;
|
88 |
+
line-height: 26px;
|
89 |
+
color: #555;
|
90 |
+
}
|
91 |
+
|
92 |
+
.gdpr-installer .gdpr-content p:last-child {
|
93 |
+
margin-bottom: 0;
|
94 |
+
}
|
95 |
+
|
96 |
+
.gdpr-content a {
|
97 |
+
color: #0095a7;
|
98 |
+
font-weight: 700;
|
99 |
+
text-decoration: none;
|
100 |
+
box-shadow: none;
|
101 |
+
}
|
102 |
+
|
103 |
+
.gdpr-content a:hover,
|
104 |
+
.gdpr-content a:focus {
|
105 |
+
outline: none;
|
106 |
+
text-decoration: none;
|
107 |
+
color: #000;
|
108 |
+
}
|
109 |
+
|
110 |
+
.gdpr-installer .gdpr-content li {
|
111 |
+
margin-left: 20px;
|
112 |
+
list-style-type: disc;
|
113 |
+
}
|
114 |
+
|
115 |
+
.gdpr-installer .gdpr-content select {
|
116 |
+
height: 32px;
|
117 |
+
border-color: #ddd;
|
118 |
+
background-color: #fff;
|
119 |
+
border: 1px solid #aaa;
|
120 |
+
border-radius: 4px;
|
121 |
+
box-sizing: border-box;
|
122 |
+
cursor: pointer;
|
123 |
+
display: block;
|
124 |
+
padding: 0 6px;
|
125 |
+
color: #666;
|
126 |
+
}
|
127 |
+
|
128 |
+
.select2-container .select2-selection--single {
|
129 |
+
height: 32px !important;
|
130 |
+
}
|
131 |
+
|
132 |
+
.gdpr-installer .gdpr-content h1 {
|
133 |
+
font-weight: 700;
|
134 |
+
line-height: normal;
|
135 |
+
}
|
136 |
+
|
137 |
+
.gdpr-installer .gdpr-content h2 {
|
138 |
+
font-size: 22px;
|
139 |
+
line-height: 32px;
|
140 |
+
font-weight: 700;
|
141 |
+
}
|
142 |
+
|
143 |
+
.gdpr-installer .gdpr-content h3 {
|
144 |
+
font-size: 18px;
|
145 |
+
line-height: 22px;
|
146 |
+
font-weight: 700;
|
147 |
+
}
|
148 |
+
|
149 |
+
.wp-core-ui .button {
|
150 |
+
font-size: 14px;
|
151 |
+
line-height: 28px;
|
152 |
+
padding: 4px 15px;
|
153 |
+
height: auto;
|
154 |
+
border: 1px solid #ccc;
|
155 |
+
box-shadow: 0 1px 0 #ccc;
|
156 |
+
-webkit-box-shadow: 0 1px 1px #ccc;
|
157 |
+
transition: .1s;
|
158 |
+
}
|
159 |
+
|
160 |
+
.wp-core-ui .button:hover {
|
161 |
+
box-shadow: 0 1px 1px #ccc;
|
162 |
+
-webkit-box-shadow: 0 1px 1px #ccc;
|
163 |
+
border: 1px solid #ccc;
|
164 |
+
background: #fff;
|
165 |
+
}
|
166 |
+
|
167 |
+
.wp-core-ui .button:focus {
|
168 |
+
box-shadow: 0 0 2px 1px #5b9cd9;
|
169 |
+
}
|
170 |
+
|
171 |
+
.wp-core-ui .button-gdpr {
|
172 |
+
background: #0095a8;
|
173 |
+
border-color: #0095a8;
|
174 |
+
-webkit-box-shadow: 0 1px 1px #ccc;
|
175 |
+
box-shadow: 0 1px 1px #ccc;
|
176 |
+
color: #fff;
|
177 |
+
text-decoration: none;
|
178 |
+
transition: .1s;
|
179 |
+
}
|
180 |
+
|
181 |
+
.wp-core-ui .button-gdpr:hover {
|
182 |
+
background: #79c2cb;
|
183 |
+
border-color: #79c2cb;
|
184 |
+
color: #fff;
|
185 |
+
}
|
186 |
+
|
187 |
+
.wp-core-ui .button-gdpr:active,
|
188 |
+
.wp-core-ui .button-gdpr:focus {
|
189 |
+
background: #0095a8;
|
190 |
+
border-color: #ccc;
|
191 |
+
color: #fff;
|
192 |
+
box-shadow: 0 0 2px 1px #5b9cd9;
|
193 |
+
}
|
194 |
+
|
195 |
+
.wp-core-ui .button-primary {
|
196 |
+
background-color: #ffa200;
|
197 |
+
border-color: #ffa200;
|
198 |
+
color: #fff;
|
199 |
+
text-shadow: none;
|
200 |
+
-webkit-box-shadow: 0 1px 1px #ccc;
|
201 |
+
box-shadow: 0 1px 1px #ccc;
|
202 |
+
}
|
203 |
+
|
204 |
+
.wp-core-ui .button-primary:hover {
|
205 |
+
background: #ffc35c;
|
206 |
+
border-color: #ffc35c;
|
207 |
+
color: #fff;
|
208 |
+
}
|
209 |
+
|
210 |
+
.wp-core-ui .button-primary:active,
|
211 |
+
.wp-core-ui .button-primary:focus {
|
212 |
+
background-color: #ffa200;
|
213 |
+
border-color: #ccc;
|
214 |
+
color: #fff;
|
215 |
+
box-shadow: 0 0 2px 1px #5b9cd9;
|
216 |
+
}
|
217 |
+
|
218 |
+
.wp-core-ui.gdpr-installer .button-right {
|
219 |
+
float: right;
|
220 |
+
}
|
221 |
+
|
222 |
+
.wp-core-ui .button.button-gdpr-large {
|
223 |
+
font-size: 14px;
|
224 |
+
padding: 4px 15px;
|
225 |
+
height: auto;
|
226 |
+
}
|
227 |
+
|
228 |
+
.gdpr-footer-links {
|
229 |
+
text-align: center;
|
230 |
+
}
|
231 |
+
|
232 |
+
.wp-core-ui .button-center {
|
233 |
+
display: block;
|
234 |
+
margin: 25px auto 10px;
|
235 |
+
}
|
236 |
+
|
237 |
+
.gdpr-installer label {
|
238 |
+
color: #666;
|
239 |
+
font-size: 14px;
|
240 |
+
font-weight: 500;
|
241 |
+
margin-bottom: .5em;
|
242 |
+
margin-top: 1em;
|
243 |
+
display: block;
|
244 |
+
cursor: pointer;
|
245 |
+
}
|
246 |
+
|
247 |
+
.gdpr-installer input[type=text],
|
248 |
+
.gdpr-installer input[type=email] {
|
249 |
+
border: 1px solid #aaa;
|
250 |
+
border-color: #ddd;
|
251 |
+
border-radius: 4px;
|
252 |
+
height: 30px;
|
253 |
+
width: calc(100% - 8px - 24px - 2px);
|
254 |
+
padding-left: 8px;
|
255 |
+
padding-right: 24px;
|
256 |
+
color: #444;
|
257 |
+
background-color: #fff;
|
258 |
+
display: inline-block;
|
259 |
+
}
|
260 |
+
|
261 |
+
.gdpr-installer input + em {
|
262 |
+
display: block;
|
263 |
+
margin-top: 5px;
|
264 |
+
}
|
265 |
+
|
266 |
+
.gdpr-installer .select2 + em {
|
267 |
+
display: block;
|
268 |
+
margin-top: 5px;
|
269 |
+
}
|
270 |
+
|
271 |
+
.gdpr-installer textarea {
|
272 |
+
width: calc(100% - 8px - 24px - 2px);
|
273 |
+
height: 80px;
|
274 |
+
}
|
275 |
+
|
276 |
+
.gdpr-installer .select2-container {
|
277 |
+
display: block;
|
278 |
+
width: 300px;
|
279 |
+
max-width: 100%;
|
280 |
+
}
|
281 |
+
|
282 |
+
.gdpr-select {
|
283 |
+
width: 300px;
|
284 |
+
max-width: 100%;
|
285 |
+
}
|
286 |
+
|
287 |
+
.hidden {
|
288 |
+
display: none;
|
289 |
+
}
|
290 |
+
|
291 |
+
.gdpr-installer fieldset {
|
292 |
+
margin: -20px 0 0 0;
|
293 |
+
}
|
294 |
+
|
295 |
+
.wp-core-ui .button-side {
|
296 |
+
min-width: 220px;
|
297 |
+
text-align: center;
|
298 |
+
margin-right: 15px;
|
299 |
+
}
|
300 |
+
|
301 |
+
.align-center {
|
302 |
+
text-align: center;
|
303 |
+
}
|
304 |
+
|
305 |
+
.section {
|
306 |
+
margin: 25px 0;
|
307 |
+
}
|
308 |
+
|
309 |
+
.row {
|
310 |
+
box-sizing: border-box;
|
311 |
+
display: -webkit-box;
|
312 |
+
display: -ms-flexbox;
|
313 |
+
display: flex;
|
314 |
+
-ms-flex-wrap: wrap;
|
315 |
+
flex-wrap: wrap;
|
316 |
+
margin-right: -8px;
|
317 |
+
margin-left: -8px;
|
318 |
+
-webkit-box-pack: center !important;
|
319 |
+
-ms-flex-pack: center !important;
|
320 |
+
justify-content: center !important;
|
321 |
+
}
|
322 |
+
|
323 |
+
.col {
|
324 |
+
box-sizing: border-box;
|
325 |
+
position: relative;
|
326 |
+
width: 100%;
|
327 |
+
min-height: 1px;
|
328 |
+
padding-right: 8px;
|
329 |
+
padding-left: 8px;
|
330 |
+
margin-bottom: 15px;
|
331 |
+
}
|
332 |
+
|
333 |
+
@media (min-width: 576px) {
|
334 |
+
.col {
|
335 |
+
-webkit-box-flex: 0;
|
336 |
+
-ms-flex: 0 0 50%;
|
337 |
+
flex: 0 0 50%;
|
338 |
+
max-width: 50%;
|
339 |
+
}
|
340 |
+
}
|
341 |
+
|
342 |
+
@media (min-width: 768px) {
|
343 |
+
.col {
|
344 |
+
-webkit-box-flex: 0;
|
345 |
+
-ms-flex: 0 0 33.33333%;
|
346 |
+
flex: 0 0 33.33333%;
|
347 |
+
max-width: 33.33333%;
|
348 |
+
}
|
349 |
+
}
|
350 |
+
|
351 |
+
.wp-core-ui .col .button {
|
352 |
+
display: block;
|
353 |
+
text-align: center;
|
354 |
+
}
|
355 |
+
|
356 |
+
.col_image {
|
357 |
+
background-position: center;
|
358 |
+
background-repeat: no-repeat;
|
359 |
+
background-size: cover;
|
360 |
+
border-radius: 6px;
|
361 |
+
background-color: #e5e5e5;
|
362 |
+
padding-bottom: 60%;
|
363 |
+
margin-bottom: 15px;
|
364 |
+
position: relative;
|
365 |
+
}
|
366 |
+
|
367 |
+
.col_image:after {
|
368 |
+
content: '';
|
369 |
+
position: absolute;
|
370 |
+
top: 0;
|
371 |
+
left: 0;
|
372 |
+
width: 100%;
|
373 |
+
height: 100%;
|
374 |
+
background-color: #ffa200;
|
375 |
+
opacity: .15;
|
376 |
+
}
|
377 |
+
|
378 |
+
/* jQuery UI hacks */
|
379 |
+
.ui-tabs {
|
380 |
+
position: relative;
|
381 |
+
padding: .2em;
|
382 |
+
}
|
383 |
+
|
384 |
+
.ui-tabs-nav {
|
385 |
+
margin: 0;
|
386 |
+
padding: .2em .2em 0;
|
387 |
+
}
|
388 |
+
|
389 |
+
.ui-helper-clearfix {
|
390 |
+
min-height: 0;
|
391 |
+
}
|
392 |
+
|
393 |
+
.ui-helper-reset {
|
394 |
+
margin: 0;
|
395 |
+
padding: 0;
|
396 |
+
border: 0;
|
397 |
+
outline: 0;
|
398 |
+
line-height: 1.3;
|
399 |
+
text-decoration: none;
|
400 |
+
font-size: 100%;
|
401 |
+
list-style: none;
|
402 |
+
}
|
403 |
+
|
404 |
+
.ui-helper-clearfix:before, .ui-helper-clearfix:after {
|
405 |
+
content: "";
|
406 |
+
display: table;
|
407 |
+
border-collapse: collapse;
|
408 |
+
}
|
409 |
+
|
410 |
+
.ui-helper-clearfix:after {
|
411 |
+
clear: both;
|
412 |
+
}
|
413 |
+
|
414 |
+
.ui-tabs .ui-tabs-nav li {
|
415 |
+
list-style: none;
|
416 |
+
float: left;
|
417 |
+
position: relative;
|
418 |
+
top: 0;
|
419 |
+
margin: 1px .2em 0 0;
|
420 |
+
border-bottom-width: 0;
|
421 |
+
padding: 0;
|
422 |
+
white-space: nowrap;
|
423 |
+
background: #eee;
|
424 |
+
}
|
425 |
+
|
426 |
+
.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
|
427 |
+
float: left;
|
428 |
+
padding: .5em 1em;
|
429 |
+
text-decoration: none;
|
430 |
+
}
|
431 |
+
|
432 |
+
.ui-tabs .ui-tabs-nav li.ui-tabs-active {
|
433 |
+
background: #fff;
|
434 |
+
}
|
435 |
+
|
436 |
+
.handle {
|
437 |
+
cursor: move;
|
438 |
+
}
|
439 |
+
|
440 |
+
.gdpr-table {
|
441 |
+
width: 100%;
|
442 |
+
}
|
443 |
+
|
444 |
+
.gdpr-footer-links {
|
445 |
+
padding-bottom: 50px;
|
446 |
+
}
|
447 |
+
|
448 |
+
.slidePadding {
|
449 |
+
display: block;
|
450 |
+
padding-top: 1px;
|
451 |
+
padding-bottom: 1px;
|
452 |
+
}
|
453 |
+
|
454 |
+
.gdpr-installer p.error {
|
455 |
+
font-size: 16px;
|
456 |
+
font-weight: 700;
|
457 |
+
color: #e34639;
|
458 |
+
}
|
459 |
+
|
460 |
+
/* gdpr-breadcrumbs */
|
461 |
+
.gdpr-breadcrumbs {
|
462 |
+
margin-bottom: 22px;
|
463 |
+
}
|
464 |
+
|
465 |
+
.gdpr-breadcrumbs:after {
|
466 |
+
display: block;
|
467 |
+
clear: both;
|
468 |
+
content: '';
|
469 |
+
}
|
470 |
+
|
471 |
+
.gdpr-breadcrumbs_unit {
|
472 |
+
box-sizing: border-box;
|
473 |
+
float: left;
|
474 |
+
width: 50%;
|
475 |
+
font-size: 14px;
|
476 |
+
line-height: 26px;
|
477 |
+
padding-right: 15px;
|
478 |
+
}
|
479 |
+
|
480 |
+
.gdpr-breadcrumbs_unit:nth-child(3),
|
481 |
+
.gdpr-breadcrumbs_unit:nth-child(4) {
|
482 |
+
margin-top: 10px;
|
483 |
+
}
|
484 |
+
|
485 |
+
.gdpr-breadcrumbs_item {
|
486 |
+
background-color: #dddddd;
|
487 |
+
padding: 2px 0;
|
488 |
+
text-align: center;
|
489 |
+
position: relative;
|
490 |
+
color: #555555;
|
491 |
+
padding-left: 8px;
|
492 |
+
}
|
493 |
+
|
494 |
+
.gdpr-breadcrumbs_item:after {
|
495 |
+
position: absolute;
|
496 |
+
right: -15px;
|
497 |
+
top: 0;
|
498 |
+
content: '';
|
499 |
+
width: 0;
|
500 |
+
height: 0;
|
501 |
+
border-style: solid;
|
502 |
+
border-width: 15px 0 15px 15px;
|
503 |
+
border-color: transparent transparent transparent #dddddd;
|
504 |
+
}
|
505 |
+
|
506 |
+
.gdpr-breadcrumbs_item:before {
|
507 |
+
position: absolute;
|
508 |
+
left: 0;
|
509 |
+
top: 0;
|
510 |
+
content: '';
|
511 |
+
width: 0;
|
512 |
+
height: 0;
|
513 |
+
border-style: solid;
|
514 |
+
border-width: 15px 0 15px 15px;
|
515 |
+
border-color: transparent transparent transparent #f1f1f1;
|
516 |
+
}
|
517 |
+
|
518 |
+
.gdpr-breadcrumbs_unit.active .gdpr-breadcrumbs_item {
|
519 |
+
background-color: #0095a8;
|
520 |
+
color: #fff;
|
521 |
+
font-weight: 700;
|
522 |
+
}
|
523 |
+
|
524 |
+
.gdpr-breadcrumbs_unit.active .gdpr-breadcrumbs_item:after {
|
525 |
+
border-color: transparent transparent transparent #0095a8;
|
526 |
+
}
|
527 |
+
|
528 |
+
.gdpr-breadcrumbs_unit:first-child .gdpr-breadcrumbs_item:before,
|
529 |
+
.gdpr-breadcrumbs_unit:last-child .gdpr-breadcrumbs_item:after {
|
530 |
+
display: none;
|
531 |
+
}
|
532 |
+
|
533 |
+
.gdpr-breadcrumbs_unit:last-child {
|
534 |
+
padding: 0;
|
535 |
+
}
|
536 |
+
|
537 |
+
.gdpr-breadcrumbs_unit:last-child .gdpr-breadcrumbs_item {
|
538 |
+
padding-left: 0;
|
539 |
+
}
|
540 |
+
|
541 |
+
@media (min-width: 576px) {
|
542 |
+
.gdpr-breadcrumbs_unit {
|
543 |
+
width: 25%;
|
544 |
+
}
|
545 |
+
|
546 |
+
.gdpr-breadcrumbs_unit:nth-child(3),
|
547 |
+
.gdpr-breadcrumbs_unit:nth-child(4) {
|
548 |
+
margin-top: 0;
|
549 |
+
}
|
550 |
+
}
|
assets/gdpr-installer.js
CHANGED
@@ -1,58 +1,58 @@
|
|
1 |
-
jQuery(function ($) {
|
2 |
-
|
3 |
-
/**
|
4 |
-
* Init select2
|
5 |
-
*/
|
6 |
-
$('.js-gdpr-select2').select2({
|
7 |
-
width: 'style'
|
8 |
-
});
|
9 |
-
|
10 |
-
$('#tabs').tabs();
|
11 |
-
|
12 |
-
$(".sortable").sortable();
|
13 |
-
|
14 |
-
/**
|
15 |
-
* https://github.com/DubFriend/jquery.repeater
|
16 |
-
*/
|
17 |
-
$repeater = $('.js-gdpr-repeater');
|
18 |
-
if ($repeater.length) {
|
19 |
-
$repeater.repeater({
|
20 |
-
ready: function (setIndexes) {
|
21 |
-
$(".sortable").on('sortupdate', setIndexes);
|
22 |
-
}
|
23 |
-
});
|
24 |
-
|
25 |
-
if (typeof window.gdprConsentTypes !== undefined) {
|
26 |
-
$repeater.setList(window.gdprConsentTypes);
|
27 |
-
}
|
28 |
-
}
|
29 |
-
|
30 |
-
/**
|
31 |
-
* Auto-fill DPA info
|
32 |
-
*/
|
33 |
-
$('.js-gdpr-country-selector').on('change', function () {
|
34 |
-
var dpaData, $website, $email, $phone;
|
35 |
-
var countryCode = $(this).val();
|
36 |
-
|
37 |
-
if (!window.gdprDpaData[countryCode]) {
|
38 |
-
return;
|
39 |
-
}
|
40 |
-
|
41 |
-
dpaData = window.gdprDpaData[countryCode];
|
42 |
-
|
43 |
-
$website = $('#gdpr_dpa_website');
|
44 |
-
if ('' === $website.data('set')) {
|
45 |
-
$website.val(dpaData['website']);
|
46 |
-
}
|
47 |
-
|
48 |
-
$email = $('#gdpr_dpa_email');
|
49 |
-
if ('' === $email.data('set')) {
|
50 |
-
$email.val(dpaData['email']);
|
51 |
-
}
|
52 |
-
|
53 |
-
$phone = $('#gdpr_dpa_phone');
|
54 |
-
if ('' === $phone.data('set')) {
|
55 |
-
$phone.val(dpaData['phone']);
|
56 |
-
}
|
57 |
-
});
|
58 |
-
});
|
1 |
+
jQuery(function ($) {
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Init select2
|
5 |
+
*/
|
6 |
+
$('.js-gdpr-select2').select2({
|
7 |
+
width: 'style'
|
8 |
+
});
|
9 |
+
|
10 |
+
$('#tabs').tabs();
|
11 |
+
|
12 |
+
$(".sortable").sortable();
|
13 |
+
|
14 |
+
/**
|
15 |
+
* https://github.com/DubFriend/jquery.repeater
|
16 |
+
*/
|
17 |
+
$repeater = $('.js-gdpr-repeater');
|
18 |
+
if ($repeater.length) {
|
19 |
+
$repeater.repeater({
|
20 |
+
ready: function (setIndexes) {
|
21 |
+
$(".sortable").on('sortupdate', setIndexes);
|
22 |
+
}
|
23 |
+
});
|
24 |
+
|
25 |
+
if (typeof window.gdprConsentTypes !== undefined) {
|
26 |
+
$repeater.setList(window.gdprConsentTypes);
|
27 |
+
}
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Auto-fill DPA info
|
32 |
+
*/
|
33 |
+
$('.js-gdpr-country-selector').on('change', function () {
|
34 |
+
var dpaData, $website, $email, $phone;
|
35 |
+
var countryCode = $(this).val();
|
36 |
+
|
37 |
+
if (!window.gdprDpaData[countryCode]) {
|
38 |
+
return;
|
39 |
+
}
|
40 |
+
|
41 |
+
dpaData = window.gdprDpaData[countryCode];
|
42 |
+
|
43 |
+
$website = $('#gdpr_dpa_website');
|
44 |
+
if ('' === $website.data('set')) {
|
45 |
+
$website.val(dpaData['website']);
|
46 |
+
}
|
47 |
+
|
48 |
+
$email = $('#gdpr_dpa_email');
|
49 |
+
if ('' === $email.data('set')) {
|
50 |
+
$email.val(dpaData['email']);
|
51 |
+
}
|
52 |
+
|
53 |
+
$phone = $('#gdpr_dpa_phone');
|
54 |
+
if ('' === $phone.data('set')) {
|
55 |
+
$phone.val(dpaData['phone']);
|
56 |
+
}
|
57 |
+
});
|
58 |
+
});
|
assets/gdpr-rhino.svg
CHANGED
@@ -1,42 +1,42 @@
|
|
1 |
-
<?xml version="1.0" encoding="utf-8"?>
|
2 |
-
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
-
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
4 |
-
viewBox="0 0 200 184.16" enable-background="new 0 0 200 184.16" xml:space="preserve">
|
5 |
-
<path fill="#0095A8" d="M68.231,30.327l0.963,0.557l0.48-1.003c2.165-4.529,7.729-7.769,16.538-9.631
|
6 |
-
c7.685-1.624,14.921-1.569,15.224-1.572l2.189,0.018l-0.753,2.055c-0.159,0.435-3.964,10.733-9.364,18.982l-0.795,1.215l1.41,0.346
|
7 |
-
c0.189,0.047,10.648,2.551,24.498,2.551c11.416,0,25.137-1.703,37.298-7.886l0.839-0.427l-0.351-0.874
|
8 |
-
c-2.805-6.968-9.737-13.46-20.045-18.775h-0.001c-14.728-7.591-34.4-11.771-55.393-11.771c-14.106,0-27.88,1.921-39.835,5.555
|
9 |
-
l-1.864,0.567l1.519,1.219C49.318,18.297,59.321,25.176,68.231,30.327z"/>
|
10 |
-
<path fill="#0095A8" d="M43.688,144.994l-0.763,0.659l0.643,0.775c10.468,12.634,22.864,23.576,36.845,32.524l0.554,0.354
|
11 |
-
l0.554-0.355c16.89-10.809,31.363-24.421,43.019-40.458c1.847-2.542,3.687-5.243,5.467-8.029l0.694-1.086l-1.213-0.436
|
12 |
-
C88.19,114.118,58.004,132.637,43.688,144.994z"/>
|
13 |
-
<path fill="#FFA200" d="M188.447,29.518l-1.785-4.136l-0.187,4.501c-0.127,3.055-0.367,6.079-0.714,8.99
|
14 |
-
c-1.792,15.057-6.219,26.337-13.159,33.528c-6.032,6.251-13.877,9.226-23.271,8.822c-0.952-0.064-9.353-0.788-11.247-6.271
|
15 |
-
c-1.457-4.214,1.406-9.483,8.753-16.11c9.307-8.394,15.282-16.207,18.266-23.883l1.416-3.641l-3.025,2.472
|
16 |
-
c-6.804,5.562-18.86,12.356-37.652,13.132c-6.599,0.268-23.328,0.448-36.131-3.678l-2.078-0.67l1.326-1.734
|
17 |
-
c4.231-5.538,7.811-13.361,9.568-17.531l0.643-1.526l-1.653,0.1c-5.844,0.354-23.189,1.406-25.986,13.83l-2.015-1.114
|
18 |
-
c-15.573-8.61-28.39-18.81-33.177-22.796l-0.457-0.381l-0.558,0.207c-3.508,1.298-6.787,2.73-9.748,4.256
|
19 |
-
c-13.84,7.135-21.463,16.3-21.463,25.808c0,0.228,0.113,23.103,9.867,51.417c5.736,16.65,13.638,31.952,23.486,45.481
|
20 |
-
c0.835,1.147,1.745,2.354,2.863,3.798l0.663,0.856l0.821-0.706c17.757-15.277,55.164-36.702,106.178-8.553l0.483,0.266l0.489-0.255
|
21 |
-
c5.617-2.93,34.134-19.045,43.894-48.605C198.522,68.234,197.038,49.436,188.447,29.518z"/>
|
22 |
-
<circle fill="#1F1F1F" cx="113.832" cy="74.693" r="5.619"/>
|
23 |
-
<path fill="#1F1F1F" d="M185.298,21.712c-1.757,8.569-3.513,36.397-15.654,47.833c-5.179,5.366-11.962,7.914-20.098,7.571
|
24 |
-
c-2.04-0.14-6.484-0.559-7.574-3.508c-0.384-1.11-0.409-4.47,7.621-11.712c0,0,22.418-17.262,17.92-35.129
|
25 |
-
c-2.391,2.179-4.928,4.074-7.563,5.728c-3.331-7.659-10.772-14.631-21.704-20.267C122.947,4.343,102.606,0,80.968,0
|
26 |
-
C59.33,0,38.99,4.343,23.691,12.229C8.413,20.105,0,30.568,0,41.692c0,0.235,0.115,23.8,10.092,52.757
|
27 |
-
c5.868,17.037,13.96,32.703,24.048,46.562c12.275,16.862,27.571,31.093,45.463,42.295l1.365,0.854l1.365-0.854
|
28 |
-
c17.929-11.228,33.25-25.491,45.536-42.396c2.123-2.92,4.186-5.982,6.158-9.109c4.267,1.772,8.645,3.896,13.135,6.43l1.151,0.65
|
29 |
-
l1.198-0.557c1.456-0.678,35.789-16.997,47.239-51.598C203.77,65.507,199.18,34.458,185.298,21.712z M135.89,16.798
|
30 |
-
c10.121,5.219,16.848,11.504,19.563,18.245c-26.884,13.67-61.084,5.254-61.084,5.254c5.462-8.345,9.289-18.701,9.468-19.191
|
31 |
-
l1.255-3.425l-3.648-0.03c-0.313-0.003-7.702-0.043-15.445,1.594c-9.158,1.936-14.94,5.356-17.253,10.194
|
32 |
-
c-9.919-5.735-19.809-12.765-27.313-18.785c11.811-3.591,25.364-5.511,39.535-5.511C101.802,5.141,121.306,9.282,135.89,16.798z
|
33 |
-
M123.709,137.888c-11.584,15.938-25.959,29.456-42.741,40.197c-13.937-8.919-26.209-19.762-36.608-32.313
|
34 |
-
c14.376-12.409,44.108-30.461,84.781-15.862C127.393,132.646,125.574,135.323,123.709,137.888z M191.881,85.069
|
35 |
-
c-9.592,29.05-37.389,44.883-43.393,48.015c-51.928-28.655-90.002-6.247-107.345,8.674c-0.964-1.244-1.917-2.498-2.845-3.774
|
36 |
-
c-9.788-13.445-17.643-28.657-23.345-45.211C5.278,64.692,5.141,41.918,5.141,41.692c0-9.103,7.424-17.944,20.905-24.894
|
37 |
-
c3.009-1.55,6.238-2.949,9.634-4.206c8.144,6.78,20.398,15.752,33.337,22.906l3.278,1.813c1.478-11.925,16.557-13.873,25.283-14.402
|
38 |
-
c-1.852,4.394-5.332,11.933-9.437,17.306l-2.209,2.891l3.463,1.117c12.994,4.186,29.847,3.997,36.488,3.727
|
39 |
-
c19.412-0.801,31.493-7.83,38.261-13.363c-2.078,5.345-6.463,13.09-17.996,23.492c-7.687,6.934-10.642,12.563-9.036,17.21
|
40 |
-
c2.111,6.105,11.069,6.888,12.15,6.961c9.72,0.41,17.836-2.664,24.08-9.134c7.099-7.356,11.62-18.836,13.44-34.12
|
41 |
-
c0.389-3.264,0.607-6.338,0.72-9.069C195.997,49.619,197.475,68.127,191.881,85.069z"/>
|
42 |
-
</svg>
|
1 |
+
<?xml version="1.0" encoding="utf-8"?>
|
2 |
+
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
+
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
4 |
+
viewBox="0 0 200 184.16" enable-background="new 0 0 200 184.16" xml:space="preserve">
|
5 |
+
<path fill="#0095A8" d="M68.231,30.327l0.963,0.557l0.48-1.003c2.165-4.529,7.729-7.769,16.538-9.631
|
6 |
+
c7.685-1.624,14.921-1.569,15.224-1.572l2.189,0.018l-0.753,2.055c-0.159,0.435-3.964,10.733-9.364,18.982l-0.795,1.215l1.41,0.346
|
7 |
+
c0.189,0.047,10.648,2.551,24.498,2.551c11.416,0,25.137-1.703,37.298-7.886l0.839-0.427l-0.351-0.874
|
8 |
+
c-2.805-6.968-9.737-13.46-20.045-18.775h-0.001c-14.728-7.591-34.4-11.771-55.393-11.771c-14.106,0-27.88,1.921-39.835,5.555
|
9 |
+
l-1.864,0.567l1.519,1.219C49.318,18.297,59.321,25.176,68.231,30.327z"/>
|
10 |
+
<path fill="#0095A8" d="M43.688,144.994l-0.763,0.659l0.643,0.775c10.468,12.634,22.864,23.576,36.845,32.524l0.554,0.354
|
11 |
+
l0.554-0.355c16.89-10.809,31.363-24.421,43.019-40.458c1.847-2.542,3.687-5.243,5.467-8.029l0.694-1.086l-1.213-0.436
|
12 |
+
C88.19,114.118,58.004,132.637,43.688,144.994z"/>
|
13 |
+
<path fill="#FFA200" d="M188.447,29.518l-1.785-4.136l-0.187,4.501c-0.127,3.055-0.367,6.079-0.714,8.99
|
14 |
+
c-1.792,15.057-6.219,26.337-13.159,33.528c-6.032,6.251-13.877,9.226-23.271,8.822c-0.952-0.064-9.353-0.788-11.247-6.271
|
15 |
+
c-1.457-4.214,1.406-9.483,8.753-16.11c9.307-8.394,15.282-16.207,18.266-23.883l1.416-3.641l-3.025,2.472
|
16 |
+
c-6.804,5.562-18.86,12.356-37.652,13.132c-6.599,0.268-23.328,0.448-36.131-3.678l-2.078-0.67l1.326-1.734
|
17 |
+
c4.231-5.538,7.811-13.361,9.568-17.531l0.643-1.526l-1.653,0.1c-5.844,0.354-23.189,1.406-25.986,13.83l-2.015-1.114
|
18 |
+
c-15.573-8.61-28.39-18.81-33.177-22.796l-0.457-0.381l-0.558,0.207c-3.508,1.298-6.787,2.73-9.748,4.256
|
19 |
+
c-13.84,7.135-21.463,16.3-21.463,25.808c0,0.228,0.113,23.103,9.867,51.417c5.736,16.65,13.638,31.952,23.486,45.481
|
20 |
+
c0.835,1.147,1.745,2.354,2.863,3.798l0.663,0.856l0.821-0.706c17.757-15.277,55.164-36.702,106.178-8.553l0.483,0.266l0.489-0.255
|
21 |
+
c5.617-2.93,34.134-19.045,43.894-48.605C198.522,68.234,197.038,49.436,188.447,29.518z"/>
|
22 |
+
<circle fill="#1F1F1F" cx="113.832" cy="74.693" r="5.619"/>
|
23 |
+
<path fill="#1F1F1F" d="M185.298,21.712c-1.757,8.569-3.513,36.397-15.654,47.833c-5.179,5.366-11.962,7.914-20.098,7.571
|
24 |
+
c-2.04-0.14-6.484-0.559-7.574-3.508c-0.384-1.11-0.409-4.47,7.621-11.712c0,0,22.418-17.262,17.92-35.129
|
25 |
+
c-2.391,2.179-4.928,4.074-7.563,5.728c-3.331-7.659-10.772-14.631-21.704-20.267C122.947,4.343,102.606,0,80.968,0
|
26 |
+
C59.33,0,38.99,4.343,23.691,12.229C8.413,20.105,0,30.568,0,41.692c0,0.235,0.115,23.8,10.092,52.757
|
27 |
+
c5.868,17.037,13.96,32.703,24.048,46.562c12.275,16.862,27.571,31.093,45.463,42.295l1.365,0.854l1.365-0.854
|
28 |
+
c17.929-11.228,33.25-25.491,45.536-42.396c2.123-2.92,4.186-5.982,6.158-9.109c4.267,1.772,8.645,3.896,13.135,6.43l1.151,0.65
|
29 |
+
l1.198-0.557c1.456-0.678,35.789-16.997,47.239-51.598C203.77,65.507,199.18,34.458,185.298,21.712z M135.89,16.798
|
30 |
+
c10.121,5.219,16.848,11.504,19.563,18.245c-26.884,13.67-61.084,5.254-61.084,5.254c5.462-8.345,9.289-18.701,9.468-19.191
|
31 |
+
l1.255-3.425l-3.648-0.03c-0.313-0.003-7.702-0.043-15.445,1.594c-9.158,1.936-14.94,5.356-17.253,10.194
|
32 |
+
c-9.919-5.735-19.809-12.765-27.313-18.785c11.811-3.591,25.364-5.511,39.535-5.511C101.802,5.141,121.306,9.282,135.89,16.798z
|
33 |
+
M123.709,137.888c-11.584,15.938-25.959,29.456-42.741,40.197c-13.937-8.919-26.209-19.762-36.608-32.313
|
34 |
+
c14.376-12.409,44.108-30.461,84.781-15.862C127.393,132.646,125.574,135.323,123.709,137.888z M191.881,85.069
|
35 |
+
c-9.592,29.05-37.389,44.883-43.393,48.015c-51.928-28.655-90.002-6.247-107.345,8.674c-0.964-1.244-1.917-2.498-2.845-3.774
|
36 |
+
c-9.788-13.445-17.643-28.657-23.345-45.211C5.278,64.692,5.141,41.918,5.141,41.692c0-9.103,7.424-17.944,20.905-24.894
|
37 |
+
c3.009-1.55,6.238-2.949,9.634-4.206c8.144,6.78,20.398,15.752,33.337,22.906l3.278,1.813c1.478-11.925,16.557-13.873,25.283-14.402
|
38 |
+
c-1.852,4.394-5.332,11.933-9.437,17.306l-2.209,2.891l3.463,1.117c12.994,4.186,29.847,3.997,36.488,3.727
|
39 |
+
c19.412-0.801,31.493-7.83,38.261-13.363c-2.078,5.345-6.463,13.09-17.996,23.492c-7.687,6.934-10.642,12.563-9.036,17.21
|
40 |
+
c2.111,6.105,11.069,6.888,12.15,6.961c9.72,0.41,17.836-2.664,24.08-9.134c7.099-7.356,11.62-18.836,13.44-34.12
|
41 |
+
c0.389-3.264,0.607-6.338,0.72-9.069C195.997,49.619,197.475,68.127,191.881,85.069z"/>
|
42 |
+
</svg>
|
assets/privacy-tools.css
CHANGED
@@ -1,30 +1,30 @@
|
|
1 |
-
.gdpr-framework-privacy-tools .gdpr-notice {
|
2 |
-
padding: 10px 20px;
|
3 |
-
border: 1px solid #666;
|
4 |
-
}
|
5 |
-
|
6 |
-
.gdpr-framework-privacy-tools .gdpr-consent td {
|
7 |
-
padding: 0.6em;
|
8 |
-
}
|
9 |
-
|
10 |
-
.gdpr-framework-privacy-tools .gdpr-consent td:first-child {
|
11 |
-
padding-left: 0;
|
12 |
-
}
|
13 |
-
|
14 |
-
.gdpr-framework-privacy-tools .gdpr-consent td:last-child {
|
15 |
-
padding-right: 0;
|
16 |
-
}
|
17 |
-
|
18 |
-
.gdpr-framework-privacy-tools .gdpr-download-button,
|
19 |
-
.gdpr-framework-privacy-tools .gdpr-export-button,
|
20 |
-
.gdpr-framework-privacy-tools .gdpr-delete-button {
|
21 |
-
display: inline-block;
|
22 |
-
margin-right: 10px;
|
23 |
-
margin-bottom: 20px;
|
24 |
-
}
|
25 |
-
|
26 |
-
.gdpr-framework-privacy-tools .gdpr-download-button input.button,
|
27 |
-
.gdpr-framework-privacy-tools .gdpr-export-button input.button,
|
28 |
-
.gdpr-framework-privacy-tools .gdpr-delete-button input.button {
|
29 |
-
min-width: 200px;
|
30 |
-
}
|
1 |
+
.gdpr-framework-privacy-tools .gdpr-notice {
|
2 |
+
padding: 10px 20px;
|
3 |
+
border: 1px solid #666;
|
4 |
+
}
|
5 |
+
|
6 |
+
.gdpr-framework-privacy-tools .gdpr-consent td {
|
7 |
+
padding: 0.6em;
|
8 |
+
}
|
9 |
+
|
10 |
+
.gdpr-framework-privacy-tools .gdpr-consent td:first-child {
|
11 |
+
padding-left: 0;
|
12 |
+
}
|
13 |
+
|
14 |
+
.gdpr-framework-privacy-tools .gdpr-consent td:last-child {
|
15 |
+
padding-right: 0;
|
16 |
+
}
|
17 |
+
|
18 |
+
.gdpr-framework-privacy-tools .gdpr-download-button,
|
19 |
+
.gdpr-framework-privacy-tools .gdpr-export-button,
|
20 |
+
.gdpr-framework-privacy-tools .gdpr-delete-button {
|
21 |
+
display: inline-block;
|
22 |
+
margin-right: 10px;
|
23 |
+
margin-bottom: 20px;
|
24 |
+
}
|
25 |
+
|
26 |
+
.gdpr-framework-privacy-tools .gdpr-download-button input.button,
|
27 |
+
.gdpr-framework-privacy-tools .gdpr-export-button input.button,
|
28 |
+
.gdpr-framework-privacy-tools .gdpr-delete-button input.button {
|
29 |
+
min-width: 200px;
|
30 |
+
}
|
bootstrap.php
CHANGED
@@ -1,71 +1,53 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Set up config object, store plugin URL and path there
|
4 |
-
* along with various other items
|
5 |
-
*/
|
6 |
-
|
7 |
-
\Codelight\GDPR\Container::getInstance()->bindIf('config', function () {
|
8 |
-
return new \Codelight\GDPR\Config([
|
9 |
-
'plugin' => [
|
10 |
-
'url' => plugin_dir_url(__FILE__),
|
11 |
-
'path' => plugin_dir_path(__FILE__),
|
12 |
-
'template_path' => plugin_dir_path(__FILE__) . 'views/',
|
13 |
-
],
|
14 |
-
'help' => [
|
15 |
-
'url' => 'https://codelight.eu/wordpress-gdpr-framework/',
|
16 |
-
],
|
17 |
-
]);
|
18 |
-
}, true);
|
19 |
-
|
20 |
-
/**
|
21 |
-
* Set up the application container
|
22 |
-
*
|
23 |
-
* @param string $abstract
|
24 |
-
* @param array $parameters
|
25 |
-
* @param Codelight\GDPR\Container $container
|
26 |
-
*
|
27 |
-
* @return Codelight\GDPR\Container|mixed
|
28 |
-
*/
|
29 |
-
function gdpr($abstract = null, $parameters = [], Codelight\GDPR\Container $container = null)
|
30 |
-
{
|
31 |
-
$container = $container ?: Codelight\GDPR\Container::getInstance();
|
32 |
-
|
33 |
-
if ( ! $abstract) {
|
34 |
-
return $container;
|
35 |
-
}
|
36 |
-
|
37 |
-
return $container->bound($abstract)
|
38 |
-
? $container->makeWith($abstract, $parameters)
|
39 |
-
: $container->makeWith("gdpr.{$abstract}", $parameters);
|
40 |
-
}
|
41 |
-
|
42 |
-
/**
|
43 |
-
* Start the plugin on plugins_loaded at priority 0.
|
44 |
-
*/
|
45 |
-
add_action('plugins_loaded', function () use ($gdpr_error) {
|
46 |
-
|
47 |
-
load_plugin_textdomain('gdpr-framework', false, basename( dirname( __FILE__ ) ) . '/languages/');
|
48 |
-
|
49 |
-
new \Codelight\GDPR\
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
* Install the database table and custom role
|
55 |
-
*/
|
56 |
-
register_activation_hook(__FILE__, function () {
|
57 |
-
$model = new \Codelight\GDPR\Components\Consent\UserConsentModel();
|
58 |
-
$model->createTable();
|
59 |
-
|
60 |
-
if (apply_filters('gdpr/data-subject/anonymize/change_role', true) && ! get_role('anonymous')) {
|
61 |
-
|
62 |
-
add_role(
|
63 |
-
'anonymous',
|
64 |
-
_x('Anonymous', '(Admin)', 'gdpr-framework'),
|
65 |
-
[]
|
66 |
-
);
|
67 |
-
}
|
68 |
-
|
69 |
-
update_option('gdpr_enable_stylesheet', true);
|
70 |
-
update_option('gdpr_enable', true);
|
71 |
-
});
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Set up config object, store plugin URL and path there
|
4 |
+
* along with various other items
|
5 |
+
*/
|
6 |
+
|
7 |
+
\Codelight\GDPR\Container::getInstance()->bindIf('config', function () {
|
8 |
+
return new \Codelight\GDPR\Config([
|
9 |
+
'plugin' => [
|
10 |
+
'url' => plugin_dir_url(__FILE__),
|
11 |
+
'path' => plugin_dir_path(__FILE__),
|
12 |
+
'template_path' => plugin_dir_path(__FILE__) . 'views/',
|
13 |
+
],
|
14 |
+
'help' => [
|
15 |
+
'url' => 'https://codelight.eu/wordpress-gdpr-framework/',
|
16 |
+
],
|
17 |
+
]);
|
18 |
+
}, true);
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Set up the application container
|
22 |
+
*
|
23 |
+
* @param string $abstract
|
24 |
+
* @param array $parameters
|
25 |
+
* @param Codelight\GDPR\Container $container
|
26 |
+
*
|
27 |
+
* @return Codelight\GDPR\Container|mixed
|
28 |
+
*/
|
29 |
+
function gdpr($abstract = null, $parameters = [], Codelight\GDPR\Container $container = null)
|
30 |
+
{
|
31 |
+
$container = $container ?: Codelight\GDPR\Container::getInstance();
|
32 |
+
|
33 |
+
if ( ! $abstract) {
|
34 |
+
return $container;
|
35 |
+
}
|
36 |
+
|
37 |
+
return $container->bound($abstract)
|
38 |
+
? $container->makeWith($abstract, $parameters)
|
39 |
+
: $container->makeWith("gdpr.{$abstract}", $parameters);
|
40 |
+
}
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Start the plugin on plugins_loaded at priority 0.
|
44 |
+
*/
|
45 |
+
add_action('plugins_loaded', function () use ($gdpr_error) {
|
46 |
+
|
47 |
+
load_plugin_textdomain('gdpr-framework', false, basename( dirname( __FILE__ ) ) . '/languages/');
|
48 |
+
|
49 |
+
new \Codelight\GDPR\Updater\Updater();
|
50 |
+
|
51 |
+
new \Codelight\GDPR\Setup();
|
52 |
+
|
53 |
+
}, 0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gdpr-framework.php
CHANGED
@@ -1,73 +1,95 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* Plugin Name: The GDPR Framework
|
5 |
-
* Plugin URI: https://codelight.eu/wordpress-gdpr-framework/
|
6 |
-
* Description: Tools to help make your website GDPR-compliant. Fully documented, extendable and developer-friendly.
|
7 |
-
* Version: 1.0.
|
8 |
-
* Author: Codelight
|
9 |
-
* Author URI: https://codelight.eu/
|
10 |
-
* Text Domain: gdpr
|
11 |
-
* Domain Path: /languages
|
12 |
-
*/
|
13 |
-
|
14 |
-
if (!defined('WPINC')) {
|
15 |
-
die;
|
16 |
-
}
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
*
|
22 |
-
*
|
23 |
-
* @param string $
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
};
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
'
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
'
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
}
|
72 |
-
|
73 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Plugin Name: The GDPR Framework
|
5 |
+
* Plugin URI: https://codelight.eu/wordpress-gdpr-framework/
|
6 |
+
* Description: Tools to help make your website GDPR-compliant. Fully documented, extendable and developer-friendly.
|
7 |
+
* Version: 1.0.5
|
8 |
+
* Author: Codelight
|
9 |
+
* Author URI: https://codelight.eu/
|
10 |
+
* Text Domain: gdpr-framework
|
11 |
+
* Domain Path: /languages
|
12 |
+
*/
|
13 |
+
|
14 |
+
if (!defined('WPINC')) {
|
15 |
+
die;
|
16 |
+
}
|
17 |
+
|
18 |
+
define('GDPR_FRAMEWORK_VERSION', '1.0.5');
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Helper function for prettying up errors
|
22 |
+
*
|
23 |
+
* @param string $message
|
24 |
+
* @param string $subtitle
|
25 |
+
* @param string $title
|
26 |
+
*/
|
27 |
+
$gdpr_error = function($message, $subtitle = '', $title = '') {
|
28 |
+
$title = $title ?: _x('WordPress GDPR › Error', '(Admin)', 'gdpr-framework');
|
29 |
+
$message = "<h1>{$title}<br><small>{$subtitle}</small></h1><p>{$message}</p>";
|
30 |
+
wp_die($message, $title);
|
31 |
+
};
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Ensure compatible version of PHP is used
|
35 |
+
*/
|
36 |
+
if (version_compare(phpversion(), '5.6.0', '<')) {
|
37 |
+
$gdpr_error(
|
38 |
+
_x('You must be using PHP 5.6.0 or greater.', '(Admin)', 'gdpr-framework'),
|
39 |
+
_x('Invalid PHP version', '(Admin)', 'gdpr-framework')
|
40 |
+
);
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Ensure compatible version of WordPress is used
|
45 |
+
*/
|
46 |
+
if (version_compare(get_bloginfo('version'), '4.3', '<')) {
|
47 |
+
$gdpr_error(
|
48 |
+
_x('You must be using WordPress 4.3.0 or greater.', '(Admin)', 'gdpr-framework'),
|
49 |
+
_x('Invalid WordPress version', '(Admin)', 'gdpr-framework')
|
50 |
+
);
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Load dependencies
|
55 |
+
*/
|
56 |
+
if (!class_exists('\Codelight\GDPR\Container')) {
|
57 |
+
|
58 |
+
if (!file_exists($composer = __DIR__ . '/vendor/autoload.php')) {
|
59 |
+
$gdpr_error(
|
60 |
+
_x(
|
61 |
+
'You appear to be running a development version of GDPR. You must run <code>composer install</code> from the plugin directory.',
|
62 |
+
'(Admin)',
|
63 |
+
'gdpr-framework'
|
64 |
+
),
|
65 |
+
_x(
|
66 |
+
'Autoloader not found.',
|
67 |
+
'(Admin)',
|
68 |
+
'gdpr-framework'
|
69 |
+
)
|
70 |
+
);
|
71 |
+
}
|
72 |
+
require_once $composer;
|
73 |
+
}
|
74 |
+
|
75 |
+
/**
|
76 |
+
* Install the database table and custom role
|
77 |
+
*/
|
78 |
+
register_activation_hook(__FILE__, function () {
|
79 |
+
$model = new \Codelight\GDPR\Components\Consent\UserConsentModel();
|
80 |
+
$model->createTable();
|
81 |
+
|
82 |
+
if (apply_filters('gdpr/data-subject/anonymize/change_role', true) && ! get_role('anonymous')) {
|
83 |
+
|
84 |
+
add_role(
|
85 |
+
'anonymous',
|
86 |
+
_x('Anonymous', '(Admin)', 'gdpr-framework'),
|
87 |
+
array()
|
88 |
+
);
|
89 |
+
}
|
90 |
+
|
91 |
+
update_option('gdpr_enable_stylesheet', true);
|
92 |
+
update_option('gdpr_enable', true);
|
93 |
+
});
|
94 |
+
|
95 |
+
require_once('bootstrap.php');
|
languages/gdpr-framework-de_DE.mo
ADDED
Binary file
|
languages/gdpr-framework-de_DE.po
ADDED
@@ -0,0 +1,1306 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# SOME DESCRIPTIVE TITLE.
|
2 |
+
# Copyright (C) YEAR Codelight
|
3 |
+
# This file is distributed under the same license as the The GDPR Framework package.
|
4 |
+
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
5 |
+
#
|
6 |
+
msgid ""
|
7 |
+
msgstr ""
|
8 |
+
"Project-Id-Version: The GDPR Framework 1.0\n"
|
9 |
+
"Report-Msgid-Bugs-To: gdpr@codelight.eu\n"
|
10 |
+
"POT-Creation-Date: 2018-04-16 10:50+0000\n"
|
11 |
+
"PO-Revision-Date: 2018-04-21 17:26+0200\n"
|
12 |
+
"Language-Team: \n"
|
13 |
+
"MIME-Version: 1.0\n"
|
14 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
15 |
+
"Content-Transfer-Encoding: 8bit\n"
|
16 |
+
"X-Generator: Poedit 2.0.6\n"
|
17 |
+
"Last-Translator: Torsten Meyer <contact@knodderdachs.de>\n"
|
18 |
+
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
19 |
+
"Language: de_DE\n"
|
20 |
+
|
21 |
+
#: gdpr-framework.php:26
|
22 |
+
msgctxt "(Admin)"
|
23 |
+
msgid "WordPress GDPR › Error"
|
24 |
+
msgstr ""
|
25 |
+
|
26 |
+
#: gdpr-framework.php:35
|
27 |
+
msgctxt "(Admin)"
|
28 |
+
msgid "Invalid PHP version"
|
29 |
+
msgstr ""
|
30 |
+
|
31 |
+
#: gdpr-framework.php:35
|
32 |
+
msgctxt "(Admin)"
|
33 |
+
msgid "You must be using PHP 5.6.33 or greater."
|
34 |
+
msgstr ""
|
35 |
+
|
36 |
+
#: gdpr-framework.php:42
|
37 |
+
msgctxt "(Admin)"
|
38 |
+
msgid "Invalid WordPress version"
|
39 |
+
msgstr ""
|
40 |
+
|
41 |
+
#: gdpr-framework.php:42
|
42 |
+
msgctxt "(Admin)"
|
43 |
+
msgid "You must be using WordPress 4.3.0 or greater."
|
44 |
+
msgstr ""
|
45 |
+
|
46 |
+
#: gdpr-framework.php:52
|
47 |
+
msgctxt "(Admin)"
|
48 |
+
msgid ""
|
49 |
+
"You appear to be running a development version of GDPR. You must run "
|
50 |
+
"<code>composer install</code> from the plugin directory."
|
51 |
+
msgstr ""
|
52 |
+
|
53 |
+
#: gdpr-framework.php:53
|
54 |
+
msgctxt "(Admin)"
|
55 |
+
msgid "Autoloader not found."
|
56 |
+
msgstr ""
|
57 |
+
|
58 |
+
#: gdpr-framework.php:115
|
59 |
+
msgctxt "(Admin)"
|
60 |
+
msgid "Anonymous"
|
61 |
+
msgstr ""
|
62 |
+
|
63 |
+
#: src/Admin/AdminTab.php:115
|
64 |
+
msgctxt "(Admin)"
|
65 |
+
msgid "Save"
|
66 |
+
msgstr ""
|
67 |
+
|
68 |
+
#: src/Admin/AdminTab.php:151
|
69 |
+
msgctxt "(Admin)"
|
70 |
+
msgid "Policy generated!"
|
71 |
+
msgstr ""
|
72 |
+
|
73 |
+
#: src/Admin/AdminTabGeneral.php:11
|
74 |
+
msgctxt "(Admin)"
|
75 |
+
msgid "General"
|
76 |
+
msgstr ""
|
77 |
+
|
78 |
+
#: src/Admin/AdminTabGeneral.php:38
|
79 |
+
msgctxt "(Admin)"
|
80 |
+
msgid "General Settings"
|
81 |
+
msgstr ""
|
82 |
+
|
83 |
+
#: src/Admin/AdminTabGeneral.php:43
|
84 |
+
msgctxt "(Admin)"
|
85 |
+
msgid "Enable Privacy Tools"
|
86 |
+
msgstr ""
|
87 |
+
|
88 |
+
#: src/Admin/AdminTabGeneral.php:53
|
89 |
+
msgctxt "(Admin)"
|
90 |
+
msgid "Pages"
|
91 |
+
msgstr ""
|
92 |
+
|
93 |
+
#: src/Admin/AdminTabGeneral.php:58 src/Admin/WordpressAdmin.php:151
|
94 |
+
msgctxt "(Admin)"
|
95 |
+
msgid "Privacy Tools Page"
|
96 |
+
msgstr ""
|
97 |
+
|
98 |
+
#: src/Admin/AdminTabGeneral.php:65 src/Admin/WordpressAdmin.php:147
|
99 |
+
msgctxt "(Admin)"
|
100 |
+
msgid "Privacy Policy Page"
|
101 |
+
msgstr ""
|
102 |
+
|
103 |
+
#: src/Admin/AdminTabGeneral.php:72
|
104 |
+
msgctxt "(Admin)"
|
105 |
+
msgid "Terms & Conditions Page"
|
106 |
+
msgstr ""
|
107 |
+
|
108 |
+
#: src/Admin/AdminTabGeneral.php:82
|
109 |
+
msgctxt "(Admin)"
|
110 |
+
msgid "View & Export Data"
|
111 |
+
msgstr ""
|
112 |
+
|
113 |
+
#: src/Admin/AdminTabGeneral.php:87
|
114 |
+
msgctxt "(Admin)"
|
115 |
+
msgid "Export action"
|
116 |
+
msgstr ""
|
117 |
+
|
118 |
+
#: src/Admin/AdminTabGeneral.php:94 src/Admin/AdminTabGeneral.php:133
|
119 |
+
msgctxt "(Admin)"
|
120 |
+
msgid "Email to notify"
|
121 |
+
msgstr ""
|
122 |
+
|
123 |
+
#: src/Admin/AdminTabGeneral.php:105
|
124 |
+
msgctxt "(Admin)"
|
125 |
+
msgid "Delete & Anonymize Data"
|
126 |
+
msgstr ""
|
127 |
+
|
128 |
+
#: src/Admin/AdminTabGeneral.php:110
|
129 |
+
msgctxt "(Admin)"
|
130 |
+
msgid "Delete action"
|
131 |
+
msgstr ""
|
132 |
+
|
133 |
+
#: src/Admin/AdminTabGeneral.php:117
|
134 |
+
msgctxt "(Admin)"
|
135 |
+
msgid "Delete or reassign content?"
|
136 |
+
msgstr ""
|
137 |
+
|
138 |
+
#: src/Admin/AdminTabGeneral.php:125
|
139 |
+
msgctxt "(Admin)"
|
140 |
+
msgid "Reassign content to"
|
141 |
+
msgstr ""
|
142 |
+
|
143 |
+
#: src/Admin/AdminTabGeneral.php:145
|
144 |
+
msgctxt "(Admin)"
|
145 |
+
msgid "Styling"
|
146 |
+
msgstr ""
|
147 |
+
|
148 |
+
#: src/Admin/AdminTabGeneral.php:150
|
149 |
+
msgctxt "(Admin)"
|
150 |
+
msgid "Enable basic styling on Privacy Tools page"
|
151 |
+
msgstr ""
|
152 |
+
|
153 |
+
#: src/Admin/AdminTabGeneral.php:162
|
154 |
+
msgctxt "(Admin)"
|
155 |
+
msgid "Compatibility"
|
156 |
+
msgstr ""
|
157 |
+
|
158 |
+
#: src/Admin/AdminTabGeneral.php:167
|
159 |
+
msgctxt "(Admin)"
|
160 |
+
msgid "Enable automatic theme compatibility"
|
161 |
+
msgstr ""
|
162 |
+
|
163 |
+
#: src/Admin/AdminTabGeneral.php:184 src/Admin/AdminTabGeneral.php:200
|
164 |
+
#: src/Admin/AdminTabGeneral.php:213 src/Admin/AdminTabGeneral.php:252
|
165 |
+
#: views/installer/steps/configuration-settings.php:62
|
166 |
+
msgctxt "(Admin)"
|
167 |
+
msgid "— Select —"
|
168 |
+
msgstr ""
|
169 |
+
|
170 |
+
#: src/Admin/WordpressAdmin.php:65
|
171 |
+
msgctxt "(Admin)"
|
172 |
+
msgid "Privacy & GDPR Settings"
|
173 |
+
msgstr ""
|
174 |
+
|
175 |
+
#: src/Admin/WordpressAdmin.php:66
|
176 |
+
msgctxt "(Admin)"
|
177 |
+
msgid "Privacy"
|
178 |
+
msgstr ""
|
179 |
+
|
180 |
+
#: src/Components/Consent/AdminTabConsent.php:30
|
181 |
+
#: src/Components/Consent/AdminTabConsent.php:49
|
182 |
+
msgctxt "(Admin)"
|
183 |
+
msgid "Consent"
|
184 |
+
msgstr ""
|
185 |
+
|
186 |
+
#: src/Components/Consent/AdminTabConsent.php:157
|
187 |
+
msgctxt "(Admin)"
|
188 |
+
msgid "Consent slug is a required field!"
|
189 |
+
msgstr ""
|
190 |
+
|
191 |
+
#: src/Components/Consent/AdminTabConsent.php:162
|
192 |
+
msgctxt "(Admin)"
|
193 |
+
msgid ""
|
194 |
+
"You may only use alphanumeric characters, dash and underscore in the consent "
|
195 |
+
"slug field."
|
196 |
+
msgstr ""
|
197 |
+
|
198 |
+
#: src/Components/Consent/AdminTabConsent.php:167
|
199 |
+
msgctxt "(Admin)"
|
200 |
+
msgid "Consent title is a required field!"
|
201 |
+
msgstr ""
|
202 |
+
|
203 |
+
#: src/Components/Consent/ConsentManager.php:46
|
204 |
+
#: views/modules/contact-form-7/content-privacy.php:2
|
205 |
+
#: views/modules/wordpress-comments/terms-checkbox.php:14
|
206 |
+
#: views/modules/wordpress-user/registration-terms-checkbox.php:15
|
207 |
+
#, php-format
|
208 |
+
msgid "I accept the %sPrivacy Policy%s"
|
209 |
+
msgstr "Ich stimme der %sDatenschutzerklärung%s zu"
|
210 |
+
|
211 |
+
#: src/Components/Consent/ConsentManager.php:50
|
212 |
+
#: src/Components/Consent/ConsentManager.php:69
|
213 |
+
msgctxt "(Admin)"
|
214 |
+
msgid ""
|
215 |
+
"This consent is not visible by default. If someone wishes to withdraw it, "
|
216 |
+
"they should simply request to delete all their data."
|
217 |
+
msgstr ""
|
218 |
+
|
219 |
+
#: src/Components/Consent/ConsentManager.php:65
|
220 |
+
#, php-format
|
221 |
+
msgid "I accept the %sTerms & Conditions%s"
|
222 |
+
msgstr "Ich akzeptiere die %sAllgemeinen Geschäftsbestimmungen%s"
|
223 |
+
|
224 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:19
|
225 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:61
|
226 |
+
#: views/admin/privacy-policy/generated.php:1 views/installer/header.php:41
|
227 |
+
msgctxt "(Admin)"
|
228 |
+
msgid "Privacy Policy"
|
229 |
+
msgstr ""
|
230 |
+
|
231 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:70
|
232 |
+
msgctxt "(Admin)"
|
233 |
+
msgid "Company information"
|
234 |
+
msgstr ""
|
235 |
+
|
236 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:75
|
237 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:209
|
238 |
+
msgctxt "(Admin)"
|
239 |
+
msgid "Company Name"
|
240 |
+
msgstr ""
|
241 |
+
|
242 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:82
|
243 |
+
msgctxt "(Admin)"
|
244 |
+
msgid "Company Email"
|
245 |
+
msgstr ""
|
246 |
+
|
247 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:89
|
248 |
+
msgctxt "(Admin)"
|
249 |
+
msgid "Company Location"
|
250 |
+
msgstr ""
|
251 |
+
|
252 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:105
|
253 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:245
|
254 |
+
msgctxt "(Admin)"
|
255 |
+
msgid "Representative Contact Name"
|
256 |
+
msgstr ""
|
257 |
+
|
258 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:112
|
259 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:252
|
260 |
+
msgctxt "(Admin)"
|
261 |
+
msgid "Representative Contact Email"
|
262 |
+
msgstr ""
|
263 |
+
|
264 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:119
|
265 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:259
|
266 |
+
msgctxt "(Admin)"
|
267 |
+
msgid "Representative Contact Phone"
|
268 |
+
msgstr ""
|
269 |
+
|
270 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:135
|
271 |
+
msgctxt "(Admin)"
|
272 |
+
msgid "Data Protection Authority"
|
273 |
+
msgstr ""
|
274 |
+
|
275 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:141
|
276 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:286
|
277 |
+
msgctxt "(Admin)"
|
278 |
+
msgid "Data Protection Authority Website"
|
279 |
+
msgstr ""
|
280 |
+
|
281 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:148
|
282 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:293
|
283 |
+
msgctxt "(Admin)"
|
284 |
+
msgid "Data Protection Authority Email"
|
285 |
+
msgstr ""
|
286 |
+
|
287 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:155
|
288 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:300
|
289 |
+
msgctxt "(Admin)"
|
290 |
+
msgid "Data Protection Authority Phone"
|
291 |
+
msgstr ""
|
292 |
+
|
293 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:165
|
294 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:175
|
295 |
+
msgctxt "(Admin)"
|
296 |
+
msgid "Data Protection Officer"
|
297 |
+
msgstr ""
|
298 |
+
|
299 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:168
|
300 |
+
msgctxt "(Admin)"
|
301 |
+
msgid "Knowledge base: Do I need to appoint a Data Protection Officer?"
|
302 |
+
msgstr ""
|
303 |
+
|
304 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:182
|
305 |
+
msgctxt "(Admin)"
|
306 |
+
msgid "Data Protection Officer Name"
|
307 |
+
msgstr ""
|
308 |
+
|
309 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:190
|
310 |
+
msgctxt "(Admin)"
|
311 |
+
msgid "Data Protection Officer Email"
|
312 |
+
msgstr ""
|
313 |
+
|
314 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:216
|
315 |
+
msgctxt "(Admin)"
|
316 |
+
msgid "Contact Email"
|
317 |
+
msgstr ""
|
318 |
+
|
319 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:235
|
320 |
+
msgctxt "(Admin)"
|
321 |
+
msgid "Representative Contact"
|
322 |
+
msgstr ""
|
323 |
+
|
324 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:238
|
325 |
+
msgctxt "(Admin)"
|
326 |
+
msgid "Knowledge base: Do I need to appoint an EU-based representative?"
|
327 |
+
msgstr ""
|
328 |
+
|
329 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:317
|
330 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:324
|
331 |
+
msgctxt "(Admin)"
|
332 |
+
msgid "DPO Name"
|
333 |
+
msgstr ""
|
334 |
+
|
335 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:420
|
336 |
+
msgctxt "(Admin)"
|
337 |
+
msgid "Save & Generate Policy"
|
338 |
+
msgstr ""
|
339 |
+
|
340 |
+
#: src/Components/PrivacyPolicy/PrivacyPolicy.php:82
|
341 |
+
#: src/Installer/Installer.php:271 src/Installer/Steps/PolicySettings.php:199
|
342 |
+
#: views/themes/storefront/footer.php:3
|
343 |
+
#: views/themes/twentyseventeen/footer.php:3
|
344 |
+
#: views/themes/twentysixteen/footer.php:4
|
345 |
+
msgid "Privacy Policy"
|
346 |
+
msgstr "Datenschutzerklärung"
|
347 |
+
|
348 |
+
#: src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php:19
|
349 |
+
msgid "This page is currently disabled."
|
350 |
+
msgstr "Diese Seite ist zur Zeit deaktiviert."
|
351 |
+
|
352 |
+
#: src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php:35
|
353 |
+
#: src/Installer/Installer.php:279
|
354 |
+
#: src/Installer/Steps/ConfigurationPages.php:55
|
355 |
+
#: views/themes/storefront/footer.php:7
|
356 |
+
#: views/themes/twentyseventeen/footer.php:7
|
357 |
+
#: views/themes/twentysixteen/footer.php:9
|
358 |
+
msgid "Privacy Tools"
|
359 |
+
msgstr "Privatsphäre Tools"
|
360 |
+
|
361 |
+
#: src/Components/Support/AdminTabSupport.php:13
|
362 |
+
#: src/Components/Support/AdminTabSupport.php:20
|
363 |
+
msgctxt "(Admin)"
|
364 |
+
msgid "Support"
|
365 |
+
msgstr ""
|
366 |
+
|
367 |
+
#: src/Components/WordpressComments/WordpressComments.php:90
|
368 |
+
#, php-format
|
369 |
+
msgid ""
|
370 |
+
"%sERROR:%s You need to accept the terms and conditions to post a comment."
|
371 |
+
msgstr ""
|
372 |
+
"%sFEHLER:%s Du musst die AGB akzeptieren, um einen Kommentar schreiben zu "
|
373 |
+
"dürfen."
|
374 |
+
|
375 |
+
#: src/Components/WordpressUser/Controllers/DashboardDataPageController.php:54
|
376 |
+
#: views/privacy-tools/notices.php:19
|
377 |
+
msgid "We have received your request and will reply within 30 days."
|
378 |
+
msgstr ""
|
379 |
+
"Wir haben Ihre Anfrage erhalten und werden innerhalb von 30 Tagen antworten."
|
380 |
+
|
381 |
+
#: src/Components/WordpressUser/Controllers/DashboardDataPageController.php:59
|
382 |
+
#: views/privacy-tools/notices.php:15
|
383 |
+
msgid "Consent withdrawn."
|
384 |
+
msgstr "Zustimmung widerrufen."
|
385 |
+
|
386 |
+
#: src/Components/WordpressUser/RegistrationForm.php:42
|
387 |
+
msgid "<strong>ERROR</strong>: You must accept the terms and conditions."
|
388 |
+
msgstr "<strong>FEHLER</strong>: Du musst die AGB akzeptieren."
|
389 |
+
|
390 |
+
#: src/Components/WordpressUser/WordpressUser.php:63
|
391 |
+
#: src/Components/WordpressUser/WordpressUser.php:64
|
392 |
+
#: views/modules/wordpress-user/dashboard/data-page/header.php:2
|
393 |
+
msgctxt "(Admin)"
|
394 |
+
msgid "Privacy Tools"
|
395 |
+
msgstr ""
|
396 |
+
|
397 |
+
#: src/DataSubject/AdminTabDataSubject.php:27
|
398 |
+
#: src/DataSubject/AdminTabDataSubject.php:41
|
399 |
+
msgctxt "(Admin)"
|
400 |
+
msgid "Data Subjects"
|
401 |
+
msgstr ""
|
402 |
+
|
403 |
+
#: src/DataSubject/DataRepository.php:143
|
404 |
+
msgid "Data exported"
|
405 |
+
msgstr "Daten exportiert"
|
406 |
+
|
407 |
+
#: src/DataSubject/DataRepository.php:158
|
408 |
+
msgid "Data export request"
|
409 |
+
msgstr "Datenexport angefragt"
|
410 |
+
|
411 |
+
#: src/DataSubject/DataRepository.php:171
|
412 |
+
msgid "Data removed"
|
413 |
+
msgstr "Daten entfernt"
|
414 |
+
|
415 |
+
#: src/DataSubject/DataRepository.php:186
|
416 |
+
msgid "Data removal request"
|
417 |
+
msgstr "Datenlöschung angefragt"
|
418 |
+
|
419 |
+
#: src/DataSubject/DataSubjectIdentificator.php:65
|
420 |
+
#: src/DataSubject/DataSubjectIdentificator.php:82
|
421 |
+
msgid "Your personal data on"
|
422 |
+
msgstr "Ihre persönlichen Daten auf"
|
423 |
+
|
424 |
+
#: src/Helpers.php:27
|
425 |
+
msgctxt "(Admin)"
|
426 |
+
msgid "Austria"
|
427 |
+
msgstr ""
|
428 |
+
|
429 |
+
#: src/Helpers.php:28
|
430 |
+
msgctxt "(Admin)"
|
431 |
+
msgid "Belgium"
|
432 |
+
msgstr ""
|
433 |
+
|
434 |
+
#: src/Helpers.php:29
|
435 |
+
msgctxt "(Admin)"
|
436 |
+
msgid "Bulgaria"
|
437 |
+
msgstr ""
|
438 |
+
|
439 |
+
#: src/Helpers.php:30
|
440 |
+
msgctxt "(Admin)"
|
441 |
+
msgid "Croatia"
|
442 |
+
msgstr ""
|
443 |
+
|
444 |
+
#: src/Helpers.php:31
|
445 |
+
msgctxt "(Admin)"
|
446 |
+
msgid "Cyprus"
|
447 |
+
msgstr ""
|
448 |
+
|
449 |
+
#: src/Helpers.php:32
|
450 |
+
msgctxt "(Admin)"
|
451 |
+
msgid "Czech Republic"
|
452 |
+
msgstr ""
|
453 |
+
|
454 |
+
#: src/Helpers.php:33
|
455 |
+
msgctxt "(Admin)"
|
456 |
+
msgid "Denmark"
|
457 |
+
msgstr ""
|
458 |
+
|
459 |
+
#: src/Helpers.php:34
|
460 |
+
msgctxt "(Admin)"
|
461 |
+
msgid "Estonia"
|
462 |
+
msgstr ""
|
463 |
+
|
464 |
+
#: src/Helpers.php:35
|
465 |
+
msgctxt "(Admin)"
|
466 |
+
msgid "Finland"
|
467 |
+
msgstr ""
|
468 |
+
|
469 |
+
#: src/Helpers.php:36
|
470 |
+
msgctxt "(Admin)"
|
471 |
+
msgid "France"
|
472 |
+
msgstr ""
|
473 |
+
|
474 |
+
#: src/Helpers.php:37
|
475 |
+
msgctxt "(Admin)"
|
476 |
+
msgid "Germany"
|
477 |
+
msgstr ""
|
478 |
+
|
479 |
+
#: src/Helpers.php:38
|
480 |
+
msgctxt "(Admin)"
|
481 |
+
msgid "Greece"
|
482 |
+
msgstr ""
|
483 |
+
|
484 |
+
#: src/Helpers.php:39
|
485 |
+
msgctxt "(Admin)"
|
486 |
+
msgid "Hungary"
|
487 |
+
msgstr ""
|
488 |
+
|
489 |
+
#: src/Helpers.php:40
|
490 |
+
msgctxt "(Admin)"
|
491 |
+
msgid "Ireland"
|
492 |
+
msgstr ""
|
493 |
+
|
494 |
+
#: src/Helpers.php:41
|
495 |
+
msgctxt "(Admin)"
|
496 |
+
msgid "Italy"
|
497 |
+
msgstr ""
|
498 |
+
|
499 |
+
#: src/Helpers.php:42
|
500 |
+
msgctxt "(Admin)"
|
501 |
+
msgid "Latvia"
|
502 |
+
msgstr ""
|
503 |
+
|
504 |
+
#: src/Helpers.php:43
|
505 |
+
msgctxt "(Admin)"
|
506 |
+
msgid "Lithuania"
|
507 |
+
msgstr ""
|
508 |
+
|
509 |
+
#: src/Helpers.php:44
|
510 |
+
msgctxt "(Admin)"
|
511 |
+
msgid "Luxembourg"
|
512 |
+
msgstr ""
|
513 |
+
|
514 |
+
#: src/Helpers.php:45
|
515 |
+
msgctxt "(Admin)"
|
516 |
+
msgid "Malta"
|
517 |
+
msgstr ""
|
518 |
+
|
519 |
+
#: src/Helpers.php:46
|
520 |
+
msgctxt "(Admin)"
|
521 |
+
msgid "Netherlands"
|
522 |
+
msgstr ""
|
523 |
+
|
524 |
+
#: src/Helpers.php:47
|
525 |
+
msgctxt "(Admin)"
|
526 |
+
msgid "Poland"
|
527 |
+
msgstr ""
|
528 |
+
|
529 |
+
#: src/Helpers.php:48
|
530 |
+
msgctxt "(Admin)"
|
531 |
+
msgid "Portugal"
|
532 |
+
msgstr ""
|
533 |
+
|
534 |
+
#: src/Helpers.php:49
|
535 |
+
msgctxt "(Admin)"
|
536 |
+
msgid "Romania"
|
537 |
+
msgstr ""
|
538 |
+
|
539 |
+
#: src/Helpers.php:50
|
540 |
+
msgctxt "(Admin)"
|
541 |
+
msgid "Slovakia"
|
542 |
+
msgstr ""
|
543 |
+
|
544 |
+
#: src/Helpers.php:51
|
545 |
+
msgctxt "(Admin)"
|
546 |
+
msgid "Slovenia"
|
547 |
+
msgstr ""
|
548 |
+
|
549 |
+
#: src/Helpers.php:52
|
550 |
+
msgctxt "(Admin)"
|
551 |
+
msgid "Spain"
|
552 |
+
msgstr ""
|
553 |
+
|
554 |
+
#: src/Helpers.php:53
|
555 |
+
msgctxt "(Admin)"
|
556 |
+
msgid "Sweden"
|
557 |
+
msgstr ""
|
558 |
+
|
559 |
+
#: src/Helpers.php:54
|
560 |
+
msgctxt "(Admin)"
|
561 |
+
msgid "United Kingdom"
|
562 |
+
msgstr ""
|
563 |
+
|
564 |
+
#: src/Helpers.php:69
|
565 |
+
msgctxt "(Admin)"
|
566 |
+
msgid "Iceland"
|
567 |
+
msgstr ""
|
568 |
+
|
569 |
+
#: src/Helpers.php:70
|
570 |
+
msgctxt "(Admin)"
|
571 |
+
msgid "Norway"
|
572 |
+
msgstr ""
|
573 |
+
|
574 |
+
#: src/Helpers.php:71
|
575 |
+
msgctxt "(Admin)"
|
576 |
+
msgid "Liechtenstein"
|
577 |
+
msgstr ""
|
578 |
+
|
579 |
+
#: src/Helpers.php:72
|
580 |
+
msgctxt "(Admin)"
|
581 |
+
msgid "Switzerland"
|
582 |
+
msgstr ""
|
583 |
+
|
584 |
+
#: src/Helpers.php:73
|
585 |
+
msgctxt "(Admin)"
|
586 |
+
msgid "United States"
|
587 |
+
msgstr ""
|
588 |
+
|
589 |
+
#: src/Helpers.php:74
|
590 |
+
msgctxt "(Admin)"
|
591 |
+
msgid "Rest of the world"
|
592 |
+
msgstr ""
|
593 |
+
|
594 |
+
#: src/Helpers.php:145
|
595 |
+
msgid "An error has occurred. Please contact the site administrator."
|
596 |
+
msgstr ""
|
597 |
+
"Es ist ein Fehler aufgetreten. Bitte setzen Sie sich mit dem Website "
|
598 |
+
"Administrator in Verbindung."
|
599 |
+
|
600 |
+
#: src/Installer/Installer.php:135
|
601 |
+
msgctxt "(Admin)"
|
602 |
+
msgid "Setup Wizard"
|
603 |
+
msgstr ""
|
604 |
+
|
605 |
+
#: src/Installer/Steps/ConfigurationPages.php:23
|
606 |
+
#: src/Installer/Steps/PolicySettings.php:23
|
607 |
+
#: src/Installer/Steps/PolicySettings.php:48
|
608 |
+
msgctxt "(Admin)"
|
609 |
+
msgid "— Create a new page —"
|
610 |
+
msgstr ""
|
611 |
+
|
612 |
+
#: src/Installer/Steps/PolicySettings.php:38
|
613 |
+
msgctxt "(Admin)"
|
614 |
+
msgid ""
|
615 |
+
"We have automatically selected your WooCommerce Terms & Conditions page."
|
616 |
+
msgstr ""
|
617 |
+
|
618 |
+
#: src/Modules/ContactForm7/ContactForm7.php:35
|
619 |
+
msgctxt "(Admin)"
|
620 |
+
msgid "gdpr terms txt"
|
621 |
+
msgstr ""
|
622 |
+
|
623 |
+
#: src/Router.php:80 src/Router.php:92 src/Router.php:125 src/Router.php:141
|
624 |
+
#, php-format
|
625 |
+
msgid "Nonce error for action \"%s\". Please go back and try again!"
|
626 |
+
msgstr ""
|
627 |
+
"Nonce Fehler für Aktion \"%s\". Bitte gehen Sie zurück und versuchen Sie es "
|
628 |
+
"erneut!"
|
629 |
+
|
630 |
+
#: src/Router.php:149
|
631 |
+
msgctxt "(Admin)"
|
632 |
+
msgid "You do not have the required permissions to perform this action!"
|
633 |
+
msgstr ""
|
634 |
+
|
635 |
+
#: views/admin/consent.php:3
|
636 |
+
msgctxt "(Admin)"
|
637 |
+
msgid "Default consent types"
|
638 |
+
msgstr ""
|
639 |
+
|
640 |
+
#: views/admin/consent.php:4
|
641 |
+
msgctxt "(Admin)"
|
642 |
+
msgid ""
|
643 |
+
"These are the consent types that have been automatically registered by the "
|
644 |
+
"framework or a plugin."
|
645 |
+
msgstr ""
|
646 |
+
|
647 |
+
#: views/admin/consent.php:7 views/admin/consent.php:52
|
648 |
+
msgctxt "(Admin)"
|
649 |
+
msgid "Slug"
|
650 |
+
msgstr ""
|
651 |
+
|
652 |
+
#: views/admin/consent.php:8 views/admin/consent.php:38
|
653 |
+
#: views/admin/consent.php:60
|
654 |
+
msgctxt "(Admin)"
|
655 |
+
msgid "Title"
|
656 |
+
msgstr ""
|
657 |
+
|
658 |
+
#: views/admin/consent.php:9 views/admin/consent.php:41
|
659 |
+
#: views/admin/consent.php:63
|
660 |
+
msgctxt "(Admin)"
|
661 |
+
msgid "Description"
|
662 |
+
msgstr ""
|
663 |
+
|
664 |
+
#: views/admin/consent.php:10
|
665 |
+
msgctxt "(Admin)"
|
666 |
+
msgid "Visibility"
|
667 |
+
msgstr ""
|
668 |
+
|
669 |
+
#: views/admin/consent.php:18
|
670 |
+
msgctxt "(Admin)"
|
671 |
+
msgid "Visible"
|
672 |
+
msgstr ""
|
673 |
+
|
674 |
+
#: views/admin/consent.php:20
|
675 |
+
msgctxt "(Admin)"
|
676 |
+
msgid "Hidden"
|
677 |
+
msgstr ""
|
678 |
+
|
679 |
+
#: views/admin/consent.php:29
|
680 |
+
msgctxt "(Admin)"
|
681 |
+
msgid "Custom consent types"
|
682 |
+
msgstr ""
|
683 |
+
|
684 |
+
#: views/admin/consent.php:30
|
685 |
+
msgctxt "(Admin)"
|
686 |
+
msgid ""
|
687 |
+
"Here you can add custom consent types to track. They will not be used "
|
688 |
+
"anywhere by default - you will need to build an integration for each of them."
|
689 |
+
msgstr ""
|
690 |
+
|
691 |
+
#: views/admin/consent.php:35
|
692 |
+
msgctxt "(Admin)"
|
693 |
+
msgid "Machine-readable slug"
|
694 |
+
msgstr ""
|
695 |
+
|
696 |
+
#: views/admin/consent.php:44 views/admin/consent.php:68
|
697 |
+
msgctxt "(Admin)"
|
698 |
+
msgid "Visible?"
|
699 |
+
msgstr ""
|
700 |
+
|
701 |
+
#: views/admin/consent.php:72
|
702 |
+
msgctxt "(Admin)"
|
703 |
+
msgid "Remove"
|
704 |
+
msgstr ""
|
705 |
+
|
706 |
+
#: views/admin/consent.php:93
|
707 |
+
msgctxt "(Admin)"
|
708 |
+
msgid "Additional info"
|
709 |
+
msgstr ""
|
710 |
+
|
711 |
+
#: views/admin/consent.php:95
|
712 |
+
msgctxt "(Admin)"
|
713 |
+
msgid ""
|
714 |
+
"This text will be displayed to your data subjects on the Privacy Tools page."
|
715 |
+
msgstr ""
|
716 |
+
|
717 |
+
#: views/admin/data-subjects/search-form.php:2
|
718 |
+
msgctxt "(Admin)"
|
719 |
+
msgid ""
|
720 |
+
"On this page, you can find which data subjects personal data you are storing "
|
721 |
+
"and download, export or delete it."
|
722 |
+
msgstr ""
|
723 |
+
|
724 |
+
#: views/admin/data-subjects/search-form.php:10
|
725 |
+
msgctxt "(Admin)"
|
726 |
+
msgid "Find data subject by email"
|
727 |
+
msgstr ""
|
728 |
+
|
729 |
+
#: views/admin/data-subjects/search-form.php:11
|
730 |
+
msgctxt "(Admin)"
|
731 |
+
msgid "Email address"
|
732 |
+
msgstr ""
|
733 |
+
|
734 |
+
#: views/admin/data-subjects/search-form.php:16
|
735 |
+
msgctxt "(Admin)"
|
736 |
+
msgid "Search"
|
737 |
+
msgstr ""
|
738 |
+
|
739 |
+
#: views/admin/data-subjects/search-results.php:7
|
740 |
+
msgctxt "(Admin)"
|
741 |
+
msgid "Username"
|
742 |
+
msgstr ""
|
743 |
+
|
744 |
+
#: views/admin/data-subjects/search-results.php:12
|
745 |
+
msgctxt "(Admin)"
|
746 |
+
msgid "is not a registered user."
|
747 |
+
msgstr ""
|
748 |
+
|
749 |
+
#: views/admin/data-subjects/search-results.php:16
|
750 |
+
msgctxt "(Admin)"
|
751 |
+
msgid "Download data (html)"
|
752 |
+
msgstr ""
|
753 |
+
|
754 |
+
#: views/admin/data-subjects/search-results.php:17
|
755 |
+
msgctxt "(Admin)"
|
756 |
+
msgid "Export data (json)"
|
757 |
+
msgstr ""
|
758 |
+
|
759 |
+
#: views/admin/data-subjects/search-results.php:21
|
760 |
+
msgctxt "(Admin)"
|
761 |
+
msgid ""
|
762 |
+
"This user has admin capabilities. Deleting data via this interface is "
|
763 |
+
"disabled."
|
764 |
+
msgstr ""
|
765 |
+
|
766 |
+
#: views/admin/data-subjects/search-results.php:24
|
767 |
+
msgctxt "(Admin)"
|
768 |
+
msgid "Anonymize data"
|
769 |
+
msgstr ""
|
770 |
+
|
771 |
+
#: views/admin/data-subjects/search-results.php:25
|
772 |
+
msgctxt "(Admin)"
|
773 |
+
msgid "Delete data"
|
774 |
+
msgstr ""
|
775 |
+
|
776 |
+
#: views/admin/data-subjects/search-results.php:29
|
777 |
+
msgctxt "(Admin)"
|
778 |
+
msgid "No data found!"
|
779 |
+
msgstr ""
|
780 |
+
|
781 |
+
#: views/admin/general/delete-action-email.php:5
|
782 |
+
#: views/admin/general/export-action-email.php:5
|
783 |
+
#: views/installer/steps/configuration-settings.php:29
|
784 |
+
#: views/installer/steps/configuration-settings.php:79
|
785 |
+
msgid "Email address"
|
786 |
+
msgstr "E-Mail Adresse"
|
787 |
+
|
788 |
+
#: views/admin/general/delete-action-reassign.php:3
|
789 |
+
#: views/installer/steps/configuration-settings.php:50
|
790 |
+
msgctxt "(Admin)"
|
791 |
+
msgid "Delete content"
|
792 |
+
msgstr ""
|
793 |
+
|
794 |
+
#: views/admin/general/delete-action-reassign.php:6
|
795 |
+
#: views/installer/steps/configuration-settings.php:53
|
796 |
+
msgctxt "(Admin)"
|
797 |
+
msgid "Reassign content to a user"
|
798 |
+
msgstr ""
|
799 |
+
|
800 |
+
#: views/admin/general/delete-action-reassign.php:10
|
801 |
+
msgctxt "(Admin)"
|
802 |
+
msgid ""
|
803 |
+
"If the user has submitted any content on your site, should it be deleted or "
|
804 |
+
"reassigned to another user?"
|
805 |
+
msgstr ""
|
806 |
+
|
807 |
+
#: views/admin/general/description-data-page.php:2
|
808 |
+
msgctxt "(Admin)"
|
809 |
+
msgid ""
|
810 |
+
"Select the page where users can go to control their data. This page must "
|
811 |
+
"contain the [gdpr_privacy_tools] shortcode."
|
812 |
+
msgstr ""
|
813 |
+
|
814 |
+
#: views/admin/general/enable.php:9
|
815 |
+
msgctxt "(Admin)"
|
816 |
+
msgid "Enable the view, export and forget functionality for users and visitors"
|
817 |
+
msgstr ""
|
818 |
+
|
819 |
+
#: views/admin/general/enable.php:12
|
820 |
+
msgctxt "(Admin)"
|
821 |
+
msgid ""
|
822 |
+
"Enable the Privacy Tools page on front-end and dashboard. This allows "
|
823 |
+
"visitors to request viewing and deleting their personal data and withdraw "
|
824 |
+
"consents."
|
825 |
+
msgstr ""
|
826 |
+
|
827 |
+
#: views/admin/general/theme-compatibility.php:9
|
828 |
+
#: views/installer/steps/integrations.php:21
|
829 |
+
msgctxt "(Admin)"
|
830 |
+
msgid ""
|
831 |
+
"Automatically add Privacy Policy and Privacy Tools links to your site footer."
|
832 |
+
msgstr ""
|
833 |
+
|
834 |
+
#: views/admin/notices/header.php:4 views/admin/settings-page.php:3
|
835 |
+
#: views/installer/header.php:23
|
836 |
+
msgctxt "(Admin)"
|
837 |
+
msgid "The GDPR Framework"
|
838 |
+
msgstr ""
|
839 |
+
|
840 |
+
#: views/admin/notices/helper-autoinstall.php:2
|
841 |
+
msgctxt "(Admin)"
|
842 |
+
msgid ""
|
843 |
+
"A Privacy Policy page has been created, but it is empty. You can generate a "
|
844 |
+
"policy template on this page."
|
845 |
+
msgstr ""
|
846 |
+
|
847 |
+
#: views/admin/notices/helper-policy.php:2
|
848 |
+
msgctxt "(Admin)"
|
849 |
+
msgid ""
|
850 |
+
"Heads up - your Privacy Policy still requires some attention. Find the "
|
851 |
+
"places marked with [TODO] and replace them with real content!"
|
852 |
+
msgstr ""
|
853 |
+
|
854 |
+
#: views/admin/notices/helper-tools.php:2
|
855 |
+
msgctxt "(Admin)"
|
856 |
+
msgid "The contents of this page should contain the [gdpr_tools] shortcode."
|
857 |
+
msgstr ""
|
858 |
+
|
859 |
+
#: views/admin/privacy-policy/description-policy-page.php:2
|
860 |
+
msgctxt "(Admin)"
|
861 |
+
msgid "Select the page which will contain your Privacy Policy"
|
862 |
+
msgstr ""
|
863 |
+
|
864 |
+
#: views/admin/privacy-policy/generated.php:3
|
865 |
+
msgctxt "(Admin)"
|
866 |
+
msgid "Your Privacy Policy has been generated."
|
867 |
+
msgstr ""
|
868 |
+
|
869 |
+
#: views/admin/privacy-policy/generated.php:20
|
870 |
+
msgctxt "(Admin)"
|
871 |
+
msgid "« Back"
|
872 |
+
msgstr ""
|
873 |
+
|
874 |
+
#: views/admin/privacy-policy/header.php:2
|
875 |
+
msgctxt "(Admin)"
|
876 |
+
msgid ""
|
877 |
+
"This page allows you to generate a Privacy Policy based on the information "
|
878 |
+
"you entered below."
|
879 |
+
msgstr ""
|
880 |
+
|
881 |
+
#: views/admin/settings-page.php:31
|
882 |
+
#, php-format
|
883 |
+
msgctxt "(Admin)"
|
884 |
+
msgid "The GDPR Framework. Built with ♥ by %sCodelight%s."
|
885 |
+
msgstr ""
|
886 |
+
|
887 |
+
#: views/admin/support/contents.php:5 views/installer/steps/finish.php:10
|
888 |
+
msgctxt "(Admin)"
|
889 |
+
msgid "Need more info?"
|
890 |
+
msgstr ""
|
891 |
+
|
892 |
+
#: views/admin/support/contents.php:11 views/installer/steps/finish.php:16
|
893 |
+
msgctxt "(Admin)"
|
894 |
+
msgid "Site Owner's guide to GDPR"
|
895 |
+
msgstr ""
|
896 |
+
|
897 |
+
#: views/admin/support/contents.php:14 views/installer/steps/finish.php:19
|
898 |
+
msgctxt "(Admin)"
|
899 |
+
msgid "Read the full guide on GDPR compliance."
|
900 |
+
msgstr ""
|
901 |
+
|
902 |
+
#: views/admin/support/contents.php:20 views/installer/steps/finish.php:25
|
903 |
+
msgctxt "(Admin)"
|
904 |
+
msgid "Knowledge base"
|
905 |
+
msgstr ""
|
906 |
+
|
907 |
+
#: views/admin/support/contents.php:23 views/installer/steps/finish.php:28
|
908 |
+
msgctxt "(Admin)"
|
909 |
+
msgid "Check out the knowledge base for common questions and answers."
|
910 |
+
msgstr ""
|
911 |
+
|
912 |
+
#: views/admin/support/contents.php:29 views/installer/steps/finish.php:34
|
913 |
+
msgctxt "(Admin)"
|
914 |
+
msgid "Developer's guide to GDPR"
|
915 |
+
msgstr ""
|
916 |
+
|
917 |
+
#: views/admin/support/contents.php:32 views/installer/steps/finish.php:37
|
918 |
+
msgctxt "(Admin)"
|
919 |
+
msgid "We have a thorough guide to help making custom sites compliant."
|
920 |
+
msgstr ""
|
921 |
+
|
922 |
+
#: views/admin/support/contents.php:40 views/installer/steps/finish.php:45
|
923 |
+
msgctxt "(Admin)"
|
924 |
+
msgid "Need help?"
|
925 |
+
msgstr ""
|
926 |
+
|
927 |
+
#: views/admin/support/contents.php:46 views/installer/steps/finish.php:51
|
928 |
+
msgctxt "(Admin)"
|
929 |
+
msgid "Submit a support request"
|
930 |
+
msgstr ""
|
931 |
+
|
932 |
+
#: views/admin/support/contents.php:49 views/installer/steps/finish.php:54
|
933 |
+
msgctxt "(Admin)"
|
934 |
+
msgid ""
|
935 |
+
"Found a bug or problem with the plugin? Post in the wordpress.org support "
|
936 |
+
"forum."
|
937 |
+
msgstr ""
|
938 |
+
|
939 |
+
#: views/admin/support/contents.php:55 views/installer/steps/finish.php:60
|
940 |
+
msgctxt "(Admin)"
|
941 |
+
msgid "Request a consultation"
|
942 |
+
msgstr ""
|
943 |
+
|
944 |
+
#: views/admin/support/contents.php:58 views/installer/steps/finish.php:63
|
945 |
+
msgctxt "(Admin)"
|
946 |
+
msgid ""
|
947 |
+
"Need development or legal assistance in making your site compliant? We can "
|
948 |
+
"help!"
|
949 |
+
msgstr ""
|
950 |
+
|
951 |
+
#: views/admin/wizard-buttons.php:2
|
952 |
+
msgctxt "(Admin)"
|
953 |
+
msgid "Restart setup wizard"
|
954 |
+
msgstr ""
|
955 |
+
|
956 |
+
#: views/email/action-export.php:8 views/email/action-forget.php:12
|
957 |
+
msgctxt "(Admin)"
|
958 |
+
msgid ""
|
959 |
+
"This email is just for your information. You don't need to take any action"
|
960 |
+
msgstr ""
|
961 |
+
|
962 |
+
#: views/email/action-forget.php:8
|
963 |
+
msgctxt "(Admin)"
|
964 |
+
msgid "The data subject had a user account on your website."
|
965 |
+
msgstr ""
|
966 |
+
|
967 |
+
#: views/email/identify-data-subject.php:2
|
968 |
+
msgid "Someone has requested access to your data on"
|
969 |
+
msgstr "Jemand hat Zugriff auf Ihre Daten angefordert auf "
|
970 |
+
|
971 |
+
#: views/email/identify-data-subject.php:3
|
972 |
+
msgid "If this was a mistake, just ignore this email and nothing will happen."
|
973 |
+
msgstr ""
|
974 |
+
"Falls dies ein Fehler war, ignorieren Sie diese E-Mail und es wird nichts "
|
975 |
+
"passieren."
|
976 |
+
|
977 |
+
#: views/email/identify-data-subject.php:4
|
978 |
+
msgid "To manage your data, visit the following address:"
|
979 |
+
msgstr "Um Ihre Daten zu verwalten, besuchen Sie diese Adresse:"
|
980 |
+
|
981 |
+
#: views/email/identify-data-subject.php:10
|
982 |
+
msgid "This link is valid for 15 minutes."
|
983 |
+
msgstr "Der Link ist 15 Minuten lang gültig."
|
984 |
+
|
985 |
+
#: views/email/no-data.php:2
|
986 |
+
msgid "Someone has requested information about your personal data on"
|
987 |
+
msgstr "Jemand hat Zugriff auf Ihre persönlichen Daten angefordert auf"
|
988 |
+
|
989 |
+
#: views/email/no-data.php:3
|
990 |
+
msgid "None of your personal data is stored on"
|
991 |
+
msgstr "Es sind keinerlei persönliche Daten von Ihnen gespeichert auf"
|
992 |
+
|
993 |
+
#: views/email/no-data.php:5
|
994 |
+
msgid ""
|
995 |
+
"If this was a mistake or you did not request this email, just ignore it and "
|
996 |
+
"nothing will happen."
|
997 |
+
msgstr ""
|
998 |
+
"Falls dies ein Fehler war oder Sie diese E-Mail nicht anfordert haben, "
|
999 |
+
"ignorieren Sie sie und es wird nichts passieren."
|
1000 |
+
|
1001 |
+
#: views/email/request-export.php:13 views/email/request-forget.php:13
|
1002 |
+
msgctxt "(Admin)"
|
1003 |
+
msgid "As a reminder: according to GDPR, you have 30 days to comply."
|
1004 |
+
msgstr ""
|
1005 |
+
|
1006 |
+
#: views/global/delete-action.php:2
|
1007 |
+
msgctxt "(Admin)"
|
1008 |
+
msgid "Automatically anonymize data"
|
1009 |
+
msgstr ""
|
1010 |
+
|
1011 |
+
#: views/global/delete-action.php:5
|
1012 |
+
msgctxt "(Admin)"
|
1013 |
+
msgid "Automatically delete data"
|
1014 |
+
msgstr ""
|
1015 |
+
|
1016 |
+
#: views/global/delete-action.php:9
|
1017 |
+
msgctxt "(Admin)"
|
1018 |
+
msgid "Automatically anonymize data and notify me via email"
|
1019 |
+
msgstr ""
|
1020 |
+
|
1021 |
+
#: views/global/delete-action.php:13
|
1022 |
+
msgctxt "(Admin)"
|
1023 |
+
msgid "Automatically delete data and notify me via email"
|
1024 |
+
msgstr ""
|
1025 |
+
|
1026 |
+
#: views/global/delete-action.php:16 views/global/export-action.php:10
|
1027 |
+
msgctxt "(Admin)"
|
1028 |
+
msgid "Only notify me via email"
|
1029 |
+
msgstr ""
|
1030 |
+
|
1031 |
+
#: views/global/export-action.php:2
|
1032 |
+
msgctxt "(Admin)"
|
1033 |
+
msgid "Automatically download data"
|
1034 |
+
msgstr ""
|
1035 |
+
|
1036 |
+
#: views/global/export-action.php:6
|
1037 |
+
msgctxt "(Admin)"
|
1038 |
+
msgid "Automatically download data and notify me via email"
|
1039 |
+
msgstr ""
|
1040 |
+
|
1041 |
+
#: views/installer/continue-notice.php:2
|
1042 |
+
msgctxt "(Admin)"
|
1043 |
+
msgid "The The GDPR Framework setup has not been finalized yet."
|
1044 |
+
msgstr ""
|
1045 |
+
|
1046 |
+
#: views/installer/continue-notice.php:3
|
1047 |
+
msgctxt "(Admin)"
|
1048 |
+
msgid "You can continue the setup at any time."
|
1049 |
+
msgstr ""
|
1050 |
+
|
1051 |
+
#: views/installer/continue-notice.php:6
|
1052 |
+
msgctxt "(Admin)"
|
1053 |
+
msgid "Continue the setup wizard"
|
1054 |
+
msgstr ""
|
1055 |
+
|
1056 |
+
#: views/installer/continue-notice.php:9
|
1057 |
+
msgctxt "(Admin)"
|
1058 |
+
msgid "Hide this message"
|
1059 |
+
msgstr ""
|
1060 |
+
|
1061 |
+
#: views/installer/footer.php:7
|
1062 |
+
msgid "Back"
|
1063 |
+
msgstr "Zurück"
|
1064 |
+
|
1065 |
+
#: views/installer/header.php:26
|
1066 |
+
msgctxt "(Admin)"
|
1067 |
+
msgid "I need help"
|
1068 |
+
msgstr ""
|
1069 |
+
|
1070 |
+
#: views/installer/header.php:29
|
1071 |
+
msgctxt "(Admin)"
|
1072 |
+
msgid "Developer Docs"
|
1073 |
+
msgstr ""
|
1074 |
+
|
1075 |
+
#: views/installer/header.php:36
|
1076 |
+
msgctxt "(Admin)"
|
1077 |
+
msgid "Configuration"
|
1078 |
+
msgstr ""
|
1079 |
+
|
1080 |
+
#: views/installer/header.php:46
|
1081 |
+
msgctxt "(Admin)"
|
1082 |
+
msgid "Forms & Consent"
|
1083 |
+
msgstr ""
|
1084 |
+
|
1085 |
+
#: views/installer/header.php:51
|
1086 |
+
msgctxt "(Admin)"
|
1087 |
+
msgid "Integrations"
|
1088 |
+
msgstr ""
|
1089 |
+
|
1090 |
+
#: views/installer/steps/configuration-settings.php:23
|
1091 |
+
#: views/installer/steps/configuration-settings.php:73
|
1092 |
+
msgctxt "(Admin)"
|
1093 |
+
msgid "Enter the email address to notify"
|
1094 |
+
msgstr ""
|
1095 |
+
|
1096 |
+
#: views/installer/steps/disclaimer.php:21
|
1097 |
+
msgctxt "(Admin)"
|
1098 |
+
msgid "I accept"
|
1099 |
+
msgstr ""
|
1100 |
+
|
1101 |
+
#: views/installer/welcome-notice.php:7
|
1102 |
+
msgctxt "(Admin)"
|
1103 |
+
msgid "Run the setup wizard"
|
1104 |
+
msgstr ""
|
1105 |
+
|
1106 |
+
#: views/installer/welcome-notice.php:11
|
1107 |
+
msgctxt "(Admin)"
|
1108 |
+
msgid "Auto-install pages"
|
1109 |
+
msgstr ""
|
1110 |
+
|
1111 |
+
#: views/installer/welcome-notice.php:15
|
1112 |
+
msgctxt "(Admin)"
|
1113 |
+
msgid "Skip and install manually"
|
1114 |
+
msgstr ""
|
1115 |
+
|
1116 |
+
#: views/modules/contact-form-7/generator-privacy.php:6
|
1117 |
+
msgctxt "(Admin)"
|
1118 |
+
msgid ""
|
1119 |
+
"This tag generates the default text for Terms & Conditions and/or Privacy "
|
1120 |
+
"Policy checkbox."
|
1121 |
+
msgstr ""
|
1122 |
+
|
1123 |
+
#: views/modules/contact-form-7/generator-privacy.php:15
|
1124 |
+
msgid "Insert"
|
1125 |
+
msgstr "Einfügen"
|
1126 |
+
|
1127 |
+
#: views/modules/wordpress-comments/terms-checkbox.php:6
|
1128 |
+
#: views/modules/wordpress-user/registration-terms-checkbox.php:7
|
1129 |
+
#, php-format
|
1130 |
+
msgid "I accept the %sTerms and Conditions%s and the %sPrivacy Policy%s"
|
1131 |
+
msgstr "Ich akzeptiere die %sAGB%s und die %sDatenschutzerklärung%s"
|
1132 |
+
|
1133 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-consent.php:3
|
1134 |
+
msgid "Manage consents"
|
1135 |
+
msgstr "Zustimmungen verwalten"
|
1136 |
+
|
1137 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-consent.php:6
|
1138 |
+
#: views/privacy-tools/form-consent.php:6
|
1139 |
+
msgid "Here you can withdraw any consents you have given."
|
1140 |
+
msgstr "Hier können Sie Ihre Zustimmungen, die Sie gegeben haben, verwalten."
|
1141 |
+
|
1142 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-consent.php:8
|
1143 |
+
#: views/privacy-tools/form-consent.php:9
|
1144 |
+
msgid "Consent types"
|
1145 |
+
msgstr "Zustimmungsarten"
|
1146 |
+
|
1147 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-consent.php:23
|
1148 |
+
#: views/privacy-tools/form-consent.php:24
|
1149 |
+
msgid "Withdraw"
|
1150 |
+
msgstr "Widerrufen"
|
1151 |
+
|
1152 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:5
|
1153 |
+
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:5
|
1154 |
+
msgctxt "(Admin)"
|
1155 |
+
msgid "Delete this user and all data"
|
1156 |
+
msgstr ""
|
1157 |
+
|
1158 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:11
|
1159 |
+
msgctxt "(Admin)"
|
1160 |
+
msgid "Delete my data"
|
1161 |
+
msgstr ""
|
1162 |
+
|
1163 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:15
|
1164 |
+
#: views/privacy-tools/form-delete.php:13
|
1165 |
+
msgid "Delete all data we have gathered about you."
|
1166 |
+
msgstr "Alle Daten, die wir über Sie gesammelt haben, widerrufen."
|
1167 |
+
|
1168 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:16
|
1169 |
+
#: views/privacy-tools/form-delete.php:14
|
1170 |
+
msgid "If you have a user account on our site, it will also be deleted."
|
1171 |
+
msgstr ""
|
1172 |
+
"Sollten Sie einen Benutzerkonto auf unserer Website haben, wird dieser "
|
1173 |
+
"ebenfalls gelöscht."
|
1174 |
+
|
1175 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:17
|
1176 |
+
#: views/privacy-tools/form-delete.php:15
|
1177 |
+
msgid "Be careful - this action is permanent and CANNOT be undone."
|
1178 |
+
msgstr ""
|
1179 |
+
"Seien Sie vorsichtig - diese Aktion ist dauerhaft und KANN NICHT rückgängig "
|
1180 |
+
"gemacht werden."
|
1181 |
+
|
1182 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:22
|
1183 |
+
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:23
|
1184 |
+
msgctxt "(Admin)"
|
1185 |
+
msgid ""
|
1186 |
+
"You seem to have an administrator or equivalent role, so deleting/"
|
1187 |
+
"anonymizing via this page is disabled."
|
1188 |
+
msgstr ""
|
1189 |
+
|
1190 |
+
#: views/modules/wordpress-user/dashboard/form-export.php:7
|
1191 |
+
#: views/privacy-tools/form-export.php:1
|
1192 |
+
msgid "Download your data"
|
1193 |
+
msgstr "Ihre Daten herunterladen"
|
1194 |
+
|
1195 |
+
#: views/modules/wordpress-user/dashboard/form-export.php:12
|
1196 |
+
#: views/privacy-tools/form-export.php:13
|
1197 |
+
msgid "Download as table"
|
1198 |
+
msgstr "Download als Tabelle"
|
1199 |
+
|
1200 |
+
#: views/modules/wordpress-user/dashboard/form-export.php:15
|
1201 |
+
#: views/privacy-tools/form-export.php:22
|
1202 |
+
msgid "Export as JSON"
|
1203 |
+
msgstr "Export als JSON"
|
1204 |
+
|
1205 |
+
#: views/modules/wordpress-user/dashboard/form-export.php:19
|
1206 |
+
#: views/privacy-tools/form-export.php:4
|
1207 |
+
msgid "You can download all your data formatted as a table for viewing."
|
1208 |
+
msgstr ""
|
1209 |
+
"Sie können alle Ihre Daten als eine Tabelle formatiert zur Ansicht "
|
1210 |
+
"herunterladen."
|
1211 |
+
|
1212 |
+
#: views/modules/wordpress-user/dashboard/form-export.php:20
|
1213 |
+
#: views/privacy-tools/form-export.php:5
|
1214 |
+
msgid "Alternatively, you can export it in machine-readable JSON format."
|
1215 |
+
msgstr "Alternativ können Sie sie im maschinenlesbaren JSON-Format exportieren"
|
1216 |
+
|
1217 |
+
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:11
|
1218 |
+
msgctxt "(Admin)"
|
1219 |
+
msgid "Delete user and all data"
|
1220 |
+
msgstr ""
|
1221 |
+
|
1222 |
+
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:14
|
1223 |
+
msgctxt "(Admin)"
|
1224 |
+
msgid "Anonymize user and all data"
|
1225 |
+
msgstr ""
|
1226 |
+
|
1227 |
+
#: views/modules/wordpress-user/dashboard/profile-page/header.php:2
|
1228 |
+
msgctxt "(Admin)"
|
1229 |
+
msgid "GDPR Data"
|
1230 |
+
msgstr ""
|
1231 |
+
|
1232 |
+
#: views/modules/wordpress-user/dashboard/profile-page/header.php:6
|
1233 |
+
msgctxt "(Admin)"
|
1234 |
+
msgid "This user has been anonymized."
|
1235 |
+
msgstr ""
|
1236 |
+
|
1237 |
+
#: views/modules/wordpress-user/dashboard/profile-page/table-consent.php:4
|
1238 |
+
msgctxt "(Admin)"
|
1239 |
+
msgid "Consents given"
|
1240 |
+
msgstr ""
|
1241 |
+
|
1242 |
+
#: views/modules/wordpress-user/dashboard/profile-page/table-consent.php:17
|
1243 |
+
msgctxt "(Admin)"
|
1244 |
+
msgid "No consents given"
|
1245 |
+
msgstr ""
|
1246 |
+
|
1247 |
+
#: views/privacy-tools/form-consent.php:2
|
1248 |
+
msgid "Consent"
|
1249 |
+
msgstr "Zustimmung"
|
1250 |
+
|
1251 |
+
#: views/privacy-tools/form-delete.php:1
|
1252 |
+
#: views/privacy-tools/notice-admin-role.php:1
|
1253 |
+
msgid "Delete my user and data"
|
1254 |
+
msgstr "Meinen Benutzer und Daten löschen"
|
1255 |
+
|
1256 |
+
#: views/privacy-tools/form-delete.php:7
|
1257 |
+
msgid "Delete my data"
|
1258 |
+
msgstr "Meine Daten löschen"
|
1259 |
+
|
1260 |
+
#: views/privacy-tools/form-identify.php:8
|
1261 |
+
msgid "Back to Privacy Tools"
|
1262 |
+
msgstr "Zurück zu Privatsphäre Tools"
|
1263 |
+
|
1264 |
+
#: views/privacy-tools/form-identify.php:14
|
1265 |
+
msgid "Identify yourself!"
|
1266 |
+
msgstr "Bitte identifizieren Sie sich."
|
1267 |
+
|
1268 |
+
#: views/privacy-tools/form-identify.php:17
|
1269 |
+
#: views/privacy-tools/form-identify.php:20
|
1270 |
+
msgid "Enter your email address"
|
1271 |
+
msgstr "Geben Sie Ihre E-Mail Adresse ein"
|
1272 |
+
|
1273 |
+
#: views/privacy-tools/form-identify.php:23
|
1274 |
+
msgid "Send email"
|
1275 |
+
msgstr "E-Mail senden"
|
1276 |
+
|
1277 |
+
#: views/privacy-tools/notice-admin-role.php:4
|
1278 |
+
msgctxt "(Admin)"
|
1279 |
+
msgid "Data deletion is disabled for administrative accounts."
|
1280 |
+
msgstr ""
|
1281 |
+
|
1282 |
+
#: views/privacy-tools/notices.php:3
|
1283 |
+
msgid ""
|
1284 |
+
"We will send you an email with the link to access your data. Please check "
|
1285 |
+
"your spam folder as well!"
|
1286 |
+
msgstr ""
|
1287 |
+
"Wir senden Ihnen eine E-Mail mit einem Link, um an Ihre Daten zu gelangen. "
|
1288 |
+
"Bitte überprüfen Sie auch Ihren Spam-Ordner."
|
1289 |
+
|
1290 |
+
#: views/privacy-tools/notices.php:7
|
1291 |
+
msgid "The email you entered does not appear to be a valid email."
|
1292 |
+
msgstr ""
|
1293 |
+
"Die angegebene E-Mail Adresse scheint keine richtige E-Mail Adresse zu sein."
|
1294 |
+
|
1295 |
+
#: views/privacy-tools/notices.php:11
|
1296 |
+
msgid "Sorry - the link seems to have expired. Please try again!"
|
1297 |
+
msgstr ""
|
1298 |
+
"Sorry - der Link scheint abgelaufen zu sein. Bitte versuchen Sie es erneut."
|
1299 |
+
|
1300 |
+
#: views/privacy-tools/notices.php:23
|
1301 |
+
msgid "Your personal data has been removed!"
|
1302 |
+
msgstr "Ihre persönlichen Daten wurden entfernt."
|
1303 |
+
|
1304 |
+
#: views/privacy-tools/privacy-tools.php:5
|
1305 |
+
msgid "You are identified as"
|
1306 |
+
msgstr "Du wurdest identifiziert als"
|
languages/gdpr-framework-es_ES.mo
ADDED
Binary file
|
languages/gdpr-framework-es_ES.po
ADDED
@@ -0,0 +1,1750 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Translation of Plugins - WP GDPR - Stable (latest release) in Spanish (Spain)
|
2 |
+
# This file is distributed under the same license as the Plugins - WP GDPR - Stable (latest release) package.
|
3 |
+
msgid ""
|
4 |
+
msgstr ""
|
5 |
+
"Project-Id-Version: The GDPR Framework en español\n"
|
6 |
+
"POT-Creation-Date: 2018-04-18 09:35+0200\n"
|
7 |
+
"PO-Revision-Date: 2018-04-18 09:40+0200\n"
|
8 |
+
"Last-Translator: PNTE <blogs@educacion.navarra.es>\n"
|
9 |
+
"Language-Team: PNTE <blogs@educacion.navarra.es>\n"
|
10 |
+
"Language: es_ES\n"
|
11 |
+
"MIME-Version: 1.0\n"
|
12 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
13 |
+
"Content-Transfer-Encoding: 8bit\n"
|
14 |
+
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
15 |
+
"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
|
16 |
+
"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;"
|
17 |
+
"esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c\n"
|
18 |
+
"X-Generator: Poedit 2.0.6\n"
|
19 |
+
"X-Poedit-SourceCharset: UTF-8\n"
|
20 |
+
"X-Poedit-Basepath: ..\n"
|
21 |
+
"X-Poedit-SearchPath-0: .\n"
|
22 |
+
|
23 |
+
#: bootstrap.php:60
|
24 |
+
msgctxt "(Admin)"
|
25 |
+
msgid "Anonymous"
|
26 |
+
msgstr "Anónimo"
|
27 |
+
|
28 |
+
#: gdpr-framework.php:26
|
29 |
+
msgctxt "(Admin)"
|
30 |
+
msgid "WordPress GDPR › Error"
|
31 |
+
msgstr "WordPress GDPR › Error"
|
32 |
+
|
33 |
+
#: gdpr-framework.php:36
|
34 |
+
msgctxt "(Admin)"
|
35 |
+
msgid "You must be using PHP 5.6.33 or greater."
|
36 |
+
msgstr "Debes utilizar la versión 5.6.33 de PHP o superior."
|
37 |
+
|
38 |
+
#: gdpr-framework.php:37
|
39 |
+
msgctxt "(Admin)"
|
40 |
+
msgid "Invalid PHP version"
|
41 |
+
msgstr "Versión de PHP no válida"
|
42 |
+
|
43 |
+
#: gdpr-framework.php:46
|
44 |
+
msgctxt "(Admin)"
|
45 |
+
msgid "You must be using WordPress 4.3.0 or greater."
|
46 |
+
msgstr "Debes utilizar la versión 4.3.0 de WordPress o superior."
|
47 |
+
|
48 |
+
#: gdpr-framework.php:47
|
49 |
+
msgctxt "(Admin)"
|
50 |
+
msgid "Invalid WordPress version"
|
51 |
+
msgstr "Versión de WordPress no válida"
|
52 |
+
|
53 |
+
#: gdpr-framework.php:59
|
54 |
+
msgctxt "(Admin)"
|
55 |
+
msgid ""
|
56 |
+
"You appear to be running a development version of GDPR. You must run "
|
57 |
+
"<code>composer install</code> from the plugin directory."
|
58 |
+
msgstr ""
|
59 |
+
"Parece que estás ejecutando una versión de desarrollo del plugin GDPR. Debes "
|
60 |
+
"ejecutar <code>composer install</code> desde el directorio del plugin."
|
61 |
+
|
62 |
+
#: gdpr-framework.php:64
|
63 |
+
msgctxt "(Admin)"
|
64 |
+
msgid "Autoloader not found."
|
65 |
+
msgstr "No se ha encontrado el autocargador."
|
66 |
+
|
67 |
+
#: src/Admin/AdminTab.php:115
|
68 |
+
msgctxt "(Admin)"
|
69 |
+
msgid "Save"
|
70 |
+
msgstr "Guardar"
|
71 |
+
|
72 |
+
#: src/Admin/AdminTab.php:151
|
73 |
+
msgctxt "(Admin)"
|
74 |
+
msgid "Policy generated!"
|
75 |
+
msgstr "La política ha sido generada."
|
76 |
+
|
77 |
+
#: src/Admin/AdminTabGeneral.php:11
|
78 |
+
msgctxt "(Admin)"
|
79 |
+
msgid "General"
|
80 |
+
msgstr "General"
|
81 |
+
|
82 |
+
#: src/Admin/AdminTabGeneral.php:38
|
83 |
+
msgctxt "(Admin)"
|
84 |
+
msgid "General Settings"
|
85 |
+
msgstr "Configuración general"
|
86 |
+
|
87 |
+
#: src/Admin/AdminTabGeneral.php:43
|
88 |
+
msgctxt "(Admin)"
|
89 |
+
msgid "Enable Privacy Tools"
|
90 |
+
msgstr "Activar las herramientas de privacidad"
|
91 |
+
|
92 |
+
#: src/Admin/AdminTabGeneral.php:53
|
93 |
+
msgctxt "(Admin)"
|
94 |
+
msgid "Pages"
|
95 |
+
msgstr "Páginas"
|
96 |
+
|
97 |
+
#: src/Admin/AdminTabGeneral.php:58 src/Admin/WordpressAdmin.php:151
|
98 |
+
msgctxt "(Admin)"
|
99 |
+
msgid "Privacy Tools Page"
|
100 |
+
msgstr "Página de herramienta de privacidad"
|
101 |
+
|
102 |
+
#: src/Admin/AdminTabGeneral.php:65 src/Admin/WordpressAdmin.php:147
|
103 |
+
msgctxt "(Admin)"
|
104 |
+
msgid "Privacy Policy Page"
|
105 |
+
msgstr "Página de política de privacidad"
|
106 |
+
|
107 |
+
#: src/Admin/AdminTabGeneral.php:72
|
108 |
+
msgctxt "(Admin)"
|
109 |
+
msgid "Terms & Conditions Page"
|
110 |
+
msgstr "Página de términos y condiciones"
|
111 |
+
|
112 |
+
#: src/Admin/AdminTabGeneral.php:82
|
113 |
+
msgctxt "(Admin)"
|
114 |
+
msgid "View & Export Data"
|
115 |
+
msgstr "Ver y exportar los datos"
|
116 |
+
|
117 |
+
#: src/Admin/AdminTabGeneral.php:87
|
118 |
+
msgctxt "(Admin)"
|
119 |
+
msgid "Export action"
|
120 |
+
msgstr "Acción de exportación"
|
121 |
+
|
122 |
+
#: src/Admin/AdminTabGeneral.php:94 src/Admin/AdminTabGeneral.php:133
|
123 |
+
msgctxt "(Admin)"
|
124 |
+
msgid "Email to notify"
|
125 |
+
msgstr "Email para notificar"
|
126 |
+
|
127 |
+
#: src/Admin/AdminTabGeneral.php:105
|
128 |
+
msgctxt "(Admin)"
|
129 |
+
msgid "Delete & Anonymize Data"
|
130 |
+
msgstr "Borrar y anonimizar los datos"
|
131 |
+
|
132 |
+
#: src/Admin/AdminTabGeneral.php:110
|
133 |
+
msgctxt "(Admin)"
|
134 |
+
msgid "Delete action"
|
135 |
+
msgstr "Acción de borrado"
|
136 |
+
|
137 |
+
#: src/Admin/AdminTabGeneral.php:117
|
138 |
+
msgctxt "(Admin)"
|
139 |
+
msgid "Delete or reassign content?"
|
140 |
+
msgstr "¿Borrar o reasignar el contenido?"
|
141 |
+
|
142 |
+
#: src/Admin/AdminTabGeneral.php:125
|
143 |
+
msgctxt "(Admin)"
|
144 |
+
msgid "Reassign content to"
|
145 |
+
msgstr "Reasignar el contenido a"
|
146 |
+
|
147 |
+
#: src/Admin/AdminTabGeneral.php:145
|
148 |
+
msgctxt "(Admin)"
|
149 |
+
msgid "Styling"
|
150 |
+
msgstr "Estilos"
|
151 |
+
|
152 |
+
#: src/Admin/AdminTabGeneral.php:150
|
153 |
+
msgctxt "(Admin)"
|
154 |
+
msgid "Enable basic styling on Privacy Tools page"
|
155 |
+
msgstr "Activar los estilos básicos en la página de herramientas de privacidad"
|
156 |
+
|
157 |
+
#: src/Admin/AdminTabGeneral.php:162
|
158 |
+
msgctxt "(Admin)"
|
159 |
+
msgid "Compatibility"
|
160 |
+
msgstr "Compatibilidad"
|
161 |
+
|
162 |
+
#: src/Admin/AdminTabGeneral.php:167
|
163 |
+
msgctxt "(Admin)"
|
164 |
+
msgid "Enable automatic theme compatibility"
|
165 |
+
msgstr "Activar la compatibilidad automática del tema"
|
166 |
+
|
167 |
+
#: src/Admin/AdminTabGeneral.php:184 src/Admin/AdminTabGeneral.php:200
|
168 |
+
#: src/Admin/AdminTabGeneral.php:213 src/Admin/AdminTabGeneral.php:252
|
169 |
+
#: views/installer/steps/configuration-settings.php:62
|
170 |
+
msgctxt "(Admin)"
|
171 |
+
msgid "— Select —"
|
172 |
+
msgstr "— Seleccionar —"
|
173 |
+
|
174 |
+
#: src/Admin/WordpressAdmin.php:65
|
175 |
+
msgctxt "(Admin)"
|
176 |
+
msgid "Privacy & GDPR Settings"
|
177 |
+
msgstr "Configuración de la privacidad y el RGPD"
|
178 |
+
|
179 |
+
#: src/Admin/WordpressAdmin.php:66
|
180 |
+
msgctxt "(Admin)"
|
181 |
+
msgid "Privacy"
|
182 |
+
msgstr "Privacidad"
|
183 |
+
|
184 |
+
#: src/Components/Consent/AdminTabConsent.php:30
|
185 |
+
#: src/Components/Consent/AdminTabConsent.php:49
|
186 |
+
msgctxt "(Admin)"
|
187 |
+
msgid "Consent"
|
188 |
+
msgstr "Consentimiento"
|
189 |
+
|
190 |
+
#: src/Components/Consent/AdminTabConsent.php:157
|
191 |
+
msgctxt "(Admin)"
|
192 |
+
msgid "Consent slug is a required field!"
|
193 |
+
msgstr "El slug del consentimiento es un campo obligatorio."
|
194 |
+
|
195 |
+
#: src/Components/Consent/AdminTabConsent.php:162
|
196 |
+
msgctxt "(Admin)"
|
197 |
+
msgid ""
|
198 |
+
"You may only use alphanumeric characters, dash and underscore in the consent "
|
199 |
+
"slug field."
|
200 |
+
msgstr ""
|
201 |
+
"Solo puedes utilizar caracteres alfanuméricos, guiones y guiones bajos en el "
|
202 |
+
"campo del slug de consentimiento."
|
203 |
+
|
204 |
+
#: src/Components/Consent/AdminTabConsent.php:167
|
205 |
+
msgctxt "(Admin)"
|
206 |
+
msgid "Consent title is a required field!"
|
207 |
+
msgstr "El título del consentimiento es un campo obligatorio."
|
208 |
+
|
209 |
+
#: src/Components/Consent/AdminTabConsent.php:179
|
210 |
+
msgid ""
|
211 |
+
"To use this website, you accepted our Privacy Policy. If you wish to "
|
212 |
+
"withdraw your acceptance, please use the \"Delete my data\" button below."
|
213 |
+
msgstr ""
|
214 |
+
"Para utilizar este sitio web, has tenido que aceptar nuestra política de "
|
215 |
+
"privacidad. Si quieres retirar tu aceptación, por favor utiliza el botón "
|
216 |
+
"\"Borrar mis datos\", que aparece a continuación."
|
217 |
+
|
218 |
+
#: src/Components/Consent/ConsentManager.php:46
|
219 |
+
#: views/modules/contact-form-7/content-privacy.php:2
|
220 |
+
#: views/modules/wordpress-comments/terms-checkbox.php:14
|
221 |
+
#: views/modules/wordpress-user/registration-terms-checkbox.php:15
|
222 |
+
#, php-format
|
223 |
+
msgid "I accept the %sPrivacy Policy%s"
|
224 |
+
msgstr "Acepto la %sPolítica de privacidad%s"
|
225 |
+
|
226 |
+
#: src/Components/Consent/ConsentManager.php:50
|
227 |
+
#: src/Components/Consent/ConsentManager.php:69
|
228 |
+
msgctxt "(Admin)"
|
229 |
+
msgid ""
|
230 |
+
"This consent is not visible by default. If someone wishes to withdraw it, "
|
231 |
+
"they should simply request to delete all their data."
|
232 |
+
msgstr ""
|
233 |
+
"Este consentimiento no es visible por defecto. Si alguien desea retirarlo, "
|
234 |
+
"simplemente debe solicitar que se borren todos sus datos."
|
235 |
+
|
236 |
+
#: src/Components/Consent/ConsentManager.php:65
|
237 |
+
#, php-format
|
238 |
+
msgid "I accept the %sTerms & Conditions%s"
|
239 |
+
msgstr "Acepto los %sTérminos y condiciones%s"
|
240 |
+
|
241 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:19
|
242 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:61
|
243 |
+
#: views/admin/privacy-policy/generated.php:1 views/installer/header.php:41
|
244 |
+
msgctxt "(Admin)"
|
245 |
+
msgid "Privacy Policy"
|
246 |
+
msgstr "Política de privacidad"
|
247 |
+
|
248 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:70
|
249 |
+
msgctxt "(Admin)"
|
250 |
+
msgid "Company information"
|
251 |
+
msgstr "Información de la compañía"
|
252 |
+
|
253 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:75
|
254 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:209
|
255 |
+
msgctxt "(Admin)"
|
256 |
+
msgid "Company Name"
|
257 |
+
msgstr "Nombre de la compañía"
|
258 |
+
|
259 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:82
|
260 |
+
msgctxt "(Admin)"
|
261 |
+
msgid "Company Email"
|
262 |
+
msgstr "Email de la compañía"
|
263 |
+
|
264 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:89
|
265 |
+
msgctxt "(Admin)"
|
266 |
+
msgid "Company Location"
|
267 |
+
msgstr "Ubicación de la compañía"
|
268 |
+
|
269 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:105
|
270 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:245
|
271 |
+
msgctxt "(Admin)"
|
272 |
+
msgid "Representative Contact Name"
|
273 |
+
msgstr "Nombre del representante para contacto"
|
274 |
+
|
275 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:112
|
276 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:252
|
277 |
+
msgctxt "(Admin)"
|
278 |
+
msgid "Representative Contact Email"
|
279 |
+
msgstr "Email del representante para contacto"
|
280 |
+
|
281 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:119
|
282 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:259
|
283 |
+
msgctxt "(Admin)"
|
284 |
+
msgid "Representative Contact Phone"
|
285 |
+
msgstr "Teléfono del representante para contacto"
|
286 |
+
|
287 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:135
|
288 |
+
msgctxt "(Admin)"
|
289 |
+
msgid "Data Protection Authority"
|
290 |
+
msgstr "Autoridad de protección de datos"
|
291 |
+
|
292 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:141
|
293 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:286
|
294 |
+
msgctxt "(Admin)"
|
295 |
+
msgid "Data Protection Authority Website"
|
296 |
+
msgstr "Sitio web de la autoridad de protección de datos"
|
297 |
+
|
298 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:148
|
299 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:293
|
300 |
+
msgctxt "(Admin)"
|
301 |
+
msgid "Data Protection Authority Email"
|
302 |
+
msgstr "Email de la autoridad de protección de datos"
|
303 |
+
|
304 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:155
|
305 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:300
|
306 |
+
msgctxt "(Admin)"
|
307 |
+
msgid "Data Protection Authority Phone"
|
308 |
+
msgstr "Teléfono de la autoridad de protección de datos"
|
309 |
+
|
310 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:165
|
311 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:175
|
312 |
+
msgctxt "(Admin)"
|
313 |
+
msgid "Data Protection Officer"
|
314 |
+
msgstr "Responsable de protección de datos"
|
315 |
+
|
316 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:168
|
317 |
+
msgctxt "(Admin)"
|
318 |
+
msgid "Knowledge base: Do I need to appoint a Data Protection Officer?"
|
319 |
+
msgstr ""
|
320 |
+
"Base de conocimiento: ¿tengo que nombrar a un responsable de protección de "
|
321 |
+
"datos?"
|
322 |
+
|
323 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:182
|
324 |
+
msgctxt "(Admin)"
|
325 |
+
msgid "Data Protection Officer Name"
|
326 |
+
msgstr "Nombre del responsable de protección de datos"
|
327 |
+
|
328 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:190
|
329 |
+
msgctxt "(Admin)"
|
330 |
+
msgid "Data Protection Officer Email"
|
331 |
+
msgstr "Email del responsable de protección de datos"
|
332 |
+
|
333 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:216
|
334 |
+
msgctxt "(Admin)"
|
335 |
+
msgid "Contact Email"
|
336 |
+
msgstr "Email de contacto"
|
337 |
+
|
338 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:235
|
339 |
+
msgctxt "(Admin)"
|
340 |
+
msgid "Representative Contact"
|
341 |
+
msgstr "Contacto con el representante"
|
342 |
+
|
343 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:238
|
344 |
+
msgctxt "(Admin)"
|
345 |
+
msgid "Knowledge base: Do I need to appoint an EU-based representative?"
|
346 |
+
msgstr ""
|
347 |
+
"Base de conocimiento: ¿tengo que nombrar a un representante basado en la "
|
348 |
+
"Unión Europea?"
|
349 |
+
|
350 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:317
|
351 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:324
|
352 |
+
msgctxt "(Admin)"
|
353 |
+
msgid "DPO Name"
|
354 |
+
msgstr "Nombre del DPO (Responsable de Protección de Datos)"
|
355 |
+
|
356 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:420
|
357 |
+
msgctxt "(Admin)"
|
358 |
+
msgid "Save & Generate Policy"
|
359 |
+
msgstr "Guardar y generar la política"
|
360 |
+
|
361 |
+
#: src/Components/PrivacyPolicy/PrivacyPolicy.php:82
|
362 |
+
#: src/Installer/Installer.php:271 src/Installer/Steps/PolicySettings.php:199
|
363 |
+
#: views/themes/storefront/footer.php:3
|
364 |
+
#: views/themes/twentyseventeen/footer.php:3
|
365 |
+
#: views/themes/twentysixteen/footer.php:4
|
366 |
+
msgid "Privacy Policy"
|
367 |
+
msgstr "Política de privacidad"
|
368 |
+
|
369 |
+
#: src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php:19
|
370 |
+
msgid "This page is currently disabled."
|
371 |
+
msgstr "Esta página se encuentra desactivada en este momento."
|
372 |
+
|
373 |
+
#: src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php:35
|
374 |
+
#: src/Installer/Installer.php:279
|
375 |
+
#: src/Installer/Steps/ConfigurationPages.php:55
|
376 |
+
#: views/themes/storefront/footer.php:7
|
377 |
+
#: views/themes/twentyseventeen/footer.php:7
|
378 |
+
#: views/themes/twentysixteen/footer.php:9
|
379 |
+
msgid "Privacy Tools"
|
380 |
+
msgstr "Herramientas de privacidad"
|
381 |
+
|
382 |
+
#: src/Components/Support/AdminTabSupport.php:13
|
383 |
+
#: src/Components/Support/AdminTabSupport.php:20
|
384 |
+
msgctxt "(Admin)"
|
385 |
+
msgid "Support"
|
386 |
+
msgstr "Soporte"
|
387 |
+
|
388 |
+
#: src/Components/WordpressComments/WordpressComments.php:90
|
389 |
+
#, php-format
|
390 |
+
msgid ""
|
391 |
+
"%sERROR:%s You need to accept the terms and conditions to post a comment."
|
392 |
+
msgstr ""
|
393 |
+
"%sERROR:%s para publicar un comentario, debes aceptar los términos y "
|
394 |
+
"condiciones."
|
395 |
+
|
396 |
+
#: src/Components/WordpressUser/Controllers/DashboardDataPageController.php:54
|
397 |
+
#: views/privacy-tools/notices.php:19
|
398 |
+
msgid "We have received your request and will reply within 30 days."
|
399 |
+
msgstr "Hemos recibido tu solicitud y la responderemos en 30 días."
|
400 |
+
|
401 |
+
#: src/Components/WordpressUser/Controllers/DashboardDataPageController.php:59
|
402 |
+
#: views/privacy-tools/notices.php:15
|
403 |
+
msgid "Consent withdrawn."
|
404 |
+
msgstr "El consentimiento ha sido retirado."
|
405 |
+
|
406 |
+
#: src/Components/WordpressUser/RegistrationForm.php:42
|
407 |
+
msgid "<strong>ERROR</strong>: You must accept the terms and conditions."
|
408 |
+
msgstr "<strong>ERROR</strong>: debes aceptar los términos y condiciones."
|
409 |
+
|
410 |
+
#: src/Components/WordpressUser/WordpressUser.php:63
|
411 |
+
#: src/Components/WordpressUser/WordpressUser.php:64
|
412 |
+
#: views/modules/wordpress-user/dashboard/data-page/header.php:2
|
413 |
+
msgctxt "(Admin)"
|
414 |
+
msgid "Privacy Tools"
|
415 |
+
msgstr "Herramientas de privacidad"
|
416 |
+
|
417 |
+
#: src/DataSubject/AdminTabDataSubject.php:27
|
418 |
+
#: src/DataSubject/AdminTabDataSubject.php:41
|
419 |
+
msgctxt "(Admin)"
|
420 |
+
msgid "Data Subjects"
|
421 |
+
msgstr "Datos personales"
|
422 |
+
|
423 |
+
#: src/DataSubject/DataRepository.php:143
|
424 |
+
msgid "Data exported"
|
425 |
+
msgstr "Los datos han sido exportados"
|
426 |
+
|
427 |
+
#: src/DataSubject/DataRepository.php:158
|
428 |
+
msgid "Data export request"
|
429 |
+
msgstr "Petición de exportación de datos"
|
430 |
+
|
431 |
+
#: src/DataSubject/DataRepository.php:171
|
432 |
+
msgid "Data removed"
|
433 |
+
msgstr "Los datos han sido eliminados"
|
434 |
+
|
435 |
+
#: src/DataSubject/DataRepository.php:186
|
436 |
+
msgid "Data removal request"
|
437 |
+
msgstr "Petición de solicitud de datos"
|
438 |
+
|
439 |
+
#: src/DataSubject/DataSubjectIdentificator.php:65
|
440 |
+
#: src/DataSubject/DataSubjectIdentificator.php:82
|
441 |
+
msgid "Your personal data on"
|
442 |
+
msgstr "Tus datos personales en"
|
443 |
+
|
444 |
+
#: src/Helpers.php:27
|
445 |
+
msgctxt "(Admin)"
|
446 |
+
msgid "Austria"
|
447 |
+
msgstr "Austria"
|
448 |
+
|
449 |
+
#: src/Helpers.php:28
|
450 |
+
msgctxt "(Admin)"
|
451 |
+
msgid "Belgium"
|
452 |
+
msgstr "Bélgica"
|
453 |
+
|
454 |
+
#: src/Helpers.php:29
|
455 |
+
msgctxt "(Admin)"
|
456 |
+
msgid "Bulgaria"
|
457 |
+
msgstr "Bulgaria"
|
458 |
+
|
459 |
+
#: src/Helpers.php:30
|
460 |
+
msgctxt "(Admin)"
|
461 |
+
msgid "Croatia"
|
462 |
+
msgstr "Croacia"
|
463 |
+
|
464 |
+
#: src/Helpers.php:31
|
465 |
+
msgctxt "(Admin)"
|
466 |
+
msgid "Cyprus"
|
467 |
+
msgstr "Chipre"
|
468 |
+
|
469 |
+
#: src/Helpers.php:32
|
470 |
+
msgctxt "(Admin)"
|
471 |
+
msgid "Czech Republic"
|
472 |
+
msgstr "República Checa"
|
473 |
+
|
474 |
+
#: src/Helpers.php:33
|
475 |
+
msgctxt "(Admin)"
|
476 |
+
msgid "Denmark"
|
477 |
+
msgstr "Dinamarca"
|
478 |
+
|
479 |
+
#: src/Helpers.php:34
|
480 |
+
msgctxt "(Admin)"
|
481 |
+
msgid "Estonia"
|
482 |
+
msgstr "Estonia"
|
483 |
+
|
484 |
+
#: src/Helpers.php:35
|
485 |
+
msgctxt "(Admin)"
|
486 |
+
msgid "Finland"
|
487 |
+
msgstr "Finlandia"
|
488 |
+
|
489 |
+
#: src/Helpers.php:36
|
490 |
+
msgctxt "(Admin)"
|
491 |
+
msgid "France"
|
492 |
+
msgstr "Francia"
|
493 |
+
|
494 |
+
#: src/Helpers.php:37
|
495 |
+
msgctxt "(Admin)"
|
496 |
+
msgid "Germany"
|
497 |
+
msgstr "Alemania"
|
498 |
+
|
499 |
+
#: src/Helpers.php:38
|
500 |
+
msgctxt "(Admin)"
|
501 |
+
msgid "Greece"
|
502 |
+
msgstr "Grecia"
|
503 |
+
|
504 |
+
#: src/Helpers.php:39
|
505 |
+
msgctxt "(Admin)"
|
506 |
+
msgid "Hungary"
|
507 |
+
msgstr "Hungría"
|
508 |
+
|
509 |
+
#: src/Helpers.php:40
|
510 |
+
msgctxt "(Admin)"
|
511 |
+
msgid "Ireland"
|
512 |
+
msgstr "Irlanda"
|
513 |
+
|
514 |
+
#: src/Helpers.php:41
|
515 |
+
msgctxt "(Admin)"
|
516 |
+
msgid "Italy"
|
517 |
+
msgstr "Italia"
|
518 |
+
|
519 |
+
#: src/Helpers.php:42
|
520 |
+
msgctxt "(Admin)"
|
521 |
+
msgid "Latvia"
|
522 |
+
msgstr "Letonia"
|
523 |
+
|
524 |
+
#: src/Helpers.php:43
|
525 |
+
msgctxt "(Admin)"
|
526 |
+
msgid "Lithuania"
|
527 |
+
msgstr "Lituania"
|
528 |
+
|
529 |
+
#: src/Helpers.php:44
|
530 |
+
msgctxt "(Admin)"
|
531 |
+
msgid "Luxembourg"
|
532 |
+
msgstr "Luxemburgo"
|
533 |
+
|
534 |
+
#: src/Helpers.php:45
|
535 |
+
msgctxt "(Admin)"
|
536 |
+
msgid "Malta"
|
537 |
+
msgstr "Malta"
|
538 |
+
|
539 |
+
#: src/Helpers.php:46
|
540 |
+
msgctxt "(Admin)"
|
541 |
+
msgid "Netherlands"
|
542 |
+
msgstr "Países Bajos"
|
543 |
+
|
544 |
+
#: src/Helpers.php:47
|
545 |
+
msgctxt "(Admin)"
|
546 |
+
msgid "Poland"
|
547 |
+
msgstr "Polonia"
|
548 |
+
|
549 |
+
#: src/Helpers.php:48
|
550 |
+
msgctxt "(Admin)"
|
551 |
+
msgid "Portugal"
|
552 |
+
msgstr "Portugal"
|
553 |
+
|
554 |
+
#: src/Helpers.php:49
|
555 |
+
msgctxt "(Admin)"
|
556 |
+
msgid "Romania"
|
557 |
+
msgstr "Rumanía"
|
558 |
+
|
559 |
+
#: src/Helpers.php:50
|
560 |
+
msgctxt "(Admin)"
|
561 |
+
msgid "Slovakia"
|
562 |
+
msgstr "Eslovaquia"
|
563 |
+
|
564 |
+
#: src/Helpers.php:51
|
565 |
+
msgctxt "(Admin)"
|
566 |
+
msgid "Slovenia"
|
567 |
+
msgstr "Eslovenia"
|
568 |
+
|
569 |
+
#: src/Helpers.php:52
|
570 |
+
msgctxt "(Admin)"
|
571 |
+
msgid "Spain"
|
572 |
+
msgstr "España"
|
573 |
+
|
574 |
+
#: src/Helpers.php:53
|
575 |
+
msgctxt "(Admin)"
|
576 |
+
msgid "Sweden"
|
577 |
+
msgstr "Suecia"
|
578 |
+
|
579 |
+
#: src/Helpers.php:54
|
580 |
+
msgctxt "(Admin)"
|
581 |
+
msgid "United Kingdom"
|
582 |
+
msgstr "Reino Unido"
|
583 |
+
|
584 |
+
#: src/Helpers.php:69
|
585 |
+
msgctxt "(Admin)"
|
586 |
+
msgid "Iceland"
|
587 |
+
msgstr "Islandia"
|
588 |
+
|
589 |
+
#: src/Helpers.php:70
|
590 |
+
msgctxt "(Admin)"
|
591 |
+
msgid "Norway"
|
592 |
+
msgstr "Noruega"
|
593 |
+
|
594 |
+
#: src/Helpers.php:71
|
595 |
+
msgctxt "(Admin)"
|
596 |
+
msgid "Liechtenstein"
|
597 |
+
msgstr "Liechtenstein"
|
598 |
+
|
599 |
+
#: src/Helpers.php:72
|
600 |
+
msgctxt "(Admin)"
|
601 |
+
msgid "Switzerland"
|
602 |
+
msgstr "Suiza"
|
603 |
+
|
604 |
+
#: src/Helpers.php:73
|
605 |
+
msgctxt "(Admin)"
|
606 |
+
msgid "United States"
|
607 |
+
msgstr "Estados Unidos"
|
608 |
+
|
609 |
+
#: src/Helpers.php:74
|
610 |
+
msgctxt "(Admin)"
|
611 |
+
msgid "Rest of the world"
|
612 |
+
msgstr "Resto del mundo"
|
613 |
+
|
614 |
+
#: src/Helpers.php:145
|
615 |
+
msgid "An error has occurred. Please contact the site administrator."
|
616 |
+
msgstr ""
|
617 |
+
"Se ha producido un error. Por favor, ponte en contacto con el administrador "
|
618 |
+
"del sitio."
|
619 |
+
|
620 |
+
#: src/Installer/Installer.php:135
|
621 |
+
msgctxt "(Admin)"
|
622 |
+
msgid "Setup Wizard"
|
623 |
+
msgstr "Asistente de configuración"
|
624 |
+
|
625 |
+
#: src/Installer/Steps/ConfigurationPages.php:23
|
626 |
+
#: src/Installer/Steps/PolicySettings.php:23
|
627 |
+
#: src/Installer/Steps/PolicySettings.php:48
|
628 |
+
msgctxt "(Admin)"
|
629 |
+
msgid "— Create a new page —"
|
630 |
+
msgstr "— Crear una nueva página —"
|
631 |
+
|
632 |
+
#: src/Installer/Steps/PolicySettings.php:38
|
633 |
+
msgctxt "(Admin)"
|
634 |
+
msgid ""
|
635 |
+
"We have automatically selected your WooCommerce Terms & Conditions page."
|
636 |
+
msgstr ""
|
637 |
+
"Hemos seleccionado automáticamente tu página de términos y condiciones de "
|
638 |
+
"WooCommerce."
|
639 |
+
|
640 |
+
#: src/Modules/ContactForm7/ContactForm7.php:35
|
641 |
+
msgctxt "(Admin)"
|
642 |
+
msgid "gdpr terms txt"
|
643 |
+
msgstr "gdpr terms txt"
|
644 |
+
|
645 |
+
#: src/Router.php:80 src/Router.php:92 src/Router.php:125 src/Router.php:141
|
646 |
+
#, php-format
|
647 |
+
msgid "Nonce error for action \"%s\". Please go back and try again!"
|
648 |
+
msgstr ""
|
649 |
+
"Error del nonce correspondiente a la acción \"%s\". Por favor, vuelve atrás "
|
650 |
+
"e inténtalo de nuevo."
|
651 |
+
|
652 |
+
#: src/Router.php:149
|
653 |
+
msgctxt "(Admin)"
|
654 |
+
msgid "You do not have the required permissions to perform this action!"
|
655 |
+
msgstr "No tienes los permisos necesarios para llevar a cabo esta acción."
|
656 |
+
|
657 |
+
#: views/admin/consent.php:3
|
658 |
+
msgctxt "(Admin)"
|
659 |
+
msgid "Default consent types"
|
660 |
+
msgstr "Tipos de consentimiento por defecto"
|
661 |
+
|
662 |
+
#: views/admin/consent.php:4
|
663 |
+
msgctxt "(Admin)"
|
664 |
+
msgid ""
|
665 |
+
"These are the consent types that have been automatically registered by the "
|
666 |
+
"framework or a plugin."
|
667 |
+
msgstr ""
|
668 |
+
"Estos son los tipos de consentimiento por defecto que han sido registrados "
|
669 |
+
"automáticamente por el framework o un plugin."
|
670 |
+
|
671 |
+
#: views/admin/consent.php:7 views/admin/consent.php:52
|
672 |
+
msgctxt "(Admin)"
|
673 |
+
msgid "Slug"
|
674 |
+
msgstr "Slug"
|
675 |
+
|
676 |
+
#: views/admin/consent.php:8 views/admin/consent.php:38
|
677 |
+
#: views/admin/consent.php:60
|
678 |
+
msgctxt "(Admin)"
|
679 |
+
msgid "Title"
|
680 |
+
msgstr "Título"
|
681 |
+
|
682 |
+
#: views/admin/consent.php:9 views/admin/consent.php:41
|
683 |
+
#: views/admin/consent.php:63
|
684 |
+
msgctxt "(Admin)"
|
685 |
+
msgid "Description"
|
686 |
+
msgstr "Descripción"
|
687 |
+
|
688 |
+
#: views/admin/consent.php:10
|
689 |
+
msgctxt "(Admin)"
|
690 |
+
msgid "Visibility"
|
691 |
+
msgstr "Visibilidad"
|
692 |
+
|
693 |
+
#: views/admin/consent.php:18
|
694 |
+
msgctxt "(Admin)"
|
695 |
+
msgid "Visible"
|
696 |
+
msgstr "Visible"
|
697 |
+
|
698 |
+
#: views/admin/consent.php:20
|
699 |
+
msgctxt "(Admin)"
|
700 |
+
msgid "Hidden"
|
701 |
+
msgstr "Oculto"
|
702 |
+
|
703 |
+
#: views/admin/consent.php:29
|
704 |
+
msgctxt "(Admin)"
|
705 |
+
msgid "Custom consent types"
|
706 |
+
msgstr "Tipos de consentimiento personalizados"
|
707 |
+
|
708 |
+
#: views/admin/consent.php:30
|
709 |
+
msgctxt "(Admin)"
|
710 |
+
msgid ""
|
711 |
+
"Here you can add custom consent types to track. They will not be used "
|
712 |
+
"anywhere by default - you will need to build an integration for each of them."
|
713 |
+
msgstr ""
|
714 |
+
"Desde aquí puedes añadir tipos de consentimiento personalizados. No se "
|
715 |
+
"utilizarán en ningún lugar por defecto, así que tendrás que construir una "
|
716 |
+
"integración para cada uno de elloss"
|
717 |
+
|
718 |
+
#: views/admin/consent.php:35
|
719 |
+
msgctxt "(Admin)"
|
720 |
+
msgid "Machine-readable slug"
|
721 |
+
msgstr "Slug legible por máquinas"
|
722 |
+
|
723 |
+
#: views/admin/consent.php:44 views/admin/consent.php:68
|
724 |
+
msgctxt "(Admin)"
|
725 |
+
msgid "Visible?"
|
726 |
+
msgstr "¿Visible?"
|
727 |
+
|
728 |
+
#: views/admin/consent.php:72
|
729 |
+
msgctxt "(Admin)"
|
730 |
+
msgid "Remove"
|
731 |
+
msgstr "Eliminar"
|
732 |
+
|
733 |
+
#: views/admin/consent.php:93
|
734 |
+
msgctxt "(Admin)"
|
735 |
+
msgid "Additional info"
|
736 |
+
msgstr "Información adicional"
|
737 |
+
|
738 |
+
#: views/admin/consent.php:95
|
739 |
+
msgctxt "(Admin)"
|
740 |
+
msgid ""
|
741 |
+
"This text will be displayed to your data subjects on the Privacy Tools page."
|
742 |
+
msgstr ""
|
743 |
+
"Este texto se mostrará a todas las personas, en la página de herramientas de "
|
744 |
+
"privacidad."
|
745 |
+
|
746 |
+
#: views/admin/data-subjects/search-form.php:2
|
747 |
+
msgctxt "(Admin)"
|
748 |
+
msgid ""
|
749 |
+
"On this page, you can find which data subjects personal data you are storing "
|
750 |
+
"and download, export or delete it."
|
751 |
+
msgstr ""
|
752 |
+
"En esta página puedes averiguar qué datos personales estás almacenando, y "
|
753 |
+
"también puedes descargarlos, exportarlos o borrarlos."
|
754 |
+
|
755 |
+
#: views/admin/data-subjects/search-form.php:10
|
756 |
+
msgctxt "(Admin)"
|
757 |
+
msgid "Find data subject by email"
|
758 |
+
msgstr "Encontrar datos personales por email"
|
759 |
+
|
760 |
+
#: views/admin/data-subjects/search-form.php:11
|
761 |
+
msgctxt "(Admin)"
|
762 |
+
msgid "Email address"
|
763 |
+
msgstr "Dirección de email"
|
764 |
+
|
765 |
+
#: views/admin/data-subjects/search-form.php:16
|
766 |
+
msgctxt "(Admin)"
|
767 |
+
msgid "Search"
|
768 |
+
msgstr "Buscar"
|
769 |
+
|
770 |
+
#: views/admin/data-subjects/search-results.php:7
|
771 |
+
msgctxt "(Admin)"
|
772 |
+
msgid "Username"
|
773 |
+
msgstr "Nombre de usuario"
|
774 |
+
|
775 |
+
#: views/admin/data-subjects/search-results.php:12
|
776 |
+
msgctxt "(Admin)"
|
777 |
+
msgid "is not a registered user."
|
778 |
+
msgstr "no es un usuario registrado."
|
779 |
+
|
780 |
+
#: views/admin/data-subjects/search-results.php:16
|
781 |
+
msgctxt "(Admin)"
|
782 |
+
msgid "Download data (html)"
|
783 |
+
msgstr "Descargar los datos (HTML)"
|
784 |
+
|
785 |
+
#: views/admin/data-subjects/search-results.php:17
|
786 |
+
msgctxt "(Admin)"
|
787 |
+
msgid "Export data (json)"
|
788 |
+
msgstr "Exportar los datos (JSON)"
|
789 |
+
|
790 |
+
#: views/admin/data-subjects/search-results.php:21
|
791 |
+
msgctxt "(Admin)"
|
792 |
+
msgid ""
|
793 |
+
"This user has admin capabilities. Deleting data via this interface is "
|
794 |
+
"disabled."
|
795 |
+
msgstr ""
|
796 |
+
"Este usuario tiene capacidades de administrador. Se ha desactivado la "
|
797 |
+
"posibilidad de borrar sus datos mediante este interfaz."
|
798 |
+
|
799 |
+
#: views/admin/data-subjects/search-results.php:24
|
800 |
+
msgctxt "(Admin)"
|
801 |
+
msgid "Anonymize data"
|
802 |
+
msgstr "Anonimizar los datos"
|
803 |
+
|
804 |
+
#: views/admin/data-subjects/search-results.php:25
|
805 |
+
msgctxt "(Admin)"
|
806 |
+
msgid "Delete data"
|
807 |
+
msgstr "Borrar los datos"
|
808 |
+
|
809 |
+
#: views/admin/data-subjects/search-results.php:29
|
810 |
+
msgctxt "(Admin)"
|
811 |
+
msgid "No data found!"
|
812 |
+
msgstr "No se ha encontrado ningún dato."
|
813 |
+
|
814 |
+
#: views/admin/general/delete-action-email.php:5
|
815 |
+
#: views/admin/general/export-action-email.php:5
|
816 |
+
#: views/installer/steps/configuration-settings.php:29
|
817 |
+
#: views/installer/steps/configuration-settings.php:79
|
818 |
+
msgid "Email address"
|
819 |
+
msgstr "Dirección de email"
|
820 |
+
|
821 |
+
#: views/admin/general/delete-action-reassign.php:3
|
822 |
+
#: views/installer/steps/configuration-settings.php:50
|
823 |
+
msgctxt "(Admin)"
|
824 |
+
msgid "Delete content"
|
825 |
+
msgstr "Borrar el contenido"
|
826 |
+
|
827 |
+
#: views/admin/general/delete-action-reassign.php:6
|
828 |
+
#: views/installer/steps/configuration-settings.php:53
|
829 |
+
msgctxt "(Admin)"
|
830 |
+
msgid "Reassign content to a user"
|
831 |
+
msgstr "Reasignar el contenido a un usuario"
|
832 |
+
|
833 |
+
#: views/admin/general/delete-action-reassign.php:10
|
834 |
+
msgctxt "(Admin)"
|
835 |
+
msgid ""
|
836 |
+
"If the user has submitted any content on your site, should it be deleted or "
|
837 |
+
"reassigned to another user?"
|
838 |
+
msgstr ""
|
839 |
+
"Si el usuario ha enviado cualquier contenido al sitio, debe borrarse o "
|
840 |
+
"reasignarse a otro usuario?"
|
841 |
+
|
842 |
+
#: views/admin/general/description-data-page.php:2
|
843 |
+
msgctxt "(Admin)"
|
844 |
+
msgid ""
|
845 |
+
"Select the page where users can go to control their data. This page must "
|
846 |
+
"contain the [gdpr_privacy_tools] shortcode."
|
847 |
+
msgstr ""
|
848 |
+
"Selecciona la página a la que los usuarios pueden ir para controlar sus "
|
849 |
+
"datos. Esta página debe contener el shortcode [gdpr_privacy_tools]."
|
850 |
+
|
851 |
+
#: views/admin/general/description-delete-action.php:2
|
852 |
+
msgctxt "(Admin)"
|
853 |
+
msgid "What should happen if a data subject requests deleting their data."
|
854 |
+
msgstr "¿Qué debe ocurrir si una persona solicita el borrado de sus datos?"
|
855 |
+
|
856 |
+
#: views/admin/general/description-export-action.php:2
|
857 |
+
msgctxt "(Admin)"
|
858 |
+
msgid ""
|
859 |
+
"What should happen if a data subject requests viewing or exporting their "
|
860 |
+
"data."
|
861 |
+
msgstr "¿Qué debe ocurrir si una persona solicita ver o exportar sus datos?"
|
862 |
+
|
863 |
+
#: views/admin/general/description-terms-page.php:2
|
864 |
+
msgctxt "(Admin)"
|
865 |
+
msgid "Optional. Select the page which contains your Terms & Conditions"
|
866 |
+
msgstr ""
|
867 |
+
"Opcional. Selecciona la página que contiene tus términos y condiciones."
|
868 |
+
|
869 |
+
#: views/admin/general/enable.php:9
|
870 |
+
msgctxt "(Admin)"
|
871 |
+
msgid "Enable the view, export and forget functionality for users and visitors"
|
872 |
+
msgstr ""
|
873 |
+
"Activar las funcionalidades de visualización, exportación y olvido para los "
|
874 |
+
"usuarios y visitantes"
|
875 |
+
|
876 |
+
#: views/admin/general/enable.php:12
|
877 |
+
msgctxt "(Admin)"
|
878 |
+
msgid ""
|
879 |
+
"Enable the Privacy Tools page on front-end and dashboard. This allows "
|
880 |
+
"visitors to request viewing and deleting their personal data and withdraw "
|
881 |
+
"consents."
|
882 |
+
msgstr ""
|
883 |
+
"Activa la página de herramientas de privacidad en el frontend y en el "
|
884 |
+
"escritorio. Esto permite que los visitantes soliciten ver y borrar sus datos "
|
885 |
+
"peronales, así como retirar su consentimiento."
|
886 |
+
|
887 |
+
#: views/admin/general/stylesheet.php:9
|
888 |
+
msgctxt "(Admin)"
|
889 |
+
msgid "Enable basic styling for Privacy Tools page."
|
890 |
+
msgstr ""
|
891 |
+
"Activar los estilos básicos de la página de herramientas de privacidad."
|
892 |
+
|
893 |
+
#: views/admin/general/theme-compatibility.php:9
|
894 |
+
#: views/installer/steps/integrations.php:21
|
895 |
+
msgctxt "(Admin)"
|
896 |
+
msgid ""
|
897 |
+
"Automatically add Privacy Policy and Privacy Tools links to your site footer."
|
898 |
+
msgstr ""
|
899 |
+
"Añadir automáticamente los enlaces de política de privacidad y herramientas "
|
900 |
+
"de privacidad al pie de página del sitio."
|
901 |
+
|
902 |
+
#: views/admin/notices/header.php:4 views/admin/settings-page.php:3
|
903 |
+
#: views/installer/header.php:23
|
904 |
+
msgctxt "(Admin)"
|
905 |
+
msgid "The GDPR Framework"
|
906 |
+
msgstr "The GDPR Framework"
|
907 |
+
|
908 |
+
#: views/admin/notices/helper-autoinstall.php:2
|
909 |
+
msgctxt "(Admin)"
|
910 |
+
msgid ""
|
911 |
+
"A Privacy Policy page has been created, but it is empty. You can generate a "
|
912 |
+
"policy template on this page."
|
913 |
+
msgstr ""
|
914 |
+
"Se ha creado una política de privacidad, pero está vacía. Puedes generar una "
|
915 |
+
"plantilla de política de privacidad desde esta página."
|
916 |
+
|
917 |
+
#: views/admin/notices/helper-policy.php:2
|
918 |
+
msgctxt "(Admin)"
|
919 |
+
msgid ""
|
920 |
+
"Heads up - your Privacy Policy still requires some attention. Find the "
|
921 |
+
"places marked with [TODO] and replace them with real content!"
|
922 |
+
msgstr ""
|
923 |
+
"Atención: tu página de política de privacidad todavía requiere atención. "
|
924 |
+
"Encuentra los lugares marcados con [TODO] y sustitúyelos por contenido real."
|
925 |
+
|
926 |
+
#: views/admin/notices/helper-tools.php:2
|
927 |
+
msgctxt "(Admin)"
|
928 |
+
msgid "The contents of this page should contain the [gdpr_tools] shortcode."
|
929 |
+
msgstr "El contenido de esta página debe incluir el shortcode [gdpr_tools]."
|
930 |
+
|
931 |
+
#: views/admin/privacy-policy/description-policy-page.php:2
|
932 |
+
msgctxt "(Admin)"
|
933 |
+
msgid "Select the page which will contain your Privacy Policy"
|
934 |
+
msgstr "Selecciona la página que contendrá tu política de privacidad."
|
935 |
+
|
936 |
+
#: views/admin/privacy-policy/generated.php:3
|
937 |
+
msgctxt "(Admin)"
|
938 |
+
msgid "Your Privacy Policy has been generated."
|
939 |
+
msgstr "Se ha generado tu página de política de privacidad."
|
940 |
+
|
941 |
+
#: views/admin/privacy-policy/generated.php:20
|
942 |
+
msgctxt "(Admin)"
|
943 |
+
msgid "« Back"
|
944 |
+
msgstr "« Volver atrás"
|
945 |
+
|
946 |
+
#: views/admin/privacy-policy/header.php:2
|
947 |
+
msgctxt "(Admin)"
|
948 |
+
msgid ""
|
949 |
+
"This page allows you to generate a Privacy Policy based on the information "
|
950 |
+
"you entered below."
|
951 |
+
msgstr ""
|
952 |
+
"Esta página te permite generar una política de privacidad basada en la "
|
953 |
+
"información que introduzcas a continuación."
|
954 |
+
|
955 |
+
#: views/admin/settings-page.php:8
|
956 |
+
msgctxt "(Admin)"
|
957 |
+
msgid "GDPR settings saved!"
|
958 |
+
msgstr "La configuración de RGPD ha sido guardada."
|
959 |
+
|
960 |
+
#: views/admin/settings-page.php:31
|
961 |
+
#, php-format
|
962 |
+
msgctxt "(Admin)"
|
963 |
+
msgid "The GDPR Framework. Built with ♥ by %sCodelight%s."
|
964 |
+
msgstr "The GDPR Framework. Elaborado con ♥ por %sCodelight%s."
|
965 |
+
|
966 |
+
#: views/admin/settings-page.php:39
|
967 |
+
#, php-format
|
968 |
+
msgctxt "(Admin)"
|
969 |
+
msgid "Support our development efforts with a %s5-star rating%s."
|
970 |
+
msgstr ""
|
971 |
+
"Da tu apoyo a nuestros esfuerzos de desarrollo, con una %svaloración de 5 "
|
972 |
+
"estrellas%s."
|
973 |
+
|
974 |
+
#: views/admin/support/contents.php:5 views/installer/steps/finish.php:10
|
975 |
+
msgctxt "(Admin)"
|
976 |
+
msgid "Need more info?"
|
977 |
+
msgstr "¿Necesitas más información?"
|
978 |
+
|
979 |
+
#: views/admin/support/contents.php:11 views/installer/steps/finish.php:16
|
980 |
+
msgctxt "(Admin)"
|
981 |
+
msgid "Site Owner's guide to GDPR"
|
982 |
+
msgstr "Guía para propietarios de sitios sobre el RGPD"
|
983 |
+
|
984 |
+
#: views/admin/support/contents.php:14 views/installer/steps/finish.php:19
|
985 |
+
msgctxt "(Admin)"
|
986 |
+
msgid "Read the full guide on GDPR compliance."
|
987 |
+
msgstr "Lee la guía completa sobre el cumplimiento del RGPD."
|
988 |
+
|
989 |
+
#: views/admin/support/contents.php:20 views/installer/steps/finish.php:25
|
990 |
+
msgctxt "(Admin)"
|
991 |
+
msgid "Knowledge base"
|
992 |
+
msgstr "Base de conocimiento"
|
993 |
+
|
994 |
+
#: views/admin/support/contents.php:23 views/installer/steps/finish.php:28
|
995 |
+
msgctxt "(Admin)"
|
996 |
+
msgid "Check out the knowledge base for common questions and answers."
|
997 |
+
msgstr ""
|
998 |
+
"Consulta nuestra base de conocimiento para encontrar las preguntas más "
|
999 |
+
"frecuentes y sus respuestas."
|
1000 |
+
|
1001 |
+
#: views/admin/support/contents.php:29 views/installer/steps/finish.php:34
|
1002 |
+
msgctxt "(Admin)"
|
1003 |
+
msgid "Developer's guide to GDPR"
|
1004 |
+
msgstr "Guía para desarrolladores sobre el RGPD"
|
1005 |
+
|
1006 |
+
#: views/admin/support/contents.php:32 views/installer/steps/finish.php:37
|
1007 |
+
msgctxt "(Admin)"
|
1008 |
+
msgid "We have a thorough guide to help making custom sites compliant."
|
1009 |
+
msgstr ""
|
1010 |
+
"Tenemos una guía exhaustiva para ayudarte a personalizar tus sitios para que "
|
1011 |
+
"cumplan el RGPD."
|
1012 |
+
|
1013 |
+
#: views/admin/support/contents.php:40 views/installer/steps/finish.php:45
|
1014 |
+
msgctxt "(Admin)"
|
1015 |
+
msgid "Need help?"
|
1016 |
+
msgstr "¿Necesitas ayuda?"
|
1017 |
+
|
1018 |
+
#: views/admin/support/contents.php:46 views/installer/steps/finish.php:51
|
1019 |
+
msgctxt "(Admin)"
|
1020 |
+
msgid "Submit a support request"
|
1021 |
+
msgstr "Envía una petición de soporte"
|
1022 |
+
|
1023 |
+
#: views/admin/support/contents.php:49 views/installer/steps/finish.php:54
|
1024 |
+
msgctxt "(Admin)"
|
1025 |
+
msgid ""
|
1026 |
+
"Found a bug or problem with the plugin? Post in the wordpress.org support "
|
1027 |
+
"forum."
|
1028 |
+
msgstr ""
|
1029 |
+
"¿Has encontrado un fallo o un problema con el plugin? Comunícalo en el foro "
|
1030 |
+
"de soporte de wordpress.org."
|
1031 |
+
|
1032 |
+
#: views/admin/support/contents.php:55 views/installer/steps/finish.php:60
|
1033 |
+
msgctxt "(Admin)"
|
1034 |
+
msgid "Request a consultation"
|
1035 |
+
msgstr "Solicita una consulta"
|
1036 |
+
|
1037 |
+
#: views/admin/support/contents.php:58 views/installer/steps/finish.php:63
|
1038 |
+
msgctxt "(Admin)"
|
1039 |
+
msgid ""
|
1040 |
+
"Need development or legal assistance in making your site compliant? We can "
|
1041 |
+
"help!"
|
1042 |
+
msgstr ""
|
1043 |
+
"¿Necesitas desarrollo o asistencia legal para hacer que tu sitio cumpla con "
|
1044 |
+
"el RGPD? ¡Podemos ayudarte!"
|
1045 |
+
|
1046 |
+
#: views/admin/wizard-buttons.php:2
|
1047 |
+
msgctxt "(Admin)"
|
1048 |
+
msgid "Restart setup wizard"
|
1049 |
+
msgstr "Reiniciar el asistente de configuración"
|
1050 |
+
|
1051 |
+
#: views/email/action-export.php:8 views/email/action-forget.php:12
|
1052 |
+
msgctxt "(Admin)"
|
1053 |
+
msgid ""
|
1054 |
+
"This email is just for your information. You don't need to take any action"
|
1055 |
+
msgstr ""
|
1056 |
+
"Este email es solo para tu información. No tienes que llevar a cabo ninguna "
|
1057 |
+
"acción."
|
1058 |
+
|
1059 |
+
#: views/email/action-forget.php:8
|
1060 |
+
msgctxt "(Admin)"
|
1061 |
+
msgid "The data subject had a user account on your website."
|
1062 |
+
msgstr "La persona tiene una cuenta de usuario en tu sitio web."
|
1063 |
+
|
1064 |
+
#: views/email/identify-data-subject.php:2
|
1065 |
+
msgid "Someone has requested access to your data on"
|
1066 |
+
msgstr "Alguien ha solicitado acceder a tus datos en"
|
1067 |
+
|
1068 |
+
#: views/email/identify-data-subject.php:3
|
1069 |
+
msgid "If this was a mistake, just ignore this email and nothing will happen."
|
1070 |
+
msgstr ""
|
1071 |
+
"Si se trata de un error, basta con que ignores este email, y no ocurrirá "
|
1072 |
+
"nada."
|
1073 |
+
|
1074 |
+
#: views/email/identify-data-subject.php:4
|
1075 |
+
msgid "To manage your data, visit the following address:"
|
1076 |
+
msgstr "Para gestionar tus datos, visita la siguiente dirección:"
|
1077 |
+
|
1078 |
+
#: views/email/identify-data-subject.php:10
|
1079 |
+
msgid "This link is valid for 15 minutes."
|
1080 |
+
msgstr "Este enlace es válido durante 15 minutos."
|
1081 |
+
|
1082 |
+
#: views/email/no-data.php:2
|
1083 |
+
msgid "Someone has requested information about your personal data on"
|
1084 |
+
msgstr "Alguien ha solicitado información sobre tus datos personales en"
|
1085 |
+
|
1086 |
+
#: views/email/no-data.php:3
|
1087 |
+
msgid "None of your personal data is stored on"
|
1088 |
+
msgstr "Ninguno de tus datos personales está almacenado en"
|
1089 |
+
|
1090 |
+
#: views/email/no-data.php:5
|
1091 |
+
msgid ""
|
1092 |
+
"If this was a mistake or you did not request this email, just ignore it and "
|
1093 |
+
"nothing will happen."
|
1094 |
+
msgstr ""
|
1095 |
+
"Si se trata de un error, o no has solicitado este email, basta con que lo "
|
1096 |
+
"ignores, y no ocurrirá nada."
|
1097 |
+
|
1098 |
+
#: views/email/request-export.php:13 views/email/request-forget.php:13
|
1099 |
+
msgctxt "(Admin)"
|
1100 |
+
msgid "As a reminder: according to GDPR, you have 30 days to comply."
|
1101 |
+
msgstr ""
|
1102 |
+
"Como recordatorio, y de acuerdo con el RGPD, tienes 30 días para cumplirlo."
|
1103 |
+
|
1104 |
+
#: views/global/delete-action.php:2
|
1105 |
+
msgctxt "(Admin)"
|
1106 |
+
msgid "Automatically anonymize data"
|
1107 |
+
msgstr "Anonimizar los datos de forma automática"
|
1108 |
+
|
1109 |
+
#: views/global/delete-action.php:5
|
1110 |
+
msgctxt "(Admin)"
|
1111 |
+
msgid "Automatically delete data"
|
1112 |
+
msgstr "Borrar los datos de forma automática"
|
1113 |
+
|
1114 |
+
#: views/global/delete-action.php:9
|
1115 |
+
msgctxt "(Admin)"
|
1116 |
+
msgid "Automatically anonymize data and notify me via email"
|
1117 |
+
msgstr "Anonimizar automáticamente los datos y avisar por email"
|
1118 |
+
|
1119 |
+
#: views/global/delete-action.php:13
|
1120 |
+
msgctxt "(Admin)"
|
1121 |
+
msgid "Automatically delete data and notify me via email"
|
1122 |
+
msgstr "Borrar automáticamente los datos y avisar por email"
|
1123 |
+
|
1124 |
+
#: views/global/delete-action.php:16 views/global/export-action.php:10
|
1125 |
+
msgctxt "(Admin)"
|
1126 |
+
msgid "Only notify me via email"
|
1127 |
+
msgstr "Solo avisar por email"
|
1128 |
+
|
1129 |
+
#: views/global/export-action.php:2
|
1130 |
+
msgctxt "(Admin)"
|
1131 |
+
msgid "Automatically download data"
|
1132 |
+
msgstr "Descargar automáticamente los datos"
|
1133 |
+
|
1134 |
+
#: views/global/export-action.php:6
|
1135 |
+
msgctxt "(Admin)"
|
1136 |
+
msgid "Automatically download data and notify me via email"
|
1137 |
+
msgstr "Descargar automáticamente los datos y avisar por email"
|
1138 |
+
|
1139 |
+
#: views/installer/continue-notice.php:2
|
1140 |
+
msgctxt "(Admin)"
|
1141 |
+
msgid "The The GDPR Framework setup has not been finalized yet."
|
1142 |
+
msgstr ""
|
1143 |
+
"La configuración del plugin The GDPR Framework todavía no ha finalizado."
|
1144 |
+
|
1145 |
+
#: views/installer/continue-notice.php:3
|
1146 |
+
msgctxt "(Admin)"
|
1147 |
+
msgid "You can continue the setup at any time."
|
1148 |
+
msgstr "Puedes continuar con la configuración en cualquier momento."
|
1149 |
+
|
1150 |
+
#: views/installer/continue-notice.php:6
|
1151 |
+
msgctxt "(Admin)"
|
1152 |
+
msgid "Continue the setup wizard"
|
1153 |
+
msgstr "Continuar con el asistente de configuración"
|
1154 |
+
|
1155 |
+
#: views/installer/continue-notice.php:9
|
1156 |
+
msgctxt "(Admin)"
|
1157 |
+
msgid "Hide this message"
|
1158 |
+
msgstr "Ocultar este mensaje"
|
1159 |
+
|
1160 |
+
#: views/installer/footer.php:7
|
1161 |
+
msgid "Back"
|
1162 |
+
msgstr "Volver atrás"
|
1163 |
+
|
1164 |
+
#: views/installer/header.php:7
|
1165 |
+
msgctxt "(Admin)"
|
1166 |
+
msgid "WordPress GDPR › Setup Wizard"
|
1167 |
+
msgstr "WordPress GDPR › Asistente de configuración"
|
1168 |
+
|
1169 |
+
#: views/installer/header.php:26
|
1170 |
+
msgctxt "(Admin)"
|
1171 |
+
msgid "I need help"
|
1172 |
+
msgstr "Necesito ayuda"
|
1173 |
+
|
1174 |
+
#: views/installer/header.php:29
|
1175 |
+
msgctxt "(Admin)"
|
1176 |
+
msgid "Developer Docs"
|
1177 |
+
msgstr "Documentos para desarrolladores"
|
1178 |
+
|
1179 |
+
#: views/installer/header.php:36
|
1180 |
+
msgctxt "(Admin)"
|
1181 |
+
msgid "Configuration"
|
1182 |
+
msgstr "Configuración"
|
1183 |
+
|
1184 |
+
#: views/installer/header.php:46
|
1185 |
+
msgctxt "(Admin)"
|
1186 |
+
msgid "Forms & Consent"
|
1187 |
+
msgstr "Formularios y consentimiento"
|
1188 |
+
|
1189 |
+
#: views/installer/header.php:51
|
1190 |
+
msgctxt "(Admin)"
|
1191 |
+
msgid "Integrations"
|
1192 |
+
msgstr "Integraciones"
|
1193 |
+
|
1194 |
+
#: views/installer/steps/configuration-settings.php:23
|
1195 |
+
#: views/installer/steps/configuration-settings.php:73
|
1196 |
+
msgctxt "(Admin)"
|
1197 |
+
msgid "Enter the email address to notify"
|
1198 |
+
msgstr "Escribe la dirección de email para notificaciones"
|
1199 |
+
|
1200 |
+
#: views/installer/steps/disclaimer.php:21
|
1201 |
+
msgctxt "(Admin)"
|
1202 |
+
msgid "I accept"
|
1203 |
+
msgstr "Acepto"
|
1204 |
+
|
1205 |
+
#: views/installer/welcome-notice.php:7
|
1206 |
+
msgctxt "(Admin)"
|
1207 |
+
msgid "Run the setup wizard"
|
1208 |
+
msgstr "Ejecutar el asistente de configuración"
|
1209 |
+
|
1210 |
+
#: views/installer/welcome-notice.php:11
|
1211 |
+
msgctxt "(Admin)"
|
1212 |
+
msgid "Auto-install pages"
|
1213 |
+
msgstr "Instalar automáticamente las páginas"
|
1214 |
+
|
1215 |
+
#: views/installer/welcome-notice.php:15
|
1216 |
+
msgctxt "(Admin)"
|
1217 |
+
msgid "Skip and install manually"
|
1218 |
+
msgstr "Omitir e instalar de forma manual"
|
1219 |
+
|
1220 |
+
#: views/modules/contact-form-7/generator-privacy.php:6
|
1221 |
+
msgctxt "(Admin)"
|
1222 |
+
msgid ""
|
1223 |
+
"This tag generates the default text for Terms & Conditions and/or Privacy "
|
1224 |
+
"Policy checkbox."
|
1225 |
+
msgstr ""
|
1226 |
+
"Esta etiqueta genera el texto por defecto para las casillas de \"Términos y "
|
1227 |
+
"condiciones\" y/o \"Política de privacidad\"."
|
1228 |
+
|
1229 |
+
#: views/modules/contact-form-7/generator-privacy.php:15
|
1230 |
+
msgid "Insert"
|
1231 |
+
msgstr "Insertar"
|
1232 |
+
|
1233 |
+
#: views/modules/wordpress-comments/terms-checkbox.php:6
|
1234 |
+
#: views/modules/wordpress-user/registration-terms-checkbox.php:7
|
1235 |
+
#, php-format
|
1236 |
+
msgid "I accept the %sTerms and Conditions%s and the %sPrivacy Policy%s"
|
1237 |
+
msgstr "Acepto los %sTérminos y condiciones%s y la %sPolítica de privacidad%s"
|
1238 |
+
|
1239 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-consent.php:3
|
1240 |
+
#: views/privacy-tools/form-consent.php:2
|
1241 |
+
msgid "Consent"
|
1242 |
+
msgstr "Consentimiento"
|
1243 |
+
|
1244 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-consent.php:6
|
1245 |
+
#: views/privacy-tools/form-consent.php:6
|
1246 |
+
msgid "Here you can withdraw any consents you have given."
|
1247 |
+
msgstr "Desde aquí puedes retirar cualquier consentimiento que hayas otorgado."
|
1248 |
+
|
1249 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-consent.php:8
|
1250 |
+
msgid "Consents"
|
1251 |
+
msgstr "Consentimientos"
|
1252 |
+
|
1253 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-consent.php:23
|
1254 |
+
#: views/privacy-tools/form-consent.php:24
|
1255 |
+
msgid "Withdraw"
|
1256 |
+
msgstr "Retirar"
|
1257 |
+
|
1258 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:5
|
1259 |
+
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:5
|
1260 |
+
msgctxt "(Admin)"
|
1261 |
+
msgid "Delete this user and all data"
|
1262 |
+
msgstr "Borrar este usuario y todos sus datos"
|
1263 |
+
|
1264 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:11
|
1265 |
+
msgctxt "(Admin)"
|
1266 |
+
msgid "Delete my data"
|
1267 |
+
msgstr "Borrar mis datos"
|
1268 |
+
|
1269 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:15
|
1270 |
+
#: views/privacy-tools/form-delete.php:13
|
1271 |
+
msgid "Delete all data we have gathered about you."
|
1272 |
+
msgstr "Borrar todos los datos que hemos recopilado sobre ti."
|
1273 |
+
|
1274 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:16
|
1275 |
+
#: views/privacy-tools/form-delete.php:14
|
1276 |
+
msgid "If you have a user account on our site, it will also be deleted."
|
1277 |
+
msgstr "Si tienes una cuenta en este sitio, también será eliminada."
|
1278 |
+
|
1279 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:17
|
1280 |
+
#: views/privacy-tools/form-delete.php:15
|
1281 |
+
msgid "Be careful - this action is permanent and CANNOT be undone."
|
1282 |
+
msgstr "Ten cuidado, ya que esta acción es permanente y NO tiene vuelta atrás."
|
1283 |
+
|
1284 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:22
|
1285 |
+
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:23
|
1286 |
+
msgctxt "(Admin)"
|
1287 |
+
msgid ""
|
1288 |
+
"You seem to have an administrator or equivalent role, so deleting/"
|
1289 |
+
"anonymizing via this page is disabled."
|
1290 |
+
msgstr ""
|
1291 |
+
"Parece que tienes el rol de administrador o equivalente; por tanto, el "
|
1292 |
+
"borrado o anonimizado mediante esta página ha sido desactivado."
|
1293 |
+
|
1294 |
+
#: views/modules/wordpress-user/dashboard/form-export.php:7
|
1295 |
+
#: views/privacy-tools/form-export.php:1
|
1296 |
+
msgid "Download your data"
|
1297 |
+
msgstr "Descarga tus datos"
|
1298 |
+
|
1299 |
+
#: views/modules/wordpress-user/dashboard/form-export.php:12
|
1300 |
+
#: views/privacy-tools/form-export.php:13
|
1301 |
+
msgid "Download as table"
|
1302 |
+
msgstr "Descargar como una tabla"
|
1303 |
+
|
1304 |
+
#: views/modules/wordpress-user/dashboard/form-export.php:15
|
1305 |
+
#: views/privacy-tools/form-export.php:22
|
1306 |
+
msgid "Export as JSON"
|
1307 |
+
msgstr "Exportar como JSON"
|
1308 |
+
|
1309 |
+
#: views/modules/wordpress-user/dashboard/form-export.php:19
|
1310 |
+
#: views/privacy-tools/form-export.php:4
|
1311 |
+
msgid "You can download all your data formatted as a table for viewing."
|
1312 |
+
msgstr ""
|
1313 |
+
"Puedes descargar todos tus datos formateados como una tabla para verlos "
|
1314 |
+
"mejor."
|
1315 |
+
|
1316 |
+
#: views/modules/wordpress-user/dashboard/form-export.php:20
|
1317 |
+
#: views/privacy-tools/form-export.php:5
|
1318 |
+
msgid "Alternatively, you can export it in machine-readable JSON format."
|
1319 |
+
msgstr ""
|
1320 |
+
"También puedes exportar los datos en formato JSON, legible por máquinas."
|
1321 |
+
|
1322 |
+
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:11
|
1323 |
+
msgctxt "(Admin)"
|
1324 |
+
msgid "Delete user and all data"
|
1325 |
+
msgstr "Borrar el usuario y todos sus datos"
|
1326 |
+
|
1327 |
+
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:14
|
1328 |
+
msgctxt "(Admin)"
|
1329 |
+
msgid "Anonymize user and all data"
|
1330 |
+
msgstr "Anonimizar al usuario y todos los datos"
|
1331 |
+
|
1332 |
+
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:18
|
1333 |
+
msgctxt "gdpr-framework"
|
1334 |
+
msgid "Be careful - this action is permanent and CANNOT be undone."
|
1335 |
+
msgstr "Ten cuidado, ya que esta acción es permanente y NO tiene vuelta atrás."
|
1336 |
+
|
1337 |
+
#: views/modules/wordpress-user/dashboard/profile-page/header.php:2
|
1338 |
+
msgctxt "(Admin)"
|
1339 |
+
msgid "GDPR Data"
|
1340 |
+
msgstr "Datos del RGPD"
|
1341 |
+
|
1342 |
+
#: views/modules/wordpress-user/dashboard/profile-page/header.php:6
|
1343 |
+
msgctxt "(Admin)"
|
1344 |
+
msgid "This user has been anonymized."
|
1345 |
+
msgstr "Este usuario ha sido anonimizado."
|
1346 |
+
|
1347 |
+
#: views/modules/wordpress-user/dashboard/profile-page/table-consent.php:4
|
1348 |
+
msgctxt "(Admin)"
|
1349 |
+
msgid "Consents given"
|
1350 |
+
msgstr "Consentimientos otorgados"
|
1351 |
+
|
1352 |
+
#: views/modules/wordpress-user/dashboard/profile-page/table-consent.php:17
|
1353 |
+
msgctxt "(Admin)"
|
1354 |
+
msgid "No consents given"
|
1355 |
+
msgstr "No se ha otorgado ningún consentimiento"
|
1356 |
+
|
1357 |
+
#: views/privacy-tools/form-consent.php:9
|
1358 |
+
msgid "Consent types"
|
1359 |
+
msgstr "Tipos de consentimiento"
|
1360 |
+
|
1361 |
+
#: views/privacy-tools/form-delete.php:1
|
1362 |
+
#: views/privacy-tools/notice-admin-role.php:1
|
1363 |
+
msgid "Delete my user and data"
|
1364 |
+
msgstr "Borrar mi usuario y mis datos"
|
1365 |
+
|
1366 |
+
#: views/privacy-tools/form-delete.php:7
|
1367 |
+
msgid "Delete my data"
|
1368 |
+
msgstr "Borrar mis datos"
|
1369 |
+
|
1370 |
+
#: views/privacy-tools/form-identify.php:8
|
1371 |
+
msgid "Back to front page"
|
1372 |
+
msgstr "Volver a la página de inicio"
|
1373 |
+
|
1374 |
+
#: views/privacy-tools/form-identify.php:14
|
1375 |
+
msgid "Identify yourself!"
|
1376 |
+
msgstr "Identifícate a ti mismo"
|
1377 |
+
|
1378 |
+
#: views/privacy-tools/form-identify.php:17
|
1379 |
+
#: views/privacy-tools/form-identify.php:20
|
1380 |
+
msgid "Enter your email address"
|
1381 |
+
msgstr "Escribe tu dirección de email"
|
1382 |
+
|
1383 |
+
#: views/privacy-tools/form-identify.php:23
|
1384 |
+
msgid "Send email"
|
1385 |
+
msgstr "Enviar el email"
|
1386 |
+
|
1387 |
+
#: views/privacy-tools/notice-admin-role.php:4
|
1388 |
+
msgctxt "(Admin)"
|
1389 |
+
msgid "Data deletion is disabled for administrative accounts."
|
1390 |
+
msgstr ""
|
1391 |
+
"El borrado de los datos está desactivado para las cuentas de administradores."
|
1392 |
+
|
1393 |
+
#: views/privacy-tools/notices.php:3
|
1394 |
+
msgid ""
|
1395 |
+
"We will send you an email with the link to access your data. Please check "
|
1396 |
+
"your spam folder as well!"
|
1397 |
+
msgstr ""
|
1398 |
+
"Te enviaremos un email con un enlace para que puedas acceder a tus datos. "
|
1399 |
+
"Por favor, comprueba también la carpeta de spam."
|
1400 |
+
|
1401 |
+
#: views/privacy-tools/notices.php:7
|
1402 |
+
msgid "The email you entered does not appear to be a valid email."
|
1403 |
+
msgstr "El email que has introducido no parece ser un email válido."
|
1404 |
+
|
1405 |
+
#: views/privacy-tools/notices.php:11
|
1406 |
+
msgid "Sorry - the link seems to have expired. Please try again!"
|
1407 |
+
msgstr ""
|
1408 |
+
"Lo sentimos, pero el enlace ha expirado. Por favor, inténtalo de nuevo."
|
1409 |
+
|
1410 |
+
#: views/privacy-tools/notices.php:23
|
1411 |
+
msgid "Your personal data has been removed!"
|
1412 |
+
msgstr "Tus datos personales han sido eliminados."
|
1413 |
+
|
1414 |
+
#: views/privacy-tools/privacy-tools.php:5
|
1415 |
+
msgid "You are identified as"
|
1416 |
+
msgstr "Has sido identificado como"
|
1417 |
+
|
1418 |
+
#~ msgid "Manage consents"
|
1419 |
+
#~ msgstr "Gestionar los consentimientos"
|
1420 |
+
|
1421 |
+
#~ msgid "Back to Privacy Tools"
|
1422 |
+
#~ msgstr "Volver a las herramientas de privacidad"
|
1423 |
+
|
1424 |
+
#~ msgid ""
|
1425 |
+
#~ "Generate the default text for your Privacy Policy acceptance checkbox. "
|
1426 |
+
#~ "For more details, see %s."
|
1427 |
+
#~ msgstr ""
|
1428 |
+
#~ "Generar el texto por defecto para tu casilla de aceptación de la política "
|
1429 |
+
#~ "de privacidad. Para saber más detalles, consulta %s."
|
1430 |
+
|
1431 |
+
#~ msgid "https://TODO"
|
1432 |
+
#~ msgstr "https://porhacer"
|
1433 |
+
|
1434 |
+
#~ msgid "GDPR Terms"
|
1435 |
+
#~ msgstr "Términos del RGPD"
|
1436 |
+
|
1437 |
+
#~ msgid "GDPR - Request personal data"
|
1438 |
+
#~ msgstr "RGPD - Solicitud de datos personales"
|
1439 |
+
|
1440 |
+
#~ msgid ""
|
1441 |
+
#~ "This form collects your name, email and content so that we can keep track "
|
1442 |
+
#~ "of the comments placed on the website. For more info check our privacy "
|
1443 |
+
#~ "policy where you'll get more info on where, how and why we store your "
|
1444 |
+
#~ "data."
|
1445 |
+
#~ msgstr ""
|
1446 |
+
#~ "Este formulario recopila tu nombre, tu email y el contenido del "
|
1447 |
+
#~ "comentario, con el objetivo de hacer seguimiento de los comentarios "
|
1448 |
+
#~ "publicados en el sitio web. Si quieres más detalles, consulta nuestra "
|
1449 |
+
#~ "página de política de privacidad, en la que encontrarás más información "
|
1450 |
+
#~ "sobre dónde, cómo y por qué almacenamos tus datos."
|
1451 |
+
|
1452 |
+
#~ msgid ""
|
1453 |
+
#~ "<strong>ERROR</strong>: please fill the required fields (GDPR checkbox)."
|
1454 |
+
#~ msgstr ""
|
1455 |
+
#~ "<strong>ERROR</strong>: por favor, rellena los campos solicitados "
|
1456 |
+
#~ "(casilla de verificación del RGPD)"
|
1457 |
+
|
1458 |
+
#~ msgid "Something went wrong."
|
1459 |
+
#~ msgstr "Algo ha salido mal"
|
1460 |
+
|
1461 |
+
#~ msgid "Comment is changed"
|
1462 |
+
#~ msgstr "El comentario ha cambiado"
|
1463 |
+
|
1464 |
+
#~ msgid "email"
|
1465 |
+
#~ msgstr "Email"
|
1466 |
+
|
1467 |
+
#~ msgid "comment"
|
1468 |
+
#~ msgstr "Comentario"
|
1469 |
+
|
1470 |
+
#~ msgid "website"
|
1471 |
+
#~ msgstr "Sitio web"
|
1472 |
+
|
1473 |
+
#~ msgid "comment date"
|
1474 |
+
#~ msgstr "Fecha del comentario"
|
1475 |
+
|
1476 |
+
#~ msgid "author email"
|
1477 |
+
#~ msgstr "Email del autor"
|
1478 |
+
|
1479 |
+
#~ msgid "author name"
|
1480 |
+
#~ msgstr "Nombre del autor"
|
1481 |
+
|
1482 |
+
#~ msgid "post ID"
|
1483 |
+
#~ msgstr "ID de la entrada"
|
1484 |
+
|
1485 |
+
#~ msgid "delete"
|
1486 |
+
#~ msgstr "Borrar"
|
1487 |
+
|
1488 |
+
#~ msgid "The site administrator received your request. Thank You."
|
1489 |
+
#~ msgstr ""
|
1490 |
+
#~ "El administrador del sitio ha recibido tu solicitud. Muchas gracias."
|
1491 |
+
|
1492 |
+
#~ msgid "New delete request"
|
1493 |
+
#~ msgstr "Nueva solicitud de borrado"
|
1494 |
+
|
1495 |
+
#~ msgid "Comments deleted"
|
1496 |
+
#~ msgstr "Comentarios borrados"
|
1497 |
+
|
1498 |
+
#~ msgid "Comments are anonymous"
|
1499 |
+
#~ msgstr "Los comentarios son anónimos"
|
1500 |
+
|
1501 |
+
#~ msgid "We confirm Your data deletion request"
|
1502 |
+
#~ msgstr "Confirmamos que has solicitado el borrado de tus datos"
|
1503 |
+
|
1504 |
+
#~ msgid "Comment author"
|
1505 |
+
#~ msgstr "Autor del comentario"
|
1506 |
+
|
1507 |
+
#~ msgid "content"
|
1508 |
+
#~ msgstr "Contenido"
|
1509 |
+
|
1510 |
+
#~ msgid "Request send"
|
1511 |
+
#~ msgstr "Solicitud enviada"
|
1512 |
+
|
1513 |
+
#~ msgid "Checkbox GDPR is required"
|
1514 |
+
#~ msgstr ""
|
1515 |
+
#~ "Para el cumplimiento del RGPD, es obligatoria la casilla de verificación"
|
1516 |
+
|
1517 |
+
#~ msgid "I agree"
|
1518 |
+
#~ msgstr "Estoy de acuerdo"
|
1519 |
+
|
1520 |
+
#~ msgid ""
|
1521 |
+
#~ "I consent to having %s collect my email so that they can send me my "
|
1522 |
+
#~ "requested info.\n"
|
1523 |
+
#~ " For more info check our privacy policy where you'll get more "
|
1524 |
+
#~ "info on where, how and why we store your data."
|
1525 |
+
#~ msgstr ""
|
1526 |
+
#~ "Doy mi consentimiento a que <em>%s</em> recopile mi dirección de email, a "
|
1527 |
+
#~ "fin de que se me pueda enviar la información solicitada.<br /><br />\n"
|
1528 |
+
#~ "Si quieres más detalles, consulta nuestra página de política de "
|
1529 |
+
#~ "privacidad, en la que encontrarás más información sobre dónde, cómo y por "
|
1530 |
+
#~ "qué almacenamos tus datos."
|
1531 |
+
|
1532 |
+
#~ msgid "Don't show comments"
|
1533 |
+
#~ msgstr "No mostrar los comentarios"
|
1534 |
+
|
1535 |
+
#~ msgid "id"
|
1536 |
+
#~ msgstr "ID"
|
1537 |
+
|
1538 |
+
#~ msgid "requested at"
|
1539 |
+
#~ msgstr "Fecha de la solicitud"
|
1540 |
+
|
1541 |
+
#~ msgid "status"
|
1542 |
+
#~ msgstr "Estado"
|
1543 |
+
|
1544 |
+
#~ msgid "language"
|
1545 |
+
#~ msgstr "Idioma"
|
1546 |
+
|
1547 |
+
#~ msgid "comments"
|
1548 |
+
#~ msgstr "Comentarios"
|
1549 |
+
|
1550 |
+
#~ msgid "gravity form entries"
|
1551 |
+
#~ msgstr "Entradas de Gravity Forms"
|
1552 |
+
|
1553 |
+
#~ msgid "cfdb7 db entries"
|
1554 |
+
#~ msgstr "Entradas de CFDB7 DB"
|
1555 |
+
|
1556 |
+
#~ msgid "woocommerce"
|
1557 |
+
#~ msgstr "WooCommerce"
|
1558 |
+
|
1559 |
+
#~ msgid "waiting for email"
|
1560 |
+
#~ msgstr "En espera de email"
|
1561 |
+
|
1562 |
+
#~ msgid "email sent"
|
1563 |
+
#~ msgstr "Email enviado"
|
1564 |
+
|
1565 |
+
#~ msgid "url is visited"
|
1566 |
+
#~ msgstr "URL visitada"
|
1567 |
+
|
1568 |
+
#~ msgid "data(ID)"
|
1569 |
+
#~ msgstr "ID del dato"
|
1570 |
+
|
1571 |
+
#~ msgid "type"
|
1572 |
+
#~ msgstr "Tipo"
|
1573 |
+
|
1574 |
+
#~ msgid "select"
|
1575 |
+
#~ msgstr "Seleccionar"
|
1576 |
+
|
1577 |
+
#~ msgid "waiting to process"
|
1578 |
+
#~ msgstr "En espera de ser procesado"
|
1579 |
+
|
1580 |
+
#~ msgid "deleted"
|
1581 |
+
#~ msgstr "Borrado"
|
1582 |
+
|
1583 |
+
#~ msgid "processed"
|
1584 |
+
#~ msgstr "Procesado"
|
1585 |
+
|
1586 |
+
#~ msgid "Plugin name"
|
1587 |
+
#~ msgstr "Nombre del plugin"
|
1588 |
+
|
1589 |
+
#~ msgid "Plugin status"
|
1590 |
+
#~ msgstr "Estado del plugin"
|
1591 |
+
|
1592 |
+
#~ msgid "Personal data"
|
1593 |
+
#~ msgstr "Datos personales"
|
1594 |
+
|
1595 |
+
#~ msgid "WP-GDPR add-on status"
|
1596 |
+
#~ msgstr "Estado del complemento WP-GDPR"
|
1597 |
+
|
1598 |
+
#~ msgid "Request add-on for your plugin"
|
1599 |
+
#~ msgstr "Complemento de solicitud para tu plugin"
|
1600 |
+
|
1601 |
+
#~ msgid "Email"
|
1602 |
+
#~ msgstr "Email"
|
1603 |
+
|
1604 |
+
#~ msgid ""
|
1605 |
+
#~ "This form collects your email so that we can keep you updated about your "
|
1606 |
+
#~ "request. Check out our %s for more information."
|
1607 |
+
#~ msgstr ""
|
1608 |
+
#~ "Este formulario recopila tu dirección de email, a fin de que podamos "
|
1609 |
+
#~ "mantenerte informado sobre tu solicitud. Si quieres más información, "
|
1610 |
+
#~ "consulta nuestra página de %s."
|
1611 |
+
|
1612 |
+
#~ msgid "I consent to having WP-GDPR collect my email when provided."
|
1613 |
+
#~ msgstr ""
|
1614 |
+
#~ "Doy mi consentimiento a que el plugin WP-GDPR recopile mi email cuando se "
|
1615 |
+
#~ "lo proporcione."
|
1616 |
+
|
1617 |
+
#~ msgid "submit"
|
1618 |
+
#~ msgstr "Enviar"
|
1619 |
+
|
1620 |
+
#~ msgid "Requests"
|
1621 |
+
#~ msgstr "Solicitudes"
|
1622 |
+
|
1623 |
+
#~ msgid "Add-ons"
|
1624 |
+
#~ msgstr "Complemento"
|
1625 |
+
|
1626 |
+
#~ msgid "Help Center"
|
1627 |
+
#~ msgstr "Centro de ayuda"
|
1628 |
+
|
1629 |
+
#~ msgid "Your data request"
|
1630 |
+
#~ msgstr "Tu solicitud de datos"
|
1631 |
+
|
1632 |
+
#~ msgid "Make personal data anonymous"
|
1633 |
+
#~ msgstr "Hacer que los datos personales sean anónimos"
|
1634 |
+
|
1635 |
+
#~ msgid "Dear Sir / Madam"
|
1636 |
+
#~ msgstr "Estimado señor / Estimada señora"
|
1637 |
+
|
1638 |
+
#~ msgid "Website:"
|
1639 |
+
#~ msgstr "Sitio web:"
|
1640 |
+
|
1641 |
+
#~ msgid "Date of request:"
|
1642 |
+
#~ msgstr "Fecha de la solicitud"
|
1643 |
+
|
1644 |
+
#~ msgid "Your requests is approved and data was successfully deleted today."
|
1645 |
+
#~ msgstr ""
|
1646 |
+
#~ "Tu solicitud ha sido aprobada, y los datos han sido eliminados "
|
1647 |
+
#~ "correctamente hoy."
|
1648 |
+
|
1649 |
+
#~ msgid "Thanks for contacting us."
|
1650 |
+
#~ msgstr "Gracias por ponerte en contacto con nosotros"
|
1651 |
+
|
1652 |
+
#~ msgid "List of processed data"
|
1653 |
+
#~ msgstr "Lista de datos procesados"
|
1654 |
+
|
1655 |
+
#~ msgid "Request to delete personal data"
|
1656 |
+
#~ msgstr "Solicitud para borrar datos personales"
|
1657 |
+
|
1658 |
+
#~ msgid "asked to delete his/her personal data."
|
1659 |
+
#~ msgstr "Ha solicitado el borrado de sus datos personales."
|
1660 |
+
|
1661 |
+
#~ msgid "Check all requests"
|
1662 |
+
#~ msgstr "Comprobar todas las solicitudes"
|
1663 |
+
|
1664 |
+
#~ msgid "List of users that requested for information"
|
1665 |
+
#~ msgstr "Lista de los usuarios que han solicitado información"
|
1666 |
+
|
1667 |
+
#~ msgid "List of delete requests"
|
1668 |
+
#~ msgstr "Lista de solicitudes de borrado"
|
1669 |
+
|
1670 |
+
#~ msgid "Help"
|
1671 |
+
#~ msgstr "Ayuda"
|
1672 |
+
|
1673 |
+
#~ msgid "Center"
|
1674 |
+
#~ msgstr "Centro"
|
1675 |
+
|
1676 |
+
#~ msgid "List of plugins that store data of users"
|
1677 |
+
#~ msgstr "Lista de los plugins que almacenan datos de usuarios"
|
1678 |
+
|
1679 |
+
#~ msgid "Update settings"
|
1680 |
+
#~ msgstr "Actualizar la configuración"
|
1681 |
+
|
1682 |
+
#~ msgid "WP GDPR"
|
1683 |
+
#~ msgstr "WP GDPR"
|
1684 |
+
|
1685 |
+
#~ msgid "Miscellaneous:"
|
1686 |
+
#~ msgstr "Miscelánea:"
|
1687 |
+
|
1688 |
+
#~ msgid "Add-on Licensing:"
|
1689 |
+
#~ msgstr "Licencia del complemento:"
|
1690 |
+
|
1691 |
+
#~ msgid "Settings for"
|
1692 |
+
#~ msgstr "Configuración de"
|
1693 |
+
|
1694 |
+
#~ msgid "WordPress comments"
|
1695 |
+
#~ msgstr "Comentarios de WordPress"
|
1696 |
+
|
1697 |
+
#~ msgid "Privacy policy text"
|
1698 |
+
#~ msgstr "Texto de la política de privacidad"
|
1699 |
+
|
1700 |
+
#~ msgid "Privacy policy checkbox"
|
1701 |
+
#~ msgstr "Casilla de verificación de la política de privacidad"
|
1702 |
+
|
1703 |
+
#~ msgid "Personal Data Request Page"
|
1704 |
+
#~ msgstr "Página de solicitud de datos personales"
|
1705 |
+
|
1706 |
+
#~ msgid "Update privacy policy settings"
|
1707 |
+
#~ msgstr "Actualizar la configuración de la política de privacidad"
|
1708 |
+
|
1709 |
+
#~ msgid "Send delete request"
|
1710 |
+
#~ msgstr "Enviar una solicitud de borrado"
|
1711 |
+
|
1712 |
+
#~ msgid "Resend emails"
|
1713 |
+
#~ msgstr "Volver a enviar los emails"
|
1714 |
+
|
1715 |
+
#~ msgid ""
|
1716 |
+
#~ "You asked to access your personal data. By clicking on the button you can "
|
1717 |
+
#~ "view or delete your comments created on the website:"
|
1718 |
+
#~ msgstr ""
|
1719 |
+
#~ "Has solicitado acceder a tus datos personales. Al hacer clic en el botón, "
|
1720 |
+
#~ "podrás ver o borrar los comentarios que has creado en este sitio web:"
|
1721 |
+
|
1722 |
+
#~ msgid "Submit"
|
1723 |
+
#~ msgstr "Enviar"
|
1724 |
+
|
1725 |
+
#~ msgid "Warning:"
|
1726 |
+
#~ msgstr "Advertencia:"
|
1727 |
+
|
1728 |
+
#~ msgid "This link will become deprecated after 48 hours."
|
1729 |
+
#~ msgstr "este enlace estará obsoleto en 48 horas"
|
1730 |
+
|
1731 |
+
#~ msgid "View Comments"
|
1732 |
+
#~ msgstr "Ver los comentarios"
|
1733 |
+
|
1734 |
+
#~ msgid "All comments added by email address"
|
1735 |
+
#~ msgstr "Todos los comentarios añadidos por direcciones de email"
|
1736 |
+
|
1737 |
+
#~ msgid "List of data requests"
|
1738 |
+
#~ msgstr "Lista de peticiones de datos"
|
1739 |
+
|
1740 |
+
#~ msgid "List of plugins"
|
1741 |
+
#~ msgstr "Lista de plugins"
|
1742 |
+
|
1743 |
+
#~ msgid "On this page will come info and help for the plugin"
|
1744 |
+
#~ msgstr "En esta página aparecerá la información y ayuda del plugin"
|
1745 |
+
|
1746 |
+
#~ msgid "Settings:"
|
1747 |
+
#~ msgstr "Configuración"
|
1748 |
+
|
1749 |
+
#~ msgid "Settings for comment forms"
|
1750 |
+
#~ msgstr "Configuración de los formularios de comentarios"
|
languages/gdpr-framework.pot
CHANGED
@@ -1,1284 +1,1284 @@
|
|
1 |
-
# SOME DESCRIPTIVE TITLE.
|
2 |
-
# Copyright (C) YEAR Codelight
|
3 |
-
# This file is distributed under the same license as the The GDPR Framework package.
|
4 |
-
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
5 |
-
#
|
6 |
-
#, fuzzy
|
7 |
-
msgid ""
|
8 |
-
msgstr ""
|
9 |
-
"Project-Id-Version: The GDPR Framework 1.0\n"
|
10 |
-
"Report-Msgid-Bugs-To: gdpr@codelight.eu\n"
|
11 |
-
"POT-Creation-Date: 2018-04-16 10:50+0000\n"
|
12 |
-
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
13 |
-
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
14 |
-
"Language-Team: LANGUAGE <LL@li.org>\n"
|
15 |
-
"Language: \n"
|
16 |
-
"MIME-Version: 1.0\n"
|
17 |
-
"Content-Type: text/plain; charset=CHARSET\n"
|
18 |
-
"Content-Transfer-Encoding: 8bit\n"
|
19 |
-
|
20 |
-
#: gdpr-framework.php:26
|
21 |
-
msgctxt "(Admin)"
|
22 |
-
msgid "WordPress GDPR › Error"
|
23 |
-
msgstr ""
|
24 |
-
|
25 |
-
#: gdpr-framework.php:35
|
26 |
-
msgctxt "(Admin)"
|
27 |
-
msgid "Invalid PHP version"
|
28 |
-
msgstr ""
|
29 |
-
|
30 |
-
#: gdpr-framework.php:35
|
31 |
-
msgctxt "(Admin)"
|
32 |
-
msgid "You must be using PHP 5.6.33 or greater."
|
33 |
-
msgstr ""
|
34 |
-
|
35 |
-
#: gdpr-framework.php:42
|
36 |
-
msgctxt "(Admin)"
|
37 |
-
msgid "Invalid WordPress version"
|
38 |
-
msgstr ""
|
39 |
-
|
40 |
-
#: gdpr-framework.php:42
|
41 |
-
msgctxt "(Admin)"
|
42 |
-
msgid "You must be using WordPress 4.3.0 or greater."
|
43 |
-
msgstr ""
|
44 |
-
|
45 |
-
#: gdpr-framework.php:52
|
46 |
-
msgctxt "(Admin)"
|
47 |
-
msgid ""
|
48 |
-
"You appear to be running a development version of GDPR. You must run "
|
49 |
-
"<code>composer install</code> from the plugin directory."
|
50 |
-
msgstr ""
|
51 |
-
|
52 |
-
#: gdpr-framework.php:53
|
53 |
-
msgctxt "(Admin)"
|
54 |
-
msgid "Autoloader not found."
|
55 |
-
msgstr ""
|
56 |
-
|
57 |
-
#: gdpr-framework.php:115
|
58 |
-
msgctxt "(Admin)"
|
59 |
-
msgid "Anonymous"
|
60 |
-
msgstr ""
|
61 |
-
|
62 |
-
#: src/Admin/AdminTab.php:115
|
63 |
-
msgctxt "(Admin)"
|
64 |
-
msgid "Save"
|
65 |
-
msgstr ""
|
66 |
-
|
67 |
-
#: src/Admin/AdminTab.php:151
|
68 |
-
msgctxt "(Admin)"
|
69 |
-
msgid "Policy generated!"
|
70 |
-
msgstr ""
|
71 |
-
|
72 |
-
#: src/Admin/AdminTabGeneral.php:11
|
73 |
-
msgctxt "(Admin)"
|
74 |
-
msgid "General"
|
75 |
-
msgstr ""
|
76 |
-
|
77 |
-
#: src/Admin/AdminTabGeneral.php:38
|
78 |
-
msgctxt "(Admin)"
|
79 |
-
msgid "General Settings"
|
80 |
-
msgstr ""
|
81 |
-
|
82 |
-
#: src/Admin/AdminTabGeneral.php:43
|
83 |
-
msgctxt "(Admin)"
|
84 |
-
msgid "Enable Privacy Tools"
|
85 |
-
msgstr ""
|
86 |
-
|
87 |
-
#: src/Admin/AdminTabGeneral.php:53
|
88 |
-
msgctxt "(Admin)"
|
89 |
-
msgid "Pages"
|
90 |
-
msgstr ""
|
91 |
-
|
92 |
-
#: src/Admin/AdminTabGeneral.php:58 src/Admin/WordpressAdmin.php:151
|
93 |
-
msgctxt "(Admin)"
|
94 |
-
msgid "Privacy Tools Page"
|
95 |
-
msgstr ""
|
96 |
-
|
97 |
-
#: src/Admin/AdminTabGeneral.php:65 src/Admin/WordpressAdmin.php:147
|
98 |
-
msgctxt "(Admin)"
|
99 |
-
msgid "Privacy Policy Page"
|
100 |
-
msgstr ""
|
101 |
-
|
102 |
-
#: src/Admin/AdminTabGeneral.php:72
|
103 |
-
msgctxt "(Admin)"
|
104 |
-
msgid "Terms & Conditions Page"
|
105 |
-
msgstr ""
|
106 |
-
|
107 |
-
#: src/Admin/AdminTabGeneral.php:82
|
108 |
-
msgctxt "(Admin)"
|
109 |
-
msgid "View & Export Data"
|
110 |
-
msgstr ""
|
111 |
-
|
112 |
-
#: src/Admin/AdminTabGeneral.php:87
|
113 |
-
msgctxt "(Admin)"
|
114 |
-
msgid "Export action"
|
115 |
-
msgstr ""
|
116 |
-
|
117 |
-
#: src/Admin/AdminTabGeneral.php:94 src/Admin/AdminTabGeneral.php:133
|
118 |
-
msgctxt "(Admin)"
|
119 |
-
msgid "Email to notify"
|
120 |
-
msgstr ""
|
121 |
-
|
122 |
-
#: src/Admin/AdminTabGeneral.php:105
|
123 |
-
msgctxt "(Admin)"
|
124 |
-
msgid "Delete & Anonymize Data"
|
125 |
-
msgstr ""
|
126 |
-
|
127 |
-
#: src/Admin/AdminTabGeneral.php:110
|
128 |
-
msgctxt "(Admin)"
|
129 |
-
msgid "Delete action"
|
130 |
-
msgstr ""
|
131 |
-
|
132 |
-
#: src/Admin/AdminTabGeneral.php:117
|
133 |
-
msgctxt "(Admin)"
|
134 |
-
msgid "Delete or reassign content?"
|
135 |
-
msgstr ""
|
136 |
-
|
137 |
-
#: src/Admin/AdminTabGeneral.php:125
|
138 |
-
msgctxt "(Admin)"
|
139 |
-
msgid "Reassign content to"
|
140 |
-
msgstr ""
|
141 |
-
|
142 |
-
#: src/Admin/AdminTabGeneral.php:145
|
143 |
-
msgctxt "(Admin)"
|
144 |
-
msgid "Styling"
|
145 |
-
msgstr ""
|
146 |
-
|
147 |
-
#: src/Admin/AdminTabGeneral.php:150
|
148 |
-
msgctxt "(Admin)"
|
149 |
-
msgid "Enable basic styling on Privacy Tools page"
|
150 |
-
msgstr ""
|
151 |
-
|
152 |
-
#: src/Admin/AdminTabGeneral.php:162
|
153 |
-
msgctxt "(Admin)"
|
154 |
-
msgid "Compatibility"
|
155 |
-
msgstr ""
|
156 |
-
|
157 |
-
#: src/Admin/AdminTabGeneral.php:167
|
158 |
-
msgctxt "(Admin)"
|
159 |
-
msgid "Enable automatic theme compatibility"
|
160 |
-
msgstr ""
|
161 |
-
|
162 |
-
#: src/Admin/AdminTabGeneral.php:184 src/Admin/AdminTabGeneral.php:200
|
163 |
-
#: src/Admin/AdminTabGeneral.php:213 src/Admin/AdminTabGeneral.php:252
|
164 |
-
#: views/installer/steps/configuration-settings.php:62
|
165 |
-
msgctxt "(Admin)"
|
166 |
-
msgid "— Select —"
|
167 |
-
msgstr ""
|
168 |
-
|
169 |
-
#: src/Admin/WordpressAdmin.php:65
|
170 |
-
msgctxt "(Admin)"
|
171 |
-
msgid "Privacy & GDPR Settings"
|
172 |
-
msgstr ""
|
173 |
-
|
174 |
-
#: src/Admin/WordpressAdmin.php:66
|
175 |
-
msgctxt "(Admin)"
|
176 |
-
msgid "Privacy"
|
177 |
-
msgstr ""
|
178 |
-
|
179 |
-
#: src/Components/Consent/AdminTabConsent.php:30
|
180 |
-
#: src/Components/Consent/AdminTabConsent.php:49
|
181 |
-
msgctxt "(Admin)"
|
182 |
-
msgid "Consent"
|
183 |
-
msgstr ""
|
184 |
-
|
185 |
-
#: src/Components/Consent/AdminTabConsent.php:157
|
186 |
-
msgctxt "(Admin)"
|
187 |
-
msgid "Consent slug is a required field!"
|
188 |
-
msgstr ""
|
189 |
-
|
190 |
-
#: src/Components/Consent/AdminTabConsent.php:162
|
191 |
-
msgctxt "(Admin)"
|
192 |
-
msgid ""
|
193 |
-
"You may only use alphanumeric characters, dash and underscore in the consent "
|
194 |
-
"slug field."
|
195 |
-
msgstr ""
|
196 |
-
|
197 |
-
#: src/Components/Consent/AdminTabConsent.php:167
|
198 |
-
msgctxt "(Admin)"
|
199 |
-
msgid "Consent title is a required field!"
|
200 |
-
msgstr ""
|
201 |
-
|
202 |
-
#: src/Components/Consent/ConsentManager.php:46
|
203 |
-
#: views/modules/contact-form-7/content-privacy.php:2
|
204 |
-
#: views/modules/wordpress-comments/terms-checkbox.php:14
|
205 |
-
#: views/modules/wordpress-user/registration-terms-checkbox.php:15
|
206 |
-
#, php-format
|
207 |
-
msgid "I accept the %sPrivacy Policy%s"
|
208 |
-
msgstr ""
|
209 |
-
|
210 |
-
#: src/Components/Consent/ConsentManager.php:50
|
211 |
-
#: src/Components/Consent/ConsentManager.php:69
|
212 |
-
msgctxt "(Admin)"
|
213 |
-
msgid ""
|
214 |
-
"This consent is not visible by default. If someone wishes to withdraw it, "
|
215 |
-
"they should simply request to delete all their data."
|
216 |
-
msgstr ""
|
217 |
-
|
218 |
-
#: src/Components/Consent/ConsentManager.php:65
|
219 |
-
#, php-format
|
220 |
-
msgid "I accept the %sTerms & Conditions%s"
|
221 |
-
msgstr ""
|
222 |
-
|
223 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:19
|
224 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:61
|
225 |
-
#: views/admin/privacy-policy/generated.php:1 views/installer/header.php:41
|
226 |
-
msgctxt "(Admin)"
|
227 |
-
msgid "Privacy Policy"
|
228 |
-
msgstr ""
|
229 |
-
|
230 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:70
|
231 |
-
msgctxt "(Admin)"
|
232 |
-
msgid "Company information"
|
233 |
-
msgstr ""
|
234 |
-
|
235 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:75
|
236 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:209
|
237 |
-
msgctxt "(Admin)"
|
238 |
-
msgid "Company Name"
|
239 |
-
msgstr ""
|
240 |
-
|
241 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:82
|
242 |
-
msgctxt "(Admin)"
|
243 |
-
msgid "Company Email"
|
244 |
-
msgstr ""
|
245 |
-
|
246 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:89
|
247 |
-
msgctxt "(Admin)"
|
248 |
-
msgid "Company Location"
|
249 |
-
msgstr ""
|
250 |
-
|
251 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:105
|
252 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:245
|
253 |
-
msgctxt "(Admin)"
|
254 |
-
msgid "Representative Contact Name"
|
255 |
-
msgstr ""
|
256 |
-
|
257 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:112
|
258 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:252
|
259 |
-
msgctxt "(Admin)"
|
260 |
-
msgid "Representative Contact Email"
|
261 |
-
msgstr ""
|
262 |
-
|
263 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:119
|
264 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:259
|
265 |
-
msgctxt "(Admin)"
|
266 |
-
msgid "Representative Contact Phone"
|
267 |
-
msgstr ""
|
268 |
-
|
269 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:135
|
270 |
-
msgctxt "(Admin)"
|
271 |
-
msgid "Data Protection Authority"
|
272 |
-
msgstr ""
|
273 |
-
|
274 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:141
|
275 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:286
|
276 |
-
msgctxt "(Admin)"
|
277 |
-
msgid "Data Protection Authority Website"
|
278 |
-
msgstr ""
|
279 |
-
|
280 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:148
|
281 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:293
|
282 |
-
msgctxt "(Admin)"
|
283 |
-
msgid "Data Protection Authority Email"
|
284 |
-
msgstr ""
|
285 |
-
|
286 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:155
|
287 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:300
|
288 |
-
msgctxt "(Admin)"
|
289 |
-
msgid "Data Protection Authority Phone"
|
290 |
-
msgstr ""
|
291 |
-
|
292 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:165
|
293 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:175
|
294 |
-
msgctxt "(Admin)"
|
295 |
-
msgid "Data Protection Officer"
|
296 |
-
msgstr ""
|
297 |
-
|
298 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:168
|
299 |
-
msgctxt "(Admin)"
|
300 |
-
msgid "Knowledge base: Do I need to appoint a Data Protection Officer?"
|
301 |
-
msgstr ""
|
302 |
-
|
303 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:182
|
304 |
-
msgctxt "(Admin)"
|
305 |
-
msgid "Data Protection Officer Name"
|
306 |
-
msgstr ""
|
307 |
-
|
308 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:190
|
309 |
-
msgctxt "(Admin)"
|
310 |
-
msgid "Data Protection Officer Email"
|
311 |
-
msgstr ""
|
312 |
-
|
313 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:216
|
314 |
-
msgctxt "(Admin)"
|
315 |
-
msgid "Contact Email"
|
316 |
-
msgstr ""
|
317 |
-
|
318 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:235
|
319 |
-
msgctxt "(Admin)"
|
320 |
-
msgid "Representative Contact"
|
321 |
-
msgstr ""
|
322 |
-
|
323 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:238
|
324 |
-
msgctxt "(Admin)"
|
325 |
-
msgid "Knowledge base: Do I need to appoint an EU-based representative?"
|
326 |
-
msgstr ""
|
327 |
-
|
328 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:317
|
329 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:324
|
330 |
-
msgctxt "(Admin)"
|
331 |
-
msgid "DPO Name"
|
332 |
-
msgstr ""
|
333 |
-
|
334 |
-
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:420
|
335 |
-
msgctxt "(Admin)"
|
336 |
-
msgid "Save & Generate Policy"
|
337 |
-
msgstr ""
|
338 |
-
|
339 |
-
#: src/Components/PrivacyPolicy/PrivacyPolicy.php:82
|
340 |
-
#: src/Installer/Installer.php:271 src/Installer/Steps/PolicySettings.php:199
|
341 |
-
#: views/themes/storefront/footer.php:3
|
342 |
-
#: views/themes/twentyseventeen/footer.php:3
|
343 |
-
#: views/themes/twentysixteen/footer.php:4
|
344 |
-
msgid "Privacy Policy"
|
345 |
-
msgstr ""
|
346 |
-
|
347 |
-
#: src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php:19
|
348 |
-
msgid "This page is currently disabled."
|
349 |
-
msgstr ""
|
350 |
-
|
351 |
-
#: src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php:35
|
352 |
-
#: src/Installer/Installer.php:279
|
353 |
-
#: src/Installer/Steps/ConfigurationPages.php:55
|
354 |
-
#: views/themes/storefront/footer.php:7
|
355 |
-
#: views/themes/twentyseventeen/footer.php:7
|
356 |
-
#: views/themes/twentysixteen/footer.php:9
|
357 |
-
msgid "Privacy Tools"
|
358 |
-
msgstr ""
|
359 |
-
|
360 |
-
#: src/Components/Support/AdminTabSupport.php:13
|
361 |
-
#: src/Components/Support/AdminTabSupport.php:20
|
362 |
-
msgctxt "(Admin)"
|
363 |
-
msgid "Support"
|
364 |
-
msgstr ""
|
365 |
-
|
366 |
-
#: src/Components/WordpressComments/WordpressComments.php:90
|
367 |
-
#, php-format
|
368 |
-
msgid ""
|
369 |
-
"%sERROR:%s You need to accept the terms and conditions to post a comment."
|
370 |
-
msgstr ""
|
371 |
-
|
372 |
-
#: src/Components/WordpressUser/Controllers/DashboardDataPageController.php:54
|
373 |
-
#: views/privacy-tools/notices.php:19
|
374 |
-
msgid "We have received your request and will reply within 30 days."
|
375 |
-
msgstr ""
|
376 |
-
|
377 |
-
#: src/Components/WordpressUser/Controllers/DashboardDataPageController.php:59
|
378 |
-
#: views/privacy-tools/notices.php:15
|
379 |
-
msgid "Consent withdrawn."
|
380 |
-
msgstr ""
|
381 |
-
|
382 |
-
#: src/Components/WordpressUser/RegistrationForm.php:42
|
383 |
-
msgid "<strong>ERROR</strong>: You must accept the terms and conditions."
|
384 |
-
msgstr ""
|
385 |
-
|
386 |
-
#: src/Components/WordpressUser/WordpressUser.php:63
|
387 |
-
#: src/Components/WordpressUser/WordpressUser.php:64
|
388 |
-
#: views/modules/wordpress-user/dashboard/data-page/header.php:2
|
389 |
-
msgctxt "(Admin)"
|
390 |
-
msgid "Privacy Tools"
|
391 |
-
msgstr ""
|
392 |
-
|
393 |
-
#: src/DataSubject/AdminTabDataSubject.php:27
|
394 |
-
#: src/DataSubject/AdminTabDataSubject.php:41
|
395 |
-
msgctxt "(Admin)"
|
396 |
-
msgid "Data Subjects"
|
397 |
-
msgstr ""
|
398 |
-
|
399 |
-
#: src/DataSubject/DataRepository.php:143
|
400 |
-
msgid "Data exported"
|
401 |
-
msgstr ""
|
402 |
-
|
403 |
-
#: src/DataSubject/DataRepository.php:158
|
404 |
-
msgid "Data export request"
|
405 |
-
msgstr ""
|
406 |
-
|
407 |
-
#: src/DataSubject/DataRepository.php:171
|
408 |
-
msgid "Data removed"
|
409 |
-
msgstr ""
|
410 |
-
|
411 |
-
#: src/DataSubject/DataRepository.php:186
|
412 |
-
msgid "Data removal request"
|
413 |
-
msgstr ""
|
414 |
-
|
415 |
-
#: src/DataSubject/DataSubjectIdentificator.php:65
|
416 |
-
#: src/DataSubject/DataSubjectIdentificator.php:82
|
417 |
-
msgid "Your personal data on"
|
418 |
-
msgstr ""
|
419 |
-
|
420 |
-
#: src/Helpers.php:27
|
421 |
-
msgctxt "(Admin)"
|
422 |
-
msgid "Austria"
|
423 |
-
msgstr ""
|
424 |
-
|
425 |
-
#: src/Helpers.php:28
|
426 |
-
msgctxt "(Admin)"
|
427 |
-
msgid "Belgium"
|
428 |
-
msgstr ""
|
429 |
-
|
430 |
-
#: src/Helpers.php:29
|
431 |
-
msgctxt "(Admin)"
|
432 |
-
msgid "Bulgaria"
|
433 |
-
msgstr ""
|
434 |
-
|
435 |
-
#: src/Helpers.php:30
|
436 |
-
msgctxt "(Admin)"
|
437 |
-
msgid "Croatia"
|
438 |
-
msgstr ""
|
439 |
-
|
440 |
-
#: src/Helpers.php:31
|
441 |
-
msgctxt "(Admin)"
|
442 |
-
msgid "Cyprus"
|
443 |
-
msgstr ""
|
444 |
-
|
445 |
-
#: src/Helpers.php:32
|
446 |
-
msgctxt "(Admin)"
|
447 |
-
msgid "Czech Republic"
|
448 |
-
msgstr ""
|
449 |
-
|
450 |
-
#: src/Helpers.php:33
|
451 |
-
msgctxt "(Admin)"
|
452 |
-
msgid "Denmark"
|
453 |
-
msgstr ""
|
454 |
-
|
455 |
-
#: src/Helpers.php:34
|
456 |
-
msgctxt "(Admin)"
|
457 |
-
msgid "Estonia"
|
458 |
-
msgstr ""
|
459 |
-
|
460 |
-
#: src/Helpers.php:35
|
461 |
-
msgctxt "(Admin)"
|
462 |
-
msgid "Finland"
|
463 |
-
msgstr ""
|
464 |
-
|
465 |
-
#: src/Helpers.php:36
|
466 |
-
msgctxt "(Admin)"
|
467 |
-
msgid "France"
|
468 |
-
msgstr ""
|
469 |
-
|
470 |
-
#: src/Helpers.php:37
|
471 |
-
msgctxt "(Admin)"
|
472 |
-
msgid "Germany"
|
473 |
-
msgstr ""
|
474 |
-
|
475 |
-
#: src/Helpers.php:38
|
476 |
-
msgctxt "(Admin)"
|
477 |
-
msgid "Greece"
|
478 |
-
msgstr ""
|
479 |
-
|
480 |
-
#: src/Helpers.php:39
|
481 |
-
msgctxt "(Admin)"
|
482 |
-
msgid "Hungary"
|
483 |
-
msgstr ""
|
484 |
-
|
485 |
-
#: src/Helpers.php:40
|
486 |
-
msgctxt "(Admin)"
|
487 |
-
msgid "Ireland"
|
488 |
-
msgstr ""
|
489 |
-
|
490 |
-
#: src/Helpers.php:41
|
491 |
-
msgctxt "(Admin)"
|
492 |
-
msgid "Italy"
|
493 |
-
msgstr ""
|
494 |
-
|
495 |
-
#: src/Helpers.php:42
|
496 |
-
msgctxt "(Admin)"
|
497 |
-
msgid "Latvia"
|
498 |
-
msgstr ""
|
499 |
-
|
500 |
-
#: src/Helpers.php:43
|
501 |
-
msgctxt "(Admin)"
|
502 |
-
msgid "Lithuania"
|
503 |
-
msgstr ""
|
504 |
-
|
505 |
-
#: src/Helpers.php:44
|
506 |
-
msgctxt "(Admin)"
|
507 |
-
msgid "Luxembourg"
|
508 |
-
msgstr ""
|
509 |
-
|
510 |
-
#: src/Helpers.php:45
|
511 |
-
msgctxt "(Admin)"
|
512 |
-
msgid "Malta"
|
513 |
-
msgstr ""
|
514 |
-
|
515 |
-
#: src/Helpers.php:46
|
516 |
-
msgctxt "(Admin)"
|
517 |
-
msgid "Netherlands"
|
518 |
-
msgstr ""
|
519 |
-
|
520 |
-
#: src/Helpers.php:47
|
521 |
-
msgctxt "(Admin)"
|
522 |
-
msgid "Poland"
|
523 |
-
msgstr ""
|
524 |
-
|
525 |
-
#: src/Helpers.php:48
|
526 |
-
msgctxt "(Admin)"
|
527 |
-
msgid "Portugal"
|
528 |
-
msgstr ""
|
529 |
-
|
530 |
-
#: src/Helpers.php:49
|
531 |
-
msgctxt "(Admin)"
|
532 |
-
msgid "Romania"
|
533 |
-
msgstr ""
|
534 |
-
|
535 |
-
#: src/Helpers.php:50
|
536 |
-
msgctxt "(Admin)"
|
537 |
-
msgid "Slovakia"
|
538 |
-
msgstr ""
|
539 |
-
|
540 |
-
#: src/Helpers.php:51
|
541 |
-
msgctxt "(Admin)"
|
542 |
-
msgid "Slovenia"
|
543 |
-
msgstr ""
|
544 |
-
|
545 |
-
#: src/Helpers.php:52
|
546 |
-
msgctxt "(Admin)"
|
547 |
-
msgid "Spain"
|
548 |
-
msgstr ""
|
549 |
-
|
550 |
-
#: src/Helpers.php:53
|
551 |
-
msgctxt "(Admin)"
|
552 |
-
msgid "Sweden"
|
553 |
-
msgstr ""
|
554 |
-
|
555 |
-
#: src/Helpers.php:54
|
556 |
-
msgctxt "(Admin)"
|
557 |
-
msgid "United Kingdom"
|
558 |
-
msgstr ""
|
559 |
-
|
560 |
-
#: src/Helpers.php:69
|
561 |
-
msgctxt "(Admin)"
|
562 |
-
msgid "Iceland"
|
563 |
-
msgstr ""
|
564 |
-
|
565 |
-
#: src/Helpers.php:70
|
566 |
-
msgctxt "(Admin)"
|
567 |
-
msgid "Norway"
|
568 |
-
msgstr ""
|
569 |
-
|
570 |
-
#: src/Helpers.php:71
|
571 |
-
msgctxt "(Admin)"
|
572 |
-
msgid "Liechtenstein"
|
573 |
-
msgstr ""
|
574 |
-
|
575 |
-
#: src/Helpers.php:72
|
576 |
-
msgctxt "(Admin)"
|
577 |
-
msgid "Switzerland"
|
578 |
-
msgstr ""
|
579 |
-
|
580 |
-
#: src/Helpers.php:73
|
581 |
-
msgctxt "(Admin)"
|
582 |
-
msgid "United States"
|
583 |
-
msgstr ""
|
584 |
-
|
585 |
-
#: src/Helpers.php:74
|
586 |
-
msgctxt "(Admin)"
|
587 |
-
msgid "Rest of the world"
|
588 |
-
msgstr ""
|
589 |
-
|
590 |
-
#: src/Helpers.php:145
|
591 |
-
msgid "An error has occurred. Please contact the site administrator."
|
592 |
-
msgstr ""
|
593 |
-
|
594 |
-
#: src/Installer/Installer.php:135
|
595 |
-
msgctxt "(Admin)"
|
596 |
-
msgid "Setup Wizard"
|
597 |
-
msgstr ""
|
598 |
-
|
599 |
-
#: src/Installer/Steps/ConfigurationPages.php:23
|
600 |
-
#: src/Installer/Steps/PolicySettings.php:23
|
601 |
-
#: src/Installer/Steps/PolicySettings.php:48
|
602 |
-
msgctxt "(Admin)"
|
603 |
-
msgid "— Create a new page —"
|
604 |
-
msgstr ""
|
605 |
-
|
606 |
-
#: src/Installer/Steps/PolicySettings.php:38
|
607 |
-
msgctxt "(Admin)"
|
608 |
-
msgid ""
|
609 |
-
"We have automatically selected your WooCommerce Terms & Conditions page."
|
610 |
-
msgstr ""
|
611 |
-
|
612 |
-
#: src/Modules/ContactForm7/ContactForm7.php:35
|
613 |
-
msgctxt "(Admin)"
|
614 |
-
msgid "gdpr terms txt"
|
615 |
-
msgstr ""
|
616 |
-
|
617 |
-
#: src/Router.php:80 src/Router.php:92 src/Router.php:125 src/Router.php:141
|
618 |
-
#, php-format
|
619 |
-
msgid "Nonce error for action \"%s\". Please go back and try again!"
|
620 |
-
msgstr ""
|
621 |
-
|
622 |
-
#: src/Router.php:149
|
623 |
-
msgctxt "(Admin)"
|
624 |
-
msgid "You do not have the required permissions to perform this action!"
|
625 |
-
msgstr ""
|
626 |
-
|
627 |
-
#: views/admin/consent.php:3
|
628 |
-
msgctxt "(Admin)"
|
629 |
-
msgid "Default consent types"
|
630 |
-
msgstr ""
|
631 |
-
|
632 |
-
#: views/admin/consent.php:4
|
633 |
-
msgctxt "(Admin)"
|
634 |
-
msgid ""
|
635 |
-
"These are the consent types that have been automatically registered by the "
|
636 |
-
"framework or a plugin."
|
637 |
-
msgstr ""
|
638 |
-
|
639 |
-
#: views/admin/consent.php:7 views/admin/consent.php:52
|
640 |
-
msgctxt "(Admin)"
|
641 |
-
msgid "Slug"
|
642 |
-
msgstr ""
|
643 |
-
|
644 |
-
#: views/admin/consent.php:8 views/admin/consent.php:38
|
645 |
-
#: views/admin/consent.php:60
|
646 |
-
msgctxt "(Admin)"
|
647 |
-
msgid "Title"
|
648 |
-
msgstr ""
|
649 |
-
|
650 |
-
#: views/admin/consent.php:9 views/admin/consent.php:41
|
651 |
-
#: views/admin/consent.php:63
|
652 |
-
msgctxt "(Admin)"
|
653 |
-
msgid "Description"
|
654 |
-
msgstr ""
|
655 |
-
|
656 |
-
#: views/admin/consent.php:10
|
657 |
-
msgctxt "(Admin)"
|
658 |
-
msgid "Visibility"
|
659 |
-
msgstr ""
|
660 |
-
|
661 |
-
#: views/admin/consent.php:18
|
662 |
-
msgctxt "(Admin)"
|
663 |
-
msgid "Visible"
|
664 |
-
msgstr ""
|
665 |
-
|
666 |
-
#: views/admin/consent.php:20
|
667 |
-
msgctxt "(Admin)"
|
668 |
-
msgid "Hidden"
|
669 |
-
msgstr ""
|
670 |
-
|
671 |
-
#: views/admin/consent.php:29
|
672 |
-
msgctxt "(Admin)"
|
673 |
-
msgid "Custom consent types"
|
674 |
-
msgstr ""
|
675 |
-
|
676 |
-
#: views/admin/consent.php:30
|
677 |
-
msgctxt "(Admin)"
|
678 |
-
msgid ""
|
679 |
-
"Here you can add custom consent types to track. They will not be used "
|
680 |
-
"anywhere by default - you will need to build an integration for each of them."
|
681 |
-
msgstr ""
|
682 |
-
|
683 |
-
#: views/admin/consent.php:35
|
684 |
-
msgctxt "(Admin)"
|
685 |
-
msgid "Machine-readable slug"
|
686 |
-
msgstr ""
|
687 |
-
|
688 |
-
#: views/admin/consent.php:44 views/admin/consent.php:68
|
689 |
-
msgctxt "(Admin)"
|
690 |
-
msgid "Visible?"
|
691 |
-
msgstr ""
|
692 |
-
|
693 |
-
#: views/admin/consent.php:72
|
694 |
-
msgctxt "(Admin)"
|
695 |
-
msgid "Remove"
|
696 |
-
msgstr ""
|
697 |
-
|
698 |
-
#: views/admin/consent.php:93
|
699 |
-
msgctxt "(Admin)"
|
700 |
-
msgid "Additional info"
|
701 |
-
msgstr ""
|
702 |
-
|
703 |
-
#: views/admin/consent.php:95
|
704 |
-
msgctxt "(Admin)"
|
705 |
-
msgid ""
|
706 |
-
"This text will be displayed to your data subjects on the Privacy Tools page."
|
707 |
-
msgstr ""
|
708 |
-
|
709 |
-
#: views/admin/data-subjects/search-form.php:2
|
710 |
-
msgctxt "(Admin)"
|
711 |
-
msgid ""
|
712 |
-
"On this page, you can find which data subjects personal data you are storing "
|
713 |
-
"and download, export or delete it."
|
714 |
-
msgstr ""
|
715 |
-
|
716 |
-
#: views/admin/data-subjects/search-form.php:10
|
717 |
-
msgctxt "(Admin)"
|
718 |
-
msgid "Find data subject by email"
|
719 |
-
msgstr ""
|
720 |
-
|
721 |
-
#: views/admin/data-subjects/search-form.php:11
|
722 |
-
msgctxt "(Admin)"
|
723 |
-
msgid "Email address"
|
724 |
-
msgstr ""
|
725 |
-
|
726 |
-
#: views/admin/data-subjects/search-form.php:16
|
727 |
-
msgctxt "(Admin)"
|
728 |
-
msgid "Search"
|
729 |
-
msgstr ""
|
730 |
-
|
731 |
-
#: views/admin/data-subjects/search-results.php:7
|
732 |
-
msgctxt "(Admin)"
|
733 |
-
msgid "Username"
|
734 |
-
msgstr ""
|
735 |
-
|
736 |
-
#: views/admin/data-subjects/search-results.php:12
|
737 |
-
msgctxt "(Admin)"
|
738 |
-
msgid "is not a registered user."
|
739 |
-
msgstr ""
|
740 |
-
|
741 |
-
#: views/admin/data-subjects/search-results.php:16
|
742 |
-
msgctxt "(Admin)"
|
743 |
-
msgid "Download data (html)"
|
744 |
-
msgstr ""
|
745 |
-
|
746 |
-
#: views/admin/data-subjects/search-results.php:17
|
747 |
-
msgctxt "(Admin)"
|
748 |
-
msgid "Export data (json)"
|
749 |
-
msgstr ""
|
750 |
-
|
751 |
-
#: views/admin/data-subjects/search-results.php:21
|
752 |
-
msgctxt "(Admin)"
|
753 |
-
msgid ""
|
754 |
-
"This user has admin capabilities. Deleting data via this interface is "
|
755 |
-
"disabled."
|
756 |
-
msgstr ""
|
757 |
-
|
758 |
-
#: views/admin/data-subjects/search-results.php:24
|
759 |
-
msgctxt "(Admin)"
|
760 |
-
msgid "Anonymize data"
|
761 |
-
msgstr ""
|
762 |
-
|
763 |
-
#: views/admin/data-subjects/search-results.php:25
|
764 |
-
msgctxt "(Admin)"
|
765 |
-
msgid "Delete data"
|
766 |
-
msgstr ""
|
767 |
-
|
768 |
-
#: views/admin/data-subjects/search-results.php:29
|
769 |
-
msgctxt "(Admin)"
|
770 |
-
msgid "No data found!"
|
771 |
-
msgstr ""
|
772 |
-
|
773 |
-
#: views/admin/general/delete-action-email.php:5
|
774 |
-
#: views/admin/general/export-action-email.php:5
|
775 |
-
#: views/installer/steps/configuration-settings.php:29
|
776 |
-
#: views/installer/steps/configuration-settings.php:79
|
777 |
-
msgid "Email address"
|
778 |
-
msgstr ""
|
779 |
-
|
780 |
-
#: views/admin/general/delete-action-reassign.php:3
|
781 |
-
#: views/installer/steps/configuration-settings.php:50
|
782 |
-
msgctxt "(Admin)"
|
783 |
-
msgid "Delete content"
|
784 |
-
msgstr ""
|
785 |
-
|
786 |
-
#: views/admin/general/delete-action-reassign.php:6
|
787 |
-
#: views/installer/steps/configuration-settings.php:53
|
788 |
-
msgctxt "(Admin)"
|
789 |
-
msgid "Reassign content to a user"
|
790 |
-
msgstr ""
|
791 |
-
|
792 |
-
#: views/admin/general/delete-action-reassign.php:10
|
793 |
-
msgctxt "(Admin)"
|
794 |
-
msgid ""
|
795 |
-
"If the user has submitted any content on your site, should it be deleted or "
|
796 |
-
"reassigned to another user?"
|
797 |
-
msgstr ""
|
798 |
-
|
799 |
-
#: views/admin/general/description-data-page.php:2
|
800 |
-
msgctxt "(Admin)"
|
801 |
-
msgid ""
|
802 |
-
"Select the page where users can go to control their data. This page must "
|
803 |
-
"contain the [gdpr_privacy_tools] shortcode."
|
804 |
-
msgstr ""
|
805 |
-
|
806 |
-
#: views/admin/general/enable.php:9
|
807 |
-
msgctxt "(Admin)"
|
808 |
-
msgid "Enable the view, export and forget functionality for users and visitors"
|
809 |
-
msgstr ""
|
810 |
-
|
811 |
-
#: views/admin/general/enable.php:12
|
812 |
-
msgctxt "(Admin)"
|
813 |
-
msgid ""
|
814 |
-
"Enable the Privacy Tools page on front-end and dashboard. This allows "
|
815 |
-
"visitors to request viewing and deleting their personal data and withdraw "
|
816 |
-
"consents."
|
817 |
-
msgstr ""
|
818 |
-
|
819 |
-
#: views/admin/general/theme-compatibility.php:9
|
820 |
-
#: views/installer/steps/integrations.php:21
|
821 |
-
msgctxt "(Admin)"
|
822 |
-
msgid ""
|
823 |
-
"Automatically add Privacy Policy and Privacy Tools links to your site footer."
|
824 |
-
msgstr ""
|
825 |
-
|
826 |
-
#: views/admin/notices/header.php:4 views/admin/settings-page.php:3
|
827 |
-
#: views/installer/header.php:23
|
828 |
-
msgctxt "(Admin)"
|
829 |
-
msgid "The GDPR Framework"
|
830 |
-
msgstr ""
|
831 |
-
|
832 |
-
#: views/admin/notices/helper-autoinstall.php:2
|
833 |
-
msgctxt "(Admin)"
|
834 |
-
msgid ""
|
835 |
-
"A Privacy Policy page has been created, but it is empty. You can generate a "
|
836 |
-
"policy template on this page."
|
837 |
-
msgstr ""
|
838 |
-
|
839 |
-
#: views/admin/notices/helper-policy.php:2
|
840 |
-
msgctxt "(Admin)"
|
841 |
-
msgid ""
|
842 |
-
"Heads up - your Privacy Policy still requires some attention. Find the "
|
843 |
-
"places marked with [TODO] and replace them with real content!"
|
844 |
-
msgstr ""
|
845 |
-
|
846 |
-
#: views/admin/notices/helper-tools.php:2
|
847 |
-
msgctxt "(Admin)"
|
848 |
-
msgid "The contents of this page should contain the [gdpr_tools] shortcode."
|
849 |
-
msgstr ""
|
850 |
-
|
851 |
-
#: views/admin/privacy-policy/description-policy-page.php:2
|
852 |
-
msgctxt "(Admin)"
|
853 |
-
msgid "Select the page which will contain your Privacy Policy"
|
854 |
-
msgstr ""
|
855 |
-
|
856 |
-
#: views/admin/privacy-policy/generated.php:3
|
857 |
-
msgctxt "(Admin)"
|
858 |
-
msgid "Your Privacy Policy has been generated."
|
859 |
-
msgstr ""
|
860 |
-
|
861 |
-
#: views/admin/privacy-policy/generated.php:20
|
862 |
-
msgctxt "(Admin)"
|
863 |
-
msgid "« Back"
|
864 |
-
msgstr ""
|
865 |
-
|
866 |
-
#: views/admin/privacy-policy/header.php:2
|
867 |
-
msgctxt "(Admin)"
|
868 |
-
msgid ""
|
869 |
-
"This page allows you to generate a Privacy Policy based on the information "
|
870 |
-
"you entered below."
|
871 |
-
msgstr ""
|
872 |
-
|
873 |
-
#: views/admin/settings-page.php:31
|
874 |
-
#, php-format
|
875 |
-
msgctxt "(Admin)"
|
876 |
-
msgid "The GDPR Framework. Built with ♥ by %sCodelight%s."
|
877 |
-
msgstr ""
|
878 |
-
|
879 |
-
#: views/admin/support/contents.php:5 views/installer/steps/finish.php:10
|
880 |
-
msgctxt "(Admin)"
|
881 |
-
msgid "Need more info?"
|
882 |
-
msgstr ""
|
883 |
-
|
884 |
-
#: views/admin/support/contents.php:11 views/installer/steps/finish.php:16
|
885 |
-
msgctxt "(Admin)"
|
886 |
-
msgid "Site Owner's guide to GDPR"
|
887 |
-
msgstr ""
|
888 |
-
|
889 |
-
#: views/admin/support/contents.php:14 views/installer/steps/finish.php:19
|
890 |
-
msgctxt "(Admin)"
|
891 |
-
msgid "Read the full guide on GDPR compliance."
|
892 |
-
msgstr ""
|
893 |
-
|
894 |
-
#: views/admin/support/contents.php:20 views/installer/steps/finish.php:25
|
895 |
-
msgctxt "(Admin)"
|
896 |
-
msgid "Knowledge base"
|
897 |
-
msgstr ""
|
898 |
-
|
899 |
-
#: views/admin/support/contents.php:23 views/installer/steps/finish.php:28
|
900 |
-
msgctxt "(Admin)"
|
901 |
-
msgid "Check out the knowledge base for common questions and answers."
|
902 |
-
msgstr ""
|
903 |
-
|
904 |
-
#: views/admin/support/contents.php:29 views/installer/steps/finish.php:34
|
905 |
-
msgctxt "(Admin)"
|
906 |
-
msgid "Developer's guide to GDPR"
|
907 |
-
msgstr ""
|
908 |
-
|
909 |
-
#: views/admin/support/contents.php:32 views/installer/steps/finish.php:37
|
910 |
-
msgctxt "(Admin)"
|
911 |
-
msgid "We have a thorough guide to help making custom sites compliant."
|
912 |
-
msgstr ""
|
913 |
-
|
914 |
-
#: views/admin/support/contents.php:40 views/installer/steps/finish.php:45
|
915 |
-
msgctxt "(Admin)"
|
916 |
-
msgid "Need help?"
|
917 |
-
msgstr ""
|
918 |
-
|
919 |
-
#: views/admin/support/contents.php:46 views/installer/steps/finish.php:51
|
920 |
-
msgctxt "(Admin)"
|
921 |
-
msgid "Submit a support request"
|
922 |
-
msgstr ""
|
923 |
-
|
924 |
-
#: views/admin/support/contents.php:49 views/installer/steps/finish.php:54
|
925 |
-
msgctxt "(Admin)"
|
926 |
-
msgid ""
|
927 |
-
"Found a bug or problem with the plugin? Post in the wordpress.org support "
|
928 |
-
"forum."
|
929 |
-
msgstr ""
|
930 |
-
|
931 |
-
#: views/admin/support/contents.php:55 views/installer/steps/finish.php:60
|
932 |
-
msgctxt "(Admin)"
|
933 |
-
msgid "Request a consultation"
|
934 |
-
msgstr ""
|
935 |
-
|
936 |
-
#: views/admin/support/contents.php:58 views/installer/steps/finish.php:63
|
937 |
-
msgctxt "(Admin)"
|
938 |
-
msgid ""
|
939 |
-
"Need development or legal assistance in making your site compliant? We can "
|
940 |
-
"help!"
|
941 |
-
msgstr ""
|
942 |
-
|
943 |
-
#: views/admin/wizard-buttons.php:2
|
944 |
-
msgctxt "(Admin)"
|
945 |
-
msgid "Restart setup wizard"
|
946 |
-
msgstr ""
|
947 |
-
|
948 |
-
#: views/email/action-export.php:8 views/email/action-forget.php:12
|
949 |
-
msgctxt "(Admin)"
|
950 |
-
msgid ""
|
951 |
-
"This email is just for your information. You don't need to take any action"
|
952 |
-
msgstr ""
|
953 |
-
|
954 |
-
#: views/email/action-forget.php:8
|
955 |
-
msgctxt "(Admin)"
|
956 |
-
msgid "The data subject had a user account on your website."
|
957 |
-
msgstr ""
|
958 |
-
|
959 |
-
#: views/email/identify-data-subject.php:2
|
960 |
-
msgid "Someone has requested access to your data on"
|
961 |
-
msgstr ""
|
962 |
-
|
963 |
-
#: views/email/identify-data-subject.php:3
|
964 |
-
msgid "If this was a mistake, just ignore this email and nothing will happen."
|
965 |
-
msgstr ""
|
966 |
-
|
967 |
-
#: views/email/identify-data-subject.php:4
|
968 |
-
msgid "To manage your data, visit the following address:"
|
969 |
-
msgstr ""
|
970 |
-
|
971 |
-
#: views/email/identify-data-subject.php:10
|
972 |
-
msgid "This link is valid for 15 minutes."
|
973 |
-
msgstr ""
|
974 |
-
|
975 |
-
#: views/email/no-data.php:2
|
976 |
-
msgid "Someone has requested information about your personal data on"
|
977 |
-
msgstr ""
|
978 |
-
|
979 |
-
#: views/email/no-data.php:3
|
980 |
-
msgid "None of your personal data is stored on"
|
981 |
-
msgstr ""
|
982 |
-
|
983 |
-
#: views/email/no-data.php:5
|
984 |
-
msgid ""
|
985 |
-
"If this was a mistake or you did not request this email, just ignore it and "
|
986 |
-
"nothing will happen."
|
987 |
-
msgstr ""
|
988 |
-
|
989 |
-
#: views/email/request-export.php:13 views/email/request-forget.php:13
|
990 |
-
msgctxt "(Admin)"
|
991 |
-
msgid "As a reminder: according to GDPR, you have 30 days to comply."
|
992 |
-
msgstr ""
|
993 |
-
|
994 |
-
#: views/global/delete-action.php:2
|
995 |
-
msgctxt "(Admin)"
|
996 |
-
msgid "Automatically anonymize data"
|
997 |
-
msgstr ""
|
998 |
-
|
999 |
-
#: views/global/delete-action.php:5
|
1000 |
-
msgctxt "(Admin)"
|
1001 |
-
msgid "Automatically delete data"
|
1002 |
-
msgstr ""
|
1003 |
-
|
1004 |
-
#: views/global/delete-action.php:9
|
1005 |
-
msgctxt "(Admin)"
|
1006 |
-
msgid "Automatically anonymize data and notify me via email"
|
1007 |
-
msgstr ""
|
1008 |
-
|
1009 |
-
#: views/global/delete-action.php:13
|
1010 |
-
msgctxt "(Admin)"
|
1011 |
-
msgid "Automatically delete data and notify me via email"
|
1012 |
-
msgstr ""
|
1013 |
-
|
1014 |
-
#: views/global/delete-action.php:16 views/global/export-action.php:10
|
1015 |
-
msgctxt "(Admin)"
|
1016 |
-
msgid "Only notify me via email"
|
1017 |
-
msgstr ""
|
1018 |
-
|
1019 |
-
#: views/global/export-action.php:2
|
1020 |
-
msgctxt "(Admin)"
|
1021 |
-
msgid "Automatically download data"
|
1022 |
-
msgstr ""
|
1023 |
-
|
1024 |
-
#: views/global/export-action.php:6
|
1025 |
-
msgctxt "(Admin)"
|
1026 |
-
msgid "Automatically download data and notify me via email"
|
1027 |
-
msgstr ""
|
1028 |
-
|
1029 |
-
#: views/installer/continue-notice.php:2
|
1030 |
-
msgctxt "(Admin)"
|
1031 |
-
msgid "The The GDPR Framework setup has not been finalized yet."
|
1032 |
-
msgstr ""
|
1033 |
-
|
1034 |
-
#: views/installer/continue-notice.php:3
|
1035 |
-
msgctxt "(Admin)"
|
1036 |
-
msgid "You can continue the setup at any time."
|
1037 |
-
msgstr ""
|
1038 |
-
|
1039 |
-
#: views/installer/continue-notice.php:6
|
1040 |
-
msgctxt "(Admin)"
|
1041 |
-
msgid "Continue the setup wizard"
|
1042 |
-
msgstr ""
|
1043 |
-
|
1044 |
-
#: views/installer/continue-notice.php:9
|
1045 |
-
msgctxt "(Admin)"
|
1046 |
-
msgid "Hide this message"
|
1047 |
-
msgstr ""
|
1048 |
-
|
1049 |
-
#: views/installer/footer.php:7
|
1050 |
-
msgid "Back"
|
1051 |
-
msgstr ""
|
1052 |
-
|
1053 |
-
#: views/installer/header.php:26
|
1054 |
-
msgctxt "(Admin)"
|
1055 |
-
msgid "I need help"
|
1056 |
-
msgstr ""
|
1057 |
-
|
1058 |
-
#: views/installer/header.php:29
|
1059 |
-
msgctxt "(Admin)"
|
1060 |
-
msgid "Developer Docs"
|
1061 |
-
msgstr ""
|
1062 |
-
|
1063 |
-
#: views/installer/header.php:36
|
1064 |
-
msgctxt "(Admin)"
|
1065 |
-
msgid "Configuration"
|
1066 |
-
msgstr ""
|
1067 |
-
|
1068 |
-
#: views/installer/header.php:46
|
1069 |
-
msgctxt "(Admin)"
|
1070 |
-
msgid "Forms & Consent"
|
1071 |
-
msgstr ""
|
1072 |
-
|
1073 |
-
#: views/installer/header.php:51
|
1074 |
-
msgctxt "(Admin)"
|
1075 |
-
msgid "Integrations"
|
1076 |
-
msgstr ""
|
1077 |
-
|
1078 |
-
#: views/installer/steps/configuration-settings.php:23
|
1079 |
-
#: views/installer/steps/configuration-settings.php:73
|
1080 |
-
msgctxt "(Admin)"
|
1081 |
-
msgid "Enter the email address to notify"
|
1082 |
-
msgstr ""
|
1083 |
-
|
1084 |
-
#: views/installer/steps/disclaimer.php:21
|
1085 |
-
msgctxt "(Admin)"
|
1086 |
-
msgid "I accept"
|
1087 |
-
msgstr ""
|
1088 |
-
|
1089 |
-
#: views/installer/welcome-notice.php:7
|
1090 |
-
msgctxt "(Admin)"
|
1091 |
-
msgid "Run the setup wizard"
|
1092 |
-
msgstr ""
|
1093 |
-
|
1094 |
-
#: views/installer/welcome-notice.php:11
|
1095 |
-
msgctxt "(Admin)"
|
1096 |
-
msgid "Auto-install pages"
|
1097 |
-
msgstr ""
|
1098 |
-
|
1099 |
-
#: views/installer/welcome-notice.php:15
|
1100 |
-
msgctxt "(Admin)"
|
1101 |
-
msgid "Skip and install manually"
|
1102 |
-
msgstr ""
|
1103 |
-
|
1104 |
-
#: views/modules/contact-form-7/generator-privacy.php:6
|
1105 |
-
msgctxt "(Admin)"
|
1106 |
-
msgid ""
|
1107 |
-
"This tag generates the default text for Terms & Conditions and/or Privacy "
|
1108 |
-
"Policy checkbox."
|
1109 |
-
msgstr ""
|
1110 |
-
|
1111 |
-
#: views/modules/contact-form-7/generator-privacy.php:15
|
1112 |
-
msgid "Insert"
|
1113 |
-
msgstr ""
|
1114 |
-
|
1115 |
-
#: views/modules/wordpress-comments/terms-checkbox.php:6
|
1116 |
-
#: views/modules/wordpress-user/registration-terms-checkbox.php:7
|
1117 |
-
#, php-format
|
1118 |
-
msgid "I accept the %sTerms and Conditions%s and the %sPrivacy Policy%s"
|
1119 |
-
msgstr ""
|
1120 |
-
|
1121 |
-
#: views/modules/wordpress-user/dashboard/data-page/form-consent.php:3
|
1122 |
-
msgid "Manage consents"
|
1123 |
-
msgstr ""
|
1124 |
-
|
1125 |
-
#: views/modules/wordpress-user/dashboard/data-page/form-consent.php:6
|
1126 |
-
#: views/privacy-tools/form-consent.php:6
|
1127 |
-
msgid "Here you can withdraw any consents you have given."
|
1128 |
-
msgstr ""
|
1129 |
-
|
1130 |
-
#: views/modules/wordpress-user/dashboard/data-page/form-consent.php:8
|
1131 |
-
#: views/privacy-tools/form-consent.php:9
|
1132 |
-
msgid "Consent types"
|
1133 |
-
msgstr ""
|
1134 |
-
|
1135 |
-
#: views/modules/wordpress-user/dashboard/data-page/form-consent.php:23
|
1136 |
-
#: views/privacy-tools/form-consent.php:24
|
1137 |
-
msgid "Withdraw"
|
1138 |
-
msgstr ""
|
1139 |
-
|
1140 |
-
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:5
|
1141 |
-
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:5
|
1142 |
-
msgctxt "(Admin)"
|
1143 |
-
msgid "Delete this user and all data"
|
1144 |
-
msgstr ""
|
1145 |
-
|
1146 |
-
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:11
|
1147 |
-
msgctxt "(Admin)"
|
1148 |
-
msgid "Delete my data"
|
1149 |
-
msgstr ""
|
1150 |
-
|
1151 |
-
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:15
|
1152 |
-
#: views/privacy-tools/form-delete.php:13
|
1153 |
-
msgid "Delete all data we have gathered about you."
|
1154 |
-
msgstr ""
|
1155 |
-
|
1156 |
-
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:16
|
1157 |
-
#: views/privacy-tools/form-delete.php:14
|
1158 |
-
msgid "If you have a user account on our site, it will also be deleted."
|
1159 |
-
msgstr ""
|
1160 |
-
|
1161 |
-
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:17
|
1162 |
-
#: views/privacy-tools/form-delete.php:15
|
1163 |
-
msgid "Be careful - this action is permanent and CANNOT be undone."
|
1164 |
-
msgstr ""
|
1165 |
-
|
1166 |
-
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:22
|
1167 |
-
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:23
|
1168 |
-
msgctxt "(Admin)"
|
1169 |
-
msgid ""
|
1170 |
-
"You seem to have an administrator or equivalent role, so deleting/"
|
1171 |
-
"anonymizing via this page is disabled."
|
1172 |
-
msgstr ""
|
1173 |
-
|
1174 |
-
#: views/modules/wordpress-user/dashboard/form-export.php:7
|
1175 |
-
#: views/privacy-tools/form-export.php:1
|
1176 |
-
msgid "Download your data"
|
1177 |
-
msgstr ""
|
1178 |
-
|
1179 |
-
#: views/modules/wordpress-user/dashboard/form-export.php:12
|
1180 |
-
#: views/privacy-tools/form-export.php:13
|
1181 |
-
msgid "Download as table"
|
1182 |
-
msgstr ""
|
1183 |
-
|
1184 |
-
#: views/modules/wordpress-user/dashboard/form-export.php:15
|
1185 |
-
#: views/privacy-tools/form-export.php:22
|
1186 |
-
msgid "Export as JSON"
|
1187 |
-
msgstr ""
|
1188 |
-
|
1189 |
-
#: views/modules/wordpress-user/dashboard/form-export.php:19
|
1190 |
-
#: views/privacy-tools/form-export.php:4
|
1191 |
-
msgid "You can download all your data formatted as a table for viewing."
|
1192 |
-
msgstr ""
|
1193 |
-
|
1194 |
-
#: views/modules/wordpress-user/dashboard/form-export.php:20
|
1195 |
-
#: views/privacy-tools/form-export.php:5
|
1196 |
-
msgid "Alternatively, you can export it in machine-readable JSON format."
|
1197 |
-
msgstr ""
|
1198 |
-
|
1199 |
-
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:11
|
1200 |
-
msgctxt "(Admin)"
|
1201 |
-
msgid "Delete user and all data"
|
1202 |
-
msgstr ""
|
1203 |
-
|
1204 |
-
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:14
|
1205 |
-
msgctxt "(Admin)"
|
1206 |
-
msgid "Anonymize user and all data"
|
1207 |
-
msgstr ""
|
1208 |
-
|
1209 |
-
#: views/modules/wordpress-user/dashboard/profile-page/header.php:2
|
1210 |
-
msgctxt "(Admin)"
|
1211 |
-
msgid "GDPR Data"
|
1212 |
-
msgstr ""
|
1213 |
-
|
1214 |
-
#: views/modules/wordpress-user/dashboard/profile-page/header.php:6
|
1215 |
-
msgctxt "(Admin)"
|
1216 |
-
msgid "This user has been anonymized."
|
1217 |
-
msgstr ""
|
1218 |
-
|
1219 |
-
#: views/modules/wordpress-user/dashboard/profile-page/table-consent.php:4
|
1220 |
-
msgctxt "(Admin)"
|
1221 |
-
msgid "Consents given"
|
1222 |
-
msgstr ""
|
1223 |
-
|
1224 |
-
#: views/modules/wordpress-user/dashboard/profile-page/table-consent.php:17
|
1225 |
-
msgctxt "(Admin)"
|
1226 |
-
msgid "No consents given"
|
1227 |
-
msgstr ""
|
1228 |
-
|
1229 |
-
#: views/privacy-tools/form-consent.php:2
|
1230 |
-
msgid "Consent"
|
1231 |
-
msgstr ""
|
1232 |
-
|
1233 |
-
#: views/privacy-tools/form-delete.php:1
|
1234 |
-
#: views/privacy-tools/notice-admin-role.php:1
|
1235 |
-
msgid "Delete my user and data"
|
1236 |
-
msgstr ""
|
1237 |
-
|
1238 |
-
#: views/privacy-tools/form-delete.php:7
|
1239 |
-
msgid "Delete my data"
|
1240 |
-
msgstr ""
|
1241 |
-
|
1242 |
-
#: views/privacy-tools/form-identify.php:8
|
1243 |
-
msgid "Back to Privacy Tools"
|
1244 |
-
msgstr ""
|
1245 |
-
|
1246 |
-
#: views/privacy-tools/form-identify.php:14
|
1247 |
-
msgid "Identify yourself!"
|
1248 |
-
msgstr ""
|
1249 |
-
|
1250 |
-
#: views/privacy-tools/form-identify.php:17
|
1251 |
-
#: views/privacy-tools/form-identify.php:20
|
1252 |
-
msgid "Enter your email address"
|
1253 |
-
msgstr ""
|
1254 |
-
|
1255 |
-
#: views/privacy-tools/form-identify.php:23
|
1256 |
-
msgid "Send email"
|
1257 |
-
msgstr ""
|
1258 |
-
|
1259 |
-
#: views/privacy-tools/notice-admin-role.php:4
|
1260 |
-
msgctxt "(Admin)"
|
1261 |
-
msgid "Data deletion is disabled for administrative accounts."
|
1262 |
-
msgstr ""
|
1263 |
-
|
1264 |
-
#: views/privacy-tools/notices.php:3
|
1265 |
-
msgid ""
|
1266 |
-
"We will send you an email with the link to access your data. Please check "
|
1267 |
-
"your spam folder as well!"
|
1268 |
-
msgstr ""
|
1269 |
-
|
1270 |
-
#: views/privacy-tools/notices.php:7
|
1271 |
-
msgid "The email you entered does not appear to be a valid email."
|
1272 |
-
msgstr ""
|
1273 |
-
|
1274 |
-
#: views/privacy-tools/notices.php:11
|
1275 |
-
msgid "Sorry - the link seems to have expired. Please try again!"
|
1276 |
-
msgstr ""
|
1277 |
-
|
1278 |
-
#: views/privacy-tools/notices.php:23
|
1279 |
-
msgid "Your personal data has been removed!"
|
1280 |
-
msgstr ""
|
1281 |
-
|
1282 |
-
#: views/privacy-tools/privacy-tools.php:5
|
1283 |
-
msgid "You are identified as"
|
1284 |
-
msgstr ""
|
1 |
+
# SOME DESCRIPTIVE TITLE.
|
2 |
+
# Copyright (C) YEAR Codelight
|
3 |
+
# This file is distributed under the same license as the The GDPR Framework package.
|
4 |
+
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
5 |
+
#
|
6 |
+
#, fuzzy
|
7 |
+
msgid ""
|
8 |
+
msgstr ""
|
9 |
+
"Project-Id-Version: The GDPR Framework 1.0\n"
|
10 |
+
"Report-Msgid-Bugs-To: gdpr@codelight.eu\n"
|
11 |
+
"POT-Creation-Date: 2018-04-16 10:50+0000\n"
|
12 |
+
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
13 |
+
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
14 |
+
"Language-Team: LANGUAGE <LL@li.org>\n"
|
15 |
+
"Language: \n"
|
16 |
+
"MIME-Version: 1.0\n"
|
17 |
+
"Content-Type: text/plain; charset=CHARSET\n"
|
18 |
+
"Content-Transfer-Encoding: 8bit\n"
|
19 |
+
|
20 |
+
#: gdpr-framework.php:26
|
21 |
+
msgctxt "(Admin)"
|
22 |
+
msgid "WordPress GDPR › Error"
|
23 |
+
msgstr ""
|
24 |
+
|
25 |
+
#: gdpr-framework.php:35
|
26 |
+
msgctxt "(Admin)"
|
27 |
+
msgid "Invalid PHP version"
|
28 |
+
msgstr ""
|
29 |
+
|
30 |
+
#: gdpr-framework.php:35
|
31 |
+
msgctxt "(Admin)"
|
32 |
+
msgid "You must be using PHP 5.6.33 or greater."
|
33 |
+
msgstr ""
|
34 |
+
|
35 |
+
#: gdpr-framework.php:42
|
36 |
+
msgctxt "(Admin)"
|
37 |
+
msgid "Invalid WordPress version"
|
38 |
+
msgstr ""
|
39 |
+
|
40 |
+
#: gdpr-framework.php:42
|
41 |
+
msgctxt "(Admin)"
|
42 |
+
msgid "You must be using WordPress 4.3.0 or greater."
|
43 |
+
msgstr ""
|
44 |
+
|
45 |
+
#: gdpr-framework.php:52
|
46 |
+
msgctxt "(Admin)"
|
47 |
+
msgid ""
|
48 |
+
"You appear to be running a development version of GDPR. You must run "
|
49 |
+
"<code>composer install</code> from the plugin directory."
|
50 |
+
msgstr ""
|
51 |
+
|
52 |
+
#: gdpr-framework.php:53
|
53 |
+
msgctxt "(Admin)"
|
54 |
+
msgid "Autoloader not found."
|
55 |
+
msgstr ""
|
56 |
+
|
57 |
+
#: gdpr-framework.php:115
|
58 |
+
msgctxt "(Admin)"
|
59 |
+
msgid "Anonymous"
|
60 |
+
msgstr ""
|
61 |
+
|
62 |
+
#: src/Admin/AdminTab.php:115
|
63 |
+
msgctxt "(Admin)"
|
64 |
+
msgid "Save"
|
65 |
+
msgstr ""
|
66 |
+
|
67 |
+
#: src/Admin/AdminTab.php:151
|
68 |
+
msgctxt "(Admin)"
|
69 |
+
msgid "Policy generated!"
|
70 |
+
msgstr ""
|
71 |
+
|
72 |
+
#: src/Admin/AdminTabGeneral.php:11
|
73 |
+
msgctxt "(Admin)"
|
74 |
+
msgid "General"
|
75 |
+
msgstr ""
|
76 |
+
|
77 |
+
#: src/Admin/AdminTabGeneral.php:38
|
78 |
+
msgctxt "(Admin)"
|
79 |
+
msgid "General Settings"
|
80 |
+
msgstr ""
|
81 |
+
|
82 |
+
#: src/Admin/AdminTabGeneral.php:43
|
83 |
+
msgctxt "(Admin)"
|
84 |
+
msgid "Enable Privacy Tools"
|
85 |
+
msgstr ""
|
86 |
+
|
87 |
+
#: src/Admin/AdminTabGeneral.php:53
|
88 |
+
msgctxt "(Admin)"
|
89 |
+
msgid "Pages"
|
90 |
+
msgstr ""
|
91 |
+
|
92 |
+
#: src/Admin/AdminTabGeneral.php:58 src/Admin/WordpressAdmin.php:151
|
93 |
+
msgctxt "(Admin)"
|
94 |
+
msgid "Privacy Tools Page"
|
95 |
+
msgstr ""
|
96 |
+
|
97 |
+
#: src/Admin/AdminTabGeneral.php:65 src/Admin/WordpressAdmin.php:147
|
98 |
+
msgctxt "(Admin)"
|
99 |
+
msgid "Privacy Policy Page"
|
100 |
+
msgstr ""
|
101 |
+
|
102 |
+
#: src/Admin/AdminTabGeneral.php:72
|
103 |
+
msgctxt "(Admin)"
|
104 |
+
msgid "Terms & Conditions Page"
|
105 |
+
msgstr ""
|
106 |
+
|
107 |
+
#: src/Admin/AdminTabGeneral.php:82
|
108 |
+
msgctxt "(Admin)"
|
109 |
+
msgid "View & Export Data"
|
110 |
+
msgstr ""
|
111 |
+
|
112 |
+
#: src/Admin/AdminTabGeneral.php:87
|
113 |
+
msgctxt "(Admin)"
|
114 |
+
msgid "Export action"
|
115 |
+
msgstr ""
|
116 |
+
|
117 |
+
#: src/Admin/AdminTabGeneral.php:94 src/Admin/AdminTabGeneral.php:133
|
118 |
+
msgctxt "(Admin)"
|
119 |
+
msgid "Email to notify"
|
120 |
+
msgstr ""
|
121 |
+
|
122 |
+
#: src/Admin/AdminTabGeneral.php:105
|
123 |
+
msgctxt "(Admin)"
|
124 |
+
msgid "Delete & Anonymize Data"
|
125 |
+
msgstr ""
|
126 |
+
|
127 |
+
#: src/Admin/AdminTabGeneral.php:110
|
128 |
+
msgctxt "(Admin)"
|
129 |
+
msgid "Delete action"
|
130 |
+
msgstr ""
|
131 |
+
|
132 |
+
#: src/Admin/AdminTabGeneral.php:117
|
133 |
+
msgctxt "(Admin)"
|
134 |
+
msgid "Delete or reassign content?"
|
135 |
+
msgstr ""
|
136 |
+
|
137 |
+
#: src/Admin/AdminTabGeneral.php:125
|
138 |
+
msgctxt "(Admin)"
|
139 |
+
msgid "Reassign content to"
|
140 |
+
msgstr ""
|
141 |
+
|
142 |
+
#: src/Admin/AdminTabGeneral.php:145
|
143 |
+
msgctxt "(Admin)"
|
144 |
+
msgid "Styling"
|
145 |
+
msgstr ""
|
146 |
+
|
147 |
+
#: src/Admin/AdminTabGeneral.php:150
|
148 |
+
msgctxt "(Admin)"
|
149 |
+
msgid "Enable basic styling on Privacy Tools page"
|
150 |
+
msgstr ""
|
151 |
+
|
152 |
+
#: src/Admin/AdminTabGeneral.php:162
|
153 |
+
msgctxt "(Admin)"
|
154 |
+
msgid "Compatibility"
|
155 |
+
msgstr ""
|
156 |
+
|
157 |
+
#: src/Admin/AdminTabGeneral.php:167
|
158 |
+
msgctxt "(Admin)"
|
159 |
+
msgid "Enable automatic theme compatibility"
|
160 |
+
msgstr ""
|
161 |
+
|
162 |
+
#: src/Admin/AdminTabGeneral.php:184 src/Admin/AdminTabGeneral.php:200
|
163 |
+
#: src/Admin/AdminTabGeneral.php:213 src/Admin/AdminTabGeneral.php:252
|
164 |
+
#: views/installer/steps/configuration-settings.php:62
|
165 |
+
msgctxt "(Admin)"
|
166 |
+
msgid "— Select —"
|
167 |
+
msgstr ""
|
168 |
+
|
169 |
+
#: src/Admin/WordpressAdmin.php:65
|
170 |
+
msgctxt "(Admin)"
|
171 |
+
msgid "Privacy & GDPR Settings"
|
172 |
+
msgstr ""
|
173 |
+
|
174 |
+
#: src/Admin/WordpressAdmin.php:66
|
175 |
+
msgctxt "(Admin)"
|
176 |
+
msgid "Privacy"
|
177 |
+
msgstr ""
|
178 |
+
|
179 |
+
#: src/Components/Consent/AdminTabConsent.php:30
|
180 |
+
#: src/Components/Consent/AdminTabConsent.php:49
|
181 |
+
msgctxt "(Admin)"
|
182 |
+
msgid "Consent"
|
183 |
+
msgstr ""
|
184 |
+
|
185 |
+
#: src/Components/Consent/AdminTabConsent.php:157
|
186 |
+
msgctxt "(Admin)"
|
187 |
+
msgid "Consent slug is a required field!"
|
188 |
+
msgstr ""
|
189 |
+
|
190 |
+
#: src/Components/Consent/AdminTabConsent.php:162
|
191 |
+
msgctxt "(Admin)"
|
192 |
+
msgid ""
|
193 |
+
"You may only use alphanumeric characters, dash and underscore in the consent "
|
194 |
+
"slug field."
|
195 |
+
msgstr ""
|
196 |
+
|
197 |
+
#: src/Components/Consent/AdminTabConsent.php:167
|
198 |
+
msgctxt "(Admin)"
|
199 |
+
msgid "Consent title is a required field!"
|
200 |
+
msgstr ""
|
201 |
+
|
202 |
+
#: src/Components/Consent/ConsentManager.php:46
|
203 |
+
#: views/modules/contact-form-7/content-privacy.php:2
|
204 |
+
#: views/modules/wordpress-comments/terms-checkbox.php:14
|
205 |
+
#: views/modules/wordpress-user/registration-terms-checkbox.php:15
|
206 |
+
#, php-format
|
207 |
+
msgid "I accept the %sPrivacy Policy%s"
|
208 |
+
msgstr ""
|
209 |
+
|
210 |
+
#: src/Components/Consent/ConsentManager.php:50
|
211 |
+
#: src/Components/Consent/ConsentManager.php:69
|
212 |
+
msgctxt "(Admin)"
|
213 |
+
msgid ""
|
214 |
+
"This consent is not visible by default. If someone wishes to withdraw it, "
|
215 |
+
"they should simply request to delete all their data."
|
216 |
+
msgstr ""
|
217 |
+
|
218 |
+
#: src/Components/Consent/ConsentManager.php:65
|
219 |
+
#, php-format
|
220 |
+
msgid "I accept the %sTerms & Conditions%s"
|
221 |
+
msgstr ""
|
222 |
+
|
223 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:19
|
224 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:61
|
225 |
+
#: views/admin/privacy-policy/generated.php:1 views/installer/header.php:41
|
226 |
+
msgctxt "(Admin)"
|
227 |
+
msgid "Privacy Policy"
|
228 |
+
msgstr ""
|
229 |
+
|
230 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:70
|
231 |
+
msgctxt "(Admin)"
|
232 |
+
msgid "Company information"
|
233 |
+
msgstr ""
|
234 |
+
|
235 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:75
|
236 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:209
|
237 |
+
msgctxt "(Admin)"
|
238 |
+
msgid "Company Name"
|
239 |
+
msgstr ""
|
240 |
+
|
241 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:82
|
242 |
+
msgctxt "(Admin)"
|
243 |
+
msgid "Company Email"
|
244 |
+
msgstr ""
|
245 |
+
|
246 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:89
|
247 |
+
msgctxt "(Admin)"
|
248 |
+
msgid "Company Location"
|
249 |
+
msgstr ""
|
250 |
+
|
251 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:105
|
252 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:245
|
253 |
+
msgctxt "(Admin)"
|
254 |
+
msgid "Representative Contact Name"
|
255 |
+
msgstr ""
|
256 |
+
|
257 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:112
|
258 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:252
|
259 |
+
msgctxt "(Admin)"
|
260 |
+
msgid "Representative Contact Email"
|
261 |
+
msgstr ""
|
262 |
+
|
263 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:119
|
264 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:259
|
265 |
+
msgctxt "(Admin)"
|
266 |
+
msgid "Representative Contact Phone"
|
267 |
+
msgstr ""
|
268 |
+
|
269 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:135
|
270 |
+
msgctxt "(Admin)"
|
271 |
+
msgid "Data Protection Authority"
|
272 |
+
msgstr ""
|
273 |
+
|
274 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:141
|
275 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:286
|
276 |
+
msgctxt "(Admin)"
|
277 |
+
msgid "Data Protection Authority Website"
|
278 |
+
msgstr ""
|
279 |
+
|
280 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:148
|
281 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:293
|
282 |
+
msgctxt "(Admin)"
|
283 |
+
msgid "Data Protection Authority Email"
|
284 |
+
msgstr ""
|
285 |
+
|
286 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:155
|
287 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:300
|
288 |
+
msgctxt "(Admin)"
|
289 |
+
msgid "Data Protection Authority Phone"
|
290 |
+
msgstr ""
|
291 |
+
|
292 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:165
|
293 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:175
|
294 |
+
msgctxt "(Admin)"
|
295 |
+
msgid "Data Protection Officer"
|
296 |
+
msgstr ""
|
297 |
+
|
298 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:168
|
299 |
+
msgctxt "(Admin)"
|
300 |
+
msgid "Knowledge base: Do I need to appoint a Data Protection Officer?"
|
301 |
+
msgstr ""
|
302 |
+
|
303 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:182
|
304 |
+
msgctxt "(Admin)"
|
305 |
+
msgid "Data Protection Officer Name"
|
306 |
+
msgstr ""
|
307 |
+
|
308 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:190
|
309 |
+
msgctxt "(Admin)"
|
310 |
+
msgid "Data Protection Officer Email"
|
311 |
+
msgstr ""
|
312 |
+
|
313 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:216
|
314 |
+
msgctxt "(Admin)"
|
315 |
+
msgid "Contact Email"
|
316 |
+
msgstr ""
|
317 |
+
|
318 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:235
|
319 |
+
msgctxt "(Admin)"
|
320 |
+
msgid "Representative Contact"
|
321 |
+
msgstr ""
|
322 |
+
|
323 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:238
|
324 |
+
msgctxt "(Admin)"
|
325 |
+
msgid "Knowledge base: Do I need to appoint an EU-based representative?"
|
326 |
+
msgstr ""
|
327 |
+
|
328 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:317
|
329 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:324
|
330 |
+
msgctxt "(Admin)"
|
331 |
+
msgid "DPO Name"
|
332 |
+
msgstr ""
|
333 |
+
|
334 |
+
#: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:420
|
335 |
+
msgctxt "(Admin)"
|
336 |
+
msgid "Save & Generate Policy"
|
337 |
+
msgstr ""
|
338 |
+
|
339 |
+
#: src/Components/PrivacyPolicy/PrivacyPolicy.php:82
|
340 |
+
#: src/Installer/Installer.php:271 src/Installer/Steps/PolicySettings.php:199
|
341 |
+
#: views/themes/storefront/footer.php:3
|
342 |
+
#: views/themes/twentyseventeen/footer.php:3
|
343 |
+
#: views/themes/twentysixteen/footer.php:4
|
344 |
+
msgid "Privacy Policy"
|
345 |
+
msgstr ""
|
346 |
+
|
347 |
+
#: src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php:19
|
348 |
+
msgid "This page is currently disabled."
|
349 |
+
msgstr ""
|
350 |
+
|
351 |
+
#: src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php:35
|
352 |
+
#: src/Installer/Installer.php:279
|
353 |
+
#: src/Installer/Steps/ConfigurationPages.php:55
|
354 |
+
#: views/themes/storefront/footer.php:7
|
355 |
+
#: views/themes/twentyseventeen/footer.php:7
|
356 |
+
#: views/themes/twentysixteen/footer.php:9
|
357 |
+
msgid "Privacy Tools"
|
358 |
+
msgstr ""
|
359 |
+
|
360 |
+
#: src/Components/Support/AdminTabSupport.php:13
|
361 |
+
#: src/Components/Support/AdminTabSupport.php:20
|
362 |
+
msgctxt "(Admin)"
|
363 |
+
msgid "Support"
|
364 |
+
msgstr ""
|
365 |
+
|
366 |
+
#: src/Components/WordpressComments/WordpressComments.php:90
|
367 |
+
#, php-format
|
368 |
+
msgid ""
|
369 |
+
"%sERROR:%s You need to accept the terms and conditions to post a comment."
|
370 |
+
msgstr ""
|
371 |
+
|
372 |
+
#: src/Components/WordpressUser/Controllers/DashboardDataPageController.php:54
|
373 |
+
#: views/privacy-tools/notices.php:19
|
374 |
+
msgid "We have received your request and will reply within 30 days."
|
375 |
+
msgstr ""
|
376 |
+
|
377 |
+
#: src/Components/WordpressUser/Controllers/DashboardDataPageController.php:59
|
378 |
+
#: views/privacy-tools/notices.php:15
|
379 |
+
msgid "Consent withdrawn."
|
380 |
+
msgstr ""
|
381 |
+
|
382 |
+
#: src/Components/WordpressUser/RegistrationForm.php:42
|
383 |
+
msgid "<strong>ERROR</strong>: You must accept the terms and conditions."
|
384 |
+
msgstr ""
|
385 |
+
|
386 |
+
#: src/Components/WordpressUser/WordpressUser.php:63
|
387 |
+
#: src/Components/WordpressUser/WordpressUser.php:64
|
388 |
+
#: views/modules/wordpress-user/dashboard/data-page/header.php:2
|
389 |
+
msgctxt "(Admin)"
|
390 |
+
msgid "Privacy Tools"
|
391 |
+
msgstr ""
|
392 |
+
|
393 |
+
#: src/DataSubject/AdminTabDataSubject.php:27
|
394 |
+
#: src/DataSubject/AdminTabDataSubject.php:41
|
395 |
+
msgctxt "(Admin)"
|
396 |
+
msgid "Data Subjects"
|
397 |
+
msgstr ""
|
398 |
+
|
399 |
+
#: src/DataSubject/DataRepository.php:143
|
400 |
+
msgid "Data exported"
|
401 |
+
msgstr ""
|
402 |
+
|
403 |
+
#: src/DataSubject/DataRepository.php:158
|
404 |
+
msgid "Data export request"
|
405 |
+
msgstr ""
|
406 |
+
|
407 |
+
#: src/DataSubject/DataRepository.php:171
|
408 |
+
msgid "Data removed"
|
409 |
+
msgstr ""
|
410 |
+
|
411 |
+
#: src/DataSubject/DataRepository.php:186
|
412 |
+
msgid "Data removal request"
|
413 |
+
msgstr ""
|
414 |
+
|
415 |
+
#: src/DataSubject/DataSubjectIdentificator.php:65
|
416 |
+
#: src/DataSubject/DataSubjectIdentificator.php:82
|
417 |
+
msgid "Your personal data on"
|
418 |
+
msgstr ""
|
419 |
+
|
420 |
+
#: src/Helpers.php:27
|
421 |
+
msgctxt "(Admin)"
|
422 |
+
msgid "Austria"
|
423 |
+
msgstr ""
|
424 |
+
|
425 |
+
#: src/Helpers.php:28
|
426 |
+
msgctxt "(Admin)"
|
427 |
+
msgid "Belgium"
|
428 |
+
msgstr ""
|
429 |
+
|
430 |
+
#: src/Helpers.php:29
|
431 |
+
msgctxt "(Admin)"
|
432 |
+
msgid "Bulgaria"
|
433 |
+
msgstr ""
|
434 |
+
|
435 |
+
#: src/Helpers.php:30
|
436 |
+
msgctxt "(Admin)"
|
437 |
+
msgid "Croatia"
|
438 |
+
msgstr ""
|
439 |
+
|
440 |
+
#: src/Helpers.php:31
|
441 |
+
msgctxt "(Admin)"
|
442 |
+
msgid "Cyprus"
|
443 |
+
msgstr ""
|
444 |
+
|
445 |
+
#: src/Helpers.php:32
|
446 |
+
msgctxt "(Admin)"
|
447 |
+
msgid "Czech Republic"
|
448 |
+
msgstr ""
|
449 |
+
|
450 |
+
#: src/Helpers.php:33
|
451 |
+
msgctxt "(Admin)"
|
452 |
+
msgid "Denmark"
|
453 |
+
msgstr ""
|
454 |
+
|
455 |
+
#: src/Helpers.php:34
|
456 |
+
msgctxt "(Admin)"
|
457 |
+
msgid "Estonia"
|
458 |
+
msgstr ""
|
459 |
+
|
460 |
+
#: src/Helpers.php:35
|
461 |
+
msgctxt "(Admin)"
|
462 |
+
msgid "Finland"
|
463 |
+
msgstr ""
|
464 |
+
|
465 |
+
#: src/Helpers.php:36
|
466 |
+
msgctxt "(Admin)"
|
467 |
+
msgid "France"
|
468 |
+
msgstr ""
|
469 |
+
|
470 |
+
#: src/Helpers.php:37
|
471 |
+
msgctxt "(Admin)"
|
472 |
+
msgid "Germany"
|
473 |
+
msgstr ""
|
474 |
+
|
475 |
+
#: src/Helpers.php:38
|
476 |
+
msgctxt "(Admin)"
|
477 |
+
msgid "Greece"
|
478 |
+
msgstr ""
|
479 |
+
|
480 |
+
#: src/Helpers.php:39
|
481 |
+
msgctxt "(Admin)"
|
482 |
+
msgid "Hungary"
|
483 |
+
msgstr ""
|
484 |
+
|
485 |
+
#: src/Helpers.php:40
|
486 |
+
msgctxt "(Admin)"
|
487 |
+
msgid "Ireland"
|
488 |
+
msgstr ""
|
489 |
+
|
490 |
+
#: src/Helpers.php:41
|
491 |
+
msgctxt "(Admin)"
|
492 |
+
msgid "Italy"
|
493 |
+
msgstr ""
|
494 |
+
|
495 |
+
#: src/Helpers.php:42
|
496 |
+
msgctxt "(Admin)"
|
497 |
+
msgid "Latvia"
|
498 |
+
msgstr ""
|
499 |
+
|
500 |
+
#: src/Helpers.php:43
|
501 |
+
msgctxt "(Admin)"
|
502 |
+
msgid "Lithuania"
|
503 |
+
msgstr ""
|
504 |
+
|
505 |
+
#: src/Helpers.php:44
|
506 |
+
msgctxt "(Admin)"
|
507 |
+
msgid "Luxembourg"
|
508 |
+
msgstr ""
|
509 |
+
|
510 |
+
#: src/Helpers.php:45
|
511 |
+
msgctxt "(Admin)"
|
512 |
+
msgid "Malta"
|
513 |
+
msgstr ""
|
514 |
+
|
515 |
+
#: src/Helpers.php:46
|
516 |
+
msgctxt "(Admin)"
|
517 |
+
msgid "Netherlands"
|
518 |
+
msgstr ""
|
519 |
+
|
520 |
+
#: src/Helpers.php:47
|
521 |
+
msgctxt "(Admin)"
|
522 |
+
msgid "Poland"
|
523 |
+
msgstr ""
|
524 |
+
|
525 |
+
#: src/Helpers.php:48
|
526 |
+
msgctxt "(Admin)"
|
527 |
+
msgid "Portugal"
|
528 |
+
msgstr ""
|
529 |
+
|
530 |
+
#: src/Helpers.php:49
|
531 |
+
msgctxt "(Admin)"
|
532 |
+
msgid "Romania"
|
533 |
+
msgstr ""
|
534 |
+
|
535 |
+
#: src/Helpers.php:50
|
536 |
+
msgctxt "(Admin)"
|
537 |
+
msgid "Slovakia"
|
538 |
+
msgstr ""
|
539 |
+
|
540 |
+
#: src/Helpers.php:51
|
541 |
+
msgctxt "(Admin)"
|
542 |
+
msgid "Slovenia"
|
543 |
+
msgstr ""
|
544 |
+
|
545 |
+
#: src/Helpers.php:52
|
546 |
+
msgctxt "(Admin)"
|
547 |
+
msgid "Spain"
|
548 |
+
msgstr ""
|
549 |
+
|
550 |
+
#: src/Helpers.php:53
|
551 |
+
msgctxt "(Admin)"
|
552 |
+
msgid "Sweden"
|
553 |
+
msgstr ""
|
554 |
+
|
555 |
+
#: src/Helpers.php:54
|
556 |
+
msgctxt "(Admin)"
|
557 |
+
msgid "United Kingdom"
|
558 |
+
msgstr ""
|
559 |
+
|
560 |
+
#: src/Helpers.php:69
|
561 |
+
msgctxt "(Admin)"
|
562 |
+
msgid "Iceland"
|
563 |
+
msgstr ""
|
564 |
+
|
565 |
+
#: src/Helpers.php:70
|
566 |
+
msgctxt "(Admin)"
|
567 |
+
msgid "Norway"
|
568 |
+
msgstr ""
|
569 |
+
|
570 |
+
#: src/Helpers.php:71
|
571 |
+
msgctxt "(Admin)"
|
572 |
+
msgid "Liechtenstein"
|
573 |
+
msgstr ""
|
574 |
+
|
575 |
+
#: src/Helpers.php:72
|
576 |
+
msgctxt "(Admin)"
|
577 |
+
msgid "Switzerland"
|
578 |
+
msgstr ""
|
579 |
+
|
580 |
+
#: src/Helpers.php:73
|
581 |
+
msgctxt "(Admin)"
|
582 |
+
msgid "United States"
|
583 |
+
msgstr ""
|
584 |
+
|
585 |
+
#: src/Helpers.php:74
|
586 |
+
msgctxt "(Admin)"
|
587 |
+
msgid "Rest of the world"
|
588 |
+
msgstr ""
|
589 |
+
|
590 |
+
#: src/Helpers.php:145
|
591 |
+
msgid "An error has occurred. Please contact the site administrator."
|
592 |
+
msgstr ""
|
593 |
+
|
594 |
+
#: src/Installer/Installer.php:135
|
595 |
+
msgctxt "(Admin)"
|
596 |
+
msgid "Setup Wizard"
|
597 |
+
msgstr ""
|
598 |
+
|
599 |
+
#: src/Installer/Steps/ConfigurationPages.php:23
|
600 |
+
#: src/Installer/Steps/PolicySettings.php:23
|
601 |
+
#: src/Installer/Steps/PolicySettings.php:48
|
602 |
+
msgctxt "(Admin)"
|
603 |
+
msgid "— Create a new page —"
|
604 |
+
msgstr ""
|
605 |
+
|
606 |
+
#: src/Installer/Steps/PolicySettings.php:38
|
607 |
+
msgctxt "(Admin)"
|
608 |
+
msgid ""
|
609 |
+
"We have automatically selected your WooCommerce Terms & Conditions page."
|
610 |
+
msgstr ""
|
611 |
+
|
612 |
+
#: src/Modules/ContactForm7/ContactForm7.php:35
|
613 |
+
msgctxt "(Admin)"
|
614 |
+
msgid "gdpr terms txt"
|
615 |
+
msgstr ""
|
616 |
+
|
617 |
+
#: src/Router.php:80 src/Router.php:92 src/Router.php:125 src/Router.php:141
|
618 |
+
#, php-format
|
619 |
+
msgid "Nonce error for action \"%s\". Please go back and try again!"
|
620 |
+
msgstr ""
|
621 |
+
|
622 |
+
#: src/Router.php:149
|
623 |
+
msgctxt "(Admin)"
|
624 |
+
msgid "You do not have the required permissions to perform this action!"
|
625 |
+
msgstr ""
|
626 |
+
|
627 |
+
#: views/admin/consent.php:3
|
628 |
+
msgctxt "(Admin)"
|
629 |
+
msgid "Default consent types"
|
630 |
+
msgstr ""
|
631 |
+
|
632 |
+
#: views/admin/consent.php:4
|
633 |
+
msgctxt "(Admin)"
|
634 |
+
msgid ""
|
635 |
+
"These are the consent types that have been automatically registered by the "
|
636 |
+
"framework or a plugin."
|
637 |
+
msgstr ""
|
638 |
+
|
639 |
+
#: views/admin/consent.php:7 views/admin/consent.php:52
|
640 |
+
msgctxt "(Admin)"
|
641 |
+
msgid "Slug"
|
642 |
+
msgstr ""
|
643 |
+
|
644 |
+
#: views/admin/consent.php:8 views/admin/consent.php:38
|
645 |
+
#: views/admin/consent.php:60
|
646 |
+
msgctxt "(Admin)"
|
647 |
+
msgid "Title"
|
648 |
+
msgstr ""
|
649 |
+
|
650 |
+
#: views/admin/consent.php:9 views/admin/consent.php:41
|
651 |
+
#: views/admin/consent.php:63
|
652 |
+
msgctxt "(Admin)"
|
653 |
+
msgid "Description"
|
654 |
+
msgstr ""
|
655 |
+
|
656 |
+
#: views/admin/consent.php:10
|
657 |
+
msgctxt "(Admin)"
|
658 |
+
msgid "Visibility"
|
659 |
+
msgstr ""
|
660 |
+
|
661 |
+
#: views/admin/consent.php:18
|
662 |
+
msgctxt "(Admin)"
|
663 |
+
msgid "Visible"
|
664 |
+
msgstr ""
|
665 |
+
|
666 |
+
#: views/admin/consent.php:20
|
667 |
+
msgctxt "(Admin)"
|
668 |
+
msgid "Hidden"
|
669 |
+
msgstr ""
|
670 |
+
|
671 |
+
#: views/admin/consent.php:29
|
672 |
+
msgctxt "(Admin)"
|
673 |
+
msgid "Custom consent types"
|
674 |
+
msgstr ""
|
675 |
+
|
676 |
+
#: views/admin/consent.php:30
|
677 |
+
msgctxt "(Admin)"
|
678 |
+
msgid ""
|
679 |
+
"Here you can add custom consent types to track. They will not be used "
|
680 |
+
"anywhere by default - you will need to build an integration for each of them."
|
681 |
+
msgstr ""
|
682 |
+
|
683 |
+
#: views/admin/consent.php:35
|
684 |
+
msgctxt "(Admin)"
|
685 |
+
msgid "Machine-readable slug"
|
686 |
+
msgstr ""
|
687 |
+
|
688 |
+
#: views/admin/consent.php:44 views/admin/consent.php:68
|
689 |
+
msgctxt "(Admin)"
|
690 |
+
msgid "Visible?"
|
691 |
+
msgstr ""
|
692 |
+
|
693 |
+
#: views/admin/consent.php:72
|
694 |
+
msgctxt "(Admin)"
|
695 |
+
msgid "Remove"
|
696 |
+
msgstr ""
|
697 |
+
|
698 |
+
#: views/admin/consent.php:93
|
699 |
+
msgctxt "(Admin)"
|
700 |
+
msgid "Additional info"
|
701 |
+
msgstr ""
|
702 |
+
|
703 |
+
#: views/admin/consent.php:95
|
704 |
+
msgctxt "(Admin)"
|
705 |
+
msgid ""
|
706 |
+
"This text will be displayed to your data subjects on the Privacy Tools page."
|
707 |
+
msgstr ""
|
708 |
+
|
709 |
+
#: views/admin/data-subjects/search-form.php:2
|
710 |
+
msgctxt "(Admin)"
|
711 |
+
msgid ""
|
712 |
+
"On this page, you can find which data subjects personal data you are storing "
|
713 |
+
"and download, export or delete it."
|
714 |
+
msgstr ""
|
715 |
+
|
716 |
+
#: views/admin/data-subjects/search-form.php:10
|
717 |
+
msgctxt "(Admin)"
|
718 |
+
msgid "Find data subject by email"
|
719 |
+
msgstr ""
|
720 |
+
|
721 |
+
#: views/admin/data-subjects/search-form.php:11
|
722 |
+
msgctxt "(Admin)"
|
723 |
+
msgid "Email address"
|
724 |
+
msgstr ""
|
725 |
+
|
726 |
+
#: views/admin/data-subjects/search-form.php:16
|
727 |
+
msgctxt "(Admin)"
|
728 |
+
msgid "Search"
|
729 |
+
msgstr ""
|
730 |
+
|
731 |
+
#: views/admin/data-subjects/search-results.php:7
|
732 |
+
msgctxt "(Admin)"
|
733 |
+
msgid "Username"
|
734 |
+
msgstr ""
|
735 |
+
|
736 |
+
#: views/admin/data-subjects/search-results.php:12
|
737 |
+
msgctxt "(Admin)"
|
738 |
+
msgid "is not a registered user."
|
739 |
+
msgstr ""
|
740 |
+
|
741 |
+
#: views/admin/data-subjects/search-results.php:16
|
742 |
+
msgctxt "(Admin)"
|
743 |
+
msgid "Download data (html)"
|
744 |
+
msgstr ""
|
745 |
+
|
746 |
+
#: views/admin/data-subjects/search-results.php:17
|
747 |
+
msgctxt "(Admin)"
|
748 |
+
msgid "Export data (json)"
|
749 |
+
msgstr ""
|
750 |
+
|
751 |
+
#: views/admin/data-subjects/search-results.php:21
|
752 |
+
msgctxt "(Admin)"
|
753 |
+
msgid ""
|
754 |
+
"This user has admin capabilities. Deleting data via this interface is "
|
755 |
+
"disabled."
|
756 |
+
msgstr ""
|
757 |
+
|
758 |
+
#: views/admin/data-subjects/search-results.php:24
|
759 |
+
msgctxt "(Admin)"
|
760 |
+
msgid "Anonymize data"
|
761 |
+
msgstr ""
|
762 |
+
|
763 |
+
#: views/admin/data-subjects/search-results.php:25
|
764 |
+
msgctxt "(Admin)"
|
765 |
+
msgid "Delete data"
|
766 |
+
msgstr ""
|
767 |
+
|
768 |
+
#: views/admin/data-subjects/search-results.php:29
|
769 |
+
msgctxt "(Admin)"
|
770 |
+
msgid "No data found!"
|
771 |
+
msgstr ""
|
772 |
+
|
773 |
+
#: views/admin/general/delete-action-email.php:5
|
774 |
+
#: views/admin/general/export-action-email.php:5
|
775 |
+
#: views/installer/steps/configuration-settings.php:29
|
776 |
+
#: views/installer/steps/configuration-settings.php:79
|
777 |
+
msgid "Email address"
|
778 |
+
msgstr ""
|
779 |
+
|
780 |
+
#: views/admin/general/delete-action-reassign.php:3
|
781 |
+
#: views/installer/steps/configuration-settings.php:50
|
782 |
+
msgctxt "(Admin)"
|
783 |
+
msgid "Delete content"
|
784 |
+
msgstr ""
|
785 |
+
|
786 |
+
#: views/admin/general/delete-action-reassign.php:6
|
787 |
+
#: views/installer/steps/configuration-settings.php:53
|
788 |
+
msgctxt "(Admin)"
|
789 |
+
msgid "Reassign content to a user"
|
790 |
+
msgstr ""
|
791 |
+
|
792 |
+
#: views/admin/general/delete-action-reassign.php:10
|
793 |
+
msgctxt "(Admin)"
|
794 |
+
msgid ""
|
795 |
+
"If the user has submitted any content on your site, should it be deleted or "
|
796 |
+
"reassigned to another user?"
|
797 |
+
msgstr ""
|
798 |
+
|
799 |
+
#: views/admin/general/description-data-page.php:2
|
800 |
+
msgctxt "(Admin)"
|
801 |
+
msgid ""
|
802 |
+
"Select the page where users can go to control their data. This page must "
|
803 |
+
"contain the [gdpr_privacy_tools] shortcode."
|
804 |
+
msgstr ""
|
805 |
+
|
806 |
+
#: views/admin/general/enable.php:9
|
807 |
+
msgctxt "(Admin)"
|
808 |
+
msgid "Enable the view, export and forget functionality for users and visitors"
|
809 |
+
msgstr ""
|
810 |
+
|
811 |
+
#: views/admin/general/enable.php:12
|
812 |
+
msgctxt "(Admin)"
|
813 |
+
msgid ""
|
814 |
+
"Enable the Privacy Tools page on front-end and dashboard. This allows "
|
815 |
+
"visitors to request viewing and deleting their personal data and withdraw "
|
816 |
+
"consents."
|
817 |
+
msgstr ""
|
818 |
+
|
819 |
+
#: views/admin/general/theme-compatibility.php:9
|
820 |
+
#: views/installer/steps/integrations.php:21
|
821 |
+
msgctxt "(Admin)"
|
822 |
+
msgid ""
|
823 |
+
"Automatically add Privacy Policy and Privacy Tools links to your site footer."
|
824 |
+
msgstr ""
|
825 |
+
|
826 |
+
#: views/admin/notices/header.php:4 views/admin/settings-page.php:3
|
827 |
+
#: views/installer/header.php:23
|
828 |
+
msgctxt "(Admin)"
|
829 |
+
msgid "The GDPR Framework"
|
830 |
+
msgstr ""
|
831 |
+
|
832 |
+
#: views/admin/notices/helper-autoinstall.php:2
|
833 |
+
msgctxt "(Admin)"
|
834 |
+
msgid ""
|
835 |
+
"A Privacy Policy page has been created, but it is empty. You can generate a "
|
836 |
+
"policy template on this page."
|
837 |
+
msgstr ""
|
838 |
+
|
839 |
+
#: views/admin/notices/helper-policy.php:2
|
840 |
+
msgctxt "(Admin)"
|
841 |
+
msgid ""
|
842 |
+
"Heads up - your Privacy Policy still requires some attention. Find the "
|
843 |
+
"places marked with [TODO] and replace them with real content!"
|
844 |
+
msgstr ""
|
845 |
+
|
846 |
+
#: views/admin/notices/helper-tools.php:2
|
847 |
+
msgctxt "(Admin)"
|
848 |
+
msgid "The contents of this page should contain the [gdpr_tools] shortcode."
|
849 |
+
msgstr ""
|
850 |
+
|
851 |
+
#: views/admin/privacy-policy/description-policy-page.php:2
|
852 |
+
msgctxt "(Admin)"
|
853 |
+
msgid "Select the page which will contain your Privacy Policy"
|
854 |
+
msgstr ""
|
855 |
+
|
856 |
+
#: views/admin/privacy-policy/generated.php:3
|
857 |
+
msgctxt "(Admin)"
|
858 |
+
msgid "Your Privacy Policy has been generated."
|
859 |
+
msgstr ""
|
860 |
+
|
861 |
+
#: views/admin/privacy-policy/generated.php:20
|
862 |
+
msgctxt "(Admin)"
|
863 |
+
msgid "« Back"
|
864 |
+
msgstr ""
|
865 |
+
|
866 |
+
#: views/admin/privacy-policy/header.php:2
|
867 |
+
msgctxt "(Admin)"
|
868 |
+
msgid ""
|
869 |
+
"This page allows you to generate a Privacy Policy based on the information "
|
870 |
+
"you entered below."
|
871 |
+
msgstr ""
|
872 |
+
|
873 |
+
#: views/admin/settings-page.php:31
|
874 |
+
#, php-format
|
875 |
+
msgctxt "(Admin)"
|
876 |
+
msgid "The GDPR Framework. Built with ♥ by %sCodelight%s."
|
877 |
+
msgstr ""
|
878 |
+
|
879 |
+
#: views/admin/support/contents.php:5 views/installer/steps/finish.php:10
|
880 |
+
msgctxt "(Admin)"
|
881 |
+
msgid "Need more info?"
|
882 |
+
msgstr ""
|
883 |
+
|
884 |
+
#: views/admin/support/contents.php:11 views/installer/steps/finish.php:16
|
885 |
+
msgctxt "(Admin)"
|
886 |
+
msgid "Site Owner's guide to GDPR"
|
887 |
+
msgstr ""
|
888 |
+
|
889 |
+
#: views/admin/support/contents.php:14 views/installer/steps/finish.php:19
|
890 |
+
msgctxt "(Admin)"
|
891 |
+
msgid "Read the full guide on GDPR compliance."
|
892 |
+
msgstr ""
|
893 |
+
|
894 |
+
#: views/admin/support/contents.php:20 views/installer/steps/finish.php:25
|
895 |
+
msgctxt "(Admin)"
|
896 |
+
msgid "Knowledge base"
|
897 |
+
msgstr ""
|
898 |
+
|
899 |
+
#: views/admin/support/contents.php:23 views/installer/steps/finish.php:28
|
900 |
+
msgctxt "(Admin)"
|
901 |
+
msgid "Check out the knowledge base for common questions and answers."
|
902 |
+
msgstr ""
|
903 |
+
|
904 |
+
#: views/admin/support/contents.php:29 views/installer/steps/finish.php:34
|
905 |
+
msgctxt "(Admin)"
|
906 |
+
msgid "Developer's guide to GDPR"
|
907 |
+
msgstr ""
|
908 |
+
|
909 |
+
#: views/admin/support/contents.php:32 views/installer/steps/finish.php:37
|
910 |
+
msgctxt "(Admin)"
|
911 |
+
msgid "We have a thorough guide to help making custom sites compliant."
|
912 |
+
msgstr ""
|
913 |
+
|
914 |
+
#: views/admin/support/contents.php:40 views/installer/steps/finish.php:45
|
915 |
+
msgctxt "(Admin)"
|
916 |
+
msgid "Need help?"
|
917 |
+
msgstr ""
|
918 |
+
|
919 |
+
#: views/admin/support/contents.php:46 views/installer/steps/finish.php:51
|
920 |
+
msgctxt "(Admin)"
|
921 |
+
msgid "Submit a support request"
|
922 |
+
msgstr ""
|
923 |
+
|
924 |
+
#: views/admin/support/contents.php:49 views/installer/steps/finish.php:54
|
925 |
+
msgctxt "(Admin)"
|
926 |
+
msgid ""
|
927 |
+
"Found a bug or problem with the plugin? Post in the wordpress.org support "
|
928 |
+
"forum."
|
929 |
+
msgstr ""
|
930 |
+
|
931 |
+
#: views/admin/support/contents.php:55 views/installer/steps/finish.php:60
|
932 |
+
msgctxt "(Admin)"
|
933 |
+
msgid "Request a consultation"
|
934 |
+
msgstr ""
|
935 |
+
|
936 |
+
#: views/admin/support/contents.php:58 views/installer/steps/finish.php:63
|
937 |
+
msgctxt "(Admin)"
|
938 |
+
msgid ""
|
939 |
+
"Need development or legal assistance in making your site compliant? We can "
|
940 |
+
"help!"
|
941 |
+
msgstr ""
|
942 |
+
|
943 |
+
#: views/admin/wizard-buttons.php:2
|
944 |
+
msgctxt "(Admin)"
|
945 |
+
msgid "Restart setup wizard"
|
946 |
+
msgstr ""
|
947 |
+
|
948 |
+
#: views/email/action-export.php:8 views/email/action-forget.php:12
|
949 |
+
msgctxt "(Admin)"
|
950 |
+
msgid ""
|
951 |
+
"This email is just for your information. You don't need to take any action"
|
952 |
+
msgstr ""
|
953 |
+
|
954 |
+
#: views/email/action-forget.php:8
|
955 |
+
msgctxt "(Admin)"
|
956 |
+
msgid "The data subject had a user account on your website."
|
957 |
+
msgstr ""
|
958 |
+
|
959 |
+
#: views/email/identify-data-subject.php:2
|
960 |
+
msgid "Someone has requested access to your data on"
|
961 |
+
msgstr ""
|
962 |
+
|
963 |
+
#: views/email/identify-data-subject.php:3
|
964 |
+
msgid "If this was a mistake, just ignore this email and nothing will happen."
|
965 |
+
msgstr ""
|
966 |
+
|
967 |
+
#: views/email/identify-data-subject.php:4
|
968 |
+
msgid "To manage your data, visit the following address:"
|
969 |
+
msgstr ""
|
970 |
+
|
971 |
+
#: views/email/identify-data-subject.php:10
|
972 |
+
msgid "This link is valid for 15 minutes."
|
973 |
+
msgstr ""
|
974 |
+
|
975 |
+
#: views/email/no-data.php:2
|
976 |
+
msgid "Someone has requested information about your personal data on"
|
977 |
+
msgstr ""
|
978 |
+
|
979 |
+
#: views/email/no-data.php:3
|
980 |
+
msgid "None of your personal data is stored on"
|
981 |
+
msgstr ""
|
982 |
+
|
983 |
+
#: views/email/no-data.php:5
|
984 |
+
msgid ""
|
985 |
+
"If this was a mistake or you did not request this email, just ignore it and "
|
986 |
+
"nothing will happen."
|
987 |
+
msgstr ""
|
988 |
+
|
989 |
+
#: views/email/request-export.php:13 views/email/request-forget.php:13
|
990 |
+
msgctxt "(Admin)"
|
991 |
+
msgid "As a reminder: according to GDPR, you have 30 days to comply."
|
992 |
+
msgstr ""
|
993 |
+
|
994 |
+
#: views/global/delete-action.php:2
|
995 |
+
msgctxt "(Admin)"
|
996 |
+
msgid "Automatically anonymize data"
|
997 |
+
msgstr ""
|
998 |
+
|
999 |
+
#: views/global/delete-action.php:5
|
1000 |
+
msgctxt "(Admin)"
|
1001 |
+
msgid "Automatically delete data"
|
1002 |
+
msgstr ""
|
1003 |
+
|
1004 |
+
#: views/global/delete-action.php:9
|
1005 |
+
msgctxt "(Admin)"
|
1006 |
+
msgid "Automatically anonymize data and notify me via email"
|
1007 |
+
msgstr ""
|
1008 |
+
|
1009 |
+
#: views/global/delete-action.php:13
|
1010 |
+
msgctxt "(Admin)"
|
1011 |
+
msgid "Automatically delete data and notify me via email"
|
1012 |
+
msgstr ""
|
1013 |
+
|
1014 |
+
#: views/global/delete-action.php:16 views/global/export-action.php:10
|
1015 |
+
msgctxt "(Admin)"
|
1016 |
+
msgid "Only notify me via email"
|
1017 |
+
msgstr ""
|
1018 |
+
|
1019 |
+
#: views/global/export-action.php:2
|
1020 |
+
msgctxt "(Admin)"
|
1021 |
+
msgid "Automatically download data"
|
1022 |
+
msgstr ""
|
1023 |
+
|
1024 |
+
#: views/global/export-action.php:6
|
1025 |
+
msgctxt "(Admin)"
|
1026 |
+
msgid "Automatically download data and notify me via email"
|
1027 |
+
msgstr ""
|
1028 |
+
|
1029 |
+
#: views/installer/continue-notice.php:2
|
1030 |
+
msgctxt "(Admin)"
|
1031 |
+
msgid "The The GDPR Framework setup has not been finalized yet."
|
1032 |
+
msgstr ""
|
1033 |
+
|
1034 |
+
#: views/installer/continue-notice.php:3
|
1035 |
+
msgctxt "(Admin)"
|
1036 |
+
msgid "You can continue the setup at any time."
|
1037 |
+
msgstr ""
|
1038 |
+
|
1039 |
+
#: views/installer/continue-notice.php:6
|
1040 |
+
msgctxt "(Admin)"
|
1041 |
+
msgid "Continue the setup wizard"
|
1042 |
+
msgstr ""
|
1043 |
+
|
1044 |
+
#: views/installer/continue-notice.php:9
|
1045 |
+
msgctxt "(Admin)"
|
1046 |
+
msgid "Hide this message"
|
1047 |
+
msgstr ""
|
1048 |
+
|
1049 |
+
#: views/installer/footer.php:7
|
1050 |
+
msgid "Back"
|
1051 |
+
msgstr ""
|
1052 |
+
|
1053 |
+
#: views/installer/header.php:26
|
1054 |
+
msgctxt "(Admin)"
|
1055 |
+
msgid "I need help"
|
1056 |
+
msgstr ""
|
1057 |
+
|
1058 |
+
#: views/installer/header.php:29
|
1059 |
+
msgctxt "(Admin)"
|
1060 |
+
msgid "Developer Docs"
|
1061 |
+
msgstr ""
|
1062 |
+
|
1063 |
+
#: views/installer/header.php:36
|
1064 |
+
msgctxt "(Admin)"
|
1065 |
+
msgid "Configuration"
|
1066 |
+
msgstr ""
|
1067 |
+
|
1068 |
+
#: views/installer/header.php:46
|
1069 |
+
msgctxt "(Admin)"
|
1070 |
+
msgid "Forms & Consent"
|
1071 |
+
msgstr ""
|
1072 |
+
|
1073 |
+
#: views/installer/header.php:51
|
1074 |
+
msgctxt "(Admin)"
|
1075 |
+
msgid "Integrations"
|
1076 |
+
msgstr ""
|
1077 |
+
|
1078 |
+
#: views/installer/steps/configuration-settings.php:23
|
1079 |
+
#: views/installer/steps/configuration-settings.php:73
|
1080 |
+
msgctxt "(Admin)"
|
1081 |
+
msgid "Enter the email address to notify"
|
1082 |
+
msgstr ""
|
1083 |
+
|
1084 |
+
#: views/installer/steps/disclaimer.php:21
|
1085 |
+
msgctxt "(Admin)"
|
1086 |
+
msgid "I accept"
|
1087 |
+
msgstr ""
|
1088 |
+
|
1089 |
+
#: views/installer/welcome-notice.php:7
|
1090 |
+
msgctxt "(Admin)"
|
1091 |
+
msgid "Run the setup wizard"
|
1092 |
+
msgstr ""
|
1093 |
+
|
1094 |
+
#: views/installer/welcome-notice.php:11
|
1095 |
+
msgctxt "(Admin)"
|
1096 |
+
msgid "Auto-install pages"
|
1097 |
+
msgstr ""
|
1098 |
+
|
1099 |
+
#: views/installer/welcome-notice.php:15
|
1100 |
+
msgctxt "(Admin)"
|
1101 |
+
msgid "Skip and install manually"
|
1102 |
+
msgstr ""
|
1103 |
+
|
1104 |
+
#: views/modules/contact-form-7/generator-privacy.php:6
|
1105 |
+
msgctxt "(Admin)"
|
1106 |
+
msgid ""
|
1107 |
+
"This tag generates the default text for Terms & Conditions and/or Privacy "
|
1108 |
+
"Policy checkbox."
|
1109 |
+
msgstr ""
|
1110 |
+
|
1111 |
+
#: views/modules/contact-form-7/generator-privacy.php:15
|
1112 |
+
msgid "Insert"
|
1113 |
+
msgstr ""
|
1114 |
+
|
1115 |
+
#: views/modules/wordpress-comments/terms-checkbox.php:6
|
1116 |
+
#: views/modules/wordpress-user/registration-terms-checkbox.php:7
|
1117 |
+
#, php-format
|
1118 |
+
msgid "I accept the %sTerms and Conditions%s and the %sPrivacy Policy%s"
|
1119 |
+
msgstr ""
|
1120 |
+
|
1121 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-consent.php:3
|
1122 |
+
msgid "Manage consents"
|
1123 |
+
msgstr ""
|
1124 |
+
|
1125 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-consent.php:6
|
1126 |
+
#: views/privacy-tools/form-consent.php:6
|
1127 |
+
msgid "Here you can withdraw any consents you have given."
|
1128 |
+
msgstr ""
|
1129 |
+
|
1130 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-consent.php:8
|
1131 |
+
#: views/privacy-tools/form-consent.php:9
|
1132 |
+
msgid "Consent types"
|
1133 |
+
msgstr ""
|
1134 |
+
|
1135 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-consent.php:23
|
1136 |
+
#: views/privacy-tools/form-consent.php:24
|
1137 |
+
msgid "Withdraw"
|
1138 |
+
msgstr ""
|
1139 |
+
|
1140 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:5
|
1141 |
+
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:5
|
1142 |
+
msgctxt "(Admin)"
|
1143 |
+
msgid "Delete this user and all data"
|
1144 |
+
msgstr ""
|
1145 |
+
|
1146 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:11
|
1147 |
+
msgctxt "(Admin)"
|
1148 |
+
msgid "Delete my data"
|
1149 |
+
msgstr ""
|
1150 |
+
|
1151 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:15
|
1152 |
+
#: views/privacy-tools/form-delete.php:13
|
1153 |
+
msgid "Delete all data we have gathered about you."
|
1154 |
+
msgstr ""
|
1155 |
+
|
1156 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:16
|
1157 |
+
#: views/privacy-tools/form-delete.php:14
|
1158 |
+
msgid "If you have a user account on our site, it will also be deleted."
|
1159 |
+
msgstr ""
|
1160 |
+
|
1161 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:17
|
1162 |
+
#: views/privacy-tools/form-delete.php:15
|
1163 |
+
msgid "Be careful - this action is permanent and CANNOT be undone."
|
1164 |
+
msgstr ""
|
1165 |
+
|
1166 |
+
#: views/modules/wordpress-user/dashboard/data-page/form-delete.php:22
|
1167 |
+
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:23
|
1168 |
+
msgctxt "(Admin)"
|
1169 |
+
msgid ""
|
1170 |
+
"You seem to have an administrator or equivalent role, so deleting/"
|
1171 |
+
"anonymizing via this page is disabled."
|
1172 |
+
msgstr ""
|
1173 |
+
|
1174 |
+
#: views/modules/wordpress-user/dashboard/form-export.php:7
|
1175 |
+
#: views/privacy-tools/form-export.php:1
|
1176 |
+
msgid "Download your data"
|
1177 |
+
msgstr ""
|
1178 |
+
|
1179 |
+
#: views/modules/wordpress-user/dashboard/form-export.php:12
|
1180 |
+
#: views/privacy-tools/form-export.php:13
|
1181 |
+
msgid "Download as table"
|
1182 |
+
msgstr ""
|
1183 |
+
|
1184 |
+
#: views/modules/wordpress-user/dashboard/form-export.php:15
|
1185 |
+
#: views/privacy-tools/form-export.php:22
|
1186 |
+
msgid "Export as JSON"
|
1187 |
+
msgstr ""
|
1188 |
+
|
1189 |
+
#: views/modules/wordpress-user/dashboard/form-export.php:19
|
1190 |
+
#: views/privacy-tools/form-export.php:4
|
1191 |
+
msgid "You can download all your data formatted as a table for viewing."
|
1192 |
+
msgstr ""
|
1193 |
+
|
1194 |
+
#: views/modules/wordpress-user/dashboard/form-export.php:20
|
1195 |
+
#: views/privacy-tools/form-export.php:5
|
1196 |
+
msgid "Alternatively, you can export it in machine-readable JSON format."
|
1197 |
+
msgstr ""
|
1198 |
+
|
1199 |
+
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:11
|
1200 |
+
msgctxt "(Admin)"
|
1201 |
+
msgid "Delete user and all data"
|
1202 |
+
msgstr ""
|
1203 |
+
|
1204 |
+
#: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:14
|
1205 |
+
msgctxt "(Admin)"
|
1206 |
+
msgid "Anonymize user and all data"
|
1207 |
+
msgstr ""
|
1208 |
+
|
1209 |
+
#: views/modules/wordpress-user/dashboard/profile-page/header.php:2
|
1210 |
+
msgctxt "(Admin)"
|
1211 |
+
msgid "GDPR Data"
|
1212 |
+
msgstr ""
|
1213 |
+
|
1214 |
+
#: views/modules/wordpress-user/dashboard/profile-page/header.php:6
|
1215 |
+
msgctxt "(Admin)"
|
1216 |
+
msgid "This user has been anonymized."
|
1217 |
+
msgstr ""
|
1218 |
+
|
1219 |
+
#: views/modules/wordpress-user/dashboard/profile-page/table-consent.php:4
|
1220 |
+
msgctxt "(Admin)"
|
1221 |
+
msgid "Consents given"
|
1222 |
+
msgstr ""
|
1223 |
+
|
1224 |
+
#: views/modules/wordpress-user/dashboard/profile-page/table-consent.php:17
|
1225 |
+
msgctxt "(Admin)"
|
1226 |
+
msgid "No consents given"
|
1227 |
+
msgstr ""
|
1228 |
+
|
1229 |
+
#: views/privacy-tools/form-consent.php:2
|
1230 |
+
msgid "Consent"
|
1231 |
+
msgstr ""
|
1232 |
+
|
1233 |
+
#: views/privacy-tools/form-delete.php:1
|
1234 |
+
#: views/privacy-tools/notice-admin-role.php:1
|
1235 |
+
msgid "Delete my user and data"
|
1236 |
+
msgstr ""
|
1237 |
+
|
1238 |
+
#: views/privacy-tools/form-delete.php:7
|
1239 |
+
msgid "Delete my data"
|
1240 |
+
msgstr ""
|
1241 |
+
|
1242 |
+
#: views/privacy-tools/form-identify.php:8
|
1243 |
+
msgid "Back to Privacy Tools"
|
1244 |
+
msgstr ""
|
1245 |
+
|
1246 |
+
#: views/privacy-tools/form-identify.php:14
|
1247 |
+
msgid "Identify yourself!"
|
1248 |
+
msgstr ""
|
1249 |
+
|
1250 |
+
#: views/privacy-tools/form-identify.php:17
|
1251 |
+
#: views/privacy-tools/form-identify.php:20
|
1252 |
+
msgid "Enter your email address"
|
1253 |
+
msgstr ""
|
1254 |
+
|
1255 |
+
#: views/privacy-tools/form-identify.php:23
|
1256 |
+
msgid "Send email"
|
1257 |
+
msgstr ""
|
1258 |
+
|
1259 |
+
#: views/privacy-tools/notice-admin-role.php:4
|
1260 |
+
msgctxt "(Admin)"
|
1261 |
+
msgid "Data deletion is disabled for administrative accounts."
|
1262 |
+
msgstr ""
|
1263 |
+
|
1264 |
+
#: views/privacy-tools/notices.php:3
|
1265 |
+
msgid ""
|
1266 |
+
"We will send you an email with the link to access your data. Please check "
|
1267 |
+
"your spam folder as well!"
|
1268 |
+
msgstr ""
|
1269 |
+
|
1270 |
+
#: views/privacy-tools/notices.php:7
|
1271 |
+
msgid "The email you entered does not appear to be a valid email."
|
1272 |
+
msgstr ""
|
1273 |
+
|
1274 |
+
#: views/privacy-tools/notices.php:11
|
1275 |
+
msgid "Sorry - the link seems to have expired. Please try again!"
|
1276 |
+
msgstr ""
|
1277 |
+
|
1278 |
+
#: views/privacy-tools/notices.php:23
|
1279 |
+
msgid "Your personal data has been removed!"
|
1280 |
+
msgstr ""
|
1281 |
+
|
1282 |
+
#: views/privacy-tools/privacy-tools.php:5
|
1283 |
+
msgid "You are identified as"
|
1284 |
+
msgstr ""
|
license.txt
CHANGED
@@ -1,199 +1,199 @@
|
|
1 |
-
This program is free software: you can redistribute it and/or modify
|
2 |
-
it under the terms of the GNU General Public License as published by
|
3 |
-
the Free Software Foundation, either version 3 of the License, or
|
4 |
-
(at your option) any later version.
|
5 |
-
|
6 |
-
This program is distributed in the hope that it will be useful,
|
7 |
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
8 |
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
9 |
-
GNU General Public License for more details.
|
10 |
-
|
11 |
-
You should have received a copy of the GNU General Public License
|
12 |
-
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
13 |
-
|
14 |
-
|
15 |
-
GNU GENERAL PUBLIC LICENSE
|
16 |
-
Version 3, 29 June 2007
|
17 |
-
|
18 |
-
Copyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
19 |
-
|
20 |
-
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
|
21 |
-
|
22 |
-
Preamble
|
23 |
-
The GNU General Public License is a free, copyleft license for software and other kinds of works.
|
24 |
-
|
25 |
-
The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.
|
26 |
-
|
27 |
-
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
|
28 |
-
|
29 |
-
To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
|
30 |
-
|
31 |
-
For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
|
32 |
-
|
33 |
-
Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
|
34 |
-
|
35 |
-
For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
|
36 |
-
|
37 |
-
Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.
|
38 |
-
|
39 |
-
Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
|
40 |
-
|
41 |
-
The precise terms and conditions for copying, distribution and modification follow.
|
42 |
-
|
43 |
-
TERMS AND CONDITIONS
|
44 |
-
0. Definitions.
|
45 |
-
“This License” refers to version 3 of the GNU General Public License.
|
46 |
-
|
47 |
-
“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
|
48 |
-
|
49 |
-
“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.
|
50 |
-
|
51 |
-
To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.
|
52 |
-
|
53 |
-
A “covered work” means either the unmodified Program or a work based on the Program.
|
54 |
-
|
55 |
-
To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
|
56 |
-
|
57 |
-
To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
|
58 |
-
|
59 |
-
An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
|
60 |
-
|
61 |
-
1. Source Code.
|
62 |
-
The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.
|
63 |
-
|
64 |
-
A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
|
65 |
-
|
66 |
-
The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
|
67 |
-
|
68 |
-
The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.
|
69 |
-
|
70 |
-
The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
|
71 |
-
|
72 |
-
The Corresponding Source for a work in source code form is that same work.
|
73 |
-
|
74 |
-
2. Basic Permissions.
|
75 |
-
All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
|
76 |
-
|
77 |
-
You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
|
78 |
-
|
79 |
-
Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
|
80 |
-
|
81 |
-
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
82 |
-
No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
|
83 |
-
|
84 |
-
When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
|
85 |
-
|
86 |
-
4. Conveying Verbatim Copies.
|
87 |
-
You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
|
88 |
-
|
89 |
-
You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
|
90 |
-
|
91 |
-
5. Conveying Modified Source Versions.
|
92 |
-
You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
|
93 |
-
|
94 |
-
a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
|
95 |
-
b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
|
96 |
-
c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
|
97 |
-
d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
|
98 |
-
A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
|
99 |
-
|
100 |
-
6. Conveying Non-Source Forms.
|
101 |
-
You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
|
102 |
-
|
103 |
-
a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
|
104 |
-
b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
|
105 |
-
c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
|
106 |
-
d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
|
107 |
-
e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
|
108 |
-
A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
|
109 |
-
|
110 |
-
A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
|
111 |
-
|
112 |
-
“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
|
113 |
-
|
114 |
-
If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
|
115 |
-
|
116 |
-
The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
|
117 |
-
|
118 |
-
Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
|
119 |
-
|
120 |
-
7. Additional Terms.
|
121 |
-
“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
|
122 |
-
|
123 |
-
When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
|
124 |
-
|
125 |
-
Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
|
126 |
-
|
127 |
-
a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
|
128 |
-
b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
|
129 |
-
c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
|
130 |
-
d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
|
131 |
-
e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
|
132 |
-
f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
|
133 |
-
All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
|
134 |
-
|
135 |
-
If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
|
136 |
-
|
137 |
-
Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
|
138 |
-
|
139 |
-
8. Termination.
|
140 |
-
You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
|
141 |
-
|
142 |
-
However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
|
143 |
-
|
144 |
-
Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
|
145 |
-
|
146 |
-
Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
|
147 |
-
|
148 |
-
9. Acceptance Not Required for Having Copies.
|
149 |
-
You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
|
150 |
-
|
151 |
-
10. Automatic Licensing of Downstream Recipients.
|
152 |
-
Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
|
153 |
-
|
154 |
-
An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
|
155 |
-
|
156 |
-
You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
|
157 |
-
|
158 |
-
11. Patents.
|
159 |
-
A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.
|
160 |
-
|
161 |
-
A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
|
162 |
-
|
163 |
-
Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
|
164 |
-
|
165 |
-
In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
|
166 |
-
|
167 |
-
If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
|
168 |
-
|
169 |
-
If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
|
170 |
-
|
171 |
-
A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
|
172 |
-
|
173 |
-
Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
|
174 |
-
|
175 |
-
12. No Surrender of Others' Freedom.
|
176 |
-
If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
|
177 |
-
|
178 |
-
13. Use with the GNU Affero General Public License.
|
179 |
-
Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
|
180 |
-
|
181 |
-
14. Revised Versions of this License.
|
182 |
-
The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
|
183 |
-
|
184 |
-
Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
|
185 |
-
|
186 |
-
If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
|
187 |
-
|
188 |
-
Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
|
189 |
-
|
190 |
-
15. Disclaimer of Warranty.
|
191 |
-
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
192 |
-
|
193 |
-
16. Limitation of Liability.
|
194 |
-
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
195 |
-
|
196 |
-
17. Interpretation of Sections 15 and 16.
|
197 |
-
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
|
198 |
-
|
199 |
END OF TERMS AND CONDITIONS
|
1 |
+
This program is free software: you can redistribute it and/or modify
|
2 |
+
it under the terms of the GNU General Public License as published by
|
3 |
+
the Free Software Foundation, either version 3 of the License, or
|
4 |
+
(at your option) any later version.
|
5 |
+
|
6 |
+
This program is distributed in the hope that it will be useful,
|
7 |
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
8 |
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
9 |
+
GNU General Public License for more details.
|
10 |
+
|
11 |
+
You should have received a copy of the GNU General Public License
|
12 |
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
13 |
+
|
14 |
+
|
15 |
+
GNU GENERAL PUBLIC LICENSE
|
16 |
+
Version 3, 29 June 2007
|
17 |
+
|
18 |
+
Copyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
19 |
+
|
20 |
+
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
|
21 |
+
|
22 |
+
Preamble
|
23 |
+
The GNU General Public License is a free, copyleft license for software and other kinds of works.
|
24 |
+
|
25 |
+
The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.
|
26 |
+
|
27 |
+
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
|
28 |
+
|
29 |
+
To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
|
30 |
+
|
31 |
+
For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
|
32 |
+
|
33 |
+
Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
|
34 |
+
|
35 |
+
For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
|
36 |
+
|
37 |
+
Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.
|
38 |
+
|
39 |
+
Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
|
40 |
+
|
41 |
+
The precise terms and conditions for copying, distribution and modification follow.
|
42 |
+
|
43 |
+
TERMS AND CONDITIONS
|
44 |
+
0. Definitions.
|
45 |
+
“This License” refers to version 3 of the GNU General Public License.
|
46 |
+
|
47 |
+
“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
|
48 |
+
|
49 |
+
“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.
|
50 |
+
|
51 |
+
To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.
|
52 |
+
|
53 |
+
A “covered work” means either the unmodified Program or a work based on the Program.
|
54 |
+
|
55 |
+
To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
|
56 |
+
|
57 |
+
To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
|
58 |
+
|
59 |
+
An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
|
60 |
+
|
61 |
+
1. Source Code.
|
62 |
+
The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.
|
63 |
+
|
64 |
+
A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
|
65 |
+
|
66 |
+
The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
|
67 |
+
|
68 |
+
The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.
|
69 |
+
|
70 |
+
The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
|
71 |
+
|
72 |
+
The Corresponding Source for a work in source code form is that same work.
|
73 |
+
|
74 |
+
2. Basic Permissions.
|
75 |
+
All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
|
76 |
+
|
77 |
+
You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
|
78 |
+
|
79 |
+
Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
|
80 |
+
|
81 |
+
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
82 |
+
No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
|
83 |
+
|
84 |
+
When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
|
85 |
+
|
86 |
+
4. Conveying Verbatim Copies.
|
87 |
+
You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
|
88 |
+
|
89 |
+
You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
|
90 |
+
|
91 |
+
5. Conveying Modified Source Versions.
|
92 |
+
You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
|
93 |
+
|
94 |
+
a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
|
95 |
+
b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
|
96 |
+
c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
|
97 |
+
d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
|
98 |
+
A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
|
99 |
+
|
100 |
+
6. Conveying Non-Source Forms.
|
101 |
+
You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
|
102 |
+
|
103 |
+
a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
|
104 |
+
b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
|
105 |
+
c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
|
106 |
+
d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
|
107 |
+
e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
|
108 |
+
A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
|
109 |
+
|
110 |
+
A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
|
111 |
+
|
112 |
+
“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
|
113 |
+
|
114 |
+
If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
|
115 |
+
|
116 |
+
The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
|
117 |
+
|
118 |
+
Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
|
119 |
+
|
120 |
+
7. Additional Terms.
|
121 |
+
“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
|
122 |
+
|
123 |
+
When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
|
124 |
+
|
125 |
+
Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
|
126 |
+
|
127 |
+
a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
|
128 |
+
b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
|
129 |
+
c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
|
130 |
+
d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
|
131 |
+
e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
|
132 |
+
f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
|
133 |
+
All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
|
134 |
+
|
135 |
+
If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
|
136 |
+
|
137 |
+
Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
|
138 |
+
|
139 |
+
8. Termination.
|
140 |
+
You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
|
141 |
+
|
142 |
+
However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
|
143 |
+
|
144 |
+
Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
|
145 |
+
|
146 |
+
Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
|
147 |
+
|
148 |
+
9. Acceptance Not Required for Having Copies.
|
149 |
+
You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
|
150 |
+
|
151 |
+
10. Automatic Licensing of Downstream Recipients.
|
152 |
+
Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
|
153 |
+
|
154 |
+
An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
|
155 |
+
|
156 |
+
You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
|
157 |
+
|
158 |
+
11. Patents.
|
159 |
+
A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.
|
160 |
+
|
161 |
+
A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
|
162 |
+
|
163 |
+
Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
|
164 |
+
|
165 |
+
In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
|
166 |
+
|
167 |
+
If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
|
168 |
+
|
169 |
+
If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
|
170 |
+
|
171 |
+
A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
|
172 |
+
|
173 |
+
Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
|
174 |
+
|
175 |
+
12. No Surrender of Others' Freedom.
|
176 |
+
If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
|
177 |
+
|
178 |
+
13. Use with the GNU Affero General Public License.
|
179 |
+
Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
|
180 |
+
|
181 |
+
14. Revised Versions of this License.
|
182 |
+
The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
|
183 |
+
|
184 |
+
Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
|
185 |
+
|
186 |
+
If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
|
187 |
+
|
188 |
+
Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
|
189 |
+
|
190 |
+
15. Disclaimer of Warranty.
|
191 |
+
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
192 |
+
|
193 |
+
16. Limitation of Liability.
|
194 |
+
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
195 |
+
|
196 |
+
17. Interpretation of Sections 15 and 16.
|
197 |
+
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
|
198 |
+
|
199 |
END OF TERMS AND CONDITIONS
|
readme.txt
CHANGED
@@ -1,85 +1,91 @@
|
|
1 |
-
|
2 |
-
=== The GDPR Framework ===
|
3 |
-
Contributors: codelight
|
4 |
-
Tags: gdpr
|
5 |
-
Requires at least: 4.7
|
6 |
-
Tested up to: 4.9.
|
7 |
-
Requires PHP: 5.6.33
|
8 |
-
Stable tag: 1.0.
|
9 |
-
License: GPLv3
|
10 |
-
License URI: https://www.gnu.org/licenses/gpl-3.0.en.html
|
11 |
-
|
12 |
-
Easy to use tools to help make your website GDPR-compliant. Fully documented, extendable and developer-friendly.
|
13 |
-
|
14 |
-
== Description ==
|
15 |
-
|
16 |
-
Easy to use tools to help make your website GDPR-compliant.
|
17 |
-
|
18 |
-
GDPR is a whopping 88 pages of legal text. Becoming compliant takes a lot more than just adding a couple of checkboxes to your forms! But worry not, we’ve got it covered. With help from [Triniti](https://triniti.eu), one of the top business and IT law firms in Europe, we’ve put together this plugin and written a thorough guide for making WordPress sites compliant with minimal effort.
|
19 |
-
|
20 |
-
You don't need to drown your customers in pointless acceptance checkboxes if you know what you're doing!
|
21 |
-
|
22 |
-
## Disclaimer
|
23 |
-
Using The GDPR Framework does NOT guarantee compliance to GDPR. This plugin gives you general information and tools, but is NOT meant to serve as complete compliance package. Compliance to GDPR is risk-based ongoing process that involves your whole business. Codelight is not eligible for any claim or action based on any information or functionality provided by this plugin.
|
24 |
-
|
25 |
-
### Documentation
|
26 |
-
Full documentation: [The WordPress Site Owner's Guide to GDPR](https://codelight.eu/wordpress-gdpr-framework/wordpress-site-owners-guide-to-gdpr/)
|
27 |
-
For developers: [Developer Docs](https://codelight.eu/wordpress-gdpr-framework/developer-docs/)
|
28 |
-
|
29 |
-
### Features
|
30 |
-
☑ Allow both users and visitors without an account to view, export and delete their personal data;
|
31 |
-
☑ Configure the plugin to delete or anonymize personal data automatically or send a notification and allow admins to do it manually;
|
32 |
-
☑ Track, manage and withdraw consent;
|
33 |
-
☑ Generate a GDPR-compatible Privacy Policy template for your site;
|
34 |
-
☑ Comes with a helpful installation wizard to get you started quickly;
|
35 |
-
☑ Fully documented;
|
36 |
-
☑ Developer-friendly. Everything can be extended, every feature and template can be overridden.
|
37 |
-
|
38 |
-
We're just getting started. There's lots more to come!
|
39 |
-
|
40 |
-
### Plugin support:
|
41 |
-
The GDPR Framework currently works with the following plugins
|
42 |
-
☑ Contact Form 7
|
43 |
-
☑ Gravity Forms - [Download the GDPR add-on](https://wordpress.org/plugins/gdpr-for-gravity-forms/)
|
44 |
-
☑
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
☐ Ninja Forms
|
49 |
-
☐ Contact Form 7 Flamingo
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
☐
|
56 |
-
☐
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
*
|
65 |
-
*
|
66 |
-
* Fix
|
67 |
-
*
|
68 |
-
|
69 |
-
= 1.0.
|
70 |
-
*
|
71 |
-
* Add
|
72 |
-
*
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
*
|
77 |
-
*
|
78 |
-
* Add
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
*
|
83 |
-
|
84 |
-
|
85 |
-
*
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
=== The GDPR Framework ===
|
3 |
+
Contributors: codelight
|
4 |
+
Tags: gdpr
|
5 |
+
Requires at least: 4.7
|
6 |
+
Tested up to: 4.9.5
|
7 |
+
Requires PHP: 5.6.33
|
8 |
+
Stable tag: 1.0.5
|
9 |
+
License: GPLv3
|
10 |
+
License URI: https://www.gnu.org/licenses/gpl-3.0.en.html
|
11 |
+
|
12 |
+
Easy to use tools to help make your website GDPR-compliant. Fully documented, extendable and developer-friendly.
|
13 |
+
|
14 |
+
== Description ==
|
15 |
+
|
16 |
+
Easy to use tools to help make your website GDPR-compliant.
|
17 |
+
|
18 |
+
GDPR is a whopping 88 pages of legal text. Becoming compliant takes a lot more than just adding a couple of checkboxes to your forms! But worry not, we’ve got it covered. With help from [Triniti](https://triniti.eu), one of the top business and IT law firms in Europe, we’ve put together this plugin and written a thorough guide for making WordPress sites compliant with minimal effort.
|
19 |
+
|
20 |
+
You don't need to drown your customers in pointless acceptance checkboxes if you know what you're doing!
|
21 |
+
|
22 |
+
## Disclaimer
|
23 |
+
Using The GDPR Framework does NOT guarantee compliance to GDPR. This plugin gives you general information and tools, but is NOT meant to serve as complete compliance package. Compliance to GDPR is risk-based ongoing process that involves your whole business. Codelight is not eligible for any claim or action based on any information or functionality provided by this plugin.
|
24 |
+
|
25 |
+
### Documentation
|
26 |
+
Full documentation: [The WordPress Site Owner's Guide to GDPR](https://codelight.eu/wordpress-gdpr-framework/wordpress-site-owners-guide-to-gdpr/)
|
27 |
+
For developers: [Developer Docs](https://codelight.eu/wordpress-gdpr-framework/developer-docs/)
|
28 |
+
|
29 |
+
### Features
|
30 |
+
☑ Allow both users and visitors without an account to view, export and delete their personal data;
|
31 |
+
☑ Configure the plugin to delete or anonymize personal data automatically or send a notification and allow admins to do it manually;
|
32 |
+
☑ Track, manage and withdraw consent;
|
33 |
+
☑ Generate a GDPR-compatible Privacy Policy template for your site;
|
34 |
+
☑ Comes with a helpful installation wizard to get you started quickly;
|
35 |
+
☑ Fully documented;
|
36 |
+
☑ Developer-friendly. Everything can be extended, every feature and template can be overridden.
|
37 |
+
|
38 |
+
We're just getting started. There's lots more to come!
|
39 |
+
|
40 |
+
### Plugin support:
|
41 |
+
The GDPR Framework currently works with the following plugins
|
42 |
+
☑ Contact Form 7
|
43 |
+
☑ Gravity Forms - [Download the GDPR add-on](https://wordpress.org/plugins/gdpr-for-gravity-forms/)
|
44 |
+
☑ Formidable Forms - [Download the GDPR add-on](https://wordpress.org/plugins/gdpr-for-formidable-forms/)
|
45 |
+
☑ WPML
|
46 |
+
|
47 |
+
Coming in April 2018:
|
48 |
+
☐ Ninja Forms
|
49 |
+
☐ Contact Form 7 Flamingo
|
50 |
+
|
51 |
+
Still free and open-source.
|
52 |
+
|
53 |
+
Other integrations coming soon:
|
54 |
+
☐ WP Migrate DB
|
55 |
+
☐ WooCommerce (postponed until the launch of their own compliance toolkit)
|
56 |
+
☐ Easy Digital Downloads
|
57 |
+
|
58 |
+
We're happy to add support for other major plugins as well. If you have a request, get in touch!
|
59 |
+
|
60 |
+
== Changelog ==
|
61 |
+
|
62 |
+
= 1.0.5 =
|
63 |
+
* Add Spanish support (Thanks @elarequi!)
|
64 |
+
* Lower required PHP version to 5.6.0
|
65 |
+
* Re-add container alias for DataSubjectManager
|
66 |
+
* Fix for installer giving the option to add links to footer for unsupported themes
|
67 |
+
* Fix PHP notice in WPML module
|
68 |
+
|
69 |
+
= 1.0.4 =
|
70 |
+
* Fix translations, for real this time
|
71 |
+
* Add French translations (Thanks @datagitateur!)
|
72 |
+
* Fix PHP warning if WPML is activated
|
73 |
+
* Add filter around $headers array for all outgoing emails sent via this plugin
|
74 |
+
|
75 |
+
= 1.0.3 =
|
76 |
+
* Change text domain to 'gdpr-framework' to avoid conflict with other plugins
|
77 |
+
* Add Portuguese translation (Thanks @kativiti!)
|
78 |
+
* Add partial Estonian translation
|
79 |
+
|
80 |
+
= 1.0.2 =
|
81 |
+
* Fix T&C and Privacy Policy URLs on registration and comments forms
|
82 |
+
* Add basic styling and separate stylesheet for Privacy Tools page
|
83 |
+
* Allow disabling styles for Privacy Tools page via admin
|
84 |
+
* Add confirmation notice on deleting data via front-end Privacy Tools
|
85 |
+
* Change strings with 'gdpr-admin' domain back to 'gdpr'. Add context to all admin strings.
|
86 |
+
|
87 |
+
= 1.0.1 =
|
88 |
+
* Fix PHP notice on Privacy Tools frontend page if logged in as admin
|
89 |
+
|
90 |
+
= 1.0.0 =
|
91 |
+
* Initial release
|
src/Admin/AdminError.php
CHANGED
@@ -1,17 +1,17 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
|
4 |
-
namespace Codelight\GDPR\Admin;
|
5 |
-
|
6 |
-
|
7 |
-
class AdminError extends AdminNotice
|
8 |
-
{
|
9 |
-
public function render()
|
10 |
-
{
|
11 |
-
if (!$this->template) {
|
12 |
-
trigger_error('Template not set for admin notice!', E_USER_ERROR);
|
13 |
-
}
|
14 |
-
|
15 |
-
echo gdpr('view')->render($this->template, $this->data);
|
16 |
-
}
|
17 |
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
|
4 |
+
namespace Codelight\GDPR\Admin;
|
5 |
+
|
6 |
+
|
7 |
+
class AdminError extends AdminNotice
|
8 |
+
{
|
9 |
+
public function render()
|
10 |
+
{
|
11 |
+
if (!$this->template) {
|
12 |
+
trigger_error('Template not set for admin notice!', E_USER_ERROR);
|
13 |
+
}
|
14 |
+
|
15 |
+
echo gdpr('view')->render($this->template, $this->data);
|
16 |
+
}
|
17 |
}
|
src/Admin/AdminHelper.php
CHANGED
@@ -1,57 +1,57 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Admin;
|
4 |
-
|
5 |
-
class AdminHelper
|
6 |
-
{
|
7 |
-
public function __construct()
|
8 |
-
{
|
9 |
-
$this->toolsHelper();
|
10 |
-
$this->autoinstallHelper();
|
11 |
-
$this->policyHelper();
|
12 |
-
}
|
13 |
-
|
14 |
-
protected function toolsHelper()
|
15 |
-
{
|
16 |
-
$toolsPage = gdpr('options')->get('tools_page');
|
17 |
-
|
18 |
-
// Display the notice only on Tools page
|
19 |
-
if (!$toolsPage || !isset($_GET['post']) || $_GET['post'] !== $toolsPage) {
|
20 |
-
return;
|
21 |
-
}
|
22 |
-
|
23 |
-
$post = get_post($toolsPage);
|
24 |
-
$helpUrl = gdpr('helpers')->docs();
|
25 |
-
|
26 |
-
if (!stristr($post->post_content, '[gdpr_privacy_tools]')) {
|
27 |
-
gdpr('admin-notice')->add('admin/notices/helper-tools', compact('helpUrl'));
|
28 |
-
}
|
29 |
-
}
|
30 |
-
|
31 |
-
protected function autoinstallHelper()
|
32 |
-
{
|
33 |
-
if (!isset($_GET['gdpr-notice']) || empty($_GET['gdpr-notice']) || 'autoinstall' !== $_GET['gdpr-notice']) {
|
34 |
-
return;
|
35 |
-
}
|
36 |
-
|
37 |
-
$helpUrl = gdpr('helpers')->docs();
|
38 |
-
gdpr('admin-notice')->add('admin/notices/helper-autoinstall', compact('helpUrl'));
|
39 |
-
}
|
40 |
-
|
41 |
-
protected function policyHelper()
|
42 |
-
{
|
43 |
-
$policyPage = gdpr('options')->get('policy_page');
|
44 |
-
|
45 |
-
// Display the notice only on Policy page
|
46 |
-
if (!$policyPage || !isset($_GET['post']) || $_GET['post'] !== $policyPage) {
|
47 |
-
return;
|
48 |
-
}
|
49 |
-
|
50 |
-
$post = get_post($policyPage);
|
51 |
-
$helpUrl = gdpr('helpers')->docs();
|
52 |
-
|
53 |
-
if (stristr($post->post_content, '[TODO]')) {
|
54 |
-
gdpr('admin-notice')->add('admin/notices/helper-policy', compact('helpUrl'));
|
55 |
-
}
|
56 |
-
}
|
57 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Admin;
|
4 |
+
|
5 |
+
class AdminHelper
|
6 |
+
{
|
7 |
+
public function __construct()
|
8 |
+
{
|
9 |
+
$this->toolsHelper();
|
10 |
+
$this->autoinstallHelper();
|
11 |
+
$this->policyHelper();
|
12 |
+
}
|
13 |
+
|
14 |
+
protected function toolsHelper()
|
15 |
+
{
|
16 |
+
$toolsPage = gdpr('options')->get('tools_page');
|
17 |
+
|
18 |
+
// Display the notice only on Tools page
|
19 |
+
if (!$toolsPage || !isset($_GET['post']) || $_GET['post'] !== $toolsPage) {
|
20 |
+
return;
|
21 |
+
}
|
22 |
+
|
23 |
+
$post = get_post($toolsPage);
|
24 |
+
$helpUrl = gdpr('helpers')->docs();
|
25 |
+
|
26 |
+
if (!stristr($post->post_content, '[gdpr_privacy_tools]')) {
|
27 |
+
gdpr('admin-notice')->add('admin/notices/helper-tools', compact('helpUrl'));
|
28 |
+
}
|
29 |
+
}
|
30 |
+
|
31 |
+
protected function autoinstallHelper()
|
32 |
+
{
|
33 |
+
if (!isset($_GET['gdpr-notice']) || empty($_GET['gdpr-notice']) || 'autoinstall' !== $_GET['gdpr-notice']) {
|
34 |
+
return;
|
35 |
+
}
|
36 |
+
|
37 |
+
$helpUrl = gdpr('helpers')->docs();
|
38 |
+
gdpr('admin-notice')->add('admin/notices/helper-autoinstall', compact('helpUrl'));
|
39 |
+
}
|
40 |
+
|
41 |
+
protected function policyHelper()
|
42 |
+
{
|
43 |
+
$policyPage = gdpr('options')->get('policy_page');
|
44 |
+
|
45 |
+
// Display the notice only on Policy page
|
46 |
+
if (!$policyPage || !isset($_GET['post']) || $_GET['post'] !== $policyPage) {
|
47 |
+
return;
|
48 |
+
}
|
49 |
+
|
50 |
+
$post = get_post($policyPage);
|
51 |
+
$helpUrl = gdpr('helpers')->docs();
|
52 |
+
|
53 |
+
if (stristr($post->post_content, '[TODO]')) {
|
54 |
+
gdpr('admin-notice')->add('admin/notices/helper-policy', compact('helpUrl'));
|
55 |
+
}
|
56 |
+
}
|
57 |
+
}
|
src/Admin/AdminNotice.php
CHANGED
@@ -1,41 +1,41 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Admin;
|
4 |
-
|
5 |
-
class AdminNotice
|
6 |
-
{
|
7 |
-
protected $template;
|
8 |
-
|
9 |
-
protected $data;
|
10 |
-
|
11 |
-
/**
|
12 |
-
* todo: replace with a proper factory pattern via gdpr()?
|
13 |
-
*
|
14 |
-
* AdminNotice constructor.
|
15 |
-
*/
|
16 |
-
public function __construct()
|
17 |
-
{
|
18 |
-
if (did_action('admin_notices')) {
|
19 |
-
trigger_error('AdminNotice class called incorrectly - admin_notices action has already ran!', E_USER_ERROR);
|
20 |
-
}
|
21 |
-
|
22 |
-
add_action('admin_notices', [$this, 'render'], 9999);
|
23 |
-
}
|
24 |
-
|
25 |
-
public function add($template, $data = [])
|
26 |
-
{
|
27 |
-
$this->template = $template;
|
28 |
-
$this->data = $data;
|
29 |
-
}
|
30 |
-
|
31 |
-
public function render()
|
32 |
-
{
|
33 |
-
if (!$this->template) {
|
34 |
-
trigger_error('Template not set for admin notice!', E_USER_ERROR);
|
35 |
-
}
|
36 |
-
|
37 |
-
echo gdpr('view')->render('admin/notices/header');
|
38 |
-
echo gdpr('view')->render($this->template, $this->data);
|
39 |
-
echo gdpr('view')->render('admin/notices/footer');
|
40 |
-
}
|
41 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Admin;
|
4 |
+
|
5 |
+
class AdminNotice
|
6 |
+
{
|
7 |
+
protected $template;
|
8 |
+
|
9 |
+
protected $data;
|
10 |
+
|
11 |
+
/**
|
12 |
+
* todo: replace with a proper factory pattern via gdpr()?
|
13 |
+
*
|
14 |
+
* AdminNotice constructor.
|
15 |
+
*/
|
16 |
+
public function __construct()
|
17 |
+
{
|
18 |
+
if (did_action('admin_notices')) {
|
19 |
+
trigger_error('AdminNotice class called incorrectly - admin_notices action has already ran!', E_USER_ERROR);
|
20 |
+
}
|
21 |
+
|
22 |
+
add_action('admin_notices', [$this, 'render'], 9999);
|
23 |
+
}
|
24 |
+
|
25 |
+
public function add($template, $data = [])
|
26 |
+
{
|
27 |
+
$this->template = $template;
|
28 |
+
$this->data = $data;
|
29 |
+
}
|
30 |
+
|
31 |
+
public function render()
|
32 |
+
{
|
33 |
+
if (!$this->template) {
|
34 |
+
trigger_error('Template not set for admin notice!', E_USER_ERROR);
|
35 |
+
}
|
36 |
+
|
37 |
+
echo gdpr('view')->render('admin/notices/header');
|
38 |
+
echo gdpr('view')->render($this->template, $this->data);
|
39 |
+
echo gdpr('view')->render('admin/notices/footer');
|
40 |
+
}
|
41 |
+
}
|
src/Admin/AdminTab.php
CHANGED
@@ -1,157 +1,157 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Admin;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Base class for admin tabs. Extend this.
|
7 |
-
*
|
8 |
-
* Class AdminTab
|
9 |
-
*
|
10 |
-
* @package Codelight\GDPR\Admin
|
11 |
-
*/
|
12 |
-
abstract class AdminTab implements AdminTabInterface
|
13 |
-
{
|
14 |
-
/* @var string */
|
15 |
-
protected $slug;
|
16 |
-
|
17 |
-
/* @var string */
|
18 |
-
protected $title;
|
19 |
-
|
20 |
-
/**
|
21 |
-
* @return string
|
22 |
-
*/
|
23 |
-
public function getSlug()
|
24 |
-
{
|
25 |
-
return $this->slug;
|
26 |
-
}
|
27 |
-
|
28 |
-
/**
|
29 |
-
* @return string
|
30 |
-
*/
|
31 |
-
public function getTitle()
|
32 |
-
{
|
33 |
-
return $this->title;
|
34 |
-
}
|
35 |
-
|
36 |
-
/**
|
37 |
-
* @return string
|
38 |
-
*/
|
39 |
-
public function getOptionsGroupName()
|
40 |
-
{
|
41 |
-
return 'gdpr_' . $this->getSlug();
|
42 |
-
}
|
43 |
-
|
44 |
-
/**
|
45 |
-
* Register a setting on the admin page
|
46 |
-
*
|
47 |
-
* @param $optionName
|
48 |
-
* @param string $args
|
49 |
-
*/
|
50 |
-
public function registerSetting($optionName, $args = [])
|
51 |
-
{
|
52 |
-
register_setting($this->getOptionsGroupName(), $optionName, $args);
|
53 |
-
}
|
54 |
-
|
55 |
-
/**
|
56 |
-
* Register a section on the admin page
|
57 |
-
*
|
58 |
-
* @param $name
|
59 |
-
* @param $callback
|
60 |
-
*/
|
61 |
-
public function registerSettingSection($id, $title, $callback = null)
|
62 |
-
{
|
63 |
-
add_settings_section(
|
64 |
-
$id,
|
65 |
-
$title,
|
66 |
-
$callback,
|
67 |
-
$this->getOptionsGroupName()
|
68 |
-
);
|
69 |
-
}
|
70 |
-
|
71 |
-
/**
|
72 |
-
* Register a setting field on the admin page
|
73 |
-
*
|
74 |
-
* @param $id
|
75 |
-
* @param $title
|
76 |
-
* @param $callback
|
77 |
-
*/
|
78 |
-
public function registerSettingField($id, $title, $callback = null, $section = '', $args = [])
|
79 |
-
{
|
80 |
-
add_settings_field(
|
81 |
-
$id,
|
82 |
-
$title,
|
83 |
-
$callback,
|
84 |
-
$this->getOptionsGroupName(),
|
85 |
-
$section,
|
86 |
-
$args
|
87 |
-
);
|
88 |
-
}
|
89 |
-
|
90 |
-
/**
|
91 |
-
* Render the contents including settings fields, sections and submit button.
|
92 |
-
* Trigger hooks for rendering content before and after the settings fields.
|
93 |
-
*
|
94 |
-
* @return string
|
95 |
-
*/
|
96 |
-
public function renderContents()
|
97 |
-
{
|
98 |
-
ob_start();
|
99 |
-
|
100 |
-
do_action("gdpr/tabs/{$this->getSlug()}/before", $this);
|
101 |
-
settings_fields($this->getOptionsGroupName());
|
102 |
-
do_settings_sections($this->getOptionsGroupName());
|
103 |
-
do_action("gdpr/tabs/{$this->getSlug()}/after", $this);
|
104 |
-
|
105 |
-
$this->renderSubmitButton();
|
106 |
-
|
107 |
-
return ob_get_clean();
|
108 |
-
}
|
109 |
-
|
110 |
-
/**
|
111 |
-
* Render WP's default submit button
|
112 |
-
*/
|
113 |
-
public function renderSubmitButton()
|
114 |
-
{
|
115 |
-
submit_button(_x('Save', '(Admin)', 'gdpr-framework'));
|
116 |
-
}
|
117 |
-
|
118 |
-
/**
|
119 |
-
* Enqueue scripts, run the child class init function, trigger action for adding custom stuff
|
120 |
-
*/
|
121 |
-
public function setup()
|
122 |
-
{
|
123 |
-
// Automatically run the 'enqueue' method if it exists
|
124 |
-
if (method_exists($this, 'enqueue')) {
|
125 |
-
add_action('admin_enqueue_scripts', [$this, 'enqueue']);
|
126 |
-
}
|
127 |
-
|
128 |
-
$this->init();
|
129 |
-
|
130 |
-
// This hook can be used for registering custom settings
|
131 |
-
do_action("gdpr/tabs/{$this->getSlug()}/init", $this);
|
132 |
-
|
133 |
-
// Render the admin notices
|
134 |
-
add_action('admin_notices', [$this, 'renderAdminNotices']);
|
135 |
-
}
|
136 |
-
|
137 |
-
/**
|
138 |
-
* Render success notices via admin_notice action
|
139 |
-
*/
|
140 |
-
public function renderAdminNotices()
|
141 |
-
{
|
142 |
-
if ('tools_page_privacy' !== get_current_screen()->base) {
|
143 |
-
return;
|
144 |
-
}
|
145 |
-
|
146 |
-
if (!isset($_REQUEST['gdpr_notice'])) {
|
147 |
-
return;
|
148 |
-
}
|
149 |
-
|
150 |
-
if ('policy_generated' === $_REQUEST['gdpr_notice']) {
|
151 |
-
$message = _x('Policy generated!', '(Admin)', 'gdpr-framework');
|
152 |
-
$class = 'notice notice-success';
|
153 |
-
}
|
154 |
-
|
155 |
-
echo gdpr('view')->render('admin/notice', compact('message', 'class'));
|
156 |
-
}
|
157 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Admin;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Base class for admin tabs. Extend this.
|
7 |
+
*
|
8 |
+
* Class AdminTab
|
9 |
+
*
|
10 |
+
* @package Codelight\GDPR\Admin
|
11 |
+
*/
|
12 |
+
abstract class AdminTab implements AdminTabInterface
|
13 |
+
{
|
14 |
+
/* @var string */
|
15 |
+
protected $slug;
|
16 |
+
|
17 |
+
/* @var string */
|
18 |
+
protected $title;
|
19 |
+
|
20 |
+
/**
|
21 |
+
* @return string
|
22 |
+
*/
|
23 |
+
public function getSlug()
|
24 |
+
{
|
25 |
+
return $this->slug;
|
26 |
+
}
|
27 |
+
|
28 |
+
/**
|
29 |
+
* @return string
|
30 |
+
*/
|
31 |
+
public function getTitle()
|
32 |
+
{
|
33 |
+
return $this->title;
|
34 |
+
}
|
35 |
+
|
36 |
+
/**
|
37 |
+
* @return string
|
38 |
+
*/
|
39 |
+
public function getOptionsGroupName()
|
40 |
+
{
|
41 |
+
return 'gdpr_' . $this->getSlug();
|
42 |
+
}
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Register a setting on the admin page
|
46 |
+
*
|
47 |
+
* @param $optionName
|
48 |
+
* @param string $args
|
49 |
+
*/
|
50 |
+
public function registerSetting($optionName, $args = [])
|
51 |
+
{
|
52 |
+
register_setting($this->getOptionsGroupName(), $optionName, $args);
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Register a section on the admin page
|
57 |
+
*
|
58 |
+
* @param $name
|
59 |
+
* @param $callback
|
60 |
+
*/
|
61 |
+
public function registerSettingSection($id, $title, $callback = null)
|
62 |
+
{
|
63 |
+
add_settings_section(
|
64 |
+
$id,
|
65 |
+
$title,
|
66 |
+
$callback,
|
67 |
+
$this->getOptionsGroupName()
|
68 |
+
);
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Register a setting field on the admin page
|
73 |
+
*
|
74 |
+
* @param $id
|
75 |
+
* @param $title
|
76 |
+
* @param $callback
|
77 |
+
*/
|
78 |
+
public function registerSettingField($id, $title, $callback = null, $section = '', $args = [])
|
79 |
+
{
|
80 |
+
add_settings_field(
|
81 |
+
$id,
|
82 |
+
$title,
|
83 |
+
$callback,
|
84 |
+
$this->getOptionsGroupName(),
|
85 |
+
$section,
|
86 |
+
$args
|
87 |
+
);
|
88 |
+
}
|
89 |
+
|
90 |
+
/**
|
91 |
+
* Render the contents including settings fields, sections and submit button.
|
92 |
+
* Trigger hooks for rendering content before and after the settings fields.
|
93 |
+
*
|
94 |
+
* @return string
|
95 |
+
*/
|
96 |
+
public function renderContents()
|
97 |
+
{
|
98 |
+
ob_start();
|
99 |
+
|
100 |
+
do_action("gdpr/tabs/{$this->getSlug()}/before", $this);
|
101 |
+
settings_fields($this->getOptionsGroupName());
|
102 |
+
do_settings_sections($this->getOptionsGroupName());
|
103 |
+
do_action("gdpr/tabs/{$this->getSlug()}/after", $this);
|
104 |
+
|
105 |
+
$this->renderSubmitButton();
|
106 |
+
|
107 |
+
return ob_get_clean();
|
108 |
+
}
|
109 |
+
|
110 |
+
/**
|
111 |
+
* Render WP's default submit button
|
112 |
+
*/
|
113 |
+
public function renderSubmitButton()
|
114 |
+
{
|
115 |
+
submit_button(_x('Save', '(Admin)', 'gdpr-framework'));
|
116 |
+
}
|
117 |
+
|
118 |
+
/**
|
119 |
+
* Enqueue scripts, run the child class init function, trigger action for adding custom stuff
|
120 |
+
*/
|
121 |
+
public function setup()
|
122 |
+
{
|
123 |
+
// Automatically run the 'enqueue' method if it exists
|
124 |
+
if (method_exists($this, 'enqueue')) {
|
125 |
+
add_action('admin_enqueue_scripts', [$this, 'enqueue']);
|
126 |
+
}
|
127 |
+
|
128 |
+
$this->init();
|
129 |
+
|
130 |
+
// This hook can be used for registering custom settings
|
131 |
+
do_action("gdpr/tabs/{$this->getSlug()}/init", $this);
|
132 |
+
|
133 |
+
// Render the admin notices
|
134 |
+
add_action('admin_notices', [$this, 'renderAdminNotices']);
|
135 |
+
}
|
136 |
+
|
137 |
+
/**
|
138 |
+
* Render success notices via admin_notice action
|
139 |
+
*/
|
140 |
+
public function renderAdminNotices()
|
141 |
+
{
|
142 |
+
if ('tools_page_privacy' !== get_current_screen()->base) {
|
143 |
+
return;
|
144 |
+
}
|
145 |
+
|
146 |
+
if (!isset($_REQUEST['gdpr_notice'])) {
|
147 |
+
return;
|
148 |
+
}
|
149 |
+
|
150 |
+
if ('policy_generated' === $_REQUEST['gdpr_notice']) {
|
151 |
+
$message = _x('Policy generated!', '(Admin)', 'gdpr-framework');
|
152 |
+
$class = 'notice notice-success';
|
153 |
+
}
|
154 |
+
|
155 |
+
echo gdpr('view')->render('admin/notice', compact('message', 'class'));
|
156 |
+
}
|
157 |
+
}
|
src/Admin/AdminTabGeneral.php
CHANGED
@@ -1,277 +1,277 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Admin;
|
4 |
-
|
5 |
-
class AdminTabGeneral extends AdminTab
|
6 |
-
{
|
7 |
-
protected $slug = 'general';
|
8 |
-
|
9 |
-
public function __construct()
|
10 |
-
{
|
11 |
-
$this->title = _x('General', '(Admin)', 'gdpr-framework');
|
12 |
-
|
13 |
-
$this->registerSetting('gdpr_enable');
|
14 |
-
|
15 |
-
$this->registerSetting('gdpr_tools_page');
|
16 |
-
$this->registerSetting('gdpr_policy_page');
|
17 |
-
$this->registerSetting('gdpr_terms_page');
|
18 |
-
|
19 |
-
$this->registerSetting('gdpr_export_action');
|
20 |
-
$this->registerSetting('gdpr_export_action_email');
|
21 |
-
|
22 |
-
$this->registerSetting('gdpr_delete_action');
|
23 |
-
$this->registerSetting('gdpr_delete_action_reassign');
|
24 |
-
$this->registerSetting('gdpr_delete_action_reassign_user');
|
25 |
-
$this->registerSetting('gdpr_delete_action_email');
|
26 |
-
|
27 |
-
$this->registerSetting('gdpr_enable_stylesheet');
|
28 |
-
$this->registerSetting('gdpr_enable_theme_compatibility');
|
29 |
-
}
|
30 |
-
|
31 |
-
public function init()
|
32 |
-
{
|
33 |
-
/**
|
34 |
-
* General
|
35 |
-
*/
|
36 |
-
$this->registerSettingSection(
|
37 |
-
'gdpr_section_general',
|
38 |
-
_x('General Settings', '(Admin)', 'gdpr-framework')
|
39 |
-
);
|
40 |
-
|
41 |
-
$this->registerSettingField(
|
42 |
-
'gdpr_enable',
|
43 |
-
_x('Enable Privacy Tools', '(Admin)', 'gdpr-framework'),
|
44 |
-
[$this, 'renderEnableCheckbox'],
|
45 |
-
'gdpr_section_general'
|
46 |
-
);
|
47 |
-
|
48 |
-
/**
|
49 |
-
* GDPR system pages
|
50 |
-
*/
|
51 |
-
$this->registerSettingSection(
|
52 |
-
'gdpr_section_pages',
|
53 |
-
_x('Pages', '(Admin)', 'gdpr-framework')
|
54 |
-
);
|
55 |
-
|
56 |
-
$this->registerSettingField(
|
57 |
-
'gdpr_tools_page',
|
58 |
-
_x('Privacy Tools Page', '(Admin)', 'gdpr-framework') . '*',
|
59 |
-
[$this, 'renderPrivacyToolsPageSelector'],
|
60 |
-
'gdpr_section_pages'
|
61 |
-
);
|
62 |
-
|
63 |
-
$this->registerSettingField(
|
64 |
-
'gdpr_policy_page',
|
65 |
-
_x('Privacy Policy Page', '(Admin)', 'gdpr-framework') . '*',
|
66 |
-
[$this, 'renderPolicyPageSelector'],
|
67 |
-
'gdpr_section_pages'
|
68 |
-
);
|
69 |
-
|
70 |
-
$this->registerSettingField(
|
71 |
-
'gdpr_terms_page',
|
72 |
-
_x('Terms & Conditions Page', '(Admin)', 'gdpr-framework'),
|
73 |
-
[$this, 'renderTermsPageSelector'],
|
74 |
-
'gdpr_section_pages'
|
75 |
-
);
|
76 |
-
|
77 |
-
/**
|
78 |
-
* View & Export
|
79 |
-
*/
|
80 |
-
$this->registerSettingSection(
|
81 |
-
'gdpr_section_export',
|
82 |
-
_x('View & Export Data', '(Admin)', 'gdpr-framework')
|
83 |
-
);
|
84 |
-
|
85 |
-
$this->registerSettingField(
|
86 |
-
'gdpr_export_action',
|
87 |
-
_x('Export action', '(Admin)', 'gdpr-framework'),
|
88 |
-
[$this, 'renderExportActionSelector'],
|
89 |
-
'gdpr_section_export'
|
90 |
-
);
|
91 |
-
|
92 |
-
$this->registerSettingField(
|
93 |
-
'gdpr_export_action_email',
|
94 |
-
_x('Email to notify', '(Admin)', 'gdpr-framework'),
|
95 |
-
[$this, 'renderExportActionEmail'],
|
96 |
-
'gdpr_section_export',
|
97 |
-
['class' => 'js-gdpr-export-action-email hidden']
|
98 |
-
);
|
99 |
-
|
100 |
-
/**
|
101 |
-
* Delete data
|
102 |
-
*/
|
103 |
-
$this->registerSettingSection(
|
104 |
-
'gdpr_section_delete',
|
105 |
-
_x('Delete & Anonymize Data', '(Admin)', 'gdpr-framework')
|
106 |
-
);
|
107 |
-
|
108 |
-
$this->registerSettingField(
|
109 |
-
'gdpr_delete_action',
|
110 |
-
_x('Delete action', '(Admin)', 'gdpr-framework'),
|
111 |
-
[$this, 'renderDeleteActionSelector'],
|
112 |
-
'gdpr_section_delete'
|
113 |
-
);
|
114 |
-
|
115 |
-
$this->registerSettingField(
|
116 |
-
'gdpr_delete_action_reassign',
|
117 |
-
_x('Delete or reassign content?', '(Admin)', 'gdpr-framework'),
|
118 |
-
[$this, 'renderDeleteActionReassign'],
|
119 |
-
'gdpr_section_delete',
|
120 |
-
['class' => 'js-gdpr-delete-action-reassign hidden']
|
121 |
-
);
|
122 |
-
|
123 |
-
$this->registerSettingField(
|
124 |
-
'gdpr_delete_action_reassign_user',
|
125 |
-
_x('Reassign content to', '(Admin)', 'gdpr-framework'),
|
126 |
-
[$this, 'renderDeleteActionReassignUser'],
|
127 |
-
'gdpr_section_delete',
|
128 |
-
['class' => 'js-gdpr-delete-action-reassign-user hidden']
|
129 |
-
);
|
130 |
-
|
131 |
-
$this->registerSettingField(
|
132 |
-
'gdpr_delete_action_email',
|
133 |
-
_x('Email to notify', '(Admin)', 'gdpr-framework'),
|
134 |
-
[$this, 'renderDeleteActionEmail'],
|
135 |
-
'gdpr_section_delete',
|
136 |
-
['class' => 'js-gdpr-delete-action-email hidden']
|
137 |
-
);
|
138 |
-
|
139 |
-
/**
|
140 |
-
* Stylesheet
|
141 |
-
*/
|
142 |
-
|
143 |
-
$this->registerSettingSection(
|
144 |
-
'gdpr_section_stylesheet',
|
145 |
-
_x('Styling', '(Admin)', 'gdpr-framework')
|
146 |
-
);
|
147 |
-
|
148 |
-
$this->registerSettingField(
|
149 |
-
'gdpr_enable_theme_compatibility',
|
150 |
-
_x('Enable basic styling on Privacy Tools page', '(Admin)', 'gdpr-framework'),
|
151 |
-
[$this, 'renderStylesheetSelector'],
|
152 |
-
'gdpr_section_stylesheet'
|
153 |
-
);
|
154 |
-
|
155 |
-
if (gdpr('themes')->isCurrentThemeSupported()) {
|
156 |
-
|
157 |
-
/**
|
158 |
-
* Compatibility settings
|
159 |
-
*/
|
160 |
-
$this->registerSettingSection(
|
161 |
-
'gdpr_section_compatibility',
|
162 |
-
_x('Compatibility', '(Admin)', 'gdpr-framework')
|
163 |
-
);
|
164 |
-
|
165 |
-
$this->registerSettingField(
|
166 |
-
'gdpr_enable_theme_compatibility',
|
167 |
-
_x('Enable automatic theme compatibility', '(Admin)', 'gdpr-framework'),
|
168 |
-
[$this, 'renderThemeCompatibilitySelector'],
|
169 |
-
'gdpr_section_compatibility'
|
170 |
-
);
|
171 |
-
}
|
172 |
-
}
|
173 |
-
|
174 |
-
public function renderEnableCheckbox()
|
175 |
-
{
|
176 |
-
$enabled = gdpr('options')->get('enable');
|
177 |
-
echo gdpr('view')->render('admin/general/enable', compact('enabled'));
|
178 |
-
}
|
179 |
-
|
180 |
-
public function renderPrivacyToolsPageSelector()
|
181 |
-
{
|
182 |
-
wp_dropdown_pages([
|
183 |
-
'name' => 'gdpr_tools_page',
|
184 |
-
'show_option_none' => _x('— Select —', '(Admin)', 'gdpr-framework'),
|
185 |
-
'option_none_value' => '0',
|
186 |
-
'selected' => gdpr('options')->get('tools_page'),
|
187 |
-
'class' => 'js-gdpr-select2 gdpr-select',
|
188 |
-
'post_status' => 'publish,draft',
|
189 |
-
]);
|
190 |
-
echo gdpr('view')->render('admin/general/description-data-page');
|
191 |
-
}
|
192 |
-
|
193 |
-
/**
|
194 |
-
* Render the GDPR policy page selector dropdown
|
195 |
-
*/
|
196 |
-
public function renderPolicyPageSelector()
|
197 |
-
{
|
198 |
-
wp_dropdown_pages([
|
199 |
-
'name' => 'gdpr_policy_page',
|
200 |
-
'show_option_none' => _x('— Select —', '(Admin)', 'gdpr-framework'),
|
201 |
-
'option_none_value' => '0',
|
202 |
-
'selected' => gdpr('options')->get('policy_page'),
|
203 |
-
'class' => 'js-gdpr-select2 gdpr-select',
|
204 |
-
'post_status' => 'publish,draft',
|
205 |
-
]);
|
206 |
-
echo gdpr('view')->render('admin/privacy-policy/description-policy-page');
|
207 |
-
}
|
208 |
-
|
209 |
-
public function renderTermsPageSelector()
|
210 |
-
{
|
211 |
-
wp_dropdown_pages([
|
212 |
-
'name' => 'gdpr_terms_page',
|
213 |
-
'show_option_none' => _x('— Select —', '(Admin)', 'gdpr-framework'),
|
214 |
-
'option_none_value' => '0',
|
215 |
-
'selected' => gdpr('options')->get('terms_page'),
|
216 |
-
'class' => 'js-gdpr-select2 gdpr-select',
|
217 |
-
'post_status' => 'publish,draft',
|
218 |
-
]);
|
219 |
-
echo gdpr('view')->render('admin/general/description-terms-page');
|
220 |
-
}
|
221 |
-
|
222 |
-
public function renderExportActionSelector()
|
223 |
-
{
|
224 |
-
$exportAction = gdpr('options')->get('export_action');
|
225 |
-
echo gdpr('view')->render('admin/general/export-action', compact('exportAction'));
|
226 |
-
echo gdpr('view')->render('admin/general/description-export-action');
|
227 |
-
}
|
228 |
-
|
229 |
-
public function renderExportActionEmail()
|
230 |
-
{
|
231 |
-
$exportActionEmail = gdpr('options')->get('export_action_email');
|
232 |
-
echo gdpr('view')->render('admin/general/export-action-email', compact('exportActionEmail'));
|
233 |
-
}
|
234 |
-
|
235 |
-
public function renderDeleteActionSelector()
|
236 |
-
{
|
237 |
-
$deleteAction = gdpr('options')->get('delete_action');
|
238 |
-
echo gdpr('view')->render('admin/general/delete-action', compact('deleteAction'));
|
239 |
-
echo gdpr('view')->render('admin/general/description-delete-action');
|
240 |
-
}
|
241 |
-
|
242 |
-
public function renderDeleteActionReassign()
|
243 |
-
{
|
244 |
-
$reassign = gdpr('options')->get('delete_action_reassign');
|
245 |
-
echo gdpr('view')->render('admin/general/delete-action-reassign', compact('reassign'));
|
246 |
-
}
|
247 |
-
|
248 |
-
public function renderDeleteActionReassignUser()
|
249 |
-
{
|
250 |
-
wp_dropdown_users([
|
251 |
-
'name' => 'gdpr_delete_action_reassign_user',
|
252 |
-
'show_option_none' => _x('— Select —', '(Admin)', 'gdpr-framework'),
|
253 |
-
'option_none_value' => '0',
|
254 |
-
'selected' => gdpr('options')->get('delete_action_reassign_user'),
|
255 |
-
'class' => 'js-gdpr-select2 gdpr-select',
|
256 |
-
'role__in' => apply_filters('gdpr/options/reassign/roles', ['administrator', 'editor']),
|
257 |
-
]);
|
258 |
-
}
|
259 |
-
|
260 |
-
public function renderDeleteActionEmail()
|
261 |
-
{
|
262 |
-
$deleteActionEmail = gdpr('options')->get('delete_action_email');
|
263 |
-
echo gdpr('view')->render('admin/general/delete-action-email', compact('deleteActionEmail'));
|
264 |
-
}
|
265 |
-
|
266 |
-
public function renderStylesheetSelector()
|
267 |
-
{
|
268 |
-
$enabled = gdpr('options')->get('enable_stylesheet');
|
269 |
-
echo gdpr('view')->render('admin/general/stylesheet', compact('enabled'));
|
270 |
-
}
|
271 |
-
|
272 |
-
public function renderThemeCompatibilitySelector()
|
273 |
-
{
|
274 |
-
$enabled = gdpr('options')->get('enable_theme_compatibility');
|
275 |
-
echo gdpr('view')->render('admin/general/theme-compatibility', compact('enabled'));
|
276 |
-
}
|
277 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Admin;
|
4 |
+
|
5 |
+
class AdminTabGeneral extends AdminTab
|
6 |
+
{
|
7 |
+
protected $slug = 'general';
|
8 |
+
|
9 |
+
public function __construct()
|
10 |
+
{
|
11 |
+
$this->title = _x('General', '(Admin)', 'gdpr-framework');
|
12 |
+
|
13 |
+
$this->registerSetting('gdpr_enable');
|
14 |
+
|
15 |
+
$this->registerSetting('gdpr_tools_page');
|
16 |
+
$this->registerSetting('gdpr_policy_page');
|
17 |
+
$this->registerSetting('gdpr_terms_page');
|
18 |
+
|
19 |
+
$this->registerSetting('gdpr_export_action');
|
20 |
+
$this->registerSetting('gdpr_export_action_email');
|
21 |
+
|
22 |
+
$this->registerSetting('gdpr_delete_action');
|
23 |
+
$this->registerSetting('gdpr_delete_action_reassign');
|
24 |
+
$this->registerSetting('gdpr_delete_action_reassign_user');
|
25 |
+
$this->registerSetting('gdpr_delete_action_email');
|
26 |
+
|
27 |
+
$this->registerSetting('gdpr_enable_stylesheet');
|
28 |
+
$this->registerSetting('gdpr_enable_theme_compatibility');
|
29 |
+
}
|
30 |
+
|
31 |
+
public function init()
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* General
|
35 |
+
*/
|
36 |
+
$this->registerSettingSection(
|
37 |
+
'gdpr_section_general',
|
38 |
+
_x('General Settings', '(Admin)', 'gdpr-framework')
|
39 |
+
);
|
40 |
+
|
41 |
+
$this->registerSettingField(
|
42 |
+
'gdpr_enable',
|
43 |
+
_x('Enable Privacy Tools', '(Admin)', 'gdpr-framework'),
|
44 |
+
[$this, 'renderEnableCheckbox'],
|
45 |
+
'gdpr_section_general'
|
46 |
+
);
|
47 |
+
|
48 |
+
/**
|
49 |
+
* GDPR system pages
|
50 |
+
*/
|
51 |
+
$this->registerSettingSection(
|
52 |
+
'gdpr_section_pages',
|
53 |
+
_x('Pages', '(Admin)', 'gdpr-framework')
|
54 |
+
);
|
55 |
+
|
56 |
+
$this->registerSettingField(
|
57 |
+
'gdpr_tools_page',
|
58 |
+
_x('Privacy Tools Page', '(Admin)', 'gdpr-framework') . '*',
|
59 |
+
[$this, 'renderPrivacyToolsPageSelector'],
|
60 |
+
'gdpr_section_pages'
|
61 |
+
);
|
62 |
+
|
63 |
+
$this->registerSettingField(
|
64 |
+
'gdpr_policy_page',
|
65 |
+
_x('Privacy Policy Page', '(Admin)', 'gdpr-framework') . '*',
|
66 |
+
[$this, 'renderPolicyPageSelector'],
|
67 |
+
'gdpr_section_pages'
|
68 |
+
);
|
69 |
+
|
70 |
+
$this->registerSettingField(
|
71 |
+
'gdpr_terms_page',
|
72 |
+
_x('Terms & Conditions Page', '(Admin)', 'gdpr-framework'),
|
73 |
+
[$this, 'renderTermsPageSelector'],
|
74 |
+
'gdpr_section_pages'
|
75 |
+
);
|
76 |
+
|
77 |
+
/**
|
78 |
+
* View & Export
|
79 |
+
*/
|
80 |
+
$this->registerSettingSection(
|
81 |
+
'gdpr_section_export',
|
82 |
+
_x('View & Export Data', '(Admin)', 'gdpr-framework')
|
83 |
+
);
|
84 |
+
|
85 |
+
$this->registerSettingField(
|
86 |
+
'gdpr_export_action',
|
87 |
+
_x('Export action', '(Admin)', 'gdpr-framework'),
|
88 |
+
[$this, 'renderExportActionSelector'],
|
89 |
+
'gdpr_section_export'
|
90 |
+
);
|
91 |
+
|
92 |
+
$this->registerSettingField(
|
93 |
+
'gdpr_export_action_email',
|
94 |
+
_x('Email to notify', '(Admin)', 'gdpr-framework'),
|
95 |
+
[$this, 'renderExportActionEmail'],
|
96 |
+
'gdpr_section_export',
|
97 |
+
['class' => 'js-gdpr-export-action-email hidden']
|
98 |
+
);
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Delete data
|
102 |
+
*/
|
103 |
+
$this->registerSettingSection(
|
104 |
+
'gdpr_section_delete',
|
105 |
+
_x('Delete & Anonymize Data', '(Admin)', 'gdpr-framework')
|
106 |
+
);
|
107 |
+
|
108 |
+
$this->registerSettingField(
|
109 |
+
'gdpr_delete_action',
|
110 |
+
_x('Delete action', '(Admin)', 'gdpr-framework'),
|
111 |
+
[$this, 'renderDeleteActionSelector'],
|
112 |
+
'gdpr_section_delete'
|
113 |
+
);
|
114 |
+
|
115 |
+
$this->registerSettingField(
|
116 |
+
'gdpr_delete_action_reassign',
|
117 |
+
_x('Delete or reassign content?', '(Admin)', 'gdpr-framework'),
|
118 |
+
[$this, 'renderDeleteActionReassign'],
|
119 |
+
'gdpr_section_delete',
|
120 |
+
['class' => 'js-gdpr-delete-action-reassign hidden']
|
121 |
+
);
|
122 |
+
|
123 |
+
$this->registerSettingField(
|
124 |
+
'gdpr_delete_action_reassign_user',
|
125 |
+
_x('Reassign content to', '(Admin)', 'gdpr-framework'),
|
126 |
+
[$this, 'renderDeleteActionReassignUser'],
|
127 |
+
'gdpr_section_delete',
|
128 |
+
['class' => 'js-gdpr-delete-action-reassign-user hidden']
|
129 |
+
);
|
130 |
+
|
131 |
+
$this->registerSettingField(
|
132 |
+
'gdpr_delete_action_email',
|
133 |
+
_x('Email to notify', '(Admin)', 'gdpr-framework'),
|
134 |
+
[$this, 'renderDeleteActionEmail'],
|
135 |
+
'gdpr_section_delete',
|
136 |
+
['class' => 'js-gdpr-delete-action-email hidden']
|
137 |
+
);
|
138 |
+
|
139 |
+
/**
|
140 |
+
* Stylesheet
|
141 |
+
*/
|
142 |
+
|
143 |
+
$this->registerSettingSection(
|
144 |
+
'gdpr_section_stylesheet',
|
145 |
+
_x('Styling', '(Admin)', 'gdpr-framework')
|
146 |
+
);
|
147 |
+
|
148 |
+
$this->registerSettingField(
|
149 |
+
'gdpr_enable_theme_compatibility',
|
150 |
+
_x('Enable basic styling on Privacy Tools page', '(Admin)', 'gdpr-framework'),
|
151 |
+
[$this, 'renderStylesheetSelector'],
|
152 |
+
'gdpr_section_stylesheet'
|
153 |
+
);
|
154 |
+
|
155 |
+
if (gdpr('themes')->isCurrentThemeSupported()) {
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Compatibility settings
|
159 |
+
*/
|
160 |
+
$this->registerSettingSection(
|
161 |
+
'gdpr_section_compatibility',
|
162 |
+
_x('Compatibility', '(Admin)', 'gdpr-framework')
|
163 |
+
);
|
164 |
+
|
165 |
+
$this->registerSettingField(
|
166 |
+
'gdpr_enable_theme_compatibility',
|
167 |
+
_x('Enable automatic theme compatibility', '(Admin)', 'gdpr-framework'),
|
168 |
+
[$this, 'renderThemeCompatibilitySelector'],
|
169 |
+
'gdpr_section_compatibility'
|
170 |
+
);
|
171 |
+
}
|
172 |
+
}
|
173 |
+
|
174 |
+
public function renderEnableCheckbox()
|
175 |
+
{
|
176 |
+
$enabled = gdpr('options')->get('enable');
|
177 |
+
echo gdpr('view')->render('admin/general/enable', compact('enabled'));
|
178 |
+
}
|
179 |
+
|
180 |
+
public function renderPrivacyToolsPageSelector()
|
181 |
+
{
|
182 |
+
wp_dropdown_pages([
|
183 |
+
'name' => 'gdpr_tools_page',
|
184 |
+
'show_option_none' => _x('— Select —', '(Admin)', 'gdpr-framework'),
|
185 |
+
'option_none_value' => '0',
|
186 |
+
'selected' => gdpr('options')->get('tools_page'),
|
187 |
+
'class' => 'js-gdpr-select2 gdpr-select',
|
188 |
+
'post_status' => 'publish,draft',
|
189 |
+
]);
|
190 |
+
echo gdpr('view')->render('admin/general/description-data-page');
|
191 |
+
}
|
192 |
+
|
193 |
+
/**
|
194 |
+
* Render the GDPR policy page selector dropdown
|
195 |
+
*/
|
196 |
+
public function renderPolicyPageSelector()
|
197 |
+
{
|
198 |
+
wp_dropdown_pages([
|
199 |
+
'name' => 'gdpr_policy_page',
|
200 |
+
'show_option_none' => _x('— Select —', '(Admin)', 'gdpr-framework'),
|
201 |
+
'option_none_value' => '0',
|
202 |
+
'selected' => gdpr('options')->get('policy_page'),
|
203 |
+
'class' => 'js-gdpr-select2 gdpr-select',
|
204 |
+
'post_status' => 'publish,draft',
|
205 |
+
]);
|
206 |
+
echo gdpr('view')->render('admin/privacy-policy/description-policy-page');
|
207 |
+
}
|
208 |
+
|
209 |
+
public function renderTermsPageSelector()
|
210 |
+
{
|
211 |
+
wp_dropdown_pages([
|
212 |
+
'name' => 'gdpr_terms_page',
|
213 |
+
'show_option_none' => _x('— Select —', '(Admin)', 'gdpr-framework'),
|
214 |
+
'option_none_value' => '0',
|
215 |
+
'selected' => gdpr('options')->get('terms_page'),
|
216 |
+
'class' => 'js-gdpr-select2 gdpr-select',
|
217 |
+
'post_status' => 'publish,draft',
|
218 |
+
]);
|
219 |
+
echo gdpr('view')->render('admin/general/description-terms-page');
|
220 |
+
}
|
221 |
+
|
222 |
+
public function renderExportActionSelector()
|
223 |
+
{
|
224 |
+
$exportAction = gdpr('options')->get('export_action');
|
225 |
+
echo gdpr('view')->render('admin/general/export-action', compact('exportAction'));
|
226 |
+
echo gdpr('view')->render('admin/general/description-export-action');
|
227 |
+
}
|
228 |
+
|
229 |
+
public function renderExportActionEmail()
|
230 |
+
{
|
231 |
+
$exportActionEmail = gdpr('options')->get('export_action_email');
|
232 |
+
echo gdpr('view')->render('admin/general/export-action-email', compact('exportActionEmail'));
|
233 |
+
}
|
234 |
+
|
235 |
+
public function renderDeleteActionSelector()
|
236 |
+
{
|
237 |
+
$deleteAction = gdpr('options')->get('delete_action');
|
238 |
+
echo gdpr('view')->render('admin/general/delete-action', compact('deleteAction'));
|
239 |
+
echo gdpr('view')->render('admin/general/description-delete-action');
|
240 |
+
}
|
241 |
+
|
242 |
+
public function renderDeleteActionReassign()
|
243 |
+
{
|
244 |
+
$reassign = gdpr('options')->get('delete_action_reassign');
|
245 |
+
echo gdpr('view')->render('admin/general/delete-action-reassign', compact('reassign'));
|
246 |
+
}
|
247 |
+
|
248 |
+
public function renderDeleteActionReassignUser()
|
249 |
+
{
|
250 |
+
wp_dropdown_users([
|
251 |
+
'name' => 'gdpr_delete_action_reassign_user',
|
252 |
+
'show_option_none' => _x('— Select —', '(Admin)', 'gdpr-framework'),
|
253 |
+
'option_none_value' => '0',
|
254 |
+
'selected' => gdpr('options')->get('delete_action_reassign_user'),
|
255 |
+
'class' => 'js-gdpr-select2 gdpr-select',
|
256 |
+
'role__in' => apply_filters('gdpr/options/reassign/roles', ['administrator', 'editor']),
|
257 |
+
]);
|
258 |
+
}
|
259 |
+
|
260 |
+
public function renderDeleteActionEmail()
|
261 |
+
{
|
262 |
+
$deleteActionEmail = gdpr('options')->get('delete_action_email');
|
263 |
+
echo gdpr('view')->render('admin/general/delete-action-email', compact('deleteActionEmail'));
|
264 |
+
}
|
265 |
+
|
266 |
+
public function renderStylesheetSelector()
|
267 |
+
{
|
268 |
+
$enabled = gdpr('options')->get('enable_stylesheet');
|
269 |
+
echo gdpr('view')->render('admin/general/stylesheet', compact('enabled'));
|
270 |
+
}
|
271 |
+
|
272 |
+
public function renderThemeCompatibilitySelector()
|
273 |
+
{
|
274 |
+
$enabled = gdpr('options')->get('enable_theme_compatibility');
|
275 |
+
echo gdpr('view')->render('admin/general/theme-compatibility', compact('enabled'));
|
276 |
+
}
|
277 |
+
}
|
src/Admin/Modal.php
CHANGED
@@ -1,41 +1,41 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Admin;
|
4 |
-
|
5 |
-
class Modal
|
6 |
-
{
|
7 |
-
protected $id;
|
8 |
-
|
9 |
-
protected $template;
|
10 |
-
|
11 |
-
protected $data;
|
12 |
-
|
13 |
-
/**
|
14 |
-
* todo: replace with a proper factory pattern via gdpr()?
|
15 |
-
*
|
16 |
-
* AdminNotice constructor.
|
17 |
-
*/
|
18 |
-
public function __construct()
|
19 |
-
{
|
20 |
-
add_action('admin_footer', [$this, 'render']);
|
21 |
-
}
|
22 |
-
|
23 |
-
public function add($id, $template, $data = [])
|
24 |
-
{
|
25 |
-
$this->id = $id;
|
26 |
-
$this->template = $template;
|
27 |
-
$this->data = $data;
|
28 |
-
$this->data['id'] = $this->id;
|
29 |
-
}
|
30 |
-
|
31 |
-
public function render()
|
32 |
-
{
|
33 |
-
if (!$this->template) {
|
34 |
-
trigger_error('Template not set for admin notice!', E_USER_ERROR);
|
35 |
-
}
|
36 |
-
|
37 |
-
echo gdpr('view')->render('admin/modals/header', $this->data);
|
38 |
-
echo gdpr('view')->render($this->template, $this->data);
|
39 |
-
echo gdpr('view')->render('admin/modals/footer', $this->data);
|
40 |
-
}
|
41 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Admin;
|
4 |
+
|
5 |
+
class Modal
|
6 |
+
{
|
7 |
+
protected $id;
|
8 |
+
|
9 |
+
protected $template;
|
10 |
+
|
11 |
+
protected $data;
|
12 |
+
|
13 |
+
/**
|
14 |
+
* todo: replace with a proper factory pattern via gdpr()?
|
15 |
+
*
|
16 |
+
* AdminNotice constructor.
|
17 |
+
*/
|
18 |
+
public function __construct()
|
19 |
+
{
|
20 |
+
add_action('admin_footer', [$this, 'render']);
|
21 |
+
}
|
22 |
+
|
23 |
+
public function add($id, $template, $data = [])
|
24 |
+
{
|
25 |
+
$this->id = $id;
|
26 |
+
$this->template = $template;
|
27 |
+
$this->data = $data;
|
28 |
+
$this->data['id'] = $this->id;
|
29 |
+
}
|
30 |
+
|
31 |
+
public function render()
|
32 |
+
{
|
33 |
+
if (!$this->template) {
|
34 |
+
trigger_error('Template not set for admin notice!', E_USER_ERROR);
|
35 |
+
}
|
36 |
+
|
37 |
+
echo gdpr('view')->render('admin/modals/header', $this->data);
|
38 |
+
echo gdpr('view')->render($this->template, $this->data);
|
39 |
+
echo gdpr('view')->render('admin/modals/footer', $this->data);
|
40 |
+
}
|
41 |
+
}
|
src/Admin/WordpressAdmin.php
CHANGED
@@ -1,156 +1,156 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Admin;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Handles general admin functionality
|
7 |
-
*
|
8 |
-
* Class WordpressAdmin
|
9 |
-
*
|
10 |
-
* @package Codelight\GDPR\Admin
|
11 |
-
*/
|
12 |
-
class WordpressAdmin
|
13 |
-
{
|
14 |
-
public function __construct(WordpressAdminPage $adminPage)
|
15 |
-
{
|
16 |
-
$this->adminPage = $adminPage;
|
17 |
-
|
18 |
-
// Register the AdminTabGeneral class in our container
|
19 |
-
gdpr()->bind(AdminTabGeneral::class);
|
20 |
-
|
21 |
-
// Allow turning off helpers
|
22 |
-
if (apply_filters('gdpr/admin/helpers/enabled', true)) {
|
23 |
-
gdpr()->make(AdminHelper::class);
|
24 |
-
}
|
25 |
-
|
26 |
-
$this->setup();
|
27 |
-
|
28 |
-
}
|
29 |
-
|
30 |
-
/**
|
31 |
-
* Set up hooks
|
32 |
-
*/
|
33 |
-
protected function setup()
|
34 |
-
{
|
35 |
-
// Register the main GDPR options page
|
36 |
-
add_action('admin_menu', [$this, 'registerGDPROptionsPage']);
|
37 |
-
|
38 |
-
// Register General admin tab
|
39 |
-
add_filter('gdpr/admin/tabs', [$this, 'registerAdminTabGeneral'], 0);
|
40 |
-
|
41 |
-
// Enqueue assets
|
42 |
-
add_action('admin_enqueue_scripts', [$this, 'enqueue']);
|
43 |
-
|
44 |
-
// Register post states
|
45 |
-
add_filter('display_post_states', [$this, 'registerPostStates'], 10, 2);
|
46 |
-
|
47 |
-
// Show help notice
|
48 |
-
add_action('current_screen', [$this, 'maybeShowHelpNotice'], 999);
|
49 |
-
}
|
50 |
-
|
51 |
-
|
52 |
-
public function maybeShowHelpNotice()
|
53 |
-
{
|
54 |
-
if ('tools_page_privacy' === get_current_screen()->base) {
|
55 |
-
gdpr('admin-notice')->add('admin/notices/help');
|
56 |
-
}
|
57 |
-
}
|
58 |
-
|
59 |
-
/**
|
60 |
-
* Register the GDPR options page in WP admin
|
61 |
-
*/
|
62 |
-
public function registerGDPROptionsPage()
|
63 |
-
{
|
64 |
-
add_management_page(
|
65 |
-
_x('Privacy & GDPR Settings', '(Admin)', 'gdpr-framework'),
|
66 |
-
_x('Privacy', '(Admin)', 'gdpr-framework'),
|
67 |
-
'manage_options',
|
68 |
-
'privacy',
|
69 |
-
[$this->adminPage, 'renderPage']
|
70 |
-
);
|
71 |
-
}
|
72 |
-
|
73 |
-
/**
|
74 |
-
* Register General admin tab
|
75 |
-
*
|
76 |
-
* @param $tabs
|
77 |
-
* @return array
|
78 |
-
*/
|
79 |
-
public function registerAdminTabGeneral($tabs)
|
80 |
-
{
|
81 |
-
$tabs['general'] = gdpr(AdminTabGeneral::class);
|
82 |
-
|
83 |
-
return $tabs;
|
84 |
-
}
|
85 |
-
|
86 |
-
/**
|
87 |
-
* Enqueue all admin scripts and styles
|
88 |
-
*/
|
89 |
-
public function enqueue()
|
90 |
-
{
|
91 |
-
/**
|
92 |
-
* General admin styles
|
93 |
-
*/
|
94 |
-
wp_enqueue_style(
|
95 |
-
'gdpr-admin',
|
96 |
-
gdpr('config')->get('plugin.url') . 'assets/gdpr-admin.css'
|
97 |
-
);
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
/**
|
102 |
-
* jQuery UI dialog for modals
|
103 |
-
*/
|
104 |
-
wp_enqueue_style('wp-jquery-ui-dialog');
|
105 |
-
wp_enqueue_script(
|
106 |
-
'gdpr-admin',
|
107 |
-
gdpr('config')->get('plugin.url') . 'assets/gdpr-admin.js',
|
108 |
-
['jquery-ui-dialog']
|
109 |
-
);
|
110 |
-
|
111 |
-
/**
|
112 |
-
* jQuery Repeater
|
113 |
-
*/
|
114 |
-
wp_enqueue_script(
|
115 |
-
'jquery-repeater',
|
116 |
-
gdpr('config')->get('plugin.url') . 'assets/jquery.repeater.min.js',
|
117 |
-
['jquery']
|
118 |
-
);
|
119 |
-
|
120 |
-
/**
|
121 |
-
* Select2
|
122 |
-
*/
|
123 |
-
wp_enqueue_style(
|
124 |
-
'select2css',
|
125 |
-
'//cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/css/select2.min.css'
|
126 |
-
);
|
127 |
-
|
128 |
-
wp_enqueue_script(
|
129 |
-
'select2',
|
130 |
-
'//cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/select2.min.js',
|
131 |
-
['jquery']
|
132 |
-
);
|
133 |
-
|
134 |
-
wp_enqueue_script(
|
135 |
-
'conditional-show',
|
136 |
-
gdpr('config')->get('plugin.url') . 'assets/conditional-show.js',
|
137 |
-
['jquery']
|
138 |
-
);
|
139 |
-
}
|
140 |
-
|
141 |
-
/**
|
142 |
-
* Add a new Post State for our super important system pages
|
143 |
-
*/
|
144 |
-
public function registerPostStates($postStates, $post)
|
145 |
-
{
|
146 |
-
if (gdpr('options')->get('policy_page') == $post->ID) {
|
147 |
-
$postStates['gdpr_policy_page'] = _x('Privacy Policy Page', '(Admin)', 'gdpr-framework');
|
148 |
-
}
|
149 |
-
|
150 |
-
if (gdpr('options')->get('tools_page') == $post->ID) {
|
151 |
-
$postStates['gdpr_tools_page'] = _x('Privacy Tools Page', '(Admin)', 'gdpr-framework');
|
152 |
-
}
|
153 |
-
|
154 |
-
return $postStates;
|
155 |
-
}
|
156 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Admin;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Handles general admin functionality
|
7 |
+
*
|
8 |
+
* Class WordpressAdmin
|
9 |
+
*
|
10 |
+
* @package Codelight\GDPR\Admin
|
11 |
+
*/
|
12 |
+
class WordpressAdmin
|
13 |
+
{
|
14 |
+
public function __construct(WordpressAdminPage $adminPage)
|
15 |
+
{
|
16 |
+
$this->adminPage = $adminPage;
|
17 |
+
|
18 |
+
// Register the AdminTabGeneral class in our container
|
19 |
+
gdpr()->bind(AdminTabGeneral::class);
|
20 |
+
|
21 |
+
// Allow turning off helpers
|
22 |
+
if (apply_filters('gdpr/admin/helpers/enabled', true)) {
|
23 |
+
gdpr()->make(AdminHelper::class);
|
24 |
+
}
|
25 |
+
|
26 |
+
$this->setup();
|
27 |
+
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Set up hooks
|
32 |
+
*/
|
33 |
+
protected function setup()
|
34 |
+
{
|
35 |
+
// Register the main GDPR options page
|
36 |
+
add_action('admin_menu', [$this, 'registerGDPROptionsPage']);
|
37 |
+
|
38 |
+
// Register General admin tab
|
39 |
+
add_filter('gdpr/admin/tabs', [$this, 'registerAdminTabGeneral'], 0);
|
40 |
+
|
41 |
+
// Enqueue assets
|
42 |
+
add_action('admin_enqueue_scripts', [$this, 'enqueue']);
|
43 |
+
|
44 |
+
// Register post states
|
45 |
+
add_filter('display_post_states', [$this, 'registerPostStates'], 10, 2);
|
46 |
+
|
47 |
+
// Show help notice
|
48 |
+
add_action('current_screen', [$this, 'maybeShowHelpNotice'], 999);
|
49 |
+
}
|
50 |
+
|
51 |
+
|
52 |
+
public function maybeShowHelpNotice()
|
53 |
+
{
|
54 |
+
if ('tools_page_privacy' === get_current_screen()->base) {
|
55 |
+
gdpr('admin-notice')->add('admin/notices/help');
|
56 |
+
}
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Register the GDPR options page in WP admin
|
61 |
+
*/
|
62 |
+
public function registerGDPROptionsPage()
|
63 |
+
{
|
64 |
+
add_management_page(
|
65 |
+
_x('Privacy & GDPR Settings', '(Admin)', 'gdpr-framework'),
|
66 |
+
_x('Privacy', '(Admin)', 'gdpr-framework'),
|
67 |
+
'manage_options',
|
68 |
+
'privacy',
|
69 |
+
[$this->adminPage, 'renderPage']
|
70 |
+
);
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Register General admin tab
|
75 |
+
*
|
76 |
+
* @param $tabs
|
77 |
+
* @return array
|
78 |
+
*/
|
79 |
+
public function registerAdminTabGeneral($tabs)
|
80 |
+
{
|
81 |
+
$tabs['general'] = gdpr(AdminTabGeneral::class);
|
82 |
+
|
83 |
+
return $tabs;
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Enqueue all admin scripts and styles
|
88 |
+
*/
|
89 |
+
public function enqueue()
|
90 |
+
{
|
91 |
+
/**
|
92 |
+
* General admin styles
|
93 |
+
*/
|
94 |
+
wp_enqueue_style(
|
95 |
+
'gdpr-admin',
|
96 |
+
gdpr('config')->get('plugin.url') . 'assets/gdpr-admin.css'
|
97 |
+
);
|
98 |
+
|
99 |
+
|
100 |
+
|
101 |
+
/**
|
102 |
+
* jQuery UI dialog for modals
|
103 |
+
*/
|
104 |
+
wp_enqueue_style('wp-jquery-ui-dialog');
|
105 |
+
wp_enqueue_script(
|
106 |
+
'gdpr-admin',
|
107 |
+
gdpr('config')->get('plugin.url') . 'assets/gdpr-admin.js',
|
108 |
+
['jquery-ui-dialog']
|
109 |
+
);
|
110 |
+
|
111 |
+
/**
|
112 |
+
* jQuery Repeater
|
113 |
+
*/
|
114 |
+
wp_enqueue_script(
|
115 |
+
'jquery-repeater',
|
116 |
+
gdpr('config')->get('plugin.url') . 'assets/jquery.repeater.min.js',
|
117 |
+
['jquery']
|
118 |
+
);
|
119 |
+
|
120 |
+
/**
|
121 |
+
* Select2
|
122 |
+
*/
|
123 |
+
wp_enqueue_style(
|
124 |
+
'select2css',
|
125 |
+
'//cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/css/select2.min.css'
|
126 |
+
);
|
127 |
+
|
128 |
+
wp_enqueue_script(
|
129 |
+
'select2',
|
130 |
+
'//cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/select2.min.js',
|
131 |
+
['jquery']
|
132 |
+
);
|
133 |
+
|
134 |
+
wp_enqueue_script(
|
135 |
+
'conditional-show',
|
136 |
+
gdpr('config')->get('plugin.url') . 'assets/conditional-show.js',
|
137 |
+
['jquery']
|
138 |
+
);
|
139 |
+
}
|
140 |
+
|
141 |
+
/**
|
142 |
+
* Add a new Post State for our super important system pages
|
143 |
+
*/
|
144 |
+
public function registerPostStates($postStates, $post)
|
145 |
+
{
|
146 |
+
if (gdpr('options')->get('policy_page') == $post->ID) {
|
147 |
+
$postStates['gdpr_policy_page'] = _x('Privacy Policy Page', '(Admin)', 'gdpr-framework');
|
148 |
+
}
|
149 |
+
|
150 |
+
if (gdpr('options')->get('tools_page') == $post->ID) {
|
151 |
+
$postStates['gdpr_tools_page'] = _x('Privacy Tools Page', '(Admin)', 'gdpr-framework');
|
152 |
+
}
|
153 |
+
|
154 |
+
return $postStates;
|
155 |
+
}
|
156 |
+
}
|
src/Admin/WordpressAdminPage.php
CHANGED
@@ -1,147 +1,147 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Admin;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Handle registering and rendering the GDPR admin page contents
|
7 |
-
*
|
8 |
-
* Class WordpressAdminPage
|
9 |
-
*
|
10 |
-
* @package Codelight\GDPR\Admin
|
11 |
-
*/
|
12 |
-
class WordpressAdminPage
|
13 |
-
{
|
14 |
-
protected $slug = 'gdpr';
|
15 |
-
|
16 |
-
protected $tabs = [];
|
17 |
-
|
18 |
-
public function __construct()
|
19 |
-
{
|
20 |
-
$this->setup();
|
21 |
-
}
|
22 |
-
|
23 |
-
protected function setup()
|
24 |
-
{
|
25 |
-
// Register the tabs
|
26 |
-
add_action('admin_init', [$this, 'registerTabs']);
|
27 |
-
|
28 |
-
// todo
|
29 |
-
//if (gdpr('options')->get('plugin_disclaimer_accepted')) {
|
30 |
-
// Initialize the active tab
|
31 |
-
add_action('admin_init', [$this, 'initActiveTab']);
|
32 |
-
//}
|
33 |
-
|
34 |
-
// todo
|
35 |
-
// gdpr('admin-modal')->add('gdpr-test', 'admin/modals/test', ['title' => 'Test modal']);
|
36 |
-
}
|
37 |
-
|
38 |
-
/**
|
39 |
-
* Render the main GDPR options page
|
40 |
-
*/
|
41 |
-
public function renderPage()
|
42 |
-
{
|
43 |
-
$tabs = $this->getNavigationData();
|
44 |
-
$currentTabContents = $this->getActiveTab()->renderContents();
|
45 |
-
$signature = apply_filters('gdpr/admin/show_signature', true);
|
46 |
-
echo gdpr('view')->render('admin/settings-page', compact('tabs', 'currentTabContents', 'signature'));
|
47 |
-
}
|
48 |
-
|
49 |
-
/**
|
50 |
-
* Allow modules to add tabs
|
51 |
-
*/
|
52 |
-
public function registerTabs()
|
53 |
-
{
|
54 |
-
$this->tabs = apply_filters('gdpr/admin/tabs', []);
|
55 |
-
}
|
56 |
-
|
57 |
-
/**
|
58 |
-
* Get the active tab or the first tab if none are active
|
59 |
-
*
|
60 |
-
* @return AdminTabInterface
|
61 |
-
*/
|
62 |
-
public function getActiveTab()
|
63 |
-
{
|
64 |
-
foreach ($this->tabs as $tab) {
|
65 |
-
if (isset($_GET['gdpr-tab']) && $_GET['gdpr-tab'] === $tab->getSlug()) {
|
66 |
-
return $tab;
|
67 |
-
}
|
68 |
-
}
|
69 |
-
|
70 |
-
return reset($this->tabs);
|
71 |
-
}
|
72 |
-
|
73 |
-
/**
|
74 |
-
* Check if the given tab is active
|
75 |
-
*
|
76 |
-
* @param $slug
|
77 |
-
* @return bool
|
78 |
-
*/
|
79 |
-
public function isTabActive($slug)
|
80 |
-
{
|
81 |
-
$activeTab = $this->getActiveTab();
|
82 |
-
if ($activeTab->getSlug() === $slug) {
|
83 |
-
return true;
|
84 |
-
}
|
85 |
-
|
86 |
-
// Hacky: if no tab set, the first tab is active
|
87 |
-
if (!isset($_GET['gdpr-tab'])) {
|
88 |
-
$firstTab = reset($this->tabs);
|
89 |
-
if ($firstTab->getSlug() === $slug) {
|
90 |
-
return true;
|
91 |
-
}
|
92 |
-
}
|
93 |
-
|
94 |
-
return false;
|
95 |
-
}
|
96 |
-
|
97 |
-
/**
|
98 |
-
* Initialize the active tab
|
99 |
-
*/
|
100 |
-
public function initActiveTab()
|
101 |
-
{
|
102 |
-
$activeTab = $this->getActiveTab();
|
103 |
-
$activeTab->setup();
|
104 |
-
}
|
105 |
-
|
106 |
-
/**
|
107 |
-
* Get the tabbed navigation for GDPR options page
|
108 |
-
*
|
109 |
-
* @return array
|
110 |
-
*/
|
111 |
-
public function getNavigationData()
|
112 |
-
{
|
113 |
-
if (!count($this->tabs)) {
|
114 |
-
return [];
|
115 |
-
}
|
116 |
-
|
117 |
-
$navigation = [];
|
118 |
-
|
119 |
-
foreach ($this->tabs as $tab) {
|
120 |
-
/* @var $tab AdminTabInterface */
|
121 |
-
$navigation[$tab->getSlug()] = [
|
122 |
-
'slug' => $tab->getSlug(),
|
123 |
-
'url' => $this->getTabUrl($tab->getSlug()),
|
124 |
-
'title' => $tab->getTitle(),
|
125 |
-
'active' => false,
|
126 |
-
];
|
127 |
-
|
128 |
-
if ($this->isTabActive($tab->getSlug())) {
|
129 |
-
$navigation[$tab->getSlug()]['active'] = true;
|
130 |
-
}
|
131 |
-
}
|
132 |
-
|
133 |
-
return $navigation;
|
134 |
-
}
|
135 |
-
|
136 |
-
|
137 |
-
/**
|
138 |
-
* todo: move to helper?
|
139 |
-
*
|
140 |
-
* @param $slug
|
141 |
-
* @return string
|
142 |
-
*/
|
143 |
-
public function getTabUrl($slug)
|
144 |
-
{
|
145 |
-
return admin_url('tools.php?page=privacy&gdpr-tab=' . $slug);
|
146 |
-
}
|
147 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Admin;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Handle registering and rendering the GDPR admin page contents
|
7 |
+
*
|
8 |
+
* Class WordpressAdminPage
|
9 |
+
*
|
10 |
+
* @package Codelight\GDPR\Admin
|
11 |
+
*/
|
12 |
+
class WordpressAdminPage
|
13 |
+
{
|
14 |
+
protected $slug = 'gdpr';
|
15 |
+
|
16 |
+
protected $tabs = [];
|
17 |
+
|
18 |
+
public function __construct()
|
19 |
+
{
|
20 |
+
$this->setup();
|
21 |
+
}
|
22 |
+
|
23 |
+
protected function setup()
|
24 |
+
{
|
25 |
+
// Register the tabs
|
26 |
+
add_action('admin_init', [$this, 'registerTabs']);
|
27 |
+
|
28 |
+
// todo
|
29 |
+
//if (gdpr('options')->get('plugin_disclaimer_accepted')) {
|
30 |
+
// Initialize the active tab
|
31 |
+
add_action('admin_init', [$this, 'initActiveTab']);
|
32 |
+
//}
|
33 |
+
|
34 |
+
// todo
|
35 |
+
// gdpr('admin-modal')->add('gdpr-test', 'admin/modals/test', ['title' => 'Test modal']);
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Render the main GDPR options page
|
40 |
+
*/
|
41 |
+
public function renderPage()
|
42 |
+
{
|
43 |
+
$tabs = $this->getNavigationData();
|
44 |
+
$currentTabContents = $this->getActiveTab()->renderContents();
|
45 |
+
$signature = apply_filters('gdpr/admin/show_signature', true);
|
46 |
+
echo gdpr('view')->render('admin/settings-page', compact('tabs', 'currentTabContents', 'signature'));
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Allow modules to add tabs
|
51 |
+
*/
|
52 |
+
public function registerTabs()
|
53 |
+
{
|
54 |
+
$this->tabs = apply_filters('gdpr/admin/tabs', []);
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Get the active tab or the first tab if none are active
|
59 |
+
*
|
60 |
+
* @return AdminTabInterface
|
61 |
+
*/
|
62 |
+
public function getActiveTab()
|
63 |
+
{
|
64 |
+
foreach ($this->tabs as $tab) {
|
65 |
+
if (isset($_GET['gdpr-tab']) && $_GET['gdpr-tab'] === $tab->getSlug()) {
|
66 |
+
return $tab;
|
67 |
+
}
|
68 |
+
}
|
69 |
+
|
70 |
+
return reset($this->tabs);
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Check if the given tab is active
|
75 |
+
*
|
76 |
+
* @param $slug
|
77 |
+
* @return bool
|
78 |
+
*/
|
79 |
+
public function isTabActive($slug)
|
80 |
+
{
|
81 |
+
$activeTab = $this->getActiveTab();
|
82 |
+
if ($activeTab->getSlug() === $slug) {
|
83 |
+
return true;
|
84 |
+
}
|
85 |
+
|
86 |
+
// Hacky: if no tab set, the first tab is active
|
87 |
+
if (!isset($_GET['gdpr-tab'])) {
|
88 |
+
$firstTab = reset($this->tabs);
|
89 |
+
if ($firstTab->getSlug() === $slug) {
|
90 |
+
return true;
|
91 |
+
}
|
92 |
+
}
|
93 |
+
|
94 |
+
return false;
|
95 |
+
}
|
96 |
+
|
97 |
+
/**
|
98 |
+
* Initialize the active tab
|
99 |
+
*/
|
100 |
+
public function initActiveTab()
|
101 |
+
{
|
102 |
+
$activeTab = $this->getActiveTab();
|
103 |
+
$activeTab->setup();
|
104 |
+
}
|
105 |
+
|
106 |
+
/**
|
107 |
+
* Get the tabbed navigation for GDPR options page
|
108 |
+
*
|
109 |
+
* @return array
|
110 |
+
*/
|
111 |
+
public function getNavigationData()
|
112 |
+
{
|
113 |
+
if (!count($this->tabs)) {
|
114 |
+
return [];
|
115 |
+
}
|
116 |
+
|
117 |
+
$navigation = [];
|
118 |
+
|
119 |
+
foreach ($this->tabs as $tab) {
|
120 |
+
/* @var $tab AdminTabInterface */
|
121 |
+
$navigation[$tab->getSlug()] = [
|
122 |
+
'slug' => $tab->getSlug(),
|
123 |
+
'url' => $this->getTabUrl($tab->getSlug()),
|
124 |
+
'title' => $tab->getTitle(),
|
125 |
+
'active' => false,
|
126 |
+
];
|
127 |
+
|
128 |
+
if ($this->isTabActive($tab->getSlug())) {
|
129 |
+
$navigation[$tab->getSlug()]['active'] = true;
|
130 |
+
}
|
131 |
+
}
|
132 |
+
|
133 |
+
return $navigation;
|
134 |
+
}
|
135 |
+
|
136 |
+
|
137 |
+
/**
|
138 |
+
* todo: move to helper?
|
139 |
+
*
|
140 |
+
* @param $slug
|
141 |
+
* @return string
|
142 |
+
*/
|
143 |
+
public function getTabUrl($slug)
|
144 |
+
{
|
145 |
+
return admin_url('tools.php?page=privacy&gdpr-tab=' . $slug);
|
146 |
+
}
|
147 |
+
}
|
src/Components/Consent/AdminTabConsent.php
CHANGED
@@ -1,181 +1,181 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Components\Consent;
|
4 |
-
|
5 |
-
use Codelight\GDPR\Admin\AdminTab;
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Handle rendering and saving the Consent tab on GDPR Options page
|
9 |
-
*
|
10 |
-
* Class AdminTabConsent
|
11 |
-
* @package Codelight\GDPR\Components\Consent
|
12 |
-
*/
|
13 |
-
class AdminTabConsent extends AdminTab
|
14 |
-
{
|
15 |
-
/* @var string */
|
16 |
-
protected $slug = 'consent';
|
17 |
-
|
18 |
-
/* @var ConsentManager */
|
19 |
-
protected $consentManager;
|
20 |
-
|
21 |
-
/**
|
22 |
-
* AdminTabConsent constructor.
|
23 |
-
*
|
24 |
-
* @param ConsentManager $consentManager
|
25 |
-
*/
|
26 |
-
public function __construct(ConsentManager $consentManager)
|
27 |
-
{
|
28 |
-
$this->consentManager = $consentManager;
|
29 |
-
|
30 |
-
$this->title = _x('Consent', '(Admin)', 'gdpr-framework');
|
31 |
-
|
32 |
-
// If we don't register the settings, WP will not allow this page to be submitted
|
33 |
-
$this->registerSetting('consent_types');
|
34 |
-
$this->registerSetting('consent_info');
|
35 |
-
|
36 |
-
$this->renderErrors();
|
37 |
-
|
38 |
-
// Register handler for this action
|
39 |
-
add_action('gdpr/admin/action/update_consent_data', [$this, 'updateConsentData']);
|
40 |
-
}
|
41 |
-
|
42 |
-
/**
|
43 |
-
* Initialize tab contents and register hooks
|
44 |
-
*/
|
45 |
-
public function init()
|
46 |
-
{
|
47 |
-
$this->registerSettingSection(
|
48 |
-
'gdpr_section_consent',
|
49 |
-
_x('Consent', '(Admin)', 'gdpr-framework'),
|
50 |
-
[$this, 'renderConsentForm']
|
51 |
-
);
|
52 |
-
}
|
53 |
-
|
54 |
-
/**
|
55 |
-
* Render the contents of the registered section
|
56 |
-
*/
|
57 |
-
public function renderConsentForm()
|
58 |
-
{
|
59 |
-
$consentInfo = gdpr('options')->get('consent_info');
|
60 |
-
|
61 |
-
if (is_null($consentInfo)) {
|
62 |
-
$consentInfo = $this->getDefaultConsentInfo();
|
63 |
-
} elseif (!$consentInfo) {
|
64 |
-
$consentInfo = '';
|
65 |
-
}
|
66 |
-
|
67 |
-
$nonce = wp_create_nonce("gdpr/admin/action/update_consent_data");
|
68 |
-
$defaultConsentTypes = $this->consentManager->getDefaultConsentTypes();
|
69 |
-
$customConsentTypes = $this->consentManager->getCustomConsentTypes();
|
70 |
-
|
71 |
-
// todo: move to a filter
|
72 |
-
if (defined('ICL_LANGUAGE_CODE')) {
|
73 |
-
$prefix = ICL_LANGUAGE_CODE . '_';
|
74 |
-
} else {
|
75 |
-
$prefix = '';
|
76 |
-
}
|
77 |
-
|
78 |
-
echo gdpr('view')->render('admin/consent', compact('nonce', 'customConsentTypes', 'defaultConsentTypes', 'consentInfo', 'prefix'));
|
79 |
-
}
|
80 |
-
|
81 |
-
/**
|
82 |
-
* Save the submitted consent types
|
83 |
-
*/
|
84 |
-
public function updateConsentData()
|
85 |
-
{
|
86 |
-
// Update additional information
|
87 |
-
if (isset($_POST['gdpr_consent_info'])) {
|
88 |
-
gdpr('options')->set('consent_info', wp_unslash($_POST['gdpr_consent_info']));
|
89 |
-
}
|
90 |
-
|
91 |
-
// Update consent types
|
92 |
-
if (isset($_POST['gdpr_consent_types']) && is_array($_POST['gdpr_consent_types'])) {
|
93 |
-
$consentTypes = $_POST['gdpr_consent_types'];
|
94 |
-
} else {
|
95 |
-
$consentTypes = [];
|
96 |
-
}
|
97 |
-
|
98 |
-
// Strip slashes which WP adds automatically
|
99 |
-
if (count($consentTypes)) {
|
100 |
-
foreach ($consentTypes as &$type) {
|
101 |
-
foreach ($type as $key => $item) {
|
102 |
-
if (is_array($item)) {
|
103 |
-
$type[$key] = array_map('wp_unslash', $item);
|
104 |
-
} else {
|
105 |
-
$type[$key] = wp_unslash($item);
|
106 |
-
}
|
107 |
-
|
108 |
-
if ('visible' === $key) {
|
109 |
-
$type[$key] = 1;
|
110 |
-
}
|
111 |
-
}
|
112 |
-
}
|
113 |
-
}
|
114 |
-
|
115 |
-
$errors = [];
|
116 |
-
|
117 |
-
if (!empty($consentTypes)) {
|
118 |
-
$errors = $this->validate($consentTypes);
|
119 |
-
}
|
120 |
-
|
121 |
-
if (!count($errors)) {
|
122 |
-
$this->consentManager->saveCustomConsentTypes($consentTypes);
|
123 |
-
} else {
|
124 |
-
$errorQuery = http_build_query($errors);
|
125 |
-
wp_safe_redirect(gdpr('helpers')->getAdminUrl('&gdpr-tab=consent&') . $errorQuery);
|
126 |
-
exit;
|
127 |
-
}
|
128 |
-
}
|
129 |
-
|
130 |
-
protected function validate($consentTypes)
|
131 |
-
{
|
132 |
-
$errors = [];
|
133 |
-
|
134 |
-
foreach ($consentTypes as $consentType) {
|
135 |
-
if (empty($consentType['slug'])) {
|
136 |
-
$errors['errors[]'] = 'slug-empty';
|
137 |
-
}
|
138 |
-
|
139 |
-
if (!preg_match('/^[A-Za-z0-9_-]+$/', $consentType['slug'])) {
|
140 |
-
$errors['errors[]'] = 'slug-invalid';
|
141 |
-
}
|
142 |
-
|
143 |
-
if (empty($consentType['title'])) {
|
144 |
-
$errors['errors[]'] = 'title-empty';
|
145 |
-
}
|
146 |
-
}
|
147 |
-
|
148 |
-
return $errors;
|
149 |
-
}
|
150 |
-
|
151 |
-
public function renderErrors()
|
152 |
-
{
|
153 |
-
if (isset($_GET['errors']) && count($_GET['errors'])) {
|
154 |
-
|
155 |
-
foreach ($_GET['errors'] as $error) {
|
156 |
-
if ('slug-empty' === $error) {
|
157 |
-
$message = _x("Consent slug is a required field!", '(Admin)', 'gdpr-framework');
|
158 |
-
gdpr('admin-error')->add('admin/notices/error', compact('message'));
|
159 |
-
}
|
160 |
-
|
161 |
-
if ('slug-invalid' === $error) {
|
162 |
-
$message = _x("You may only use alphanumeric characters, dash and underscore in the consent slug field.", '(Admin)', 'gdpr-framework');
|
163 |
-
gdpr('admin-error')->add('admin/notices/error', compact('message'));
|
164 |
-
}
|
165 |
-
|
166 |
-
if ('title-empty' === $error) {
|
167 |
-
$message = _x("Consent title is a required field!", '(Admin)', 'gdpr-framework');
|
168 |
-
gdpr('admin-error')->add('admin/notices/error', compact('message'));
|
169 |
-
}
|
170 |
-
}
|
171 |
-
}
|
172 |
-
}
|
173 |
-
|
174 |
-
/**
|
175 |
-
* @return string
|
176 |
-
*/
|
177 |
-
public function getDefaultConsentInfo()
|
178 |
-
{
|
179 |
-
return __('To use this website, you accepted our Privacy Policy. If you wish to withdraw your acceptance, please use the "Delete my data" button below.', 'gdpr-framework');
|
180 |
-
}
|
181 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Components\Consent;
|
4 |
+
|
5 |
+
use Codelight\GDPR\Admin\AdminTab;
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Handle rendering and saving the Consent tab on GDPR Options page
|
9 |
+
*
|
10 |
+
* Class AdminTabConsent
|
11 |
+
* @package Codelight\GDPR\Components\Consent
|
12 |
+
*/
|
13 |
+
class AdminTabConsent extends AdminTab
|
14 |
+
{
|
15 |
+
/* @var string */
|
16 |
+
protected $slug = 'consent';
|
17 |
+
|
18 |
+
/* @var ConsentManager */
|
19 |
+
protected $consentManager;
|
20 |
+
|
21 |
+
/**
|
22 |
+
* AdminTabConsent constructor.
|
23 |
+
*
|
24 |
+
* @param ConsentManager $consentManager
|
25 |
+
*/
|
26 |
+
public function __construct(ConsentManager $consentManager)
|
27 |
+
{
|
28 |
+
$this->consentManager = $consentManager;
|
29 |
+
|
30 |
+
$this->title = _x('Consent', '(Admin)', 'gdpr-framework');
|
31 |
+
|
32 |
+
// If we don't register the settings, WP will not allow this page to be submitted
|
33 |
+
$this->registerSetting('consent_types');
|
34 |
+
$this->registerSetting('consent_info');
|
35 |
+
|
36 |
+
$this->renderErrors();
|
37 |
+
|
38 |
+
// Register handler for this action
|
39 |
+
add_action('gdpr/admin/action/update_consent_data', [$this, 'updateConsentData']);
|
40 |
+
}
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Initialize tab contents and register hooks
|
44 |
+
*/
|
45 |
+
public function init()
|
46 |
+
{
|
47 |
+
$this->registerSettingSection(
|
48 |
+
'gdpr_section_consent',
|
49 |
+
_x('Consent', '(Admin)', 'gdpr-framework'),
|
50 |
+
[$this, 'renderConsentForm']
|
51 |
+
);
|
52 |
+
}
|
53 |
+
|
54 |
+
/**
|
55 |
+
* Render the contents of the registered section
|
56 |
+
*/
|
57 |
+
public function renderConsentForm()
|
58 |
+
{
|
59 |
+
$consentInfo = gdpr('options')->get('consent_info');
|
60 |
+
|
61 |
+
if (is_null($consentInfo)) {
|
62 |
+
$consentInfo = $this->getDefaultConsentInfo();
|
63 |
+
} elseif (!$consentInfo) {
|
64 |
+
$consentInfo = '';
|
65 |
+
}
|
66 |
+
|
67 |
+
$nonce = wp_create_nonce("gdpr/admin/action/update_consent_data");
|
68 |
+
$defaultConsentTypes = $this->consentManager->getDefaultConsentTypes();
|
69 |
+
$customConsentTypes = $this->consentManager->getCustomConsentTypes();
|
70 |
+
|
71 |
+
// todo: move to a filter
|
72 |
+
if (defined('ICL_LANGUAGE_CODE')) {
|
73 |
+
$prefix = ICL_LANGUAGE_CODE . '_';
|
74 |
+
} else {
|
75 |
+
$prefix = '';
|
76 |
+
}
|
77 |
+
|
78 |
+
echo gdpr('view')->render('admin/consent', compact('nonce', 'customConsentTypes', 'defaultConsentTypes', 'consentInfo', 'prefix'));
|
79 |
+
}
|
80 |
+
|
81 |
+
/**
|
82 |
+
* Save the submitted consent types
|
83 |
+
*/
|
84 |
+
public function updateConsentData()
|
85 |
+
{
|
86 |
+
// Update additional information
|
87 |
+
if (isset($_POST['gdpr_consent_info'])) {
|
88 |
+
gdpr('options')->set('consent_info', wp_unslash($_POST['gdpr_consent_info']));
|
89 |
+
}
|
90 |
+
|
91 |
+
// Update consent types
|
92 |
+
if (isset($_POST['gdpr_consent_types']) && is_array($_POST['gdpr_consent_types'])) {
|
93 |
+
$consentTypes = $_POST['gdpr_consent_types'];
|
94 |
+
} else {
|
95 |
+
$consentTypes = [];
|
96 |
+
}
|
97 |
+
|
98 |
+
// Strip slashes which WP adds automatically
|
99 |
+
if (count($consentTypes)) {
|
100 |
+
foreach ($consentTypes as &$type) {
|
101 |
+
foreach ($type as $key => $item) {
|
102 |
+
if (is_array($item)) {
|
103 |
+
$type[$key] = array_map('wp_unslash', $item);
|
104 |
+
} else {
|
105 |
+
$type[$key] = wp_unslash($item);
|
106 |
+
}
|
107 |
+
|
108 |
+
if ('visible' === $key) {
|
109 |
+
$type[$key] = 1;
|
110 |
+
}
|
111 |
+
}
|
112 |
+
}
|
113 |
+
}
|
114 |
+
|
115 |
+
$errors = [];
|
116 |
+
|
117 |
+
if (!empty($consentTypes)) {
|
118 |
+
$errors = $this->validate($consentTypes);
|
119 |
+
}
|
120 |
+
|
121 |
+
if (!count($errors)) {
|
122 |
+
$this->consentManager->saveCustomConsentTypes($consentTypes);
|
123 |
+
} else {
|
124 |
+
$errorQuery = http_build_query($errors);
|
125 |
+
wp_safe_redirect(gdpr('helpers')->getAdminUrl('&gdpr-tab=consent&') . $errorQuery);
|
126 |
+
exit;
|
127 |
+
}
|
128 |
+
}
|
129 |
+
|
130 |
+
protected function validate($consentTypes)
|
131 |
+
{
|
132 |
+
$errors = [];
|
133 |
+
|
134 |
+
foreach ($consentTypes as $consentType) {
|
135 |
+
if (empty($consentType['slug'])) {
|
136 |
+
$errors['errors[]'] = 'slug-empty';
|
137 |
+
}
|
138 |
+
|
139 |
+
if (!preg_match('/^[A-Za-z0-9_-]+$/', $consentType['slug'])) {
|
140 |
+
$errors['errors[]'] = 'slug-invalid';
|
141 |
+
}
|
142 |
+
|
143 |
+
if (empty($consentType['title'])) {
|
144 |
+
$errors['errors[]'] = 'title-empty';
|
145 |
+
}
|
146 |
+
}
|
147 |
+
|
148 |
+
return $errors;
|
149 |
+
}
|
150 |
+
|
151 |
+
public function renderErrors()
|
152 |
+
{
|
153 |
+
if (isset($_GET['errors']) && count($_GET['errors'])) {
|
154 |
+
|
155 |
+
foreach ($_GET['errors'] as $error) {
|
156 |
+
if ('slug-empty' === $error) {
|
157 |
+
$message = _x("Consent slug is a required field!", '(Admin)', 'gdpr-framework');
|
158 |
+
gdpr('admin-error')->add('admin/notices/error', compact('message'));
|
159 |
+
}
|
160 |
+
|
161 |
+
if ('slug-invalid' === $error) {
|
162 |
+
$message = _x("You may only use alphanumeric characters, dash and underscore in the consent slug field.", '(Admin)', 'gdpr-framework');
|
163 |
+
gdpr('admin-error')->add('admin/notices/error', compact('message'));
|
164 |
+
}
|
165 |
+
|
166 |
+
if ('title-empty' === $error) {
|
167 |
+
$message = _x("Consent title is a required field!", '(Admin)', 'gdpr-framework');
|
168 |
+
gdpr('admin-error')->add('admin/notices/error', compact('message'));
|
169 |
+
}
|
170 |
+
}
|
171 |
+
}
|
172 |
+
}
|
173 |
+
|
174 |
+
/**
|
175 |
+
* @return string
|
176 |
+
*/
|
177 |
+
public function getDefaultConsentInfo()
|
178 |
+
{
|
179 |
+
return __('To use this website, you accepted our Privacy Policy. If you wish to withdraw your acceptance, please use the "Delete my data" button below.', 'gdpr-framework');
|
180 |
+
}
|
181 |
+
}
|
src/Components/Consent/ConsentManager.php
CHANGED
@@ -1,317 +1,317 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Components\Consent;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Handles getting, saving and removing consent based on a whitelist
|
7 |
-
*
|
8 |
-
* Class ConsentManager
|
9 |
-
*
|
10 |
-
* @package Codelight\GDPR\Components\Consent
|
11 |
-
*/
|
12 |
-
class ConsentManager
|
13 |
-
{
|
14 |
-
/* @var UserConsentModel */
|
15 |
-
protected $model;
|
16 |
-
|
17 |
-
/* @var array */
|
18 |
-
protected $defaultConsentTypes = [];
|
19 |
-
|
20 |
-
/* @var array */
|
21 |
-
protected $customConsentTypes = [];
|
22 |
-
|
23 |
-
/**
|
24 |
-
* ConsentManager constructor.
|
25 |
-
*
|
26 |
-
* @param UserConsentModel $model
|
27 |
-
*/
|
28 |
-
public function __construct(UserConsentModel $model)
|
29 |
-
{
|
30 |
-
$this->model = $model;
|
31 |
-
|
32 |
-
add_action('init', [$this, 'registerCustomConsentTypes'], 0);
|
33 |
-
add_action('init', [$this, 'registerDefaultConsentTypes'], 0);
|
34 |
-
|
35 |
-
add_action('gdpr/data-subject/delete', [$this, 'delete']);
|
36 |
-
add_action('gdpr/data-subject/anonymize', [$this, 'anonymize'], 10, 2);
|
37 |
-
}
|
38 |
-
|
39 |
-
public function registerDefaultConsentTypes()
|
40 |
-
{
|
41 |
-
$policyPageUrl = get_permalink(gdpr('options')->get('policy_page'));
|
42 |
-
|
43 |
-
gdpr('consent')->register(
|
44 |
-
'privacy-policy',
|
45 |
-
sprintf(
|
46 |
-
__('I accept the %sPrivacy Policy%s', 'gdpr-framework'),
|
47 |
-
"<a href='{$policyPageUrl}' target='_blank'>",
|
48 |
-
"</a>"
|
49 |
-
),
|
50 |
-
_x('This consent is not visible by default. If someone wishes to withdraw it, they should simply request to delete all their data.', '(Admin)', 'gdpr-framework'),
|
51 |
-
false
|
52 |
-
);
|
53 |
-
|
54 |
-
$termsPage = gdpr('options')->get('terms_page');
|
55 |
-
if ($termsPage) {
|
56 |
-
$termsPageUrl = get_permalink($termsPage);
|
57 |
-
} else {
|
58 |
-
$termsPageUrl = false;
|
59 |
-
}
|
60 |
-
|
61 |
-
if ($termsPageUrl) {
|
62 |
-
gdpr('consent')->register(
|
63 |
-
'terms-conditions',
|
64 |
-
sprintf(
|
65 |
-
__('I accept the %sTerms & Conditions%s', 'gdpr-framework'),
|
66 |
-
"<a href='{$termsPageUrl}' target='_blank'>",
|
67 |
-
"</a>"
|
68 |
-
),
|
69 |
-
_x('This consent is not visible by default. If someone wishes to withdraw it, they should simply request to delete all their data.', '(Admin)', 'gdpr-framework'),
|
70 |
-
false
|
71 |
-
);
|
72 |
-
}
|
73 |
-
}
|
74 |
-
|
75 |
-
/**
|
76 |
-
* Get a list of all registered consent types
|
77 |
-
*
|
78 |
-
* @return array
|
79 |
-
*/
|
80 |
-
public function getConsentTypes()
|
81 |
-
{
|
82 |
-
return apply_filters('gdpr/consent/types', $this->getDefaultConsentTypes() + $this->getCustomConsentTypes());
|
83 |
-
}
|
84 |
-
|
85 |
-
/**
|
86 |
-
* Get all consent types registered by external sources, i.e. not stored in the database
|
87 |
-
*
|
88 |
-
* @return array
|
89 |
-
*/
|
90 |
-
public function getDefaultConsentTypes()
|
91 |
-
{
|
92 |
-
return apply_filters('gdpr/consent/types/default', $this->defaultConsentTypes);
|
93 |
-
}
|
94 |
-
|
95 |
-
/**
|
96 |
-
* Get all consent types registered by the admin, i.e. stored in the database
|
97 |
-
*
|
98 |
-
* @return array
|
99 |
-
*/
|
100 |
-
public function getCustomConsentTypes()
|
101 |
-
{
|
102 |
-
return apply_filters('gdpr/consent/types/custom', $this->customConsentTypes);
|
103 |
-
}
|
104 |
-
|
105 |
-
/**
|
106 |
-
* Register a *default* consent in the list of valid consents
|
107 |
-
*
|
108 |
-
* @param $consent
|
109 |
-
*/
|
110 |
-
public function register($slug, $title, $description, $visible = true)
|
111 |
-
{
|
112 |
-
$this->defaultConsentTypes[$slug] = [
|
113 |
-
'slug' => $slug,
|
114 |
-
'title' => $title,
|
115 |
-
'description' => $description,
|
116 |
-
'visible' => $visible,
|
117 |
-
];
|
118 |
-
}
|
119 |
-
|
120 |
-
/**
|
121 |
-
* Register consent types saved via WP admin
|
122 |
-
*/
|
123 |
-
public function registerCustomConsentTypes()
|
124 |
-
{
|
125 |
-
$savedConsentTypes = gdpr('options')->get('consent_types');
|
126 |
-
|
127 |
-
if (is_array($savedConsentTypes) && count($savedConsentTypes)) {
|
128 |
-
foreach ($savedConsentTypes as $consentType) {
|
129 |
-
$this->customConsentTypes[$consentType['slug']] = [
|
130 |
-
'slug' => isset($consentType['slug']) ? $consentType['slug'] : '',
|
131 |
-
'title' => isset($consentType['title']) ? $consentType['title'] : '',
|
132 |
-
'description' => isset($consentType['description']) ? $consentType['description'] : '',
|
133 |
-
'visible' => isset($consentType['visible']) ? $consentType['visible'] : '',
|
134 |
-
];
|
135 |
-
}
|
136 |
-
}
|
137 |
-
}
|
138 |
-
|
139 |
-
/**
|
140 |
-
* Save the given consent types to database
|
141 |
-
*
|
142 |
-
* @param $consentTypes
|
143 |
-
*/
|
144 |
-
public function saveCustomConsentTypes($consentTypes)
|
145 |
-
{
|
146 |
-
// Todo: validate to make sure something broken is not saved to DB
|
147 |
-
gdpr('options')->set('consent_types', $consentTypes);
|
148 |
-
}
|
149 |
-
|
150 |
-
/**
|
151 |
-
* Check if a consent is valid so that we don't write random stuff in the database by accident
|
152 |
-
*
|
153 |
-
* @param $consent
|
154 |
-
* @return bool
|
155 |
-
*/
|
156 |
-
public function isRegisteredConsent($consent)
|
157 |
-
{
|
158 |
-
return isset($this->getConsentTypes()[$consent]);
|
159 |
-
}
|
160 |
-
|
161 |
-
/**
|
162 |
-
* Check if the given consent is valid. If not, throw error.
|
163 |
-
*
|
164 |
-
* @param $consent
|
165 |
-
*/
|
166 |
-
protected function validateConsent($consent)
|
167 |
-
{
|
168 |
-
if (!$this->isRegisteredConsent($consent)) {
|
169 |
-
wp_die("Not a valid consent: " . esc_html($consent));
|
170 |
-
}
|
171 |
-
}
|
172 |
-
|
173 |
-
/**
|
174 |
-
* Set a consent as 'given' for the data subject
|
175 |
-
*
|
176 |
-
* @param $email
|
177 |
-
* @param $consent
|
178 |
-
*/
|
179 |
-
public function giveConsent($email, $consent)
|
180 |
-
{
|
181 |
-
$this->validateConsent($consent);
|
182 |
-
|
183 |
-
$validation = apply_filters('gdpr/consent/give', true, $email, $consent);
|
184 |
-
|
185 |
-
// If the data subject has already given this consent, do nothing
|
186 |
-
if ($this->model->given($email, $consent) || !$validation) {
|
187 |
-
return;
|
188 |
-
}
|
189 |
-
|
190 |
-
$this->model->give($email, $consent);
|
191 |
-
do_action('gdpr/consent/given', $email, $consent);
|
192 |
-
}
|
193 |
-
|
194 |
-
/**
|
195 |
-
* Set a consent as withdrawn for the data subject
|
196 |
-
*
|
197 |
-
* @param $email
|
198 |
-
* @param $consent
|
199 |
-
*/
|
200 |
-
public function withdrawConsent($email, $consent)
|
201 |
-
{
|
202 |
-
$this->validateConsent($consent);
|
203 |
-
|
204 |
-
$validation = apply_filters('gdpr/consent/withdraw', true, $email, $consent);
|
205 |
-
|
206 |
-
// If the consent has never been given or if data subject has already withdrawn this consent, do nothing
|
207 |
-
if (!$this->model->exists($email, $consent) || $this->model->withdrawn($email, $consent) || !$validation) {
|
208 |
-
return;
|
209 |
-
}
|
210 |
-
|
211 |
-
$this->model->withdraw($email, $consent);
|
212 |
-
do_action('gdpr/consent/withdrawn', $email, $consent, 'withdrawn');
|
213 |
-
}
|
214 |
-
|
215 |
-
/**
|
216 |
-
* Remove consent given by subject
|
217 |
-
*
|
218 |
-
* @param $email
|
219 |
-
* @param $consent
|
220 |
-
*/
|
221 |
-
public function deleteConsent($email, $consent)
|
222 |
-
{
|
223 |
-
$this->validateConsent($consent);
|
224 |
-
|
225 |
-
if ($this->model->given($email, $consent)) {
|
226 |
-
do_action('gdpr/consent/withdrawn', $email, $consent, 'deleted');
|
227 |
-
}
|
228 |
-
|
229 |
-
$this->model->delete($email, $consent);
|
230 |
-
}
|
231 |
-
|
232 |
-
/**
|
233 |
-
* Withdraw and anonymize a consent
|
234 |
-
*
|
235 |
-
* @param $email
|
236 |
-
* @param $consent
|
237 |
-
* @param $anonymizedId
|
238 |
-
*/
|
239 |
-
public function anonymizeConsent($email, $consent, $anonymizedId)
|
240 |
-
{
|
241 |
-
$this->validateConsent($consent);
|
242 |
-
|
243 |
-
if ($this->model->given($email, $consent)) {
|
244 |
-
do_action('gdpr/consent/withdrawn', $email, $consent, 'anonymized');
|
245 |
-
}
|
246 |
-
|
247 |
-
$this->model->anonymize($email, $consent, $anonymizedId);
|
248 |
-
}
|
249 |
-
|
250 |
-
/**
|
251 |
-
* Get all consent given by subject
|
252 |
-
*
|
253 |
-
* @param $email
|
254 |
-
*/
|
255 |
-
public function getAllConsents($email)
|
256 |
-
{
|
257 |
-
return $this->model->getAll($email);
|
258 |
-
}
|
259 |
-
|
260 |
-
/**
|
261 |
-
* Get the registered consent types and add 'given' field depending
|
262 |
-
* on whether or not the user has given this particular consent
|
263 |
-
*
|
264 |
-
* @param $dataSubjectConsents
|
265 |
-
* @return array
|
266 |
-
*/
|
267 |
-
public function getConsentData($dataSubjectConsents)
|
268 |
-
{
|
269 |
-
$consentTypes = $this->getConsentTypes();
|
270 |
-
$consents = [];
|
271 |
-
|
272 |
-
foreach ($consentTypes as $slug => $consentType) {
|
273 |
-
if (in_array($slug, $dataSubjectConsents)) {
|
274 |
-
$consents[$slug] = $consentType;
|
275 |
-
}
|
276 |
-
}
|
277 |
-
|
278 |
-
return $consents;
|
279 |
-
}
|
280 |
-
|
281 |
-
/**
|
282 |
-
* Return a list of all data subjects who have given a particular consent
|
283 |
-
*
|
284 |
-
* @param $consent
|
285 |
-
*/
|
286 |
-
public function getAllDataSubjectsByConsent($consent)
|
287 |
-
{
|
288 |
-
// Todo
|
289 |
-
}
|
290 |
-
|
291 |
-
/**
|
292 |
-
* Withdraw and delete all consents given by a data subject
|
293 |
-
*
|
294 |
-
* @param $email
|
295 |
-
*/
|
296 |
-
public function delete($email)
|
297 |
-
{
|
298 |
-
$consents = $this->getAllConsents($email);
|
299 |
-
foreach ($consents as $consent) {
|
300 |
-
$this->deleteConsent($email, $consent);
|
301 |
-
}
|
302 |
-
}
|
303 |
-
|
304 |
-
/**
|
305 |
-
* Withdraw and anonymize all consents given by a data subject
|
306 |
-
*
|
307 |
-
* @param $email
|
308 |
-
* @param $anonymizedId
|
309 |
-
*/
|
310 |
-
public function anonymize($email, $anonymizedId)
|
311 |
-
{
|
312 |
-
$consents = $this->getAllConsents($email);
|
313 |
-
foreach ($consents as $consent) {
|
314 |
-
$this->anonymizeConsent($email, $consent, $anonymizedId);
|
315 |
-
}
|
316 |
-
}
|
317 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Components\Consent;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Handles getting, saving and removing consent based on a whitelist
|
7 |
+
*
|
8 |
+
* Class ConsentManager
|
9 |
+
*
|
10 |
+
* @package Codelight\GDPR\Components\Consent
|
11 |
+
*/
|
12 |
+
class ConsentManager
|
13 |
+
{
|
14 |
+
/* @var UserConsentModel */
|
15 |
+
protected $model;
|
16 |
+
|
17 |
+
/* @var array */
|
18 |
+
protected $defaultConsentTypes = [];
|
19 |
+
|
20 |
+
/* @var array */
|
21 |
+
protected $customConsentTypes = [];
|
22 |
+
|
23 |
+
/**
|
24 |
+
* ConsentManager constructor.
|
25 |
+
*
|
26 |
+
* @param UserConsentModel $model
|
27 |
+
*/
|
28 |
+
public function __construct(UserConsentModel $model)
|
29 |
+
{
|
30 |
+
$this->model = $model;
|
31 |
+
|
32 |
+
add_action('init', [$this, 'registerCustomConsentTypes'], 0);
|
33 |
+
add_action('init', [$this, 'registerDefaultConsentTypes'], 0);
|
34 |
+
|
35 |
+
add_action('gdpr/data-subject/delete', [$this, 'delete']);
|
36 |
+
add_action('gdpr/data-subject/anonymize', [$this, 'anonymize'], 10, 2);
|
37 |
+
}
|
38 |
+
|
39 |
+
public function registerDefaultConsentTypes()
|
40 |
+
{
|
41 |
+
$policyPageUrl = get_permalink(gdpr('options')->get('policy_page'));
|
42 |
+
|
43 |
+
gdpr('consent')->register(
|
44 |
+
'privacy-policy',
|
45 |
+
sprintf(
|
46 |
+
__('I accept the %sPrivacy Policy%s', 'gdpr-framework'),
|
47 |
+
"<a href='{$policyPageUrl}' target='_blank'>",
|
48 |
+
"</a>"
|
49 |
+
),
|
50 |
+
_x('This consent is not visible by default. If someone wishes to withdraw it, they should simply request to delete all their data.', '(Admin)', 'gdpr-framework'),
|
51 |
+
false
|
52 |
+
);
|
53 |
+
|
54 |
+
$termsPage = gdpr('options')->get('terms_page');
|
55 |
+
if ($termsPage) {
|
56 |
+
$termsPageUrl = get_permalink($termsPage);
|
57 |
+
} else {
|
58 |
+
$termsPageUrl = false;
|
59 |
+
}
|
60 |
+
|
61 |
+
if ($termsPageUrl) {
|
62 |
+
gdpr('consent')->register(
|
63 |
+
'terms-conditions',
|
64 |
+
sprintf(
|
65 |
+
__('I accept the %sTerms & Conditions%s', 'gdpr-framework'),
|
66 |
+
"<a href='{$termsPageUrl}' target='_blank'>",
|
67 |
+
"</a>"
|
68 |
+
),
|
69 |
+
_x('This consent is not visible by default. If someone wishes to withdraw it, they should simply request to delete all their data.', '(Admin)', 'gdpr-framework'),
|
70 |
+
false
|
71 |
+
);
|
72 |
+
}
|
73 |
+
}
|
74 |
+
|
75 |
+
/**
|
76 |
+
* Get a list of all registered consent types
|
77 |
+
*
|
78 |
+
* @return array
|
79 |
+
*/
|
80 |
+
public function getConsentTypes()
|
81 |
+
{
|
82 |
+
return apply_filters('gdpr/consent/types', $this->getDefaultConsentTypes() + $this->getCustomConsentTypes());
|
83 |
+
}
|
84 |
+
|
85 |
+
/**
|
86 |
+
* Get all consent types registered by external sources, i.e. not stored in the database
|
87 |
+
*
|
88 |
+
* @return array
|
89 |
+
*/
|
90 |
+
public function getDefaultConsentTypes()
|
91 |
+
{
|
92 |
+
return apply_filters('gdpr/consent/types/default', $this->defaultConsentTypes);
|
93 |
+
}
|
94 |
+
|
95 |
+
/**
|
96 |
+
* Get all consent types registered by the admin, i.e. stored in the database
|
97 |
+
*
|
98 |
+
* @return array
|
99 |
+
*/
|
100 |
+
public function getCustomConsentTypes()
|
101 |
+
{
|
102 |
+
return apply_filters('gdpr/consent/types/custom', $this->customConsentTypes);
|
103 |
+
}
|
104 |
+
|
105 |
+
/**
|
106 |
+
* Register a *default* consent in the list of valid consents
|
107 |
+
*
|
108 |
+
* @param $consent
|
109 |
+
*/
|
110 |
+
public function register($slug, $title, $description, $visible = true)
|
111 |
+
{
|
112 |
+
$this->defaultConsentTypes[$slug] = [
|
113 |
+
'slug' => $slug,
|
114 |
+
'title' => $title,
|
115 |
+
'description' => $description,
|
116 |
+
'visible' => $visible,
|
117 |
+
];
|
118 |
+
}
|
119 |
+
|
120 |
+
/**
|
121 |
+
* Register consent types saved via WP admin
|
122 |
+
*/
|
123 |
+
public function registerCustomConsentTypes()
|
124 |
+
{
|
125 |
+
$savedConsentTypes = gdpr('options')->get('consent_types');
|
126 |
+
|
127 |
+
if (is_array($savedConsentTypes) && count($savedConsentTypes)) {
|
128 |
+
foreach ($savedConsentTypes as $consentType) {
|
129 |
+
$this->customConsentTypes[$consentType['slug']] = [
|
130 |
+
'slug' => isset($consentType['slug']) ? $consentType['slug'] : '',
|
131 |
+
'title' => isset($consentType['title']) ? $consentType['title'] : '',
|
132 |
+
'description' => isset($consentType['description']) ? $consentType['description'] : '',
|
133 |
+
'visible' => isset($consentType['visible']) ? $consentType['visible'] : '',
|
134 |
+
];
|
135 |
+
}
|
136 |
+
}
|
137 |
+
}
|
138 |
+
|
139 |
+
/**
|
140 |
+
* Save the given consent types to database
|
141 |
+
*
|
142 |
+
* @param $consentTypes
|
143 |
+
*/
|
144 |
+
public function saveCustomConsentTypes($consentTypes)
|
145 |
+
{
|
146 |
+
// Todo: validate to make sure something broken is not saved to DB
|
147 |
+
gdpr('options')->set('consent_types', $consentTypes);
|
148 |
+
}
|
149 |
+
|
150 |
+
/**
|
151 |
+
* Check if a consent is valid so that we don't write random stuff in the database by accident
|
152 |
+
*
|
153 |
+
* @param $consent
|
154 |
+
* @return bool
|
155 |
+
*/
|
156 |
+
public function isRegisteredConsent($consent)
|
157 |
+
{
|
158 |
+
return isset($this->getConsentTypes()[$consent]);
|
159 |
+
}
|
160 |
+
|
161 |
+
/**
|
162 |
+
* Check if the given consent is valid. If not, throw error.
|
163 |
+
*
|
164 |
+
* @param $consent
|
165 |
+
*/
|
166 |
+
protected function validateConsent($consent)
|
167 |
+
{
|
168 |
+
if (!$this->isRegisteredConsent($consent)) {
|
169 |
+
wp_die("Not a valid consent: " . esc_html($consent));
|
170 |
+
}
|
171 |
+
}
|
172 |
+
|
173 |
+
/**
|
174 |
+
* Set a consent as 'given' for the data subject
|
175 |
+
*
|
176 |
+
* @param $email
|
177 |
+
* @param $consent
|
178 |
+
*/
|
179 |
+
public function giveConsent($email, $consent)
|
180 |
+
{
|
181 |
+
$this->validateConsent($consent);
|
182 |
+
|
183 |
+
$validation = apply_filters('gdpr/consent/give', true, $email, $consent);
|
184 |
+
|
185 |
+
// If the data subject has already given this consent, do nothing
|
186 |
+
if ($this->model->given($email, $consent) || !$validation) {
|
187 |
+
return;
|
188 |
+
}
|
189 |
+
|
190 |
+
$this->model->give($email, $consent);
|
191 |
+
do_action('gdpr/consent/given', $email, $consent);
|
192 |
+
}
|
193 |
+
|
194 |
+
/**
|
195 |
+
* Set a consent as withdrawn for the data subject
|
196 |
+
*
|
197 |
+
* @param $email
|
198 |
+
* @param $consent
|
199 |
+
*/
|
200 |
+
public function withdrawConsent($email, $consent)
|
201 |
+
{
|
202 |
+
$this->validateConsent($consent);
|
203 |
+
|
204 |
+
$validation = apply_filters('gdpr/consent/withdraw', true, $email, $consent);
|
205 |
+
|
206 |
+
// If the consent has never been given or if data subject has already withdrawn this consent, do nothing
|
207 |
+
if (!$this->model->exists($email, $consent) || $this->model->withdrawn($email, $consent) || !$validation) {
|
208 |
+
return;
|
209 |
+
}
|
210 |
+
|
211 |
+
$this->model->withdraw($email, $consent);
|
212 |
+
do_action('gdpr/consent/withdrawn', $email, $consent, 'withdrawn');
|
213 |
+
}
|
214 |
+
|
215 |
+
/**
|
216 |
+
* Remove consent given by subject
|
217 |
+
*
|
218 |
+
* @param $email
|
219 |
+
* @param $consent
|
220 |
+
*/
|
221 |
+
public function deleteConsent($email, $consent)
|
222 |
+
{
|
223 |
+
$this->validateConsent($consent);
|
224 |
+
|
225 |
+
if ($this->model->given($email, $consent)) {
|
226 |
+
do_action('gdpr/consent/withdrawn', $email, $consent, 'deleted');
|
227 |
+
}
|
228 |
+
|
229 |
+
$this->model->delete($email, $consent);
|
230 |
+
}
|
231 |
+
|
232 |
+
/**
|
233 |
+
* Withdraw and anonymize a consent
|
234 |
+
*
|
235 |
+
* @param $email
|
236 |
+
* @param $consent
|
237 |
+
* @param $anonymizedId
|
238 |
+
*/
|
239 |
+
public function anonymizeConsent($email, $consent, $anonymizedId)
|
240 |
+
{
|
241 |
+
$this->validateConsent($consent);
|
242 |
+
|
243 |
+
if ($this->model->given($email, $consent)) {
|
244 |
+
do_action('gdpr/consent/withdrawn', $email, $consent, 'anonymized');
|
245 |
+
}
|
246 |
+
|
247 |
+
$this->model->anonymize($email, $consent, $anonymizedId);
|
248 |
+
}
|
249 |
+
|
250 |
+
/**
|
251 |
+
* Get all consent given by subject
|
252 |
+
*
|
253 |
+
* @param $email
|
254 |
+
*/
|
255 |
+
public function getAllConsents($email)
|
256 |
+
{
|
257 |
+
return $this->model->getAll($email);
|
258 |
+
}
|
259 |
+
|
260 |
+
/**
|
261 |
+
* Get the registered consent types and add 'given' field depending
|
262 |
+
* on whether or not the user has given this particular consent
|
263 |
+
*
|
264 |
+
* @param $dataSubjectConsents
|
265 |
+
* @return array
|
266 |
+
*/
|
267 |
+
public function getConsentData($dataSubjectConsents)
|
268 |
+
{
|
269 |
+
$consentTypes = $this->getConsentTypes();
|
270 |
+
$consents = [];
|
271 |
+
|
272 |
+
foreach ($consentTypes as $slug => $consentType) {
|
273 |
+
if (in_array($slug, $dataSubjectConsents)) {
|
274 |
+
$consents[$slug] = $consentType;
|
275 |
+
}
|
276 |
+
}
|
277 |
+
|
278 |
+
return $consents;
|
279 |
+
}
|
280 |
+
|
281 |
+
/**
|
282 |
+
* Return a list of all data subjects who have given a particular consent
|
283 |
+
*
|
284 |
+
* @param $consent
|
285 |
+
*/
|
286 |
+
public function getAllDataSubjectsByConsent($consent)
|
287 |
+
{
|
288 |
+
// Todo
|
289 |
+
}
|
290 |
+
|
291 |
+
/**
|
292 |
+
* Withdraw and delete all consents given by a data subject
|
293 |
+
*
|
294 |
+
* @param $email
|
295 |
+
*/
|
296 |
+
public function delete($email)
|
297 |
+
{
|
298 |
+
$consents = $this->getAllConsents($email);
|
299 |
+
foreach ($consents as $consent) {
|
300 |
+
$this->deleteConsent($email, $consent);
|
301 |
+
}
|
302 |
+
}
|
303 |
+
|
304 |
+
/**
|
305 |
+
* Withdraw and anonymize all consents given by a data subject
|
306 |
+
*
|
307 |
+
* @param $email
|
308 |
+
* @param $anonymizedId
|
309 |
+
*/
|
310 |
+
public function anonymize($email, $anonymizedId)
|
311 |
+
{
|
312 |
+
$consents = $this->getAllConsents($email);
|
313 |
+
foreach ($consents as $consent) {
|
314 |
+
$this->anonymizeConsent($email, $consent, $anonymizedId);
|
315 |
+
}
|
316 |
+
}
|
317 |
+
}
|
src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php
CHANGED
@@ -1,436 +1,436 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Components\PrivacyPolicy;
|
4 |
-
|
5 |
-
use Codelight\GDPR\Admin\AdminTab;
|
6 |
-
|
7 |
-
class AdminTabPrivacyPolicy extends AdminTab
|
8 |
-
{
|
9 |
-
/* @var string */
|
10 |
-
protected $slug = 'privacy-policy';
|
11 |
-
|
12 |
-
/* @var PolicyGenerator */
|
13 |
-
protected $policyGenerator;
|
14 |
-
|
15 |
-
public function __construct(PolicyGenerator $policyGenerator)
|
16 |
-
{
|
17 |
-
$this->policyGenerator = $policyGenerator;
|
18 |
-
|
19 |
-
$this->title = _x('Privacy Policy', '(Admin)', 'gdpr-framework');
|
20 |
-
|
21 |
-
$this->registerSetting('gdpr_company_name');
|
22 |
-
$this->registerSetting('gdpr_contact_email');
|
23 |
-
$this->registerSetting('gdpr_company_location');
|
24 |
-
|
25 |
-
$this->registerSetting('gdpr_representative_contact_name');
|
26 |
-
$this->registerSetting('gdpr_representative_contact_email');
|
27 |
-
$this->registerSetting('gdpr_representative_contact_phone');
|
28 |
-
|
29 |
-
$this->registerSetting('gdpr_dpa_website');
|
30 |
-
$this->registerSetting('gdpr_dpa_email');
|
31 |
-
$this->registerSetting('gdpr_dpa_phone');
|
32 |
-
|
33 |
-
$this->registerSetting('gdpr_has_dpo');
|
34 |
-
$this->registerSetting('gdpr_dpo_name');
|
35 |
-
$this->registerSetting('gdpr_dpo_email');
|
36 |
-
|
37 |
-
/*
|
38 |
-
$this->registerSetting('gdpr_pp_data_gathered_1');
|
39 |
-
$this->registerSetting('gdpr_pp_data_gathered_2');
|
40 |
-
$this->registerSetting('gdpr_pp_data_gathered_3');
|
41 |
-
$this->registerSetting('gdpr_pp_data_gathered_4');
|
42 |
-
|
43 |
-
$this->registerSetting('gdpr_pp_data_usage_1');
|
44 |
-
$this->registerSetting('gdpr_pp_data_usage_2');
|
45 |
-
$this->registerSetting('gdpr_pp_data_usage_3');
|
46 |
-
$this->registerSetting('gdpr_pp_data_usage_4');
|
47 |
-
|
48 |
-
$this->registerSetting('gdpr_pp_data_partners');
|
49 |
-
*/
|
50 |
-
|
51 |
-
add_action('gdpr/admin/action/privacy-policy/generate', [$this, 'generatePolicy']);
|
52 |
-
}
|
53 |
-
|
54 |
-
public function init()
|
55 |
-
{
|
56 |
-
/**
|
57 |
-
* General settings
|
58 |
-
*/
|
59 |
-
$this->registerSettingSection(
|
60 |
-
'gdpr_section_privacy_policy',
|
61 |
-
_x('Privacy Policy', '(Admin)', 'gdpr-framework'),
|
62 |
-
[$this, 'renderHeader']
|
63 |
-
);
|
64 |
-
|
65 |
-
/**
|
66 |
-
* Company info
|
67 |
-
*/
|
68 |
-
$this->registerSettingSection(
|
69 |
-
'gdpr_section_privacy_policy_company',
|
70 |
-
_x('Company information', '(Admin)', 'gdpr-framework')
|
71 |
-
);
|
72 |
-
|
73 |
-
$this->registerSettingField(
|
74 |
-
'gdpr_company_name',
|
75 |
-
_x('Company Name', '(Admin)', 'gdpr-framework'),
|
76 |
-
[$this, 'renderCompanyNameHtml'],
|
77 |
-
'gdpr_section_privacy_policy_company'
|
78 |
-
);
|
79 |
-
|
80 |
-
$this->registerSettingField(
|
81 |
-
'gdpr_company_email',
|
82 |
-
_x('Company Email', '(Admin)', 'gdpr-framework'),
|
83 |
-
[$this, 'renderCompanyEmailHtml'],
|
84 |
-
'gdpr_section_privacy_policy_company'
|
85 |
-
);
|
86 |
-
|
87 |
-
$this->registerSettingField(
|
88 |
-
'gdpr_company_location',
|
89 |
-
_x('Company Location', '(Admin)', 'gdpr-framework'),
|
90 |
-
[$this, 'renderCompanyLocationHtml'],
|
91 |
-
'gdpr_section_privacy_policy_company'
|
92 |
-
);
|
93 |
-
|
94 |
-
/**
|
95 |
-
* Representative
|
96 |
-
*/
|
97 |
-
$this->registerSettingSection(
|
98 |
-
'gdpr_section_privacy_policy_representative',
|
99 |
-
false,
|
100 |
-
[$this, 'renderRepresentativeOpen']
|
101 |
-
);
|
102 |
-
|
103 |
-
$this->registerSettingField(
|
104 |
-
'gdpr_representative_contact_name',
|
105 |
-
_x('Representative Contact Name', '(Admin)', 'gdpr-framework'),
|
106 |
-
[$this, 'renderRepresentativeContactName'],
|
107 |
-
'gdpr_section_privacy_policy_representative'
|
108 |
-
);
|
109 |
-
|
110 |
-
$this->registerSettingField(
|
111 |
-
'gdpr_representative_contact_email',
|
112 |
-
_x('Representative Contact Email', '(Admin)', 'gdpr-framework'),
|
113 |
-
[$this, 'renderRepresentativeContactEmail'],
|
114 |
-
'gdpr_section_privacy_policy_representative'
|
115 |
-
);
|
116 |
-
|
117 |
-
$this->registerSettingField(
|
118 |
-
'gdpr_representative_contact_phone',
|
119 |
-
_x('Representative Contact Phone', '(Admin)', 'gdpr-framework'),
|
120 |
-
[$this, 'renderRepresentativeContactPhone'],
|
121 |
-
'gdpr_section_privacy_policy_representative'
|
122 |
-
);
|
123 |
-
|
124 |
-
$this->registerSettingSection(
|
125 |
-
'gdpr_section_privacy_policy_representative_close',
|
126 |
-
false,
|
127 |
-
[$this, 'renderRepresentativeClose']
|
128 |
-
);
|
129 |
-
|
130 |
-
/**
|
131 |
-
* DPA
|
132 |
-
*/
|
133 |
-
$this->registerSettingSection(
|
134 |
-
'gdpr_section_privacy_policy_dpa',
|
135 |
-
_x('Data Protection Authority', '(Admin)', 'gdpr-framework'),
|
136 |
-
[$this, 'renderDpaJS']
|
137 |
-
);
|
138 |
-
|
139 |
-
$this->registerSettingField(
|
140 |
-
'gdpr_dpa_website',
|
141 |
-
_x('Data Protection Authority Website', '(Admin)', 'gdpr-framework'),
|
142 |
-
[$this, 'renderDpaWebsite'],
|
143 |
-
'gdpr_section_privacy_policy_dpa'
|
144 |
-
);
|
145 |
-
|
146 |
-
$this->registerSettingField(
|
147 |
-
'gdpr_dpa_email',
|
148 |
-
_x('Data Protection Authority Email', '(Admin)', 'gdpr-framework'),
|
149 |
-
[$this, 'renderDpaEmail'],
|
150 |
-
'gdpr_section_privacy_policy_dpa'
|
151 |
-
);
|
152 |
-
|
153 |
-
$this->registerSettingField(
|
154 |
-
'gdpr_dpa_phone',
|
155 |
-
_x('Data Protection Authority Phone', '(Admin)', 'gdpr-framework'),
|
156 |
-
[$this, 'renderDpaPhone'],
|
157 |
-
'gdpr_section_privacy_policy_dpa'
|
158 |
-
);
|
159 |
-
|
160 |
-
/**
|
161 |
-
* DPO
|
162 |
-
*/
|
163 |
-
$this->registerSettingSection(
|
164 |
-
'gdpr_section_privacy_policy_dpo',
|
165 |
-
_x('Data Protection Officer', '(Admin)', 'gdpr-framework'),
|
166 |
-
function() {
|
167 |
-
echo "<a href='https://codelight.eu/wordpress-gdpr-framework/knowledge-base/do-i-need-to-appoint-data-protection-officer-dpo/' target='_blank'>";
|
168 |
-
echo _x('Knowledge base: Do I need to appoint a Data Protection Officer?', '(Admin)', 'gdpr-framework');
|
169 |
-
echo "</a>";
|
170 |
-
}
|
171 |
-
);
|
172 |
-
|
173 |
-
$this->registerSettingField(
|
174 |
-
'gdpr_has_dpo',
|
175 |
-
_x('Data Protection Officer', '(Admin)', 'gdpr-framework'),
|
176 |
-
[$this, 'renderHasDPOHtml'],
|
177 |
-
'gdpr_section_privacy_policy_dpo'
|
178 |
-
);
|
179 |
-
|
180 |
-
$this->registerSettingField(
|
181 |
-
'gdpr_dpo_name',
|
182 |
-
_x('Data Protection Officer Name', '(Admin)', 'gdpr-framework'),
|
183 |
-
[$this, 'renderDPONameHtml'],
|
184 |
-
'gdpr_section_privacy_policy_dpo',
|
185 |
-
['class' => 'gdpr-dpo hidden']
|
186 |
-
);
|
187 |
-
|
188 |
-
$this->registerSettingField(
|
189 |
-
'gdpr_dpo_email',
|
190 |
-
_x('Data Protection Officer Email', '(Admin)', 'gdpr-framework'),
|
191 |
-
[$this, 'renderDPOEmailHtml'],
|
192 |
-
'gdpr_section_privacy_policy_dpo',
|
193 |
-
['class' => 'gdpr-dpo hidden']
|
194 |
-
);
|
195 |
-
}
|
196 |
-
|
197 |
-
public function renderHeader()
|
198 |
-
{
|
199 |
-
echo gdpr('view')->render('admin/privacy-policy/header');
|
200 |
-
}
|
201 |
-
|
202 |
-
/**
|
203 |
-
* Company info
|
204 |
-
*/
|
205 |
-
|
206 |
-
public function renderCompanyNameHtml()
|
207 |
-
{
|
208 |
-
$value = gdpr('options')->get('company_name') ? esc_attr(gdpr('options')->get('company_name')) : '';
|
209 |
-
$placeholder = _x('Company Name', '(Admin)', 'gdpr-framework');
|
210 |
-
echo "<input name='gdpr_company_name' placeholder='{$placeholder}' value='{$value}'>";
|
211 |
-
}
|
212 |
-
|
213 |
-
public function renderCompanyEmailHtml()
|
214 |
-
{
|
215 |
-
$value = gdpr('options')->get('contact_email') ? esc_attr(gdpr('options')->get('contact_email')) : '';
|
216 |
-
$placeholder = _x('Contact Email', '(Admin)', 'gdpr-framework');
|
217 |
-
echo "<input type='email' name='gdpr_contact_email' placeholder='{$placeholder}' value='{$value}'>";
|
218 |
-
}
|
219 |
-
|
220 |
-
public function renderCompanyLocationHtml()
|
221 |
-
{
|
222 |
-
$country = gdpr('options')->get('company_location') ? gdpr('options')->get('company_location') : '';
|
223 |
-
$countrySelectOptions = gdpr('helpers')->getCountrySelectOptions($country);
|
224 |
-
echo gdpr('view')->render('admin/privacy-policy/company-location', compact('countrySelectOptions'));
|
225 |
-
}
|
226 |
-
|
227 |
-
/**
|
228 |
-
* Representative contact
|
229 |
-
*/
|
230 |
-
|
231 |
-
public function renderRepresentativeOpen()
|
232 |
-
{
|
233 |
-
echo "<span class='gdpr-representative hidden'>";
|
234 |
-
echo "<h3>";
|
235 |
-
echo _x('Representative Contact', '(Admin)', 'gdpr-framework');
|
236 |
-
echo "</h3>";
|
237 |
-
echo "<a href='https://codelight.eu/wordpress-gdpr-framework/knowledge-base/do-i-need-to-appoint-an-eu-based-representative/' target='_blank'>";
|
238 |
-
echo _x('Knowledge base: Do I need to appoint an EU-based representative?', '(Admin)', 'gdpr-framework');
|
239 |
-
echo "</a>";
|
240 |
-
}
|
241 |
-
|
242 |
-
public function renderRepresentativeContactName()
|
243 |
-
{
|
244 |
-
$value = gdpr('options')->get('representative_contact_name') ? esc_attr(gdpr('options')->get('representative_contact_name')) : '';
|
245 |
-
$placeholder = _x('Representative Contact Name', '(Admin)', 'gdpr-framework');
|
246 |
-
echo "<input name='gdpr_representative_contact_name' placeholder='{$placeholder}' value='{$value}'>";
|
247 |
-
}
|
248 |
-
|
249 |
-
public function renderRepresentativeContactEmail()
|
250 |
-
{
|
251 |
-
$value = gdpr('options')->get('representative_contact_email') ? esc_attr(gdpr('options')->get('representative_contact_email')) : '';
|
252 |
-
$placeholder = _x('Representative Contact Email', '(Admin)', 'gdpr-framework');
|
253 |
-
echo "<input type='email' name='gdpr_representative_contact_email' placeholder='{$placeholder}' value='{$value}'>";
|
254 |
-
}
|
255 |
-
|
256 |
-
public function renderRepresentativeContactPhone()
|
257 |
-
{
|
258 |
-
$value = gdpr('options')->get('representative_contact_phone') ? esc_attr(gdpr('options')->get('representative_contact_phone')) : '';
|
259 |
-
$placeholder = _x('Representative Contact Phone', '(Admin)', 'gdpr-framework');
|
260 |
-
echo "<input name='gdpr_representative_contact_phone' placeholder='{$placeholder}' value='{$value}'>";
|
261 |
-
}
|
262 |
-
|
263 |
-
public function renderRepresentativeClose()
|
264 |
-
{
|
265 |
-
echo "</span>";
|
266 |
-
}
|
267 |
-
|
268 |
-
/**
|
269 |
-
* Data Protection Authority
|
270 |
-
*/
|
271 |
-
public function renderDpaJS()
|
272 |
-
{
|
273 |
-
echo "<a href='https://codelight.eu/wordpress-gdpr-framework/knowledge-base/do-i-need-to-appoint-an-eu-based-representative/' target='_blank'>";
|
274 |
-
echo 'See the <a href="http://ec.europa.eu/justice/data-protection/article-29/structure/data-protection-authorities/index_en.htm" target="_blank">list of contacts here</a>';
|
275 |
-
echo "</a>";
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
-
$dpaData = json_encode(gdpr('helpers')->getDataProtectionAuthorities());
|
280 |
-
echo gdpr('view')->render('admin/privacy-policy/dpa', compact('dpaData'));
|
281 |
-
}
|
282 |
-
|
283 |
-
public function renderDpaWebsite()
|
284 |
-
{
|
285 |
-
$value = gdpr('options')->get('dpa_website') ? esc_attr(gdpr('options')->get('dpa_website')) : '';
|
286 |
-
$placeholder = _x('Data Protection Authority Website', '(Admin)', 'gdpr-framework');
|
287 |
-
echo "<input name='gdpr_dpa_website' id='gdpr_dpa_website' placeholder='{$placeholder}' value='{$value}' data-set='{$value}'>";
|
288 |
-
}
|
289 |
-
|
290 |
-
public function renderDpaEmail()
|
291 |
-
{
|
292 |
-
$value = gdpr('options')->get('dpa_email') ? esc_attr(gdpr('options')->get('dpa_email')) : '';
|
293 |
-
$placeholder = _x('Data Protection Authority Email', '(Admin)', 'gdpr-framework');
|
294 |
-
echo "<input type='email' name='gdpr_dpa_email' id='gdpr_dpa_email' placeholder='{$placeholder}' value='{$value}' data-set='{$value}'>";
|
295 |
-
}
|
296 |
-
|
297 |
-
public function renderDpaPhone()
|
298 |
-
{
|
299 |
-
$value = gdpr('options')->get('dpa_phone') ? esc_attr(gdpr('options')->get('dpa_phone')) : '';
|
300 |
-
$placeholder = _x('Data Protection Authority Phone', '(Admin)', 'gdpr-framework');
|
301 |
-
echo "<input name='gdpr_dpa_phone' id='gdpr_dpa_phone' placeholder='{$placeholder}' value='{$value}' data-set='{$value}'>";
|
302 |
-
}
|
303 |
-
|
304 |
-
/**
|
305 |
-
* Data Protection Officer
|
306 |
-
*/
|
307 |
-
|
308 |
-
public function renderHasDPOHtml()
|
309 |
-
{
|
310 |
-
$hasDPO = gdpr('options')->get('has_dpo');
|
311 |
-
echo gdpr('view')->render('admin/privacy-policy/has-dpo', compact('hasDPO'));
|
312 |
-
}
|
313 |
-
|
314 |
-
public function renderDPONameHtml()
|
315 |
-
{
|
316 |
-
$value = gdpr('options')->get('dpo_name') ? esc_attr(gdpr('options')->get('dpo_name')) : '';
|
317 |
-
$placeholder = _x('DPO Name', '(Admin)', 'gdpr-framework');
|
318 |
-
echo "<input name='gdpr_dpo_name' placeholder='{$placeholder}' value='{$value}'>";
|
319 |
-
}
|
320 |
-
|
321 |
-
public function renderDPOEmailHtml()
|
322 |
-
{
|
323 |
-
$value = gdpr('options')->get('dpo_email') ? esc_attr(gdpr('options')->get('dpo_email')) : '';
|
324 |
-
$placeholder = _x('DPO Name', '(Admin)', 'gdpr-framework');
|
325 |
-
echo "<input type='email' name='gdpr_dpo_email' placeholder='{$placeholder}' value='{$value}'>";
|
326 |
-
}
|
327 |
-
|
328 |
-
|
329 |
-
public function generatePolicy()
|
330 |
-
{
|
331 |
-
$policyPage = gdpr('options')->get('policy_page');
|
332 |
-
|
333 |
-
// todo: handle errors
|
334 |
-
if ( ! $policyPage) {
|
335 |
-
return;
|
336 |
-
}
|
337 |
-
|
338 |
-
$policy = gdpr('view')->render(
|
339 |
-
'policy/policy'
|
340 |
-
);
|
341 |
-
|
342 |
-
wp_update_post([
|
343 |
-
'ID' => $policyPage,
|
344 |
-
'post_content' => $policy,
|
345 |
-
]);
|
346 |
-
|
347 |
-
wp_safe_redirect(gdpr('helpers')->getAdminUrl('&gdpr-tab=privacy-policy&gdpr_notice=policy_generated'));
|
348 |
-
}
|
349 |
-
|
350 |
-
/**
|
351 |
-
* Render either the settings or the generated policy
|
352 |
-
*/
|
353 |
-
public function renderContents()
|
354 |
-
{
|
355 |
-
if (isset($_GET['generate']) && 'yes' == $_GET['generate']) {
|
356 |
-
return $this->renderPolicy();
|
357 |
-
} else {
|
358 |
-
return $this->renderSettings();
|
359 |
-
}
|
360 |
-
}
|
361 |
-
|
362 |
-
/**
|
363 |
-
* Render the contents including settings fields, sections and submit button.
|
364 |
-
* Trigger hooks for rendering content before and after the settings fields.
|
365 |
-
*
|
366 |
-
* @return string
|
367 |
-
*/
|
368 |
-
public function renderSettings()
|
369 |
-
{
|
370 |
-
ob_start();
|
371 |
-
|
372 |
-
do_action("gdpr/tabs/{$this->getSlug()}/before", $this);
|
373 |
-
$this->settingsFields($this->getOptionsGroupName());
|
374 |
-
do_settings_sections($this->getOptionsGroupName());
|
375 |
-
do_action("gdpr/tabs/{$this->getSlug()}/after", $this);
|
376 |
-
|
377 |
-
$this->renderSubmitButton();
|
378 |
-
|
379 |
-
return ob_get_clean();
|
380 |
-
}
|
381 |
-
|
382 |
-
public function renderPolicy()
|
383 |
-
{
|
384 |
-
$policyPageId = gdpr('options')->get('policy_page');
|
385 |
-
if ($policyPageId) {
|
386 |
-
$policyUrl = get_edit_post_link($policyPageId);
|
387 |
-
} else {
|
388 |
-
$policyUrl = false;
|
389 |
-
}
|
390 |
-
|
391 |
-
$editor = $this->getPolicyEditor();
|
392 |
-
$backUrl = gdpr('helpers')->getAdminUrl('&gdpr-tab=privacy-policy');
|
393 |
-
|
394 |
-
return gdpr('view')->render('admin/privacy-policy/generated', compact('editor', 'policyUrl', 'backUrl'));
|
395 |
-
}
|
396 |
-
|
397 |
-
protected function getPolicyEditor()
|
398 |
-
{
|
399 |
-
ob_start();
|
400 |
-
|
401 |
-
wp_editor(
|
402 |
-
wp_kses_post($this->policyGenerator->generate()),
|
403 |
-
'gdpr_policy',
|
404 |
-
[
|
405 |
-
'media_buttons' => false,
|
406 |
-
'editor_height' => 600,
|
407 |
-
'teeny' => true,
|
408 |
-
'editor_css' => '<style>#mceu_16 { display: none; }</style>'
|
409 |
-
]
|
410 |
-
);
|
411 |
-
|
412 |
-
return ob_get_clean();
|
413 |
-
}
|
414 |
-
|
415 |
-
/**
|
416 |
-
* Render WP's default submit button
|
417 |
-
*/
|
418 |
-
public function renderSubmitButton()
|
419 |
-
{
|
420 |
-
submit_button(_x('Save & Generate Policy', '(Admin)', 'gdpr-framework'));
|
421 |
-
}
|
422 |
-
|
423 |
-
/**
|
424 |
-
* In order to set up a proper redirect to the generated policy
|
425 |
-
* after saving settings, we modify the way wp_nonce_field is called and insert our own referer input.
|
426 |
-
*
|
427 |
-
* @param $optionGroup
|
428 |
-
*/
|
429 |
-
public function settingsFields($optionGroup)
|
430 |
-
{
|
431 |
-
echo "<input type='hidden' name='option_page' value='" . esc_attr($optionGroup) . "' />";
|
432 |
-
echo '<input type="hidden" name="action" value="update" />';
|
433 |
-
wp_nonce_field("$optionGroup-options", '_wpnonce', false);
|
434 |
-
echo '<input type="hidden" name="_wp_http_referer" value="'. esc_attr( wp_unslash( $_SERVER['REQUEST_URI'] ) . '&generate=yes' ) . '" />';
|
435 |
-
}
|
436 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Components\PrivacyPolicy;
|
4 |
+
|
5 |
+
use Codelight\GDPR\Admin\AdminTab;
|
6 |
+
|
7 |
+
class AdminTabPrivacyPolicy extends AdminTab
|
8 |
+
{
|
9 |
+
/* @var string */
|
10 |
+
protected $slug = 'privacy-policy';
|
11 |
+
|
12 |
+
/* @var PolicyGenerator */
|
13 |
+
protected $policyGenerator;
|
14 |
+
|
15 |
+
public function __construct(PolicyGenerator $policyGenerator)
|
16 |
+
{
|
17 |
+
$this->policyGenerator = $policyGenerator;
|
18 |
+
|
19 |
+
$this->title = _x('Privacy Policy', '(Admin)', 'gdpr-framework');
|
20 |
+
|
21 |
+
$this->registerSetting('gdpr_company_name');
|
22 |
+
$this->registerSetting('gdpr_contact_email');
|
23 |
+
$this->registerSetting('gdpr_company_location');
|
24 |
+
|
25 |
+
$this->registerSetting('gdpr_representative_contact_name');
|
26 |
+
$this->registerSetting('gdpr_representative_contact_email');
|
27 |
+
$this->registerSetting('gdpr_representative_contact_phone');
|
28 |
+
|
29 |
+
$this->registerSetting('gdpr_dpa_website');
|
30 |
+
$this->registerSetting('gdpr_dpa_email');
|
31 |
+
$this->registerSetting('gdpr_dpa_phone');
|
32 |
+
|
33 |
+
$this->registerSetting('gdpr_has_dpo');
|
34 |
+
$this->registerSetting('gdpr_dpo_name');
|
35 |
+
$this->registerSetting('gdpr_dpo_email');
|
36 |
+
|
37 |
+
/*
|
38 |
+
$this->registerSetting('gdpr_pp_data_gathered_1');
|
39 |
+
$this->registerSetting('gdpr_pp_data_gathered_2');
|
40 |
+
$this->registerSetting('gdpr_pp_data_gathered_3');
|
41 |
+
$this->registerSetting('gdpr_pp_data_gathered_4');
|
42 |
+
|
43 |
+
$this->registerSetting('gdpr_pp_data_usage_1');
|
44 |
+
$this->registerSetting('gdpr_pp_data_usage_2');
|
45 |
+
$this->registerSetting('gdpr_pp_data_usage_3');
|
46 |
+
$this->registerSetting('gdpr_pp_data_usage_4');
|
47 |
+
|
48 |
+
$this->registerSetting('gdpr_pp_data_partners');
|
49 |
+
*/
|
50 |
+
|
51 |
+
add_action('gdpr/admin/action/privacy-policy/generate', [$this, 'generatePolicy']);
|
52 |
+
}
|
53 |
+
|
54 |
+
public function init()
|
55 |
+
{
|
56 |
+
/**
|
57 |
+
* General settings
|
58 |
+
*/
|
59 |
+
$this->registerSettingSection(
|
60 |
+
'gdpr_section_privacy_policy',
|
61 |
+
_x('Privacy Policy', '(Admin)', 'gdpr-framework'),
|
62 |
+
[$this, 'renderHeader']
|
63 |
+
);
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Company info
|
67 |
+
*/
|
68 |
+
$this->registerSettingSection(
|
69 |
+
'gdpr_section_privacy_policy_company',
|
70 |
+
_x('Company information', '(Admin)', 'gdpr-framework')
|
71 |
+
);
|
72 |
+
|
73 |
+
$this->registerSettingField(
|
74 |
+
'gdpr_company_name',
|
75 |
+
_x('Company Name', '(Admin)', 'gdpr-framework'),
|
76 |
+
[$this, 'renderCompanyNameHtml'],
|
77 |
+
'gdpr_section_privacy_policy_company'
|
78 |
+
);
|
79 |
+
|
80 |
+
$this->registerSettingField(
|
81 |
+
'gdpr_company_email',
|
82 |
+
_x('Company Email', '(Admin)', 'gdpr-framework'),
|
83 |
+
[$this, 'renderCompanyEmailHtml'],
|
84 |
+
'gdpr_section_privacy_policy_company'
|
85 |
+
);
|
86 |
+
|
87 |
+
$this->registerSettingField(
|
88 |
+
'gdpr_company_location',
|
89 |
+
_x('Company Location', '(Admin)', 'gdpr-framework'),
|
90 |
+
[$this, 'renderCompanyLocationHtml'],
|
91 |
+
'gdpr_section_privacy_policy_company'
|
92 |
+
);
|
93 |
+
|
94 |
+
/**
|
95 |
+
* Representative
|
96 |
+
*/
|
97 |
+
$this->registerSettingSection(
|
98 |
+
'gdpr_section_privacy_policy_representative',
|
99 |
+
false,
|
100 |
+
[$this, 'renderRepresentativeOpen']
|
101 |
+
);
|
102 |
+
|
103 |
+
$this->registerSettingField(
|
104 |
+
'gdpr_representative_contact_name',
|
105 |
+
_x('Representative Contact Name', '(Admin)', 'gdpr-framework'),
|
106 |
+
[$this, 'renderRepresentativeContactName'],
|
107 |
+
'gdpr_section_privacy_policy_representative'
|
108 |
+
);
|
109 |
+
|
110 |
+
$this->registerSettingField(
|
111 |
+
'gdpr_representative_contact_email',
|
112 |
+
_x('Representative Contact Email', '(Admin)', 'gdpr-framework'),
|
113 |
+
[$this, 'renderRepresentativeContactEmail'],
|
114 |
+
'gdpr_section_privacy_policy_representative'
|
115 |
+
);
|
116 |
+
|
117 |
+
$this->registerSettingField(
|
118 |
+
'gdpr_representative_contact_phone',
|
119 |
+
_x('Representative Contact Phone', '(Admin)', 'gdpr-framework'),
|
120 |
+
[$this, 'renderRepresentativeContactPhone'],
|
121 |
+
'gdpr_section_privacy_policy_representative'
|
122 |
+
);
|
123 |
+
|
124 |
+
$this->registerSettingSection(
|
125 |
+
'gdpr_section_privacy_policy_representative_close',
|
126 |
+
false,
|
127 |
+
[$this, 'renderRepresentativeClose']
|
128 |
+
);
|
129 |
+
|
130 |
+
/**
|
131 |
+
* DPA
|
132 |
+
*/
|
133 |
+
$this->registerSettingSection(
|
134 |
+
'gdpr_section_privacy_policy_dpa',
|
135 |
+
_x('Data Protection Authority', '(Admin)', 'gdpr-framework'),
|
136 |
+
[$this, 'renderDpaJS']
|
137 |
+
);
|
138 |
+
|
139 |
+
$this->registerSettingField(
|
140 |
+
'gdpr_dpa_website',
|
141 |
+
_x('Data Protection Authority Website', '(Admin)', 'gdpr-framework'),
|
142 |
+
[$this, 'renderDpaWebsite'],
|
143 |
+
'gdpr_section_privacy_policy_dpa'
|
144 |
+
);
|
145 |
+
|
146 |
+
$this->registerSettingField(
|
147 |
+
'gdpr_dpa_email',
|
148 |
+
_x('Data Protection Authority Email', '(Admin)', 'gdpr-framework'),
|
149 |
+
[$this, 'renderDpaEmail'],
|
150 |
+
'gdpr_section_privacy_policy_dpa'
|
151 |
+
);
|
152 |
+
|
153 |
+
$this->registerSettingField(
|
154 |
+
'gdpr_dpa_phone',
|
155 |
+
_x('Data Protection Authority Phone', '(Admin)', 'gdpr-framework'),
|
156 |
+
[$this, 'renderDpaPhone'],
|
157 |
+
'gdpr_section_privacy_policy_dpa'
|
158 |
+
);
|
159 |
+
|
160 |
+
/**
|
161 |
+
* DPO
|
162 |
+
*/
|
163 |
+
$this->registerSettingSection(
|
164 |
+
'gdpr_section_privacy_policy_dpo',
|
165 |
+
_x('Data Protection Officer', '(Admin)', 'gdpr-framework'),
|
166 |
+
function() {
|
167 |
+
echo "<a href='https://codelight.eu/wordpress-gdpr-framework/knowledge-base/do-i-need-to-appoint-data-protection-officer-dpo/' target='_blank'>";
|
168 |
+
echo _x('Knowledge base: Do I need to appoint a Data Protection Officer?', '(Admin)', 'gdpr-framework');
|
169 |
+
echo "</a>";
|
170 |
+
}
|
171 |
+
);
|
172 |
+
|
173 |
+
$this->registerSettingField(
|
174 |
+
'gdpr_has_dpo',
|
175 |
+
_x('Data Protection Officer', '(Admin)', 'gdpr-framework'),
|
176 |
+
[$this, 'renderHasDPOHtml'],
|
177 |
+
'gdpr_section_privacy_policy_dpo'
|
178 |
+
);
|
179 |
+
|
180 |
+
$this->registerSettingField(
|
181 |
+
'gdpr_dpo_name',
|
182 |
+
_x('Data Protection Officer Name', '(Admin)', 'gdpr-framework'),
|
183 |
+
[$this, 'renderDPONameHtml'],
|
184 |
+
'gdpr_section_privacy_policy_dpo',
|
185 |
+
['class' => 'gdpr-dpo hidden']
|
186 |
+
);
|
187 |
+
|
188 |
+
$this->registerSettingField(
|
189 |
+
'gdpr_dpo_email',
|
190 |
+
_x('Data Protection Officer Email', '(Admin)', 'gdpr-framework'),
|
191 |
+
[$this, 'renderDPOEmailHtml'],
|
192 |
+
'gdpr_section_privacy_policy_dpo',
|
193 |
+
['class' => 'gdpr-dpo hidden']
|
194 |
+
);
|
195 |
+
}
|
196 |
+
|
197 |
+
public function renderHeader()
|
198 |
+
{
|
199 |
+
echo gdpr('view')->render('admin/privacy-policy/header');
|
200 |
+
}
|
201 |
+
|
202 |
+
/**
|
203 |
+
* Company info
|
204 |
+
*/
|
205 |
+
|
206 |
+
public function renderCompanyNameHtml()
|
207 |
+
{
|
208 |
+
$value = gdpr('options')->get('company_name') ? esc_attr(gdpr('options')->get('company_name')) : '';
|
209 |
+
$placeholder = _x('Company Name', '(Admin)', 'gdpr-framework');
|
210 |
+
echo "<input name='gdpr_company_name' placeholder='{$placeholder}' value='{$value}'>";
|
211 |
+
}
|
212 |
+
|
213 |
+
public function renderCompanyEmailHtml()
|
214 |
+
{
|
215 |
+
$value = gdpr('options')->get('contact_email') ? esc_attr(gdpr('options')->get('contact_email')) : '';
|
216 |
+
$placeholder = _x('Contact Email', '(Admin)', 'gdpr-framework');
|
217 |
+
echo "<input type='email' name='gdpr_contact_email' placeholder='{$placeholder}' value='{$value}'>";
|
218 |
+
}
|
219 |
+
|
220 |
+
public function renderCompanyLocationHtml()
|
221 |
+
{
|
222 |
+
$country = gdpr('options')->get('company_location') ? gdpr('options')->get('company_location') : '';
|
223 |
+
$countrySelectOptions = gdpr('helpers')->getCountrySelectOptions($country);
|
224 |
+
echo gdpr('view')->render('admin/privacy-policy/company-location', compact('countrySelectOptions'));
|
225 |
+
}
|
226 |
+
|
227 |
+
/**
|
228 |
+
* Representative contact
|
229 |
+
*/
|
230 |
+
|
231 |
+
public function renderRepresentativeOpen()
|
232 |
+
{
|
233 |
+
echo "<span class='gdpr-representative hidden'>";
|
234 |
+
echo "<h3>";
|
235 |
+
echo _x('Representative Contact', '(Admin)', 'gdpr-framework');
|
236 |
+
echo "</h3>";
|
237 |
+
echo "<a href='https://codelight.eu/wordpress-gdpr-framework/knowledge-base/do-i-need-to-appoint-an-eu-based-representative/' target='_blank'>";
|
238 |
+
echo _x('Knowledge base: Do I need to appoint an EU-based representative?', '(Admin)', 'gdpr-framework');
|
239 |
+
echo "</a>";
|
240 |
+
}
|
241 |
+
|
242 |
+
public function renderRepresentativeContactName()
|
243 |
+
{
|
244 |
+
$value = gdpr('options')->get('representative_contact_name') ? esc_attr(gdpr('options')->get('representative_contact_name')) : '';
|
245 |
+
$placeholder = _x('Representative Contact Name', '(Admin)', 'gdpr-framework');
|
246 |
+
echo "<input name='gdpr_representative_contact_name' placeholder='{$placeholder}' value='{$value}'>";
|
247 |
+
}
|
248 |
+
|
249 |
+
public function renderRepresentativeContactEmail()
|
250 |
+
{
|
251 |
+
$value = gdpr('options')->get('representative_contact_email') ? esc_attr(gdpr('options')->get('representative_contact_email')) : '';
|
252 |
+
$placeholder = _x('Representative Contact Email', '(Admin)', 'gdpr-framework');
|
253 |
+
echo "<input type='email' name='gdpr_representative_contact_email' placeholder='{$placeholder}' value='{$value}'>";
|
254 |
+
}
|
255 |
+
|
256 |
+
public function renderRepresentativeContactPhone()
|
257 |
+
{
|
258 |
+
$value = gdpr('options')->get('representative_contact_phone') ? esc_attr(gdpr('options')->get('representative_contact_phone')) : '';
|
259 |
+
$placeholder = _x('Representative Contact Phone', '(Admin)', 'gdpr-framework');
|
260 |
+
echo "<input name='gdpr_representative_contact_phone' placeholder='{$placeholder}' value='{$value}'>";
|
261 |
+
}
|
262 |
+
|
263 |
+
public function renderRepresentativeClose()
|
264 |
+
{
|
265 |
+
echo "</span>";
|
266 |
+
}
|
267 |
+
|
268 |
+
/**
|
269 |
+
* Data Protection Authority
|
270 |
+
*/
|
271 |
+
public function renderDpaJS()
|
272 |
+
{
|
273 |
+
echo "<a href='https://codelight.eu/wordpress-gdpr-framework/knowledge-base/do-i-need-to-appoint-an-eu-based-representative/' target='_blank'>";
|
274 |
+
echo 'See the <a href="http://ec.europa.eu/justice/data-protection/article-29/structure/data-protection-authorities/index_en.htm" target="_blank">list of contacts here</a>';
|
275 |
+
echo "</a>";
|
276 |
+
|
277 |
+
|
278 |
+
|
279 |
+
$dpaData = json_encode(gdpr('helpers')->getDataProtectionAuthorities());
|
280 |
+
echo gdpr('view')->render('admin/privacy-policy/dpa', compact('dpaData'));
|
281 |
+
}
|
282 |
+
|
283 |
+
public function renderDpaWebsite()
|
284 |
+
{
|
285 |
+
$value = gdpr('options')->get('dpa_website') ? esc_attr(gdpr('options')->get('dpa_website')) : '';
|
286 |
+
$placeholder = _x('Data Protection Authority Website', '(Admin)', 'gdpr-framework');
|
287 |
+
echo "<input name='gdpr_dpa_website' id='gdpr_dpa_website' placeholder='{$placeholder}' value='{$value}' data-set='{$value}'>";
|
288 |
+
}
|
289 |
+
|
290 |
+
public function renderDpaEmail()
|
291 |
+
{
|
292 |
+
$value = gdpr('options')->get('dpa_email') ? esc_attr(gdpr('options')->get('dpa_email')) : '';
|
293 |
+
$placeholder = _x('Data Protection Authority Email', '(Admin)', 'gdpr-framework');
|
294 |
+
echo "<input type='email' name='gdpr_dpa_email' id='gdpr_dpa_email' placeholder='{$placeholder}' value='{$value}' data-set='{$value}'>";
|
295 |
+
}
|
296 |
+
|
297 |
+
public function renderDpaPhone()
|
298 |
+
{
|
299 |
+
$value = gdpr('options')->get('dpa_phone') ? esc_attr(gdpr('options')->get('dpa_phone')) : '';
|
300 |
+
$placeholder = _x('Data Protection Authority Phone', '(Admin)', 'gdpr-framework');
|
301 |
+
echo "<input name='gdpr_dpa_phone' id='gdpr_dpa_phone' placeholder='{$placeholder}' value='{$value}' data-set='{$value}'>";
|
302 |
+
}
|
303 |
+
|
304 |
+
/**
|
305 |
+
* Data Protection Officer
|
306 |
+
*/
|
307 |
+
|
308 |
+
public function renderHasDPOHtml()
|
309 |
+
{
|
310 |
+
$hasDPO = gdpr('options')->get('has_dpo');
|
311 |
+
echo gdpr('view')->render('admin/privacy-policy/has-dpo', compact('hasDPO'));
|
312 |
+
}
|
313 |
+
|
314 |
+
public function renderDPONameHtml()
|
315 |
+
{
|
316 |
+
$value = gdpr('options')->get('dpo_name') ? esc_attr(gdpr('options')->get('dpo_name')) : '';
|
317 |
+
$placeholder = _x('DPO Name', '(Admin)', 'gdpr-framework');
|
318 |
+
echo "<input name='gdpr_dpo_name' placeholder='{$placeholder}' value='{$value}'>";
|
319 |
+
}
|
320 |
+
|
321 |
+
public function renderDPOEmailHtml()
|
322 |
+
{
|
323 |
+
$value = gdpr('options')->get('dpo_email') ? esc_attr(gdpr('options')->get('dpo_email')) : '';
|
324 |
+
$placeholder = _x('DPO Name', '(Admin)', 'gdpr-framework');
|
325 |
+
echo "<input type='email' name='gdpr_dpo_email' placeholder='{$placeholder}' value='{$value}'>";
|
326 |
+
}
|
327 |
+
|
328 |
+
|
329 |
+
public function generatePolicy()
|
330 |
+
{
|
331 |
+
$policyPage = gdpr('options')->get('policy_page');
|
332 |
+
|
333 |
+
// todo: handle errors
|
334 |
+
if ( ! $policyPage) {
|
335 |
+
return;
|
336 |
+
}
|
337 |
+
|
338 |
+
$policy = gdpr('view')->render(
|
339 |
+
'policy/policy'
|
340 |
+
);
|
341 |
+
|
342 |
+
wp_update_post([
|
343 |
+
'ID' => $policyPage,
|
344 |
+
'post_content' => $policy,
|
345 |
+
]);
|
346 |
+
|
347 |
+
wp_safe_redirect(gdpr('helpers')->getAdminUrl('&gdpr-tab=privacy-policy&gdpr_notice=policy_generated'));
|
348 |
+
}
|
349 |
+
|
350 |
+
/**
|
351 |
+
* Render either the settings or the generated policy
|
352 |
+
*/
|
353 |
+
public function renderContents()
|
354 |
+
{
|
355 |
+
if (isset($_GET['generate']) && 'yes' == $_GET['generate']) {
|
356 |
+
return $this->renderPolicy();
|
357 |
+
} else {
|
358 |
+
return $this->renderSettings();
|
359 |
+
}
|
360 |
+
}
|
361 |
+
|
362 |
+
/**
|
363 |
+
* Render the contents including settings fields, sections and submit button.
|
364 |
+
* Trigger hooks for rendering content before and after the settings fields.
|
365 |
+
*
|
366 |
+
* @return string
|
367 |
+
*/
|
368 |
+
public function renderSettings()
|
369 |
+
{
|
370 |
+
ob_start();
|
371 |
+
|
372 |
+
do_action("gdpr/tabs/{$this->getSlug()}/before", $this);
|
373 |
+
$this->settingsFields($this->getOptionsGroupName());
|
374 |
+
do_settings_sections($this->getOptionsGroupName());
|
375 |
+
do_action("gdpr/tabs/{$this->getSlug()}/after", $this);
|
376 |
+
|
377 |
+
$this->renderSubmitButton();
|
378 |
+
|
379 |
+
return ob_get_clean();
|
380 |
+
}
|
381 |
+
|
382 |
+
public function renderPolicy()
|
383 |
+
{
|
384 |
+
$policyPageId = gdpr('options')->get('policy_page');
|
385 |
+
if ($policyPageId) {
|
386 |
+
$policyUrl = get_edit_post_link($policyPageId);
|
387 |
+
} else {
|
388 |
+
$policyUrl = false;
|
389 |
+
}
|
390 |
+
|
391 |
+
$editor = $this->getPolicyEditor();
|
392 |
+
$backUrl = gdpr('helpers')->getAdminUrl('&gdpr-tab=privacy-policy');
|
393 |
+
|
394 |
+
return gdpr('view')->render('admin/privacy-policy/generated', compact('editor', 'policyUrl', 'backUrl'));
|
395 |
+
}
|
396 |
+
|
397 |
+
protected function getPolicyEditor()
|
398 |
+
{
|
399 |
+
ob_start();
|
400 |
+
|
401 |
+
wp_editor(
|
402 |
+
wp_kses_post($this->policyGenerator->generate()),
|
403 |
+
'gdpr_policy',
|
404 |
+
[
|
405 |
+
'media_buttons' => false,
|
406 |
+
'editor_height' => 600,
|
407 |
+
'teeny' => true,
|
408 |
+
'editor_css' => '<style>#mceu_16 { display: none; }</style>'
|
409 |
+
]
|
410 |
+
);
|
411 |
+
|
412 |
+
return ob_get_clean();
|
413 |
+
}
|
414 |
+
|
415 |
+
/**
|
416 |
+
* Render WP's default submit button
|
417 |
+
*/
|
418 |
+
public function renderSubmitButton()
|
419 |
+
{
|
420 |
+
submit_button(_x('Save & Generate Policy', '(Admin)', 'gdpr-framework'));
|
421 |
+
}
|
422 |
+
|
423 |
+
/**
|
424 |
+
* In order to set up a proper redirect to the generated policy
|
425 |
+
* after saving settings, we modify the way wp_nonce_field is called and insert our own referer input.
|
426 |
+
*
|
427 |
+
* @param $optionGroup
|
428 |
+
*/
|
429 |
+
public function settingsFields($optionGroup)
|
430 |
+
{
|
431 |
+
echo "<input type='hidden' name='option_page' value='" . esc_attr($optionGroup) . "' />";
|
432 |
+
echo '<input type="hidden" name="action" value="update" />';
|
433 |
+
wp_nonce_field("$optionGroup-options", '_wpnonce', false);
|
434 |
+
echo '<input type="hidden" name="_wp_http_referer" value="'. esc_attr( wp_unslash( $_SERVER['REQUEST_URI'] ) . '&generate=yes' ) . '" />';
|
435 |
+
}
|
436 |
+
}
|
src/Components/PrivacyPolicy/PolicyGenerator.php
CHANGED
@@ -1,45 +1,45 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Components\PrivacyPolicy;
|
4 |
-
|
5 |
-
class PolicyGenerator
|
6 |
-
{
|
7 |
-
public function generate()
|
8 |
-
{
|
9 |
-
return gdpr('view')->render(
|
10 |
-
'policy/policy',
|
11 |
-
$this->getData()
|
12 |
-
);
|
13 |
-
}
|
14 |
-
|
15 |
-
public function getData()
|
16 |
-
{
|
17 |
-
$location = gdpr('options')->get('company_location');
|
18 |
-
$date = date(get_option('date_format'));
|
19 |
-
|
20 |
-
return [
|
21 |
-
'companyName' => gdpr('options')->get('company_name'),
|
22 |
-
'companyLocation' => $location,
|
23 |
-
'contactEmail' => gdpr('options')->get('contact_email') ?
|
24 |
-
gdpr('options')->get('contact_email') :
|
25 |
-
get_option('admin_email'),
|
26 |
-
|
27 |
-
'hasRepresentative' => gdpr('helpers')->countryNeedsRepresentative($location),
|
28 |
-
'representativeContactName' => gdpr('options')->get('representative_contact_name'),
|
29 |
-
'representativeContactEmail' => gdpr('options')->get('representative_contact_email'),
|
30 |
-
'representativeContactPhone' => gdpr('options')->get('representative_contact_phone'),
|
31 |
-
|
32 |
-
'dpaWebsite' => gdpr('options')->get('dpa_name'),
|
33 |
-
'dpaEmail' => gdpr('options')->get('dpa_email'),
|
34 |
-
'dpaPhone' => gdpr('options')->get('dpa_phone'),
|
35 |
-
|
36 |
-
'hasDpo' => gdpr('options')->get('has_dpo'),
|
37 |
-
'dpoName' => gdpr('options')->get('dpo_name'),
|
38 |
-
'dpoEmail' => gdpr('options')->get('dpo_email'),
|
39 |
-
|
40 |
-
'hasTerms' => gdpr('options')->get('terms_page'),
|
41 |
-
|
42 |
-
'date' => $date,
|
43 |
-
];
|
44 |
-
}
|
45 |
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Components\PrivacyPolicy;
|
4 |
+
|
5 |
+
class PolicyGenerator
|
6 |
+
{
|
7 |
+
public function generate()
|
8 |
+
{
|
9 |
+
return gdpr('view')->render(
|
10 |
+
'policy/policy',
|
11 |
+
$this->getData()
|
12 |
+
);
|
13 |
+
}
|
14 |
+
|
15 |
+
public function getData()
|
16 |
+
{
|
17 |
+
$location = gdpr('options')->get('company_location');
|
18 |
+
$date = date(get_option('date_format'));
|
19 |
+
|
20 |
+
return [
|
21 |
+
'companyName' => gdpr('options')->get('company_name'),
|
22 |
+
'companyLocation' => $location,
|
23 |
+
'contactEmail' => gdpr('options')->get('contact_email') ?
|
24 |
+
gdpr('options')->get('contact_email') :
|
25 |
+
get_option('admin_email'),
|
26 |
+
|
27 |
+
'hasRepresentative' => gdpr('helpers')->countryNeedsRepresentative($location),
|
28 |
+
'representativeContactName' => gdpr('options')->get('representative_contact_name'),
|
29 |
+
'representativeContactEmail' => gdpr('options')->get('representative_contact_email'),
|
30 |
+
'representativeContactPhone' => gdpr('options')->get('representative_contact_phone'),
|
31 |
+
|
32 |
+
'dpaWebsite' => gdpr('options')->get('dpa_name'),
|
33 |
+
'dpaEmail' => gdpr('options')->get('dpa_email'),
|
34 |
+
'dpaPhone' => gdpr('options')->get('dpa_phone'),
|
35 |
+
|
36 |
+
'hasDpo' => gdpr('options')->get('has_dpo'),
|
37 |
+
'dpoName' => gdpr('options')->get('dpo_name'),
|
38 |
+
'dpoEmail' => gdpr('options')->get('dpo_email'),
|
39 |
+
|
40 |
+
'hasTerms' => gdpr('options')->get('terms_page'),
|
41 |
+
|
42 |
+
'date' => $date,
|
43 |
+
];
|
44 |
+
}
|
45 |
}
|
src/Components/PrivacyPolicy/PrivacyPolicy.php
CHANGED
@@ -1,92 +1,92 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Components\PrivacyPolicy;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Handles putting together and rendering the privacy policy page
|
7 |
-
*
|
8 |
-
* Class PrivacyPolicy
|
9 |
-
*
|
10 |
-
* @package Codelight\GDPR\Components\PrivacyPolicy
|
11 |
-
*/
|
12 |
-
class PrivacyPolicy
|
13 |
-
{
|
14 |
-
public function __construct()
|
15 |
-
{
|
16 |
-
add_filter('gdpr/admin/tabs', [$this, 'registerAdminTab'], 35);
|
17 |
-
|
18 |
-
add_shortcode('gdpr_privacy', [$this, 'doShortcode']);
|
19 |
-
add_shortcode('gdpr_privacy_policy_url', [$this, 'renderUrlShortcode']);
|
20 |
-
add_shortcode('gdpr_privacy_policy_link', [$this, 'renderLinkShortcode']);
|
21 |
-
}
|
22 |
-
|
23 |
-
public function registerAdminTab($tabs)
|
24 |
-
{
|
25 |
-
$tabs['privacy-policy'] = gdpr()->make(AdminTabPrivacyPolicy::class);
|
26 |
-
|
27 |
-
return $tabs;
|
28 |
-
}
|
29 |
-
|
30 |
-
public function doShortcode($attributes)
|
31 |
-
{
|
32 |
-
$attributes = shortcode_atts([
|
33 |
-
'item' => null,
|
34 |
-
], $attributes);
|
35 |
-
|
36 |
-
switch ($attributes['item']) {
|
37 |
-
case 'company_name':
|
38 |
-
return esc_html(gdpr('options')->get('company_name'));
|
39 |
-
case 'company_email':
|
40 |
-
return esc_html(gdpr('options')->get('contact_email'));
|
41 |
-
case 'company_email_link':
|
42 |
-
$email = antispambot(gdpr('options')->get('contact_email'));
|
43 |
-
return "<a href='mailto:{$email}'>{$email}</a>";
|
44 |
-
case 'dpo_name':
|
45 |
-
return esc_html(gdpr('options')->get('dpo_name'));
|
46 |
-
case 'dpo_email':
|
47 |
-
return esc_html(gdpr('options')->get('dpo_email'));
|
48 |
-
case 'dpo_email_link':
|
49 |
-
$email = antispambot(gdpr('options')->get('dpo_email'));
|
50 |
-
return "<a href='mailto:{$email}'>{$email}</a>";
|
51 |
-
case 'rep_name':
|
52 |
-
return esc_html(gdpr('options')->get('representative_contact_name'));
|
53 |
-
case 'rep_email':
|
54 |
-
return esc_html(gdpr('options')->get('representative_contact_email'));
|
55 |
-
case 'rep_email_link':
|
56 |
-
$email = antispambot(gdpr('options')->get('representative_contact_email'));
|
57 |
-
return "<a href='mailto:{$email}'>{$email}</a>";
|
58 |
-
case 'authority_website':
|
59 |
-
return esc_html(gdpr('options')->get('dpa_website'));
|
60 |
-
case 'authority_email':
|
61 |
-
return esc_html(gdpr('options')->get('dpa_email'));
|
62 |
-
case 'authority_email_link':
|
63 |
-
$email = antispambot(gdpr('options')->get('dpa_email'));
|
64 |
-
return "<a href='mailto:{$email}'>{$email}</a>";
|
65 |
-
case 'authority_phone':
|
66 |
-
return esc_html(gdpr('options')->get('dpa_phone'));
|
67 |
-
case null:
|
68 |
-
return '';
|
69 |
-
}
|
70 |
-
|
71 |
-
return '';
|
72 |
-
}
|
73 |
-
|
74 |
-
public function renderUrlShortcode()
|
75 |
-
{
|
76 |
-
return gdpr('helpers')->getPrivacyPolicyPageUrl();
|
77 |
-
}
|
78 |
-
|
79 |
-
public function renderLinkShortcode($attributes)
|
80 |
-
{
|
81 |
-
$attributes = shortcode_atts([
|
82 |
-
'title' => __('Privacy Policy', 'gdpr-framework'),
|
83 |
-
], $attributes);
|
84 |
-
|
85 |
-
$url = gdpr('helpers')->getPrivacyPolicyPageUrl();
|
86 |
-
|
87 |
-
return
|
88 |
-
"<a href='{$url}'>" .
|
89 |
-
esc_html($attributes['title']) .
|
90 |
-
"</a>";
|
91 |
-
}
|
92 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Components\PrivacyPolicy;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Handles putting together and rendering the privacy policy page
|
7 |
+
*
|
8 |
+
* Class PrivacyPolicy
|
9 |
+
*
|
10 |
+
* @package Codelight\GDPR\Components\PrivacyPolicy
|
11 |
+
*/
|
12 |
+
class PrivacyPolicy
|
13 |
+
{
|
14 |
+
public function __construct()
|
15 |
+
{
|
16 |
+
add_filter('gdpr/admin/tabs', [$this, 'registerAdminTab'], 35);
|
17 |
+
|
18 |
+
add_shortcode('gdpr_privacy', [$this, 'doShortcode']);
|
19 |
+
add_shortcode('gdpr_privacy_policy_url', [$this, 'renderUrlShortcode']);
|
20 |
+
add_shortcode('gdpr_privacy_policy_link', [$this, 'renderLinkShortcode']);
|
21 |
+
}
|
22 |
+
|
23 |
+
public function registerAdminTab($tabs)
|
24 |
+
{
|
25 |
+
$tabs['privacy-policy'] = gdpr()->make(AdminTabPrivacyPolicy::class);
|
26 |
+
|
27 |
+
return $tabs;
|
28 |
+
}
|
29 |
+
|
30 |
+
public function doShortcode($attributes)
|
31 |
+
{
|
32 |
+
$attributes = shortcode_atts([
|
33 |
+
'item' => null,
|
34 |
+
], $attributes);
|
35 |
+
|
36 |
+
switch ($attributes['item']) {
|
37 |
+
case 'company_name':
|
38 |
+
return esc_html(gdpr('options')->get('company_name'));
|
39 |
+
case 'company_email':
|
40 |
+
return esc_html(gdpr('options')->get('contact_email'));
|
41 |
+
case 'company_email_link':
|
42 |
+
$email = antispambot(gdpr('options')->get('contact_email'));
|
43 |
+
return "<a href='mailto:{$email}'>{$email}</a>";
|
44 |
+
case 'dpo_name':
|
45 |
+
return esc_html(gdpr('options')->get('dpo_name'));
|
46 |
+
case 'dpo_email':
|
47 |
+
return esc_html(gdpr('options')->get('dpo_email'));
|
48 |
+
case 'dpo_email_link':
|
49 |
+
$email = antispambot(gdpr('options')->get('dpo_email'));
|
50 |
+
return "<a href='mailto:{$email}'>{$email}</a>";
|
51 |
+
case 'rep_name':
|
52 |
+
return esc_html(gdpr('options')->get('representative_contact_name'));
|
53 |
+
case 'rep_email':
|
54 |
+
return esc_html(gdpr('options')->get('representative_contact_email'));
|
55 |
+
case 'rep_email_link':
|
56 |
+
$email = antispambot(gdpr('options')->get('representative_contact_email'));
|
57 |
+
return "<a href='mailto:{$email}'>{$email}</a>";
|
58 |
+
case 'authority_website':
|
59 |
+
return esc_html(gdpr('options')->get('dpa_website'));
|
60 |
+
case 'authority_email':
|
61 |
+
return esc_html(gdpr('options')->get('dpa_email'));
|
62 |
+
case 'authority_email_link':
|
63 |
+
$email = antispambot(gdpr('options')->get('dpa_email'));
|
64 |
+
return "<a href='mailto:{$email}'>{$email}</a>";
|
65 |
+
case 'authority_phone':
|
66 |
+
return esc_html(gdpr('options')->get('dpa_phone'));
|
67 |
+
case null:
|
68 |
+
return '';
|
69 |
+
}
|
70 |
+
|
71 |
+
return '';
|
72 |
+
}
|
73 |
+
|
74 |
+
public function renderUrlShortcode()
|
75 |
+
{
|
76 |
+
return gdpr('helpers')->getPrivacyPolicyPageUrl();
|
77 |
+
}
|
78 |
+
|
79 |
+
public function renderLinkShortcode($attributes)
|
80 |
+
{
|
81 |
+
$attributes = shortcode_atts([
|
82 |
+
'title' => __('Privacy Policy', 'gdpr-framework'),
|
83 |
+
], $attributes);
|
84 |
+
|
85 |
+
$url = gdpr('helpers')->getPrivacyPolicyPageUrl();
|
86 |
+
|
87 |
+
return
|
88 |
+
"<a href='{$url}'>" .
|
89 |
+
esc_html($attributes['title']) .
|
90 |
+
"</a>";
|
91 |
+
}
|
92 |
+
}
|
src/Components/PrivacyToolsPage/PrivacyToolsPage.php
CHANGED
@@ -1,15 +1,15 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Components\PrivacyToolsPage;
|
4 |
-
|
5 |
-
class PrivacyToolsPage
|
6 |
-
{
|
7 |
-
public function __construct()
|
8 |
-
{
|
9 |
-
gdpr()->singleton(PrivacyToolsPageController::class);
|
10 |
-
gdpr()->make(PrivacyToolsPageShortcode::class);
|
11 |
-
|
12 |
-
gdpr()->singleton(PrivacyToolsPageShortcode::class);
|
13 |
-
gdpr()->make(PrivacyToolsPageShortcode::class);
|
14 |
-
}
|
15 |
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Components\PrivacyToolsPage;
|
4 |
+
|
5 |
+
class PrivacyToolsPage
|
6 |
+
{
|
7 |
+
public function __construct()
|
8 |
+
{
|
9 |
+
gdpr()->singleton(PrivacyToolsPageController::class);
|
10 |
+
gdpr()->make(PrivacyToolsPageShortcode::class);
|
11 |
+
|
12 |
+
gdpr()->singleton(PrivacyToolsPageShortcode::class);
|
13 |
+
gdpr()->make(PrivacyToolsPageShortcode::class);
|
14 |
+
}
|
15 |
}
|
src/Components/PrivacyToolsPage/PrivacyToolsPageController.php
CHANGED
@@ -1,278 +1,278 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Components\PrivacyToolsPage;
|
4 |
-
|
5 |
-
use Codelight\GDPR\DataSubject\DataSubject;
|
6 |
-
use Codelight\GDPR\DataSubject\DataSubjectAuthenticator;
|
7 |
-
use Codelight\GDPR\DataSubject\DataSubjectIdentificator;
|
8 |
-
use Codelight\GDPR\DataSubject\DataSubjectManager;
|
9 |
-
use Codelight\GDPR\DataSubject\DataExporter;
|
10 |
-
|
11 |
-
/**
|
12 |
-
* Handle the data page on front-end
|
13 |
-
*
|
14 |
-
* Class DataPageController
|
15 |
-
*
|
16 |
-
* @package Codelight\GDPR\Components\DataPage
|
17 |
-
*/
|
18 |
-
class PrivacyToolsPageController
|
19 |
-
{
|
20 |
-
/* @var DataSubjectAuthenticator */
|
21 |
-
protected $dataSubjectAuthenticator;
|
22 |
-
|
23 |
-
/* @var DataSubjectIdentificator */
|
24 |
-
protected $dataSubjectIdentificator;
|
25 |
-
|
26 |
-
/* @var DataSubjectManager */
|
27 |
-
protected $dataSubjectManager;
|
28 |
-
|
29 |
-
/**
|
30 |
-
* DataPageController constructor.
|
31 |
-
*
|
32 |
-
* @param DataSubjectIdentificator $dataSubjectIdentificator
|
33 |
-
* @param DataSubjectManager $dataSubjectManager
|
34 |
-
*/
|
35 |
-
public function __construct(
|
36 |
-
DataSubjectAuthenticator $dataSubjectAuthenticator,
|
37 |
-
DataSubjectIdentificator $dataSubjectIdentificator,
|
38 |
-
DataSubjectManager $dataSubjectManager,
|
39 |
-
DataExporter $dataExporter
|
40 |
-
) {
|
41 |
-
$this->dataSubjectAuthenticator = $dataSubjectAuthenticator;
|
42 |
-
$this->dataSubjectIdentificator = $dataSubjectIdentificator;
|
43 |
-
$this->dataSubjectManager = $dataSubjectManager;
|
44 |
-
$this->dataExporter = $dataExporter;
|
45 |
-
|
46 |
-
if ( ! gdpr('options')->get('enable')) {
|
47 |
-
return;
|
48 |
-
}
|
49 |
-
|
50 |
-
$this->setup();
|
51 |
-
}
|
52 |
-
|
53 |
-
protected function setup()
|
54 |
-
{
|
55 |
-
add_action('wp_enqueue_scripts', [$this, 'enqueue']);
|
56 |
-
|
57 |
-
// Listen to 'identify' action and send an email
|
58 |
-
add_action('gdpr/frontend/action/identify', [$this, 'sendIdentificationEmail']);
|
59 |
-
|
60 |
-
add_action('gdpr/frontend/privacy-tools-page/content', [$this, 'renderConsentForm'], 10, 2);
|
61 |
-
add_action('gdpr/frontend/privacy-tools-page/content', [$this, 'renderExportForm'], 20, 2);
|
62 |
-
add_action('gdpr/frontend/privacy-tools-page/content', [$this, 'renderDeleteForm'], 30, 2);
|
63 |
-
|
64 |
-
add_action('gdpr/frontend/privacy-tools-page/action/withdraw_consent', [$this, 'withdrawConsent'], 10, 2);
|
65 |
-
add_action('gdpr/frontend/privacy-tools-page/action/export', [$this, 'export'], 10, 2);
|
66 |
-
add_action('gdpr/frontend/privacy-tools-page/action/forget', [$this, 'forget'], 10, 2);
|
67 |
-
}
|
68 |
-
|
69 |
-
public function enqueue()
|
70 |
-
{
|
71 |
-
if ( ! gdpr('options')->get('enable_stylesheet') || ! is_page(gdpr('options')->get('tools_page'))) {
|
72 |
-
return;
|
73 |
-
}
|
74 |
-
|
75 |
-
wp_enqueue_style(
|
76 |
-
'gdpr-framework-privacy-tools',
|
77 |
-
gdpr('config')->get('plugin.url') . 'assets/privacy-tools.css'
|
78 |
-
);
|
79 |
-
}
|
80 |
-
|
81 |
-
/**
|
82 |
-
* If the given email address exists as a data subject, send an authentication email to that address
|
83 |
-
*/
|
84 |
-
public function sendIdentificationEmail()
|
85 |
-
{
|
86 |
-
// Additional safety check
|
87 |
-
if ( ! is_email($_REQUEST['email'])) {
|
88 |
-
$this->redirect(['gdpr_notice' => 'invalid_email']);
|
89 |
-
}
|
90 |
-
|
91 |
-
if ($this->dataSubjectIdentificator->isDataSubject($_REQUEST['email'])) {
|
92 |
-
$this->dataSubjectIdentificator->sendIdentificationEmail($_REQUEST['email']);
|
93 |
-
} else {
|
94 |
-
$this->dataSubjectIdentificator->sendNoDataFoundEmail($_REQUEST['email']);
|
95 |
-
}
|
96 |
-
|
97 |
-
$this->redirect(['gdpr_notice' => 'email_sent']);
|
98 |
-
}
|
99 |
-
|
100 |
-
/**
|
101 |
-
* Render the page contents.
|
102 |
-
* This is only called via the shortcode.
|
103 |
-
*/
|
104 |
-
public function render()
|
105 |
-
{
|
106 |
-
$dataSubject = $this->dataSubjectAuthenticator->authenticate();
|
107 |
-
$this->renderNotices();
|
108 |
-
|
109 |
-
if ($dataSubject) {
|
110 |
-
$this->renderPrivacyTools($dataSubject);
|
111 |
-
} else {
|
112 |
-
$this->renderIdentificationForm();
|
113 |
-
}
|
114 |
-
}
|
115 |
-
|
116 |
-
/**
|
117 |
-
* Display notices to the user.
|
118 |
-
* The contents of the notices are currently hardcoded inside the template.
|
119 |
-
*/
|
120 |
-
protected function renderNotices()
|
121 |
-
{
|
122 |
-
if ( ! isset($_REQUEST['gdpr_notice'])) {
|
123 |
-
return;
|
124 |
-
}
|
125 |
-
|
126 |
-
echo gdpr('view')->render('privacy-tools/notices');
|
127 |
-
}
|
128 |
-
|
129 |
-
/**
|
130 |
-
* Render the contents of the identification form
|
131 |
-
*/
|
132 |
-
protected function renderIdentificationForm()
|
133 |
-
{
|
134 |
-
$nonce = wp_create_nonce('gdpr/frontend/action/identify');
|
135 |
-
echo gdpr('view')->render('privacy-tools/form-identify', compact('nonce', 'notices'));
|
136 |
-
}
|
137 |
-
|
138 |
-
/**
|
139 |
-
* Render the contents of the Privacy Tools page
|
140 |
-
*
|
141 |
-
* @param DataSubject $dataSubject
|
142 |
-
*/
|
143 |
-
protected function renderPrivacyTools(DataSubject $dataSubject)
|
144 |
-
{
|
145 |
-
$email = $dataSubject->getEmail();
|
146 |
-
echo gdpr('view')->render('privacy-tools/privacy-tools', compact('dataSubject', 'email'));
|
147 |
-
}
|
148 |
-
|
149 |
-
/**
|
150 |
-
* Render the form that allows withdrawing consent
|
151 |
-
*
|
152 |
-
* @param DataSubject $dataSubject
|
153 |
-
*/
|
154 |
-
public function renderConsentForm(DataSubject $dataSubject)
|
155 |
-
{
|
156 |
-
$consentData = $dataSubject->getVisibleConsentData();
|
157 |
-
|
158 |
-
foreach ($consentData as &$item) {
|
159 |
-
$item['withdraw_url'] = add_query_arg([
|
160 |
-
'gdpr_action' => 'withdraw_consent',
|
161 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/frontend/privacy-tools-page/action/withdraw_consent"),
|
162 |
-
'email' => $dataSubject->getEmail(),
|
163 |
-
'consent' => $item['slug'],
|
164 |
-
]);
|
165 |
-
}
|
166 |
-
|
167 |
-
$consentInfo = apply_filters('the_content', gdpr('options')->get('consent_info'));
|
168 |
-
|
169 |
-
echo gdpr('view')->render(
|
170 |
-
"privacy-tools/form-consent",
|
171 |
-
compact('consentData', 'consentInfo')
|
172 |
-
);
|
173 |
-
}
|
174 |
-
|
175 |
-
/**
|
176 |
-
* Render the form that allows the data subject to export their data
|
177 |
-
*
|
178 |
-
* @param DataSubject $dataSubject
|
179 |
-
*/
|
180 |
-
public function renderExportForm(DataSubject $dataSubject)
|
181 |
-
{
|
182 |
-
$email = $dataSubject->getEmail();
|
183 |
-
$nonce = wp_create_nonce("gdpr/frontend/privacy-tools-page/action/export");
|
184 |
-
|
185 |
-
echo gdpr('view')->render(
|
186 |
-
"privacy-tools/form-export",
|
187 |
-
compact('email', 'nonce')
|
188 |
-
);
|
189 |
-
}
|
190 |
-
|
191 |
-
/**
|
192 |
-
* Render the form that allows the data subject to delete their data
|
193 |
-
*
|
194 |
-
* @param DataSubject $dataSubject
|
195 |
-
*/
|
196 |
-
public function renderDeleteForm(DataSubject $dataSubject)
|
197 |
-
{
|
198 |
-
// Let's not allow admins to delete themselves
|
199 |
-
if (current_user_can('manage_options')) {
|
200 |
-
echo gdpr('view')->render("privacy-tools/notice-admin-role");
|
201 |
-
|
202 |
-
return;
|
203 |
-
}
|
204 |
-
|
205 |
-
$action = 'forget';
|
206 |
-
$email = $dataSubject->getEmail();
|
207 |
-
$nonce = wp_create_nonce("gdpr/frontend/privacy-tools-page/action/forget");
|
208 |
-
|
209 |
-
echo gdpr('view')->render(
|
210 |
-
"privacy-tools/form-delete",
|
211 |
-
compact('action', 'email', 'nonce')
|
212 |
-
);
|
213 |
-
}
|
214 |
-
|
215 |
-
/**
|
216 |
-
* Withdraw the consent
|
217 |
-
*
|
218 |
-
* @param DataSubject $dataSubject
|
219 |
-
*/
|
220 |
-
public function withdrawConsent(DataSubject $dataSubject)
|
221 |
-
{
|
222 |
-
$dataSubject->withdrawConsent($_REQUEST['consent']);
|
223 |
-
$this->redirect(['gdpr_notice' => 'consent_withdrawn']);
|
224 |
-
}
|
225 |
-
|
226 |
-
/**
|
227 |
-
* Trigger the export action.
|
228 |
-
*
|
229 |
-
* @param DataSubject $dataSubject
|
230 |
-
*/
|
231 |
-
public function export(DataSubject $dataSubject)
|
232 |
-
{
|
233 |
-
$data = $dataSubject->export($_REQUEST['gdpr_format']);
|
234 |
-
|
235 |
-
if ( ! is_null($data)) {
|
236 |
-
// If there is data, download it
|
237 |
-
$this->dataExporter->export($data, $dataSubject, $_REQUEST['gdpr_format']);
|
238 |
-
} else {
|
239 |
-
// If there's no data, then show notification that your request has been sent.
|
240 |
-
$this->redirect(['gdpr_notice' => 'request_sent']);
|
241 |
-
}
|
242 |
-
}
|
243 |
-
|
244 |
-
/**
|
245 |
-
* Trigger the forget action.
|
246 |
-
*
|
247 |
-
* @param DataSubject $dataSubject
|
248 |
-
*/
|
249 |
-
public function forget(DataSubject $dataSubject)
|
250 |
-
{
|
251 |
-
$deleted = $dataSubject->forget();
|
252 |
-
|
253 |
-
if ($deleted) {
|
254 |
-
$this->dataSubjectAuthenticator->deleteSession();
|
255 |
-
$this->redirect(['gdpr_notice' => 'data_deleted']);
|
256 |
-
} else {
|
257 |
-
// If request was sent to admin, then show notification
|
258 |
-
$this->redirect(['gdpr_notice' => 'request_sent']);
|
259 |
-
}
|
260 |
-
|
261 |
-
}
|
262 |
-
|
263 |
-
/**
|
264 |
-
* Redirect the visitor to an appropriate location
|
265 |
-
*
|
266 |
-
* @param array $args
|
267 |
-
* @param null $baseUrl
|
268 |
-
*/
|
269 |
-
protected function redirect($args = [], $baseUrl = null)
|
270 |
-
{
|
271 |
-
if ( ! $baseUrl) {
|
272 |
-
$baseUrl = get_permalink(gdpr('options')->get('tools_page'));
|
273 |
-
}
|
274 |
-
|
275 |
-
wp_safe_redirect(add_query_arg($args, $baseUrl));
|
276 |
-
exit;
|
277 |
-
}
|
278 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Components\PrivacyToolsPage;
|
4 |
+
|
5 |
+
use Codelight\GDPR\DataSubject\DataSubject;
|
6 |
+
use Codelight\GDPR\DataSubject\DataSubjectAuthenticator;
|
7 |
+
use Codelight\GDPR\DataSubject\DataSubjectIdentificator;
|
8 |
+
use Codelight\GDPR\DataSubject\DataSubjectManager;
|
9 |
+
use Codelight\GDPR\DataSubject\DataExporter;
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Handle the data page on front-end
|
13 |
+
*
|
14 |
+
* Class DataPageController
|
15 |
+
*
|
16 |
+
* @package Codelight\GDPR\Components\DataPage
|
17 |
+
*/
|
18 |
+
class PrivacyToolsPageController
|
19 |
+
{
|
20 |
+
/* @var DataSubjectAuthenticator */
|
21 |
+
protected $dataSubjectAuthenticator;
|
22 |
+
|
23 |
+
/* @var DataSubjectIdentificator */
|
24 |
+
protected $dataSubjectIdentificator;
|
25 |
+
|
26 |
+
/* @var DataSubjectManager */
|
27 |
+
protected $dataSubjectManager;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* DataPageController constructor.
|
31 |
+
*
|
32 |
+
* @param DataSubjectIdentificator $dataSubjectIdentificator
|
33 |
+
* @param DataSubjectManager $dataSubjectManager
|
34 |
+
*/
|
35 |
+
public function __construct(
|
36 |
+
DataSubjectAuthenticator $dataSubjectAuthenticator,
|
37 |
+
DataSubjectIdentificator $dataSubjectIdentificator,
|
38 |
+
DataSubjectManager $dataSubjectManager,
|
39 |
+
DataExporter $dataExporter
|
40 |
+
) {
|
41 |
+
$this->dataSubjectAuthenticator = $dataSubjectAuthenticator;
|
42 |
+
$this->dataSubjectIdentificator = $dataSubjectIdentificator;
|
43 |
+
$this->dataSubjectManager = $dataSubjectManager;
|
44 |
+
$this->dataExporter = $dataExporter;
|
45 |
+
|
46 |
+
if ( ! gdpr('options')->get('enable')) {
|
47 |
+
return;
|
48 |
+
}
|
49 |
+
|
50 |
+
$this->setup();
|
51 |
+
}
|
52 |
+
|
53 |
+
protected function setup()
|
54 |
+
{
|
55 |
+
add_action('wp_enqueue_scripts', [$this, 'enqueue']);
|
56 |
+
|
57 |
+
// Listen to 'identify' action and send an email
|
58 |
+
add_action('gdpr/frontend/action/identify', [$this, 'sendIdentificationEmail']);
|
59 |
+
|
60 |
+
add_action('gdpr/frontend/privacy-tools-page/content', [$this, 'renderConsentForm'], 10, 2);
|
61 |
+
add_action('gdpr/frontend/privacy-tools-page/content', [$this, 'renderExportForm'], 20, 2);
|
62 |
+
add_action('gdpr/frontend/privacy-tools-page/content', [$this, 'renderDeleteForm'], 30, 2);
|
63 |
+
|
64 |
+
add_action('gdpr/frontend/privacy-tools-page/action/withdraw_consent', [$this, 'withdrawConsent'], 10, 2);
|
65 |
+
add_action('gdpr/frontend/privacy-tools-page/action/export', [$this, 'export'], 10, 2);
|
66 |
+
add_action('gdpr/frontend/privacy-tools-page/action/forget', [$this, 'forget'], 10, 2);
|
67 |
+
}
|
68 |
+
|
69 |
+
public function enqueue()
|
70 |
+
{
|
71 |
+
if ( ! gdpr('options')->get('enable_stylesheet') || ! is_page(gdpr('options')->get('tools_page'))) {
|
72 |
+
return;
|
73 |
+
}
|
74 |
+
|
75 |
+
wp_enqueue_style(
|
76 |
+
'gdpr-framework-privacy-tools',
|
77 |
+
gdpr('config')->get('plugin.url') . 'assets/privacy-tools.css'
|
78 |
+
);
|
79 |
+
}
|
80 |
+
|
81 |
+
/**
|
82 |
+
* If the given email address exists as a data subject, send an authentication email to that address
|
83 |
+
*/
|
84 |
+
public function sendIdentificationEmail()
|
85 |
+
{
|
86 |
+
// Additional safety check
|
87 |
+
if ( ! is_email($_REQUEST['email'])) {
|
88 |
+
$this->redirect(['gdpr_notice' => 'invalid_email']);
|
89 |
+
}
|
90 |
+
|
91 |
+
if ($this->dataSubjectIdentificator->isDataSubject($_REQUEST['email'])) {
|
92 |
+
$this->dataSubjectIdentificator->sendIdentificationEmail($_REQUEST['email']);
|
93 |
+
} else {
|
94 |
+
$this->dataSubjectIdentificator->sendNoDataFoundEmail($_REQUEST['email']);
|
95 |
+
}
|
96 |
+
|
97 |
+
$this->redirect(['gdpr_notice' => 'email_sent']);
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Render the page contents.
|
102 |
+
* This is only called via the shortcode.
|
103 |
+
*/
|
104 |
+
public function render()
|
105 |
+
{
|
106 |
+
$dataSubject = $this->dataSubjectAuthenticator->authenticate();
|
107 |
+
$this->renderNotices();
|
108 |
+
|
109 |
+
if ($dataSubject) {
|
110 |
+
$this->renderPrivacyTools($dataSubject);
|
111 |
+
} else {
|
112 |
+
$this->renderIdentificationForm();
|
113 |
+
}
|
114 |
+
}
|
115 |
+
|
116 |
+
/**
|
117 |
+
* Display notices to the user.
|
118 |
+
* The contents of the notices are currently hardcoded inside the template.
|
119 |
+
*/
|
120 |
+
protected function renderNotices()
|
121 |
+
{
|
122 |
+
if ( ! isset($_REQUEST['gdpr_notice'])) {
|
123 |
+
return;
|
124 |
+
}
|
125 |
+
|
126 |
+
echo gdpr('view')->render('privacy-tools/notices');
|
127 |
+
}
|
128 |
+
|
129 |
+
/**
|
130 |
+
* Render the contents of the identification form
|
131 |
+
*/
|
132 |
+
protected function renderIdentificationForm()
|
133 |
+
{
|
134 |
+
$nonce = wp_create_nonce('gdpr/frontend/action/identify');
|
135 |
+
echo gdpr('view')->render('privacy-tools/form-identify', compact('nonce', 'notices'));
|
136 |
+
}
|
137 |
+
|
138 |
+
/**
|
139 |
+
* Render the contents of the Privacy Tools page
|
140 |
+
*
|
141 |
+
* @param DataSubject $dataSubject
|
142 |
+
*/
|
143 |
+
protected function renderPrivacyTools(DataSubject $dataSubject)
|
144 |
+
{
|
145 |
+
$email = $dataSubject->getEmail();
|
146 |
+
echo gdpr('view')->render('privacy-tools/privacy-tools', compact('dataSubject', 'email'));
|
147 |
+
}
|
148 |
+
|
149 |
+
/**
|
150 |
+
* Render the form that allows withdrawing consent
|
151 |
+
*
|
152 |
+
* @param DataSubject $dataSubject
|
153 |
+
*/
|
154 |
+
public function renderConsentForm(DataSubject $dataSubject)
|
155 |
+
{
|
156 |
+
$consentData = $dataSubject->getVisibleConsentData();
|
157 |
+
|
158 |
+
foreach ($consentData as &$item) {
|
159 |
+
$item['withdraw_url'] = add_query_arg([
|
160 |
+
'gdpr_action' => 'withdraw_consent',
|
161 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/frontend/privacy-tools-page/action/withdraw_consent"),
|
162 |
+
'email' => $dataSubject->getEmail(),
|
163 |
+
'consent' => $item['slug'],
|
164 |
+
]);
|
165 |
+
}
|
166 |
+
|
167 |
+
$consentInfo = apply_filters('the_content', gdpr('options')->get('consent_info'));
|
168 |
+
|
169 |
+
echo gdpr('view')->render(
|
170 |
+
"privacy-tools/form-consent",
|
171 |
+
compact('consentData', 'consentInfo')
|
172 |
+
);
|
173 |
+
}
|
174 |
+
|
175 |
+
/**
|
176 |
+
* Render the form that allows the data subject to export their data
|
177 |
+
*
|
178 |
+
* @param DataSubject $dataSubject
|
179 |
+
*/
|
180 |
+
public function renderExportForm(DataSubject $dataSubject)
|
181 |
+
{
|
182 |
+
$email = $dataSubject->getEmail();
|
183 |
+
$nonce = wp_create_nonce("gdpr/frontend/privacy-tools-page/action/export");
|
184 |
+
|
185 |
+
echo gdpr('view')->render(
|
186 |
+
"privacy-tools/form-export",
|
187 |
+
compact('email', 'nonce')
|
188 |
+
);
|
189 |
+
}
|
190 |
+
|
191 |
+
/**
|
192 |
+
* Render the form that allows the data subject to delete their data
|
193 |
+
*
|
194 |
+
* @param DataSubject $dataSubject
|
195 |
+
*/
|
196 |
+
public function renderDeleteForm(DataSubject $dataSubject)
|
197 |
+
{
|
198 |
+
// Let's not allow admins to delete themselves
|
199 |
+
if (current_user_can('manage_options')) {
|
200 |
+
echo gdpr('view')->render("privacy-tools/notice-admin-role");
|
201 |
+
|
202 |
+
return;
|
203 |
+
}
|
204 |
+
|
205 |
+
$action = 'forget';
|
206 |
+
$email = $dataSubject->getEmail();
|
207 |
+
$nonce = wp_create_nonce("gdpr/frontend/privacy-tools-page/action/forget");
|
208 |
+
|
209 |
+
echo gdpr('view')->render(
|
210 |
+
"privacy-tools/form-delete",
|
211 |
+
compact('action', 'email', 'nonce')
|
212 |
+
);
|
213 |
+
}
|
214 |
+
|
215 |
+
/**
|
216 |
+
* Withdraw the consent
|
217 |
+
*
|
218 |
+
* @param DataSubject $dataSubject
|
219 |
+
*/
|
220 |
+
public function withdrawConsent(DataSubject $dataSubject)
|
221 |
+
{
|
222 |
+
$dataSubject->withdrawConsent($_REQUEST['consent']);
|
223 |
+
$this->redirect(['gdpr_notice' => 'consent_withdrawn']);
|
224 |
+
}
|
225 |
+
|
226 |
+
/**
|
227 |
+
* Trigger the export action.
|
228 |
+
*
|
229 |
+
* @param DataSubject $dataSubject
|
230 |
+
*/
|
231 |
+
public function export(DataSubject $dataSubject)
|
232 |
+
{
|
233 |
+
$data = $dataSubject->export($_REQUEST['gdpr_format']);
|
234 |
+
|
235 |
+
if ( ! is_null($data)) {
|
236 |
+
// If there is data, download it
|
237 |
+
$this->dataExporter->export($data, $dataSubject, $_REQUEST['gdpr_format']);
|
238 |
+
} else {
|
239 |
+
// If there's no data, then show notification that your request has been sent.
|
240 |
+
$this->redirect(['gdpr_notice' => 'request_sent']);
|
241 |
+
}
|
242 |
+
}
|
243 |
+
|
244 |
+
/**
|
245 |
+
* Trigger the forget action.
|
246 |
+
*
|
247 |
+
* @param DataSubject $dataSubject
|
248 |
+
*/
|
249 |
+
public function forget(DataSubject $dataSubject)
|
250 |
+
{
|
251 |
+
$deleted = $dataSubject->forget();
|
252 |
+
|
253 |
+
if ($deleted) {
|
254 |
+
$this->dataSubjectAuthenticator->deleteSession();
|
255 |
+
$this->redirect(['gdpr_notice' => 'data_deleted']);
|
256 |
+
} else {
|
257 |
+
// If request was sent to admin, then show notification
|
258 |
+
$this->redirect(['gdpr_notice' => 'request_sent']);
|
259 |
+
}
|
260 |
+
|
261 |
+
}
|
262 |
+
|
263 |
+
/**
|
264 |
+
* Redirect the visitor to an appropriate location
|
265 |
+
*
|
266 |
+
* @param array $args
|
267 |
+
* @param null $baseUrl
|
268 |
+
*/
|
269 |
+
protected function redirect($args = [], $baseUrl = null)
|
270 |
+
{
|
271 |
+
if ( ! $baseUrl) {
|
272 |
+
$baseUrl = get_permalink(gdpr('options')->get('tools_page'));
|
273 |
+
}
|
274 |
+
|
275 |
+
wp_safe_redirect(add_query_arg($args, $baseUrl));
|
276 |
+
exit;
|
277 |
+
}
|
278 |
+
}
|
src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php
CHANGED
@@ -1,45 +1,45 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Components\PrivacyToolsPage;
|
4 |
-
|
5 |
-
class PrivacyToolsPageShortcode
|
6 |
-
{
|
7 |
-
public function __construct(PrivacyToolsPageController $controller)
|
8 |
-
{
|
9 |
-
$this->controller = $controller;
|
10 |
-
|
11 |
-
add_shortcode('gdpr_privacy_tools', [$this, 'renderPage']);
|
12 |
-
add_shortcode('gdpr_privacy_tools_url', [$this, 'renderUrlShortcode']);
|
13 |
-
add_shortcode('gdpr_privacy_tools_link', [$this, 'renderLinkShortcode']);
|
14 |
-
}
|
15 |
-
|
16 |
-
public function renderPage()
|
17 |
-
{
|
18 |
-
if (!gdpr('options')->get('enable')) {
|
19 |
-
return __('This page is currently disabled.', 'gdpr-framework');
|
20 |
-
}
|
21 |
-
|
22 |
-
ob_start();
|
23 |
-
$this->controller->render();
|
24 |
-
return ob_get_clean();
|
25 |
-
}
|
26 |
-
|
27 |
-
public function renderUrlShortcode()
|
28 |
-
{
|
29 |
-
return gdpr('helpers')->getPrivacyToolsPageUrl();
|
30 |
-
}
|
31 |
-
|
32 |
-
public function renderLinkShortcode($attributes)
|
33 |
-
{
|
34 |
-
$attributes = shortcode_atts([
|
35 |
-
'title' => __('Privacy Tools', 'gdpr-framework'),
|
36 |
-
], $attributes);
|
37 |
-
|
38 |
-
$url = gdpr('helpers')->getPrivacyToolsPageUrl();
|
39 |
-
|
40 |
-
return
|
41 |
-
"<a href='{$url}'>" .
|
42 |
-
esc_html($attributes['title']) .
|
43 |
-
"</a>";
|
44 |
-
}
|
45 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Components\PrivacyToolsPage;
|
4 |
+
|
5 |
+
class PrivacyToolsPageShortcode
|
6 |
+
{
|
7 |
+
public function __construct(PrivacyToolsPageController $controller)
|
8 |
+
{
|
9 |
+
$this->controller = $controller;
|
10 |
+
|
11 |
+
add_shortcode('gdpr_privacy_tools', [$this, 'renderPage']);
|
12 |
+
add_shortcode('gdpr_privacy_tools_url', [$this, 'renderUrlShortcode']);
|
13 |
+
add_shortcode('gdpr_privacy_tools_link', [$this, 'renderLinkShortcode']);
|
14 |
+
}
|
15 |
+
|
16 |
+
public function renderPage()
|
17 |
+
{
|
18 |
+
if (!gdpr('options')->get('enable')) {
|
19 |
+
return __('This page is currently disabled.', 'gdpr-framework');
|
20 |
+
}
|
21 |
+
|
22 |
+
ob_start();
|
23 |
+
$this->controller->render();
|
24 |
+
return ob_get_clean();
|
25 |
+
}
|
26 |
+
|
27 |
+
public function renderUrlShortcode()
|
28 |
+
{
|
29 |
+
return gdpr('helpers')->getPrivacyToolsPageUrl();
|
30 |
+
}
|
31 |
+
|
32 |
+
public function renderLinkShortcode($attributes)
|
33 |
+
{
|
34 |
+
$attributes = shortcode_atts([
|
35 |
+
'title' => __('Privacy Tools', 'gdpr-framework'),
|
36 |
+
], $attributes);
|
37 |
+
|
38 |
+
$url = gdpr('helpers')->getPrivacyToolsPageUrl();
|
39 |
+
|
40 |
+
return
|
41 |
+
"<a href='{$url}'>" .
|
42 |
+
esc_html($attributes['title']) .
|
43 |
+
"</a>";
|
44 |
+
}
|
45 |
+
}
|
src/Components/Support/AdminTabSupport.php
CHANGED
@@ -1,34 +1,34 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Components\Support;
|
4 |
-
|
5 |
-
use Codelight\GDPR\Admin\AdminTab;
|
6 |
-
|
7 |
-
class AdminTabSupport extends AdminTab
|
8 |
-
{
|
9 |
-
protected $slug = 'support';
|
10 |
-
|
11 |
-
public function __construct()
|
12 |
-
{
|
13 |
-
$this->title = _x('Support', '(Admin)', 'gdpr-framework');
|
14 |
-
}
|
15 |
-
|
16 |
-
public function init()
|
17 |
-
{
|
18 |
-
$this->registerSettingSection(
|
19 |
-
'gdpr-section-support',
|
20 |
-
_x('Support', '(Admin)', 'gdpr-framework'),
|
21 |
-
[$this, 'renderTab']
|
22 |
-
);
|
23 |
-
}
|
24 |
-
|
25 |
-
public function renderTab()
|
26 |
-
{
|
27 |
-
echo gdpr('view')->render('admin/support/contents');
|
28 |
-
}
|
29 |
-
|
30 |
-
public function renderSubmitButton()
|
31 |
-
{
|
32 |
-
// Intentionally left blank
|
33 |
-
}
|
34 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Components\Support;
|
4 |
+
|
5 |
+
use Codelight\GDPR\Admin\AdminTab;
|
6 |
+
|
7 |
+
class AdminTabSupport extends AdminTab
|
8 |
+
{
|
9 |
+
protected $slug = 'support';
|
10 |
+
|
11 |
+
public function __construct()
|
12 |
+
{
|
13 |
+
$this->title = _x('Support', '(Admin)', 'gdpr-framework');
|
14 |
+
}
|
15 |
+
|
16 |
+
public function init()
|
17 |
+
{
|
18 |
+
$this->registerSettingSection(
|
19 |
+
'gdpr-section-support',
|
20 |
+
_x('Support', '(Admin)', 'gdpr-framework'),
|
21 |
+
[$this, 'renderTab']
|
22 |
+
);
|
23 |
+
}
|
24 |
+
|
25 |
+
public function renderTab()
|
26 |
+
{
|
27 |
+
echo gdpr('view')->render('admin/support/contents');
|
28 |
+
}
|
29 |
+
|
30 |
+
public function renderSubmitButton()
|
31 |
+
{
|
32 |
+
// Intentionally left blank
|
33 |
+
}
|
34 |
+
}
|
src/Components/Support/Support.php
CHANGED
@@ -1,18 +1,18 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Components\Support;
|
4 |
-
|
5 |
-
class Support
|
6 |
-
{
|
7 |
-
public function __construct()
|
8 |
-
{
|
9 |
-
add_filter('gdpr/admin/tabs', [$this, 'registerTab'], 40);
|
10 |
-
}
|
11 |
-
|
12 |
-
public function registerTab($tabs)
|
13 |
-
{
|
14 |
-
$tabs['support'] = gdpr()->make(AdminTabSupport::class);
|
15 |
-
|
16 |
-
return $tabs;
|
17 |
-
}
|
18 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Components\Support;
|
4 |
+
|
5 |
+
class Support
|
6 |
+
{
|
7 |
+
public function __construct()
|
8 |
+
{
|
9 |
+
add_filter('gdpr/admin/tabs', [$this, 'registerTab'], 40);
|
10 |
+
}
|
11 |
+
|
12 |
+
public function registerTab($tabs)
|
13 |
+
{
|
14 |
+
$tabs['support'] = gdpr()->make(AdminTabSupport::class);
|
15 |
+
|
16 |
+
return $tabs;
|
17 |
+
}
|
18 |
+
}
|
src/Components/WordpressComments/WordpressComments.php
CHANGED
@@ -1,173 +1,173 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Components\WordpressComments;
|
4 |
-
|
5 |
-
use Codelight\GDPR\DataSubject\DataSubject;
|
6 |
-
use Codelight\GDPR\DataSubject\DataSubjectManager;
|
7 |
-
|
8 |
-
class WordpressComments
|
9 |
-
{
|
10 |
-
/* @var DataSubjectManager */
|
11 |
-
protected $dataSubjectManager;
|
12 |
-
|
13 |
-
public function __construct(DataSubjectManager $dataSubjectManager)
|
14 |
-
{
|
15 |
-
$this->dataSubjectManager = $dataSubjectManager;
|
16 |
-
|
17 |
-
$this->setup();
|
18 |
-
}
|
19 |
-
|
20 |
-
public function setup()
|
21 |
-
{
|
22 |
-
if (gdpr('options')->get('policy_page')) {
|
23 |
-
add_action('comment_form_after_fields', [$this, 'maybeAddCommentFormCheckbox']);
|
24 |
-
add_action('comment_form_logged_in_after', [$this, 'maybeAddCommentFormCheckbox']);
|
25 |
-
|
26 |
-
add_filter('preprocess_comment', [$this, 'validate']);
|
27 |
-
}
|
28 |
-
|
29 |
-
add_filter('gdpr/data-subject/data', [$this, 'getExportData'], 1, 2);
|
30 |
-
add_action('gdpr/data-subject/delete', [$this, 'deleteComments']);
|
31 |
-
add_action('gdpr/data-subject/anonymize', [$this, 'deleteComments']);
|
32 |
-
}
|
33 |
-
|
34 |
-
/**
|
35 |
-
* Check if consent is needed
|
36 |
-
*
|
37 |
-
* @return bool
|
38 |
-
*/
|
39 |
-
public function needsConsent($email = null)
|
40 |
-
{
|
41 |
-
if ($email) {
|
42 |
-
$dataSubject = $this->dataSubjectManager->getByEmail($email);
|
43 |
-
} else {
|
44 |
-
$dataSubject = $this->dataSubjectManager->getByLoggedInUser();
|
45 |
-
}
|
46 |
-
return !($dataSubject && $dataSubject->hasConsented('privacy-policy'));
|
47 |
-
}
|
48 |
-
|
49 |
-
/**
|
50 |
-
* If consent is needed, render the checkbox
|
51 |
-
*
|
52 |
-
* @param $fields
|
53 |
-
*/
|
54 |
-
public function maybeAddCommentFormCheckbox()
|
55 |
-
{
|
56 |
-
$email = isset($_POST['email']) ? $_POST['email'] : null;
|
57 |
-
|
58 |
-
if (!$this->needsConsent($email)) {
|
59 |
-
return;
|
60 |
-
}
|
61 |
-
|
62 |
-
$privacyPolicyUrl = get_permalink(gdpr('options')->get('policy_page'));
|
63 |
-
$termsPage = gdpr('options')->get('terms_page');
|
64 |
-
if ($termsPage) {
|
65 |
-
$termsUrl = get_permalink($termsPage);
|
66 |
-
} else {
|
67 |
-
$termsUrl = false;
|
68 |
-
}
|
69 |
-
|
70 |
-
echo gdpr('view')->render(
|
71 |
-
'modules/wordpress-comments/terms-checkbox',
|
72 |
-
compact('termsUrl', 'privacyPolicyUrl')
|
73 |
-
);
|
74 |
-
}
|
75 |
-
|
76 |
-
/**
|
77 |
-
* If consent is needed, validate it
|
78 |
-
*/
|
79 |
-
public function validate($commentData)
|
80 |
-
{
|
81 |
-
$email = isset($_POST['email']) ? $_POST['email'] : null;
|
82 |
-
|
83 |
-
if (!$this->needsConsent($email)) {
|
84 |
-
return $commentData;
|
85 |
-
}
|
86 |
-
|
87 |
-
if (!isset($_POST['gdpr_terms']) || !$_POST['gdpr_terms']) {
|
88 |
-
wp_die(
|
89 |
-
sprintf(
|
90 |
-
__('%sERROR:%s You need to accept the terms and conditions to post a comment.'),
|
91 |
-
'<strong>',
|
92 |
-
'</strong>'
|
93 |
-
)
|
94 |
-
);
|
95 |
-
} else {
|
96 |
-
if (is_user_logged_in()) {
|
97 |
-
$dataSubject = $this->dataSubjectManager->getByLoggedInUser();
|
98 |
-
} else {
|
99 |
-
$dataSubject = $this->dataSubjectManager->getByEmail($email);
|
100 |
-
}
|
101 |
-
$dataSubject->giveConsent('privacy-policy');
|
102 |
-
}
|
103 |
-
|
104 |
-
return $commentData;
|
105 |
-
}
|
106 |
-
|
107 |
-
/**
|
108 |
-
* Add comments as well as comment meta to export data
|
109 |
-
*
|
110 |
-
* @param $data
|
111 |
-
* @param $email
|
112 |
-
* @param $dataSubject
|
113 |
-
* @return mixed
|
114 |
-
*/
|
115 |
-
public function getExportData($data, $email)
|
116 |
-
{
|
117 |
-
$comments = $this->getCommentsByEmail($email);
|
118 |
-
|
119 |
-
if (count($comments)) {
|
120 |
-
|
121 |
-
foreach ($comments as $comment) {
|
122 |
-
/* @var $comment \WP_Comment */
|
123 |
-
|
124 |
-
$commentData = [
|
125 |
-
'comment_author' => $comment->comment_author,
|
126 |
-
'comment_author_email' => $comment->comment_author_email,
|
127 |
-
'comment_author_url' => $comment->comment_author_url,
|
128 |
-
'comment_author_IP' => $comment->comment_author_IP,
|
129 |
-
'comment_date' => $comment->comment_date,
|
130 |
-
'comment_date_gmt' => $comment->comment_date_gmt,
|
131 |
-
'comment_content' => $comment->comment_content,
|
132 |
-
'comment_approved' => $comment->comment_approved,
|
133 |
-
'comment_agent' => $comment->comment_agent,
|
134 |
-
];
|
135 |
-
|
136 |
-
$commentMeta = get_comment_meta($comment->comment_ID);
|
137 |
-
if (!empty($commentMeta)) {
|
138 |
-
$commentData['comment_meta'] = $commentMeta;
|
139 |
-
}
|
140 |
-
|
141 |
-
$data['comments'][] = $commentData;
|
142 |
-
}
|
143 |
-
}
|
144 |
-
|
145 |
-
return $data;
|
146 |
-
}
|
147 |
-
|
148 |
-
public function deleteComments($email)
|
149 |
-
{
|
150 |
-
$comments = $this->getCommentsByEmail($email);
|
151 |
-
|
152 |
-
if (!count($comments)) {
|
153 |
-
return;
|
154 |
-
}
|
155 |
-
|
156 |
-
foreach ($comments as $comment) {
|
157 |
-
/* @var $comment \WP_Comment */
|
158 |
-
wp_delete_comment($comment->comment_ID, true);
|
159 |
-
}
|
160 |
-
}
|
161 |
-
|
162 |
-
public function getCommentsByEmail($email)
|
163 |
-
{
|
164 |
-
if (!$email || !is_email($email)) {
|
165 |
-
return [];
|
166 |
-
}
|
167 |
-
|
168 |
-
$query = new \WP_Comment_Query;
|
169 |
-
return $query->query([
|
170 |
-
'author_email' => $email,
|
171 |
-
]);
|
172 |
-
}
|
173 |
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Components\WordpressComments;
|
4 |
+
|
5 |
+
use Codelight\GDPR\DataSubject\DataSubject;
|
6 |
+
use Codelight\GDPR\DataSubject\DataSubjectManager;
|
7 |
+
|
8 |
+
class WordpressComments
|
9 |
+
{
|
10 |
+
/* @var DataSubjectManager */
|
11 |
+
protected $dataSubjectManager;
|
12 |
+
|
13 |
+
public function __construct(DataSubjectManager $dataSubjectManager)
|
14 |
+
{
|
15 |
+
$this->dataSubjectManager = $dataSubjectManager;
|
16 |
+
|
17 |
+
$this->setup();
|
18 |
+
}
|
19 |
+
|
20 |
+
public function setup()
|
21 |
+
{
|
22 |
+
if (gdpr('options')->get('policy_page')) {
|
23 |
+
add_action('comment_form_after_fields', [$this, 'maybeAddCommentFormCheckbox']);
|
24 |
+
add_action('comment_form_logged_in_after', [$this, 'maybeAddCommentFormCheckbox']);
|
25 |
+
|
26 |
+
add_filter('preprocess_comment', [$this, 'validate']);
|
27 |
+
}
|
28 |
+
|
29 |
+
add_filter('gdpr/data-subject/data', [$this, 'getExportData'], 1, 2);
|
30 |
+
add_action('gdpr/data-subject/delete', [$this, 'deleteComments']);
|
31 |
+
add_action('gdpr/data-subject/anonymize', [$this, 'deleteComments']);
|
32 |
+
}
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Check if consent is needed
|
36 |
+
*
|
37 |
+
* @return bool
|
38 |
+
*/
|
39 |
+
public function needsConsent($email = null)
|
40 |
+
{
|
41 |
+
if ($email) {
|
42 |
+
$dataSubject = $this->dataSubjectManager->getByEmail($email);
|
43 |
+
} else {
|
44 |
+
$dataSubject = $this->dataSubjectManager->getByLoggedInUser();
|
45 |
+
}
|
46 |
+
return !($dataSubject && $dataSubject->hasConsented('privacy-policy'));
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* If consent is needed, render the checkbox
|
51 |
+
*
|
52 |
+
* @param $fields
|
53 |
+
*/
|
54 |
+
public function maybeAddCommentFormCheckbox()
|
55 |
+
{
|
56 |
+
$email = isset($_POST['email']) ? $_POST['email'] : null;
|
57 |
+
|
58 |
+
if (!$this->needsConsent($email)) {
|
59 |
+
return;
|
60 |
+
}
|
61 |
+
|
62 |
+
$privacyPolicyUrl = get_permalink(gdpr('options')->get('policy_page'));
|
63 |
+
$termsPage = gdpr('options')->get('terms_page');
|
64 |
+
if ($termsPage) {
|
65 |
+
$termsUrl = get_permalink($termsPage);
|
66 |
+
} else {
|
67 |
+
$termsUrl = false;
|
68 |
+
}
|
69 |
+
|
70 |
+
echo gdpr('view')->render(
|
71 |
+
'modules/wordpress-comments/terms-checkbox',
|
72 |
+
compact('termsUrl', 'privacyPolicyUrl')
|
73 |
+
);
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* If consent is needed, validate it
|
78 |
+
*/
|
79 |
+
public function validate($commentData)
|
80 |
+
{
|
81 |
+
$email = isset($_POST['email']) ? $_POST['email'] : null;
|
82 |
+
|
83 |
+
if (!$this->needsConsent($email)) {
|
84 |
+
return $commentData;
|
85 |
+
}
|
86 |
+
|
87 |
+
if (!isset($_POST['gdpr_terms']) || !$_POST['gdpr_terms']) {
|
88 |
+
wp_die(
|
89 |
+
sprintf(
|
90 |
+
__('%sERROR:%s You need to accept the terms and conditions to post a comment.'),
|
91 |
+
'<strong>',
|
92 |
+
'</strong>'
|
93 |
+
)
|
94 |
+
);
|
95 |
+
} else {
|
96 |
+
if (is_user_logged_in()) {
|
97 |
+
$dataSubject = $this->dataSubjectManager->getByLoggedInUser();
|
98 |
+
} else {
|
99 |
+
$dataSubject = $this->dataSubjectManager->getByEmail($email);
|
100 |
+
}
|
101 |
+
$dataSubject->giveConsent('privacy-policy');
|
102 |
+
}
|
103 |
+
|
104 |
+
return $commentData;
|
105 |
+
}
|
106 |
+
|
107 |
+
/**
|
108 |
+
* Add comments as well as comment meta to export data
|
109 |
+
*
|
110 |
+
* @param $data
|
111 |
+
* @param $email
|
112 |
+
* @param $dataSubject
|
113 |
+
* @return mixed
|
114 |
+
*/
|
115 |
+
public function getExportData($data, $email)
|
116 |
+
{
|
117 |
+
$comments = $this->getCommentsByEmail($email);
|
118 |
+
|
119 |
+
if (count($comments)) {
|
120 |
+
|
121 |
+
foreach ($comments as $comment) {
|
122 |
+
/* @var $comment \WP_Comment */
|
123 |
+
|
124 |
+
$commentData = [
|
125 |
+
'comment_author' => $comment->comment_author,
|
126 |
+
'comment_author_email' => $comment->comment_author_email,
|
127 |
+
'comment_author_url' => $comment->comment_author_url,
|
128 |
+
'comment_author_IP' => $comment->comment_author_IP,
|
129 |
+
'comment_date' => $comment->comment_date,
|
130 |
+
'comment_date_gmt' => $comment->comment_date_gmt,
|
131 |
+
'comment_content' => $comment->comment_content,
|
132 |
+
'comment_approved' => $comment->comment_approved,
|
133 |
+
'comment_agent' => $comment->comment_agent,
|
134 |
+
];
|
135 |
+
|
136 |
+
$commentMeta = get_comment_meta($comment->comment_ID);
|
137 |
+
if (!empty($commentMeta)) {
|
138 |
+
$commentData['comment_meta'] = $commentMeta;
|
139 |
+
}
|
140 |
+
|
141 |
+
$data['comments'][] = $commentData;
|
142 |
+
}
|
143 |
+
}
|
144 |
+
|
145 |
+
return $data;
|
146 |
+
}
|
147 |
+
|
148 |
+
public function deleteComments($email)
|
149 |
+
{
|
150 |
+
$comments = $this->getCommentsByEmail($email);
|
151 |
+
|
152 |
+
if (!count($comments)) {
|
153 |
+
return;
|
154 |
+
}
|
155 |
+
|
156 |
+
foreach ($comments as $comment) {
|
157 |
+
/* @var $comment \WP_Comment */
|
158 |
+
wp_delete_comment($comment->comment_ID, true);
|
159 |
+
}
|
160 |
+
}
|
161 |
+
|
162 |
+
public function getCommentsByEmail($email)
|
163 |
+
{
|
164 |
+
if (!$email || !is_email($email)) {
|
165 |
+
return [];
|
166 |
+
}
|
167 |
+
|
168 |
+
$query = new \WP_Comment_Query;
|
169 |
+
return $query->query([
|
170 |
+
'author_email' => $email,
|
171 |
+
]);
|
172 |
+
}
|
173 |
}
|
src/Components/WordpressUser/Controllers/DashboardDataPageController.php
CHANGED
@@ -1,197 +1,197 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Components\WordpressUser\Controllers;
|
4 |
-
|
5 |
-
use Codelight\GDPR\DataSubject\DataExporter;
|
6 |
-
use Codelight\GDPR\DataSubject\DataSubject;
|
7 |
-
use Codelight\GDPR\DataSubject\DataSubjectAuthenticator;
|
8 |
-
|
9 |
-
/**
|
10 |
-
* Handles Users > Privacy Tools page
|
11 |
-
*
|
12 |
-
* Class DashboardDataPageController
|
13 |
-
*
|
14 |
-
* @package Codelight\GDPR\Modules\WordpressUser\Controllers
|
15 |
-
*/
|
16 |
-
class DashboardDataPageController
|
17 |
-
{
|
18 |
-
/**
|
19 |
-
* DashboardDataPageController constructor.
|
20 |
-
*
|
21 |
-
* @param DataExporter $dataExporter
|
22 |
-
*/
|
23 |
-
public function __construct(DataExporter $dataExporter, DataSubjectAuthenticator $dataSubjectAuthenticator)
|
24 |
-
{
|
25 |
-
$this->dataExporter = $dataExporter;
|
26 |
-
$this->dataSubjectAuthenticator = $dataSubjectAuthenticator;
|
27 |
-
|
28 |
-
add_action('gdpr/dashboard/privacy-tools/content', [$this, 'renderHeader'], 10);
|
29 |
-
add_action('gdpr/dashboard/privacy-tools/content', [$this, 'renderConsentForm'], 20);
|
30 |
-
add_action('gdpr/dashboard/privacy-tools/content', [$this, 'renderExportForm'], 30);
|
31 |
-
add_action('gdpr/dashboard/privacy-tools/content', [$this, 'renderDeleteForm'], 40);
|
32 |
-
|
33 |
-
add_action('gdpr/dashboard/privacy-tools/action/withdraw_consent', [$this, 'withdrawConsent']);
|
34 |
-
add_action('gdpr/dashboard/privacy-tools/action/export', [$this, 'export']);
|
35 |
-
add_action('gdpr/dashboard/privacy-tools/action/forget', [$this, 'forget']);
|
36 |
-
|
37 |
-
add_action('admin_notices', [$this, 'renderAdminNotices']);
|
38 |
-
}
|
39 |
-
|
40 |
-
/**
|
41 |
-
* Render success notices via admin_notice action
|
42 |
-
*/
|
43 |
-
public function renderAdminNotices()
|
44 |
-
{
|
45 |
-
if ('profile_page_gdpr-profile' !== get_current_screen()->base) {
|
46 |
-
return;
|
47 |
-
}
|
48 |
-
|
49 |
-
if (!isset($_REQUEST['gdpr_notice'])) {
|
50 |
-
return;
|
51 |
-
}
|
52 |
-
|
53 |
-
if ('request_sent' === $_REQUEST['gdpr_notice']) {
|
54 |
-
$message = __('We have received your request and will reply within 30 days.', 'gdpr-framework');
|
55 |
-
$class = 'notice notice-success';
|
56 |
-
}
|
57 |
-
|
58 |
-
if ('consent_withdrawn' === $_REQUEST['gdpr_notice']) {
|
59 |
-
$message = __('Consent withdrawn.', 'gdpr-framework');
|
60 |
-
$class = 'notice notice-success';
|
61 |
-
}
|
62 |
-
|
63 |
-
echo gdpr('view')->render('admin/notice', compact('message', 'class'));
|
64 |
-
}
|
65 |
-
|
66 |
-
/**
|
67 |
-
* Render page header
|
68 |
-
*/
|
69 |
-
public function renderHeader()
|
70 |
-
{
|
71 |
-
echo gdpr('view')->render(
|
72 |
-
"modules/wordpress-user/dashboard/data-page/header"
|
73 |
-
);
|
74 |
-
}
|
75 |
-
|
76 |
-
/**
|
77 |
-
* Render the consent form
|
78 |
-
*
|
79 |
-
* @param DataSubject $dataSubject
|
80 |
-
*/
|
81 |
-
public function renderConsentForm(DataSubject $dataSubject)
|
82 |
-
{
|
83 |
-
$consentData = $dataSubject->getVisibleConsentData();
|
84 |
-
|
85 |
-
foreach ($consentData as &$item) {
|
86 |
-
$item['withdraw_url'] = add_query_arg([
|
87 |
-
'gdpr_action' => 'withdraw_consent',
|
88 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/dashboard/privacy-tools/action/withdraw_consent"),
|
89 |
-
'email' => $dataSubject->getEmail(),
|
90 |
-
'consent' => $item['slug'],
|
91 |
-
]);
|
92 |
-
}
|
93 |
-
|
94 |
-
$consentInfo = apply_filters('the_content', gdpr('options')->get('consent_info'));
|
95 |
-
|
96 |
-
echo gdpr('view')->render(
|
97 |
-
"modules/wordpress-user/dashboard/data-page/form-consent",
|
98 |
-
compact('consentData', 'consentInfo')
|
99 |
-
);
|
100 |
-
}
|
101 |
-
|
102 |
-
/**
|
103 |
-
* Render the buttons that allow exporting data
|
104 |
-
*/
|
105 |
-
public function renderExportForm()
|
106 |
-
{
|
107 |
-
$exportHTMLUrl = add_query_arg([
|
108 |
-
'gdpr_action' => 'export',
|
109 |
-
'gdpr_format' => 'html',
|
110 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/dashboard/privacy-tools/action/export"),
|
111 |
-
]);
|
112 |
-
|
113 |
-
$exportJSONUrl = add_query_arg([
|
114 |
-
'gdpr_action' => 'export',
|
115 |
-
'gdpr_format' => 'json',
|
116 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/dashboard/privacy-tools/action/export"),
|
117 |
-
]);
|
118 |
-
|
119 |
-
echo gdpr('view')->render(
|
120 |
-
"modules/wordpress-user/dashboard/form-export",
|
121 |
-
compact('exportHTMLUrl', 'exportJSONUrl')
|
122 |
-
);
|
123 |
-
}
|
124 |
-
|
125 |
-
/**
|
126 |
-
* Render the delete data button
|
127 |
-
*/
|
128 |
-
public function renderDeleteForm()
|
129 |
-
{
|
130 |
-
$showDelete = !current_user_can('manage_options');
|
131 |
-
$url = add_query_arg([
|
132 |
-
'gdpr_action' => 'forget',
|
133 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/dashboard/privacy-tools/action/forget"),
|
134 |
-
]);
|
135 |
-
|
136 |
-
echo gdpr('view')->render(
|
137 |
-
"modules/wordpress-user/dashboard/data-page/form-delete",
|
138 |
-
compact('url', 'showDelete')
|
139 |
-
);
|
140 |
-
}
|
141 |
-
|
142 |
-
/**
|
143 |
-
* @param DataSubject $dataSubject
|
144 |
-
*/
|
145 |
-
public function withdrawConsent(DataSubject $dataSubject)
|
146 |
-
{
|
147 |
-
$dataSubject->withdrawConsent($_REQUEST['consent']);
|
148 |
-
$this->redirect(['gdpr_notice' => 'consent_withdrawn']);
|
149 |
-
}
|
150 |
-
|
151 |
-
/**
|
152 |
-
* @param DataSubject $dataSubject
|
153 |
-
*/
|
154 |
-
public function export(DataSubject $dataSubject)
|
155 |
-
{
|
156 |
-
$data = $dataSubject->export($_REQUEST['gdpr_format']);
|
157 |
-
|
158 |
-
if (!is_null($data)) {
|
159 |
-
// If there is data, download it
|
160 |
-
$this->dataExporter->export($data, $dataSubject, $_REQUEST['gdpr_format']);
|
161 |
-
} else {
|
162 |
-
// If there's no data, then show notification that your request has been sent.
|
163 |
-
$this->redirect(['gdpr_notice' => 'request_sent']);
|
164 |
-
}
|
165 |
-
}
|
166 |
-
|
167 |
-
/**
|
168 |
-
* @param DataSubject $dataSubject
|
169 |
-
*/
|
170 |
-
public function forget(DataSubject $dataSubject)
|
171 |
-
{
|
172 |
-
$status = $dataSubject->forget();
|
173 |
-
|
174 |
-
if (!$status) {
|
175 |
-
$this->redirect(['gdpr_notice' => 'request_sent']);
|
176 |
-
} else {
|
177 |
-
$this->dataSubjectAuthenticator->deleteSession();
|
178 |
-
$this->redirect([], '/');
|
179 |
-
}
|
180 |
-
}
|
181 |
-
|
182 |
-
/**
|
183 |
-
* Redirect the visitor to an appropriate location
|
184 |
-
*
|
185 |
-
* @param array $args
|
186 |
-
* @param null $baseUrl
|
187 |
-
*/
|
188 |
-
protected function redirect($args = [], $baseUrl = null)
|
189 |
-
{
|
190 |
-
if (!$baseUrl) {
|
191 |
-
$baseUrl = gdpr('helpers')->getDashboardDataPageUrl();
|
192 |
-
}
|
193 |
-
|
194 |
-
wp_safe_redirect(add_query_arg($args, $baseUrl));
|
195 |
-
exit;
|
196 |
-
}
|
197 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Components\WordpressUser\Controllers;
|
4 |
+
|
5 |
+
use Codelight\GDPR\DataSubject\DataExporter;
|
6 |
+
use Codelight\GDPR\DataSubject\DataSubject;
|
7 |
+
use Codelight\GDPR\DataSubject\DataSubjectAuthenticator;
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Handles Users > Privacy Tools page
|
11 |
+
*
|
12 |
+
* Class DashboardDataPageController
|
13 |
+
*
|
14 |
+
* @package Codelight\GDPR\Modules\WordpressUser\Controllers
|
15 |
+
*/
|
16 |
+
class DashboardDataPageController
|
17 |
+
{
|
18 |
+
/**
|
19 |
+
* DashboardDataPageController constructor.
|
20 |
+
*
|
21 |
+
* @param DataExporter $dataExporter
|
22 |
+
*/
|
23 |
+
public function __construct(DataExporter $dataExporter, DataSubjectAuthenticator $dataSubjectAuthenticator)
|
24 |
+
{
|
25 |
+
$this->dataExporter = $dataExporter;
|
26 |
+
$this->dataSubjectAuthenticator = $dataSubjectAuthenticator;
|
27 |
+
|
28 |
+
add_action('gdpr/dashboard/privacy-tools/content', [$this, 'renderHeader'], 10);
|
29 |
+
add_action('gdpr/dashboard/privacy-tools/content', [$this, 'renderConsentForm'], 20);
|
30 |
+
add_action('gdpr/dashboard/privacy-tools/content', [$this, 'renderExportForm'], 30);
|
31 |
+
add_action('gdpr/dashboard/privacy-tools/content', [$this, 'renderDeleteForm'], 40);
|
32 |
+
|
33 |
+
add_action('gdpr/dashboard/privacy-tools/action/withdraw_consent', [$this, 'withdrawConsent']);
|
34 |
+
add_action('gdpr/dashboard/privacy-tools/action/export', [$this, 'export']);
|
35 |
+
add_action('gdpr/dashboard/privacy-tools/action/forget', [$this, 'forget']);
|
36 |
+
|
37 |
+
add_action('admin_notices', [$this, 'renderAdminNotices']);
|
38 |
+
}
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Render success notices via admin_notice action
|
42 |
+
*/
|
43 |
+
public function renderAdminNotices()
|
44 |
+
{
|
45 |
+
if ('profile_page_gdpr-profile' !== get_current_screen()->base) {
|
46 |
+
return;
|
47 |
+
}
|
48 |
+
|
49 |
+
if (!isset($_REQUEST['gdpr_notice'])) {
|
50 |
+
return;
|
51 |
+
}
|
52 |
+
|
53 |
+
if ('request_sent' === $_REQUEST['gdpr_notice']) {
|
54 |
+
$message = __('We have received your request and will reply within 30 days.', 'gdpr-framework');
|
55 |
+
$class = 'notice notice-success';
|
56 |
+
}
|
57 |
+
|
58 |
+
if ('consent_withdrawn' === $_REQUEST['gdpr_notice']) {
|
59 |
+
$message = __('Consent withdrawn.', 'gdpr-framework');
|
60 |
+
$class = 'notice notice-success';
|
61 |
+
}
|
62 |
+
|
63 |
+
echo gdpr('view')->render('admin/notice', compact('message', 'class'));
|
64 |
+
}
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Render page header
|
68 |
+
*/
|
69 |
+
public function renderHeader()
|
70 |
+
{
|
71 |
+
echo gdpr('view')->render(
|
72 |
+
"modules/wordpress-user/dashboard/data-page/header"
|
73 |
+
);
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Render the consent form
|
78 |
+
*
|
79 |
+
* @param DataSubject $dataSubject
|
80 |
+
*/
|
81 |
+
public function renderConsentForm(DataSubject $dataSubject)
|
82 |
+
{
|
83 |
+
$consentData = $dataSubject->getVisibleConsentData();
|
84 |
+
|
85 |
+
foreach ($consentData as &$item) {
|
86 |
+
$item['withdraw_url'] = add_query_arg([
|
87 |
+
'gdpr_action' => 'withdraw_consent',
|
88 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/dashboard/privacy-tools/action/withdraw_consent"),
|
89 |
+
'email' => $dataSubject->getEmail(),
|
90 |
+
'consent' => $item['slug'],
|
91 |
+
]);
|
92 |
+
}
|
93 |
+
|
94 |
+
$consentInfo = apply_filters('the_content', gdpr('options')->get('consent_info'));
|
95 |
+
|
96 |
+
echo gdpr('view')->render(
|
97 |
+
"modules/wordpress-user/dashboard/data-page/form-consent",
|
98 |
+
compact('consentData', 'consentInfo')
|
99 |
+
);
|
100 |
+
}
|
101 |
+
|
102 |
+
/**
|
103 |
+
* Render the buttons that allow exporting data
|
104 |
+
*/
|
105 |
+
public function renderExportForm()
|
106 |
+
{
|
107 |
+
$exportHTMLUrl = add_query_arg([
|
108 |
+
'gdpr_action' => 'export',
|
109 |
+
'gdpr_format' => 'html',
|
110 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/dashboard/privacy-tools/action/export"),
|
111 |
+
]);
|
112 |
+
|
113 |
+
$exportJSONUrl = add_query_arg([
|
114 |
+
'gdpr_action' => 'export',
|
115 |
+
'gdpr_format' => 'json',
|
116 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/dashboard/privacy-tools/action/export"),
|
117 |
+
]);
|
118 |
+
|
119 |
+
echo gdpr('view')->render(
|
120 |
+
"modules/wordpress-user/dashboard/form-export",
|
121 |
+
compact('exportHTMLUrl', 'exportJSONUrl')
|
122 |
+
);
|
123 |
+
}
|
124 |
+
|
125 |
+
/**
|
126 |
+
* Render the delete data button
|
127 |
+
*/
|
128 |
+
public function renderDeleteForm()
|
129 |
+
{
|
130 |
+
$showDelete = !current_user_can('manage_options');
|
131 |
+
$url = add_query_arg([
|
132 |
+
'gdpr_action' => 'forget',
|
133 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/dashboard/privacy-tools/action/forget"),
|
134 |
+
]);
|
135 |
+
|
136 |
+
echo gdpr('view')->render(
|
137 |
+
"modules/wordpress-user/dashboard/data-page/form-delete",
|
138 |
+
compact('url', 'showDelete')
|
139 |
+
);
|
140 |
+
}
|
141 |
+
|
142 |
+
/**
|
143 |
+
* @param DataSubject $dataSubject
|
144 |
+
*/
|
145 |
+
public function withdrawConsent(DataSubject $dataSubject)
|
146 |
+
{
|
147 |
+
$dataSubject->withdrawConsent($_REQUEST['consent']);
|
148 |
+
$this->redirect(['gdpr_notice' => 'consent_withdrawn']);
|
149 |
+
}
|
150 |
+
|
151 |
+
/**
|
152 |
+
* @param DataSubject $dataSubject
|
153 |
+
*/
|
154 |
+
public function export(DataSubject $dataSubject)
|
155 |
+
{
|
156 |
+
$data = $dataSubject->export($_REQUEST['gdpr_format']);
|
157 |
+
|
158 |
+
if (!is_null($data)) {
|
159 |
+
// If there is data, download it
|
160 |
+
$this->dataExporter->export($data, $dataSubject, $_REQUEST['gdpr_format']);
|
161 |
+
} else {
|
162 |
+
// If there's no data, then show notification that your request has been sent.
|
163 |
+
$this->redirect(['gdpr_notice' => 'request_sent']);
|
164 |
+
}
|
165 |
+
}
|
166 |
+
|
167 |
+
/**
|
168 |
+
* @param DataSubject $dataSubject
|
169 |
+
*/
|
170 |
+
public function forget(DataSubject $dataSubject)
|
171 |
+
{
|
172 |
+
$status = $dataSubject->forget();
|
173 |
+
|
174 |
+
if (!$status) {
|
175 |
+
$this->redirect(['gdpr_notice' => 'request_sent']);
|
176 |
+
} else {
|
177 |
+
$this->dataSubjectAuthenticator->deleteSession();
|
178 |
+
$this->redirect([], '/');
|
179 |
+
}
|
180 |
+
}
|
181 |
+
|
182 |
+
/**
|
183 |
+
* Redirect the visitor to an appropriate location
|
184 |
+
*
|
185 |
+
* @param array $args
|
186 |
+
* @param null $baseUrl
|
187 |
+
*/
|
188 |
+
protected function redirect($args = [], $baseUrl = null)
|
189 |
+
{
|
190 |
+
if (!$baseUrl) {
|
191 |
+
$baseUrl = gdpr('helpers')->getDashboardDataPageUrl();
|
192 |
+
}
|
193 |
+
|
194 |
+
wp_safe_redirect(add_query_arg($args, $baseUrl));
|
195 |
+
exit;
|
196 |
+
}
|
197 |
+
}
|
src/Components/WordpressUser/Controllers/DashboardProfilePageController.php
CHANGED
@@ -1,123 +1,123 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Components\WordpressUser\Controllers;
|
4 |
-
|
5 |
-
use Codelight\GDPR\DataSubject\DataExporter;
|
6 |
-
use Codelight\GDPR\DataSubject\DataSubject;
|
7 |
-
use Codelight\GDPR\DataSubject\DataSubjectManager;
|
8 |
-
|
9 |
-
class DashboardProfilePageController
|
10 |
-
{
|
11 |
-
public function __construct(DataSubjectManager $dataSubjectManager, DataExporter $dataExporter)
|
12 |
-
{
|
13 |
-
$this->dataSubjectManager = $dataSubjectManager;
|
14 |
-
$this->dataExporter = $dataExporter;
|
15 |
-
|
16 |
-
add_action('gdpr/dashboard/profile-page/content', [$this, 'renderHeader'], 10);
|
17 |
-
add_action('gdpr/dashboard/profile-page/content', [$this, 'renderConsentTable'], 20);
|
18 |
-
add_action('gdpr/dashboard/profile-page/content', [$this, 'renderExportForm'], 30);
|
19 |
-
add_action('gdpr/dashboard/profile-page/content', [$this, 'renderDeleteForm'], 40);
|
20 |
-
|
21 |
-
add_action('gdpr/admin/action/export', [$this, 'export']);
|
22 |
-
add_action('gdpr/admin/action/forget', [$this, 'forget']);
|
23 |
-
}
|
24 |
-
|
25 |
-
protected function isUserAnonymized(DataSubject $dataSubject)
|
26 |
-
{
|
27 |
-
return !$dataSubject->getEmail();
|
28 |
-
}
|
29 |
-
|
30 |
-
public function renderHeader(DataSubject $dataSubject)
|
31 |
-
{
|
32 |
-
$isAnonymized = $this->isUserAnonymized($dataSubject);
|
33 |
-
|
34 |
-
echo gdpr('view')->render(
|
35 |
-
"modules/wordpress-user/dashboard/profile-page/header",
|
36 |
-
compact('isAnonymized')
|
37 |
-
);
|
38 |
-
}
|
39 |
-
|
40 |
-
public function renderConsentTable(DataSubject $dataSubject)
|
41 |
-
{
|
42 |
-
if ($this->isUserAnonymized($dataSubject)) {
|
43 |
-
return;
|
44 |
-
}
|
45 |
-
|
46 |
-
$consentData = $dataSubject->getConsentData();
|
47 |
-
|
48 |
-
echo gdpr('view')->render(
|
49 |
-
"modules/wordpress-user/dashboard/profile-page/table-consent",
|
50 |
-
compact('consentData')
|
51 |
-
);
|
52 |
-
}
|
53 |
-
|
54 |
-
public function renderExportForm(DataSubject $dataSubject)
|
55 |
-
{
|
56 |
-
if ($this->isUserAnonymized($dataSubject)) {
|
57 |
-
return;
|
58 |
-
}
|
59 |
-
|
60 |
-
$exportHTMLUrl = add_query_arg([
|
61 |
-
'gdpr_action' => 'export',
|
62 |
-
'gdpr_format' => 'html',
|
63 |
-
'gdpr_email' => $dataSubject->getEmail(),
|
64 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/export"),
|
65 |
-
]);
|
66 |
-
|
67 |
-
$exportJSONUrl = add_query_arg([
|
68 |
-
'gdpr_action' => 'export',
|
69 |
-
'gdpr_format' => 'json',
|
70 |
-
'gdpr_email' => $dataSubject->getEmail(),
|
71 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/export"),
|
72 |
-
]);
|
73 |
-
|
74 |
-
echo gdpr('view')->render(
|
75 |
-
"modules/wordpress-user/dashboard/form-export",
|
76 |
-
compact('exportHTMLUrl', 'exportJSONUrl')
|
77 |
-
);
|
78 |
-
}
|
79 |
-
|
80 |
-
public function renderDeleteForm(DataSubject $dataSubject)
|
81 |
-
{
|
82 |
-
if ($this->isUserAnonymized($dataSubject)) {
|
83 |
-
return;
|
84 |
-
}
|
85 |
-
|
86 |
-
// Hide the delete button away from site admins on their own profile page to avoid accidents
|
87 |
-
$showDelete = !(current_user_can('manage_options') && wp_get_current_user()->ID === $dataSubject->getUserId());
|
88 |
-
|
89 |
-
$anonymizeUrl = add_query_arg([
|
90 |
-
'gdpr_email' => $dataSubject->getEmail(),
|
91 |
-
'gdpr_action' => 'forget',
|
92 |
-
'gdpr_force_action' => 'anonymize',
|
93 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/forget"),
|
94 |
-
]);
|
95 |
-
|
96 |
-
$deleteUrl = add_query_arg([
|
97 |
-
'gdpr_email' => $dataSubject->getEmail(),
|
98 |
-
'gdpr_action' => 'forget',
|
99 |
-
'gdpr_force_action' => 'delete',
|
100 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/forget"),
|
101 |
-
]);
|
102 |
-
|
103 |
-
echo gdpr('view')->render(
|
104 |
-
"modules/wordpress-user/dashboard/profile-page/form-delete",
|
105 |
-
compact('anonymizeUrl', 'deleteUrl', 'showDelete')
|
106 |
-
);
|
107 |
-
}
|
108 |
-
|
109 |
-
public function export()
|
110 |
-
{
|
111 |
-
$dataSubject = $this->dataSubjectManager->getByEmail($_REQUEST['gdpr_email']);
|
112 |
-
$data = $dataSubject->export($_REQUEST['gdpr_format'], true);
|
113 |
-
$this->dataExporter->export($data, $dataSubject, $_REQUEST['gdpr_format']);
|
114 |
-
}
|
115 |
-
|
116 |
-
public function forget()
|
117 |
-
{
|
118 |
-
$dataSubject = $this->dataSubjectManager->getByEmail($_REQUEST['gdpr_email']);
|
119 |
-
$dataSubject->forget($_REQUEST['gdpr_force_action']);
|
120 |
-
|
121 |
-
wp_safe_redirect(admin_url('users.php'));
|
122 |
-
}
|
123 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Components\WordpressUser\Controllers;
|
4 |
+
|
5 |
+
use Codelight\GDPR\DataSubject\DataExporter;
|
6 |
+
use Codelight\GDPR\DataSubject\DataSubject;
|
7 |
+
use Codelight\GDPR\DataSubject\DataSubjectManager;
|
8 |
+
|
9 |
+
class DashboardProfilePageController
|
10 |
+
{
|
11 |
+
public function __construct(DataSubjectManager $dataSubjectManager, DataExporter $dataExporter)
|
12 |
+
{
|
13 |
+
$this->dataSubjectManager = $dataSubjectManager;
|
14 |
+
$this->dataExporter = $dataExporter;
|
15 |
+
|
16 |
+
add_action('gdpr/dashboard/profile-page/content', [$this, 'renderHeader'], 10);
|
17 |
+
add_action('gdpr/dashboard/profile-page/content', [$this, 'renderConsentTable'], 20);
|
18 |
+
add_action('gdpr/dashboard/profile-page/content', [$this, 'renderExportForm'], 30);
|
19 |
+
add_action('gdpr/dashboard/profile-page/content', [$this, 'renderDeleteForm'], 40);
|
20 |
+
|
21 |
+
add_action('gdpr/admin/action/export', [$this, 'export']);
|
22 |
+
add_action('gdpr/admin/action/forget', [$this, 'forget']);
|
23 |
+
}
|
24 |
+
|
25 |
+
protected function isUserAnonymized(DataSubject $dataSubject)
|
26 |
+
{
|
27 |
+
return !$dataSubject->getEmail();
|
28 |
+
}
|
29 |
+
|
30 |
+
public function renderHeader(DataSubject $dataSubject)
|
31 |
+
{
|
32 |
+
$isAnonymized = $this->isUserAnonymized($dataSubject);
|
33 |
+
|
34 |
+
echo gdpr('view')->render(
|
35 |
+
"modules/wordpress-user/dashboard/profile-page/header",
|
36 |
+
compact('isAnonymized')
|
37 |
+
);
|
38 |
+
}
|
39 |
+
|
40 |
+
public function renderConsentTable(DataSubject $dataSubject)
|
41 |
+
{
|
42 |
+
if ($this->isUserAnonymized($dataSubject)) {
|
43 |
+
return;
|
44 |
+
}
|
45 |
+
|
46 |
+
$consentData = $dataSubject->getConsentData();
|
47 |
+
|
48 |
+
echo gdpr('view')->render(
|
49 |
+
"modules/wordpress-user/dashboard/profile-page/table-consent",
|
50 |
+
compact('consentData')
|
51 |
+
);
|
52 |
+
}
|
53 |
+
|
54 |
+
public function renderExportForm(DataSubject $dataSubject)
|
55 |
+
{
|
56 |
+
if ($this->isUserAnonymized($dataSubject)) {
|
57 |
+
return;
|
58 |
+
}
|
59 |
+
|
60 |
+
$exportHTMLUrl = add_query_arg([
|
61 |
+
'gdpr_action' => 'export',
|
62 |
+
'gdpr_format' => 'html',
|
63 |
+
'gdpr_email' => $dataSubject->getEmail(),
|
64 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/export"),
|
65 |
+
]);
|
66 |
+
|
67 |
+
$exportJSONUrl = add_query_arg([
|
68 |
+
'gdpr_action' => 'export',
|
69 |
+
'gdpr_format' => 'json',
|
70 |
+
'gdpr_email' => $dataSubject->getEmail(),
|
71 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/export"),
|
72 |
+
]);
|
73 |
+
|
74 |
+
echo gdpr('view')->render(
|
75 |
+
"modules/wordpress-user/dashboard/form-export",
|
76 |
+
compact('exportHTMLUrl', 'exportJSONUrl')
|
77 |
+
);
|
78 |
+
}
|
79 |
+
|
80 |
+
public function renderDeleteForm(DataSubject $dataSubject)
|
81 |
+
{
|
82 |
+
if ($this->isUserAnonymized($dataSubject)) {
|
83 |
+
return;
|
84 |
+
}
|
85 |
+
|
86 |
+
// Hide the delete button away from site admins on their own profile page to avoid accidents
|
87 |
+
$showDelete = !(current_user_can('manage_options') && wp_get_current_user()->ID === $dataSubject->getUserId());
|
88 |
+
|
89 |
+
$anonymizeUrl = add_query_arg([
|
90 |
+
'gdpr_email' => $dataSubject->getEmail(),
|
91 |
+
'gdpr_action' => 'forget',
|
92 |
+
'gdpr_force_action' => 'anonymize',
|
93 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/forget"),
|
94 |
+
]);
|
95 |
+
|
96 |
+
$deleteUrl = add_query_arg([
|
97 |
+
'gdpr_email' => $dataSubject->getEmail(),
|
98 |
+
'gdpr_action' => 'forget',
|
99 |
+
'gdpr_force_action' => 'delete',
|
100 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/forget"),
|
101 |
+
]);
|
102 |
+
|
103 |
+
echo gdpr('view')->render(
|
104 |
+
"modules/wordpress-user/dashboard/profile-page/form-delete",
|
105 |
+
compact('anonymizeUrl', 'deleteUrl', 'showDelete')
|
106 |
+
);
|
107 |
+
}
|
108 |
+
|
109 |
+
public function export()
|
110 |
+
{
|
111 |
+
$dataSubject = $this->dataSubjectManager->getByEmail($_REQUEST['gdpr_email']);
|
112 |
+
$data = $dataSubject->export($_REQUEST['gdpr_format'], true);
|
113 |
+
$this->dataExporter->export($data, $dataSubject, $_REQUEST['gdpr_format']);
|
114 |
+
}
|
115 |
+
|
116 |
+
public function forget()
|
117 |
+
{
|
118 |
+
$dataSubject = $this->dataSubjectManager->getByEmail($_REQUEST['gdpr_email']);
|
119 |
+
$dataSubject->forget($_REQUEST['gdpr_force_action']);
|
120 |
+
|
121 |
+
wp_safe_redirect(admin_url('users.php'));
|
122 |
+
}
|
123 |
+
}
|
src/Components/WordpressUser/DataManager.php
CHANGED
@@ -1,151 +1,151 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Components\WordpressUser;
|
4 |
-
|
5 |
-
use Codelight\GDPR\DataSubject\DataSubject;
|
6 |
-
|
7 |
-
class DataManager
|
8 |
-
{
|
9 |
-
public function getData(DataSubject $dataSubject)
|
10 |
-
{
|
11 |
-
$user = $dataSubject->getUser();
|
12 |
-
if ($user) {
|
13 |
-
$meta = get_user_meta($user->ID);
|
14 |
-
$data['meta'] = $meta;
|
15 |
-
} else {
|
16 |
-
$data = [];
|
17 |
-
}
|
18 |
-
|
19 |
-
$whitelist = [
|
20 |
-
'nickname',
|
21 |
-
'first_name',
|
22 |
-
'last_name',
|
23 |
-
'description',
|
24 |
-
'locale',
|
25 |
-
'community-events-location',
|
26 |
-
];
|
27 |
-
|
28 |
-
if (isset($data['meta']) && count($data['meta'])) {
|
29 |
-
foreach ($data['meta'] as $key => $value) {
|
30 |
-
if (!in_array($key, $whitelist)) {
|
31 |
-
unset($data['meta'][$key]);
|
32 |
-
}
|
33 |
-
}
|
34 |
-
}
|
35 |
-
|
36 |
-
// Remove session keys. Just in case.
|
37 |
-
if (isset($meta) && isset($meta['session_tokens']) && count($meta['session_tokens'])) {
|
38 |
-
foreach ($meta['session_tokens'] as $token) {
|
39 |
-
foreach (unserialize($token) as $key => $tokenData) {
|
40 |
-
$data['meta']['session_tokens'][] = $tokenData;
|
41 |
-
}
|
42 |
-
}
|
43 |
-
}
|
44 |
-
|
45 |
-
/*
|
46 |
-
$blacklist = [
|
47 |
-
'use_ssl',
|
48 |
-
'show_admin_bar_front',
|
49 |
-
'wp_capabilities',
|
50 |
-
'wp_user_level',
|
51 |
-
'dismissed_wp_pointers',
|
52 |
-
'show_welcome_panel',
|
53 |
-
'wp_dashboard_quick_press_last_post_id',
|
54 |
-
'wp_user-settings',
|
55 |
-
'wp_user-settings-time',
|
56 |
-
'closedpostboxes_page',
|
57 |
-
'metaboxhidden_page',
|
58 |
-
'session_tokens',
|
59 |
-
'managenav-menuscolumnshidden',
|
60 |
-
'metaboxhidden_nav-menus',
|
61 |
-
'nav_menu_recently_edited',
|
62 |
-
'acf_user_settings',
|
63 |
-
];
|
64 |
-
|
65 |
-
// Blacklist some data
|
66 |
-
if (isset($data['meta']) && count($data['meta'])) {
|
67 |
-
foreach ($data['meta'] as $key => $value) {
|
68 |
-
if (in_array($key, $blacklist)) {
|
69 |
-
unset($data['meta'][$key]);
|
70 |
-
}
|
71 |
-
}
|
72 |
-
|
73 |
-
$data['meta'] = array_diff_assoc($data['meta'], $blacklist);
|
74 |
-
}
|
75 |
-
*/
|
76 |
-
|
77 |
-
return apply_filters('gdpr/wordpress-user/export/data', $data);
|
78 |
-
}
|
79 |
-
|
80 |
-
public function deleteUser(DataSubject $dataSubject, $reassign = null)
|
81 |
-
{
|
82 |
-
require_once(ABSPATH . 'wp-admin/includes/user.php');
|
83 |
-
|
84 |
-
$reassignOption = gdpr('options')->get('delete_action_reassign');
|
85 |
-
if ('reassign' === $reassignOption) {
|
86 |
-
$reassignUserId = gdpr('options')->get('delete_action_reassign_user');
|
87 |
-
} else {
|
88 |
-
$reassignUserId = false;
|
89 |
-
}
|
90 |
-
|
91 |
-
wp_delete_user($dataSubject->getUserId(), $reassignUserId);
|
92 |
-
}
|
93 |
-
|
94 |
-
public function anonymizeUser(DataSubject $dataSubject, $anonymizedId)
|
95 |
-
{
|
96 |
-
if (!$dataSubject->hasUser()) {
|
97 |
-
return;
|
98 |
-
}
|
99 |
-
|
100 |
-
if (!$anonymizedId) {
|
101 |
-
gdpr('helpers')->error();
|
102 |
-
}
|
103 |
-
|
104 |
-
// Save a unique identifier to tie anonymized data together for analytics purposes
|
105 |
-
update_user_meta($dataSubject->getUserId(), "gdpr_anonymized_id", $anonymizedId);
|
106 |
-
|
107 |
-
// Change username
|
108 |
-
global $wpdb;
|
109 |
-
|
110 |
-
$anonymizedUsername = apply_filters('gdpr/wordpress-user/anonymize/username', '[anonymous]');
|
111 |
-
$wpdb->update(
|
112 |
-
$wpdb->users,
|
113 |
-
['user_login' => $anonymizedUsername],
|
114 |
-
['ID' => $dataSubject->getUserId()]
|
115 |
-
);
|
116 |
-
|
117 |
-
// Clear all relevant user fields, reset password
|
118 |
-
wp_update_user([
|
119 |
-
'ID' => $dataSubject->getUserId(),
|
120 |
-
'user_email' => '',
|
121 |
-
'user_nicename' => '',
|
122 |
-
'user_url' => '',
|
123 |
-
'user_activation_key' => '',
|
124 |
-
'display_name' => $anonymizedUsername,
|
125 |
-
// Set a random password, just in case the functionality that disallows users from logging in should break for any reason
|
126 |
-
'user_pass' => wp_hash_password(wp_generate_password()),
|
127 |
-
]);
|
128 |
-
|
129 |
-
// Clear all relevant usermeta fields
|
130 |
-
delete_user_meta($dataSubject->getUserId(), 'first_name');
|
131 |
-
delete_user_meta($dataSubject->getUserId(), 'last_name');
|
132 |
-
delete_user_meta($dataSubject->getUserId(), 'nickname');
|
133 |
-
delete_user_meta($dataSubject->getUserId(), 'description');
|
134 |
-
delete_user_meta($dataSubject->getUserId(), 'session_tokens');
|
135 |
-
delete_user_meta($dataSubject->getUserId(), 'community-events-location');
|
136 |
-
|
137 |
-
// Remove all capabilities
|
138 |
-
$user = $dataSubject->getUser();
|
139 |
-
$user->remove_all_caps();
|
140 |
-
|
141 |
-
// Finally, assign the 'anonymous' role to user
|
142 |
-
if (apply_filters('gdpr/wordpress-user/anonymize/change_role', true) && get_role('anonymous')) {
|
143 |
-
|
144 |
-
foreach ($user->roles as $role) {
|
145 |
-
$user->remove_role($role);
|
146 |
-
}
|
147 |
-
|
148 |
-
$user->add_role('anonymous');
|
149 |
-
}
|
150 |
-
}
|
151 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Components\WordpressUser;
|
4 |
+
|
5 |
+
use Codelight\GDPR\DataSubject\DataSubject;
|
6 |
+
|
7 |
+
class DataManager
|
8 |
+
{
|
9 |
+
public function getData(DataSubject $dataSubject)
|
10 |
+
{
|
11 |
+
$user = $dataSubject->getUser();
|
12 |
+
if ($user) {
|
13 |
+
$meta = get_user_meta($user->ID);
|
14 |
+
$data['meta'] = $meta;
|
15 |
+
} else {
|
16 |
+
$data = [];
|
17 |
+
}
|
18 |
+
|
19 |
+
$whitelist = [
|
20 |
+
'nickname',
|
21 |
+
'first_name',
|
22 |
+
'last_name',
|
23 |
+
'description',
|
24 |
+
'locale',
|
25 |
+
'community-events-location',
|
26 |
+
];
|
27 |
+
|
28 |
+
if (isset($data['meta']) && count($data['meta'])) {
|
29 |
+
foreach ($data['meta'] as $key => $value) {
|
30 |
+
if (!in_array($key, $whitelist)) {
|
31 |
+
unset($data['meta'][$key]);
|
32 |
+
}
|
33 |
+
}
|
34 |
+
}
|
35 |
+
|
36 |
+
// Remove session keys. Just in case.
|
37 |
+
if (isset($meta) && isset($meta['session_tokens']) && count($meta['session_tokens'])) {
|
38 |
+
foreach ($meta['session_tokens'] as $token) {
|
39 |
+
foreach (unserialize($token) as $key => $tokenData) {
|
40 |
+
$data['meta']['session_tokens'][] = $tokenData;
|
41 |
+
}
|
42 |
+
}
|
43 |
+
}
|
44 |
+
|
45 |
+
/*
|
46 |
+
$blacklist = [
|
47 |
+
'use_ssl',
|
48 |
+
'show_admin_bar_front',
|
49 |
+
'wp_capabilities',
|
50 |
+
'wp_user_level',
|
51 |
+
'dismissed_wp_pointers',
|
52 |
+
'show_welcome_panel',
|
53 |
+
'wp_dashboard_quick_press_last_post_id',
|
54 |
+
'wp_user-settings',
|
55 |
+
'wp_user-settings-time',
|
56 |
+
'closedpostboxes_page',
|
57 |
+
'metaboxhidden_page',
|
58 |
+
'session_tokens',
|
59 |
+
'managenav-menuscolumnshidden',
|
60 |
+
'metaboxhidden_nav-menus',
|
61 |
+
'nav_menu_recently_edited',
|
62 |
+
'acf_user_settings',
|
63 |
+
];
|
64 |
+
|
65 |
+
// Blacklist some data
|
66 |
+
if (isset($data['meta']) && count($data['meta'])) {
|
67 |
+
foreach ($data['meta'] as $key => $value) {
|
68 |
+
if (in_array($key, $blacklist)) {
|
69 |
+
unset($data['meta'][$key]);
|
70 |
+
}
|
71 |
+
}
|
72 |
+
|
73 |
+
$data['meta'] = array_diff_assoc($data['meta'], $blacklist);
|
74 |
+
}
|
75 |
+
*/
|
76 |
+
|
77 |
+
return apply_filters('gdpr/wordpress-user/export/data', $data);
|
78 |
+
}
|
79 |
+
|
80 |
+
public function deleteUser(DataSubject $dataSubject, $reassign = null)
|
81 |
+
{
|
82 |
+
require_once(ABSPATH . 'wp-admin/includes/user.php');
|
83 |
+
|
84 |
+
$reassignOption = gdpr('options')->get('delete_action_reassign');
|
85 |
+
if ('reassign' === $reassignOption) {
|
86 |
+
$reassignUserId = gdpr('options')->get('delete_action_reassign_user');
|
87 |
+
} else {
|
88 |
+
$reassignUserId = false;
|
89 |
+
}
|
90 |
+
|
91 |
+
wp_delete_user($dataSubject->getUserId(), $reassignUserId);
|
92 |
+
}
|
93 |
+
|
94 |
+
public function anonymizeUser(DataSubject $dataSubject, $anonymizedId)
|
95 |
+
{
|
96 |
+
if (!$dataSubject->hasUser()) {
|
97 |
+
return;
|
98 |
+
}
|
99 |
+
|
100 |
+
if (!$anonymizedId) {
|
101 |
+
gdpr('helpers')->error();
|
102 |
+
}
|
103 |
+
|
104 |
+
// Save a unique identifier to tie anonymized data together for analytics purposes
|
105 |
+
update_user_meta($dataSubject->getUserId(), "gdpr_anonymized_id", $anonymizedId);
|
106 |
+
|
107 |
+
// Change username
|
108 |
+
global $wpdb;
|
109 |
+
|
110 |
+
$anonymizedUsername = apply_filters('gdpr/wordpress-user/anonymize/username', '[anonymous]');
|
111 |
+
$wpdb->update(
|
112 |
+
$wpdb->users,
|
113 |
+
['user_login' => $anonymizedUsername],
|
114 |
+
['ID' => $dataSubject->getUserId()]
|
115 |
+
);
|
116 |
+
|
117 |
+
// Clear all relevant user fields, reset password
|
118 |
+
wp_update_user([
|
119 |
+
'ID' => $dataSubject->getUserId(),
|
120 |
+
'user_email' => '',
|
121 |
+
'user_nicename' => '',
|
122 |
+
'user_url' => '',
|
123 |
+
'user_activation_key' => '',
|
124 |
+
'display_name' => $anonymizedUsername,
|
125 |
+
// Set a random password, just in case the functionality that disallows users from logging in should break for any reason
|
126 |
+
'user_pass' => wp_hash_password(wp_generate_password()),
|
127 |
+
]);
|
128 |
+
|
129 |
+
// Clear all relevant usermeta fields
|
130 |
+
delete_user_meta($dataSubject->getUserId(), 'first_name');
|
131 |
+
delete_user_meta($dataSubject->getUserId(), 'last_name');
|
132 |
+
delete_user_meta($dataSubject->getUserId(), 'nickname');
|
133 |
+
delete_user_meta($dataSubject->getUserId(), 'description');
|
134 |
+
delete_user_meta($dataSubject->getUserId(), 'session_tokens');
|
135 |
+
delete_user_meta($dataSubject->getUserId(), 'community-events-location');
|
136 |
+
|
137 |
+
// Remove all capabilities
|
138 |
+
$user = $dataSubject->getUser();
|
139 |
+
$user->remove_all_caps();
|
140 |
+
|
141 |
+
// Finally, assign the 'anonymous' role to user
|
142 |
+
if (apply_filters('gdpr/wordpress-user/anonymize/change_role', true) && get_role('anonymous')) {
|
143 |
+
|
144 |
+
foreach ($user->roles as $role) {
|
145 |
+
$user->remove_role($role);
|
146 |
+
}
|
147 |
+
|
148 |
+
$user->add_role('anonymous');
|
149 |
+
}
|
150 |
+
}
|
151 |
+
}
|
src/Components/WordpressUser/RegistrationForm.php
CHANGED
@@ -1,50 +1,50 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Components\WordpressUser;
|
4 |
-
|
5 |
-
use Codelight\GDPR\DataSubject\DataSubjectManager;
|
6 |
-
|
7 |
-
class RegistrationForm
|
8 |
-
{
|
9 |
-
/* @var DataSubjectManager */
|
10 |
-
protected $dataSubjectManager;
|
11 |
-
|
12 |
-
public function __construct(DataSubjectManager $dataSubjectManager)
|
13 |
-
{
|
14 |
-
$this->dataSubjectManager = $dataSubjectManager;
|
15 |
-
|
16 |
-
if (gdpr('options')->get('policy_page')) {
|
17 |
-
add_action('register_form', [$this, 'addRegisterFormCheckbox']);
|
18 |
-
add_filter('registration_errors', [$this, 'validate'], PHP_INT_MAX);
|
19 |
-
}
|
20 |
-
}
|
21 |
-
|
22 |
-
public function addRegisterFormCheckbox()
|
23 |
-
{
|
24 |
-
$privacyPolicyUrl = get_permalink(gdpr('options')->get('policy_page'));
|
25 |
-
$termsPage = gdpr('options')->get('terms_page');
|
26 |
-
|
27 |
-
if ($termsPage) {
|
28 |
-
$termsUrl = get_permalink($termsPage);
|
29 |
-
} else {
|
30 |
-
$termsUrl = false;
|
31 |
-
}
|
32 |
-
|
33 |
-
echo gdpr('view')->render(
|
34 |
-
'modules/wordpress-user/registration-terms-checkbox',
|
35 |
-
compact('privacyPolicyUrl', 'termsUrl')
|
36 |
-
);
|
37 |
-
}
|
38 |
-
|
39 |
-
public function validate(\WP_Error $errors)
|
40 |
-
{
|
41 |
-
if (empty($_POST['gdpr_terms']) || !$_POST['gdpr_terms']) {
|
42 |
-
$errors->add('gdpr_error', __('<strong>ERROR</strong>: You must accept the terms and conditions.', 'gdpr-framework'));
|
43 |
-
} else {
|
44 |
-
$dataSubject = $this->dataSubjectManager->getByEmail($_POST['user_email']);
|
45 |
-
$dataSubject->giveConsent('privacy-policy');
|
46 |
-
}
|
47 |
-
|
48 |
-
return $errors;
|
49 |
-
}
|
50 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Components\WordpressUser;
|
4 |
+
|
5 |
+
use Codelight\GDPR\DataSubject\DataSubjectManager;
|
6 |
+
|
7 |
+
class RegistrationForm
|
8 |
+
{
|
9 |
+
/* @var DataSubjectManager */
|
10 |
+
protected $dataSubjectManager;
|
11 |
+
|
12 |
+
public function __construct(DataSubjectManager $dataSubjectManager)
|
13 |
+
{
|
14 |
+
$this->dataSubjectManager = $dataSubjectManager;
|
15 |
+
|
16 |
+
if (gdpr('options')->get('policy_page')) {
|
17 |
+
add_action('register_form', [$this, 'addRegisterFormCheckbox']);
|
18 |
+
add_filter('registration_errors', [$this, 'validate'], PHP_INT_MAX);
|
19 |
+
}
|
20 |
+
}
|
21 |
+
|
22 |
+
public function addRegisterFormCheckbox()
|
23 |
+
{
|
24 |
+
$privacyPolicyUrl = get_permalink(gdpr('options')->get('policy_page'));
|
25 |
+
$termsPage = gdpr('options')->get('terms_page');
|
26 |
+
|
27 |
+
if ($termsPage) {
|
28 |
+
$termsUrl = get_permalink($termsPage);
|
29 |
+
} else {
|
30 |
+
$termsUrl = false;
|
31 |
+
}
|
32 |
+
|
33 |
+
echo gdpr('view')->render(
|
34 |
+
'modules/wordpress-user/registration-terms-checkbox',
|
35 |
+
compact('privacyPolicyUrl', 'termsUrl')
|
36 |
+
);
|
37 |
+
}
|
38 |
+
|
39 |
+
public function validate(\WP_Error $errors)
|
40 |
+
{
|
41 |
+
if (empty($_POST['gdpr_terms']) || !$_POST['gdpr_terms']) {
|
42 |
+
$errors->add('gdpr_error', __('<strong>ERROR</strong>: You must accept the terms and conditions.', 'gdpr-framework'));
|
43 |
+
} else {
|
44 |
+
$dataSubject = $this->dataSubjectManager->getByEmail($_POST['user_email']);
|
45 |
+
$dataSubject->giveConsent('privacy-policy');
|
46 |
+
}
|
47 |
+
|
48 |
+
return $errors;
|
49 |
+
}
|
50 |
+
}
|
src/Components/WordpressUser/WordpressUser.php
CHANGED
@@ -1,111 +1,111 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Components\WordpressUser;
|
4 |
-
|
5 |
-
use Codelight\GDPR\DataSubject\DataSubjectManager;
|
6 |
-
use Codelight\GDPR\Components\WordpressUser\Controllers\DashboardDataPageController;
|
7 |
-
use Codelight\GDPR\Components\WordpressUser\Controllers\DashboardProfilePageController;
|
8 |
-
|
9 |
-
/**
|
10 |
-
* Handles everything related to a WordPress user account
|
11 |
-
*
|
12 |
-
* Class WordpressUser
|
13 |
-
*
|
14 |
-
* @package Codelight\GDPR\Modules\WordpressUser
|
15 |
-
*/
|
16 |
-
class WordpressUser
|
17 |
-
{
|
18 |
-
/* @var string */
|
19 |
-
protected $name = 'wordpress-user';
|
20 |
-
|
21 |
-
/* @var DataManager */
|
22 |
-
protected $dataManager;
|
23 |
-
|
24 |
-
/* @var DataSubjectManager */
|
25 |
-
protected $dataSubjectManager;
|
26 |
-
|
27 |
-
/**
|
28 |
-
* WordpressUser constructor.
|
29 |
-
*
|
30 |
-
* @param DataSubjectManager $dataSubjectManager
|
31 |
-
* @param DataManager $dataManager
|
32 |
-
*/
|
33 |
-
public function __construct(DataSubjectManager $dataSubjectManager, DataManager $dataManager)
|
34 |
-
{
|
35 |
-
$this->dataSubjectManager = $dataSubjectManager;
|
36 |
-
$this->dataManager = $dataManager;
|
37 |
-
|
38 |
-
gdpr()->make(DashboardProfilePageController::class);
|
39 |
-
gdpr()->make(RegistrationForm::class);
|
40 |
-
|
41 |
-
if (gdpr('options')->get('enable')) {
|
42 |
-
gdpr()->make(DashboardDataPageController::class);
|
43 |
-
|
44 |
-
// Register Privacy Tools page in admin
|
45 |
-
add_action('admin_menu', [$this, 'registerDashboardDataPage']);
|
46 |
-
}
|
47 |
-
|
48 |
-
// Register render action on Profile edit page
|
49 |
-
add_action('show_user_profile', [$this, 'triggerProfileRenderAction'], PHP_INT_MAX);
|
50 |
-
add_action('edit_user_profile', [$this, 'triggerProfileRenderAction'], PHP_INT_MAX);
|
51 |
-
|
52 |
-
add_filter('gdpr/data-subject/data', [$this, 'getExportData'], 1, 2);
|
53 |
-
add_action('gdpr/data-subject/delete', [$this, 'deleteUser'], 100);
|
54 |
-
add_action('gdpr/data-subject/anonymize', [$this, 'anonymizeUser'], 100, 2);
|
55 |
-
}
|
56 |
-
|
57 |
-
/**
|
58 |
-
* Register Privacy Tools dashboard page under Users
|
59 |
-
*/
|
60 |
-
public function registerDashboardDataPage()
|
61 |
-
{
|
62 |
-
add_users_page(
|
63 |
-
_x('Privacy Tools', '(Admin)', 'gdpr-framework'),
|
64 |
-
_x('Privacy Tools', '(Admin)', 'gdpr-framework'),
|
65 |
-
'read',
|
66 |
-
'gdpr-profile',
|
67 |
-
[$this, 'renderDashboardDataPage']
|
68 |
-
);
|
69 |
-
}
|
70 |
-
|
71 |
-
/**
|
72 |
-
* Render the contents of Privacy Tools dashboard page
|
73 |
-
*/
|
74 |
-
public function renderDashboardDataPage()
|
75 |
-
{
|
76 |
-
$dataSubject = $this->dataSubjectManager->getByLoggedInUser();
|
77 |
-
|
78 |
-
if ($dataSubject) {
|
79 |
-
do_action('gdpr/dashboard/privacy-tools/content', $dataSubject);
|
80 |
-
}
|
81 |
-
}
|
82 |
-
|
83 |
-
/**
|
84 |
-
* On profile page, trigger an action with the same format as the Router provides
|
85 |
-
* so that we have consistency with the rest of the hooks.
|
86 |
-
*/
|
87 |
-
public function triggerProfileRenderAction(\WP_User $user)
|
88 |
-
{
|
89 |
-
if (current_user_can('edit_users') || current_user_can('delete_users')) {
|
90 |
-
$dataSubject = $this->dataSubjectManager->getByEmail($user->user_email);
|
91 |
-
do_action("gdpr/dashboard/profile-page/content", $dataSubject);
|
92 |
-
}
|
93 |
-
}
|
94 |
-
|
95 |
-
public function getExportData($data, $email)
|
96 |
-
{
|
97 |
-
return $data + $this->dataManager->getData($this->dataSubjectManager->getByEmail($email));
|
98 |
-
}
|
99 |
-
|
100 |
-
public function deleteUser($email)
|
101 |
-
{
|
102 |
-
$dataSubject = $this->dataSubjectManager->getByEmail($email);
|
103 |
-
$this->dataManager->deleteUser($dataSubject);
|
104 |
-
}
|
105 |
-
|
106 |
-
public function anonymizeUser($email, $anonymizedId)
|
107 |
-
{
|
108 |
-
$dataSubject = $this->dataSubjectManager->getByEmail($email);
|
109 |
-
$this->dataManager->anonymizeUser($dataSubject, $anonymizedId);
|
110 |
-
}
|
111 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Components\WordpressUser;
|
4 |
+
|
5 |
+
use Codelight\GDPR\DataSubject\DataSubjectManager;
|
6 |
+
use Codelight\GDPR\Components\WordpressUser\Controllers\DashboardDataPageController;
|
7 |
+
use Codelight\GDPR\Components\WordpressUser\Controllers\DashboardProfilePageController;
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Handles everything related to a WordPress user account
|
11 |
+
*
|
12 |
+
* Class WordpressUser
|
13 |
+
*
|
14 |
+
* @package Codelight\GDPR\Modules\WordpressUser
|
15 |
+
*/
|
16 |
+
class WordpressUser
|
17 |
+
{
|
18 |
+
/* @var string */
|
19 |
+
protected $name = 'wordpress-user';
|
20 |
+
|
21 |
+
/* @var DataManager */
|
22 |
+
protected $dataManager;
|
23 |
+
|
24 |
+
/* @var DataSubjectManager */
|
25 |
+
protected $dataSubjectManager;
|
26 |
+
|
27 |
+
/**
|
28 |
+
* WordpressUser constructor.
|
29 |
+
*
|
30 |
+
* @param DataSubjectManager $dataSubjectManager
|
31 |
+
* @param DataManager $dataManager
|
32 |
+
*/
|
33 |
+
public function __construct(DataSubjectManager $dataSubjectManager, DataManager $dataManager)
|
34 |
+
{
|
35 |
+
$this->dataSubjectManager = $dataSubjectManager;
|
36 |
+
$this->dataManager = $dataManager;
|
37 |
+
|
38 |
+
gdpr()->make(DashboardProfilePageController::class);
|
39 |
+
gdpr()->make(RegistrationForm::class);
|
40 |
+
|
41 |
+
if (gdpr('options')->get('enable')) {
|
42 |
+
gdpr()->make(DashboardDataPageController::class);
|
43 |
+
|
44 |
+
// Register Privacy Tools page in admin
|
45 |
+
add_action('admin_menu', [$this, 'registerDashboardDataPage']);
|
46 |
+
}
|
47 |
+
|
48 |
+
// Register render action on Profile edit page
|
49 |
+
add_action('show_user_profile', [$this, 'triggerProfileRenderAction'], PHP_INT_MAX);
|
50 |
+
add_action('edit_user_profile', [$this, 'triggerProfileRenderAction'], PHP_INT_MAX);
|
51 |
+
|
52 |
+
add_filter('gdpr/data-subject/data', [$this, 'getExportData'], 1, 2);
|
53 |
+
add_action('gdpr/data-subject/delete', [$this, 'deleteUser'], 100);
|
54 |
+
add_action('gdpr/data-subject/anonymize', [$this, 'anonymizeUser'], 100, 2);
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Register Privacy Tools dashboard page under Users
|
59 |
+
*/
|
60 |
+
public function registerDashboardDataPage()
|
61 |
+
{
|
62 |
+
add_users_page(
|
63 |
+
_x('Privacy Tools', '(Admin)', 'gdpr-framework'),
|
64 |
+
_x('Privacy Tools', '(Admin)', 'gdpr-framework'),
|
65 |
+
'read',
|
66 |
+
'gdpr-profile',
|
67 |
+
[$this, 'renderDashboardDataPage']
|
68 |
+
);
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Render the contents of Privacy Tools dashboard page
|
73 |
+
*/
|
74 |
+
public function renderDashboardDataPage()
|
75 |
+
{
|
76 |
+
$dataSubject = $this->dataSubjectManager->getByLoggedInUser();
|
77 |
+
|
78 |
+
if ($dataSubject) {
|
79 |
+
do_action('gdpr/dashboard/privacy-tools/content', $dataSubject);
|
80 |
+
}
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* On profile page, trigger an action with the same format as the Router provides
|
85 |
+
* so that we have consistency with the rest of the hooks.
|
86 |
+
*/
|
87 |
+
public function triggerProfileRenderAction(\WP_User $user)
|
88 |
+
{
|
89 |
+
if (current_user_can('edit_users') || current_user_can('delete_users')) {
|
90 |
+
$dataSubject = $this->dataSubjectManager->getByEmail($user->user_email);
|
91 |
+
do_action("gdpr/dashboard/profile-page/content", $dataSubject);
|
92 |
+
}
|
93 |
+
}
|
94 |
+
|
95 |
+
public function getExportData($data, $email)
|
96 |
+
{
|
97 |
+
return $data + $this->dataManager->getData($this->dataSubjectManager->getByEmail($email));
|
98 |
+
}
|
99 |
+
|
100 |
+
public function deleteUser($email)
|
101 |
+
{
|
102 |
+
$dataSubject = $this->dataSubjectManager->getByEmail($email);
|
103 |
+
$this->dataManager->deleteUser($dataSubject);
|
104 |
+
}
|
105 |
+
|
106 |
+
public function anonymizeUser($email, $anonymizedId)
|
107 |
+
{
|
108 |
+
$dataSubject = $this->dataSubjectManager->getByEmail($email);
|
109 |
+
$this->dataManager->anonymizeUser($dataSubject, $anonymizedId);
|
110 |
+
}
|
111 |
+
}
|
src/DataSubject/AdminTabDataSubject.php
CHANGED
@@ -1,126 +1,126 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\DataSubject;
|
4 |
-
|
5 |
-
use Codelight\GDPR\Admin\AdminTab;
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Class AdminTabDataSubject
|
9 |
-
*
|
10 |
-
* @package Codelight\GDPR\DataSubject
|
11 |
-
*/
|
12 |
-
class AdminTabDataSubject extends AdminTab
|
13 |
-
{
|
14 |
-
/* @var string */
|
15 |
-
protected $slug = 'data-subject';
|
16 |
-
|
17 |
-
/* @var DataSubjectManager */
|
18 |
-
protected $dataSubjectManager;
|
19 |
-
|
20 |
-
/**
|
21 |
-
* AdminTabDataSubject constructor.
|
22 |
-
*
|
23 |
-
* @param DataSubjectManager $dataSubjectManager
|
24 |
-
*/
|
25 |
-
public function __construct(DataSubjectManager $dataSubjectManager)
|
26 |
-
{
|
27 |
-
$this->title = _x('Data Subjects', '(Admin)', 'gdpr-framework');
|
28 |
-
$this->dataSubjectManager = $dataSubjectManager;
|
29 |
-
|
30 |
-
// Workaround to allow this page to be submitted
|
31 |
-
$this->registerSetting('gdpr_email');
|
32 |
-
|
33 |
-
// Register handler for this action
|
34 |
-
add_action('gdpr/admin/action/search', [$this, 'searchRedirect']);
|
35 |
-
}
|
36 |
-
|
37 |
-
public function init()
|
38 |
-
{
|
39 |
-
$this->registerSettingSection(
|
40 |
-
'gdpr-section-data-subjects',
|
41 |
-
_x('Data Subjects', '(Admin)', 'gdpr-framework'),
|
42 |
-
[$this, 'renderTab']
|
43 |
-
);
|
44 |
-
}
|
45 |
-
|
46 |
-
public function renderTab()
|
47 |
-
{
|
48 |
-
if (isset($_GET['search']) && $_GET['search']) {
|
49 |
-
$results = $this->getRenderedResults($_GET['search'], $this->dataSubjectManager->getByEmail($_GET['search']));
|
50 |
-
} else {
|
51 |
-
$results = '';
|
52 |
-
}
|
53 |
-
|
54 |
-
$nonce = wp_create_nonce('gdpr/admin/action/search');
|
55 |
-
echo gdpr('view')->render(
|
56 |
-
'admin/data-subjects/search-form',
|
57 |
-
compact('nonce', 'results', 'exportUrl', 'deleteUrl')
|
58 |
-
);
|
59 |
-
}
|
60 |
-
|
61 |
-
public function getRenderedResults($email, DataSubject $dataSubject)
|
62 |
-
{
|
63 |
-
$hasData = $dataSubject->hasData();
|
64 |
-
$links = [];
|
65 |
-
|
66 |
-
if ($hasData) {
|
67 |
-
if ($dataSubject->getUserId()) {
|
68 |
-
$userName = get_userdata($dataSubject->getUserId())->user_login;
|
69 |
-
$links['profile'] = get_edit_user_link($dataSubject->getUserId());
|
70 |
-
$adminCap = user_can($dataSubject->getUserId(), 'manage_options');
|
71 |
-
|
72 |
-
} else {
|
73 |
-
$userName = false;
|
74 |
-
$adminCap = false;
|
75 |
-
}
|
76 |
-
|
77 |
-
/**
|
78 |
-
* TODO: these actions are currently triggered in DashboardProfilePageController
|
79 |
-
* Should replace this with a generic AdminController!
|
80 |
-
* Also consider namespacing gdpr_action in this case, i.e. profile/delete vs data-subject-tab/delete
|
81 |
-
*/
|
82 |
-
$links['view'] = add_query_arg([
|
83 |
-
'gdpr_action' => 'export',
|
84 |
-
'gdpr_format' => 'html',
|
85 |
-
'gdpr_email' => $_GET['search'],
|
86 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/export"),
|
87 |
-
]);
|
88 |
-
|
89 |
-
$links['export'] = add_query_arg([
|
90 |
-
'gdpr_action' => 'export',
|
91 |
-
'gdpr_format' => 'json',
|
92 |
-
'gdpr_email' => $_GET['search'],
|
93 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/export"),
|
94 |
-
]);
|
95 |
-
|
96 |
-
$links['anonymize'] = add_query_arg([
|
97 |
-
'gdpr_email' => $_GET['search'],
|
98 |
-
'gdpr_action' => 'forget',
|
99 |
-
'gdpr_force_action' => 'anonymize',
|
100 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/forget"),
|
101 |
-
]);
|
102 |
-
|
103 |
-
$links['delete'] = add_query_arg([
|
104 |
-
'gdpr_email' => $_GET['search'],
|
105 |
-
'gdpr_action' => 'forget',
|
106 |
-
'gdpr_force_action' => 'delete',
|
107 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/forget"),
|
108 |
-
]);
|
109 |
-
}
|
110 |
-
|
111 |
-
return gdpr('view')->render('admin/data-subjects/search-results', compact('email', 'hasData', 'links', 'userName', 'adminCap'));
|
112 |
-
}
|
113 |
-
|
114 |
-
public function renderSubmitButton()
|
115 |
-
{
|
116 |
-
// Intentionally left blank
|
117 |
-
}
|
118 |
-
|
119 |
-
public function searchRedirect()
|
120 |
-
{
|
121 |
-
if (isset($_POST['gdpr_email']) && $_POST['gdpr_email']) {
|
122 |
-
wp_safe_redirect(gdpr('helpers')->getAdminUrl('&gdpr-tab=data-subject&search=' . $_POST['gdpr_email']));
|
123 |
-
exit;
|
124 |
-
}
|
125 |
-
}
|
126 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\DataSubject;
|
4 |
+
|
5 |
+
use Codelight\GDPR\Admin\AdminTab;
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Class AdminTabDataSubject
|
9 |
+
*
|
10 |
+
* @package Codelight\GDPR\DataSubject
|
11 |
+
*/
|
12 |
+
class AdminTabDataSubject extends AdminTab
|
13 |
+
{
|
14 |
+
/* @var string */
|
15 |
+
protected $slug = 'data-subject';
|
16 |
+
|
17 |
+
/* @var DataSubjectManager */
|
18 |
+
protected $dataSubjectManager;
|
19 |
+
|
20 |
+
/**
|
21 |
+
* AdminTabDataSubject constructor.
|
22 |
+
*
|
23 |
+
* @param DataSubjectManager $dataSubjectManager
|
24 |
+
*/
|
25 |
+
public function __construct(DataSubjectManager $dataSubjectManager)
|
26 |
+
{
|
27 |
+
$this->title = _x('Data Subjects', '(Admin)', 'gdpr-framework');
|
28 |
+
$this->dataSubjectManager = $dataSubjectManager;
|
29 |
+
|
30 |
+
// Workaround to allow this page to be submitted
|
31 |
+
$this->registerSetting('gdpr_email');
|
32 |
+
|
33 |
+
// Register handler for this action
|
34 |
+
add_action('gdpr/admin/action/search', [$this, 'searchRedirect']);
|
35 |
+
}
|
36 |
+
|
37 |
+
public function init()
|
38 |
+
{
|
39 |
+
$this->registerSettingSection(
|
40 |
+
'gdpr-section-data-subjects',
|
41 |
+
_x('Data Subjects', '(Admin)', 'gdpr-framework'),
|
42 |
+
[$this, 'renderTab']
|
43 |
+
);
|
44 |
+
}
|
45 |
+
|
46 |
+
public function renderTab()
|
47 |
+
{
|
48 |
+
if (isset($_GET['search']) && $_GET['search']) {
|
49 |
+
$results = $this->getRenderedResults($_GET['search'], $this->dataSubjectManager->getByEmail($_GET['search']));
|
50 |
+
} else {
|
51 |
+
$results = '';
|
52 |
+
}
|
53 |
+
|
54 |
+
$nonce = wp_create_nonce('gdpr/admin/action/search');
|
55 |
+
echo gdpr('view')->render(
|
56 |
+
'admin/data-subjects/search-form',
|
57 |
+
compact('nonce', 'results', 'exportUrl', 'deleteUrl')
|
58 |
+
);
|
59 |
+
}
|
60 |
+
|
61 |
+
public function getRenderedResults($email, DataSubject $dataSubject)
|
62 |
+
{
|
63 |
+
$hasData = $dataSubject->hasData();
|
64 |
+
$links = [];
|
65 |
+
|
66 |
+
if ($hasData) {
|
67 |
+
if ($dataSubject->getUserId()) {
|
68 |
+
$userName = get_userdata($dataSubject->getUserId())->user_login;
|
69 |
+
$links['profile'] = get_edit_user_link($dataSubject->getUserId());
|
70 |
+
$adminCap = user_can($dataSubject->getUserId(), 'manage_options');
|
71 |
+
|
72 |
+
} else {
|
73 |
+
$userName = false;
|
74 |
+
$adminCap = false;
|
75 |
+
}
|
76 |
+
|
77 |
+
/**
|
78 |
+
* TODO: these actions are currently triggered in DashboardProfilePageController
|
79 |
+
* Should replace this with a generic AdminController!
|
80 |
+
* Also consider namespacing gdpr_action in this case, i.e. profile/delete vs data-subject-tab/delete
|
81 |
+
*/
|
82 |
+
$links['view'] = add_query_arg([
|
83 |
+
'gdpr_action' => 'export',
|
84 |
+
'gdpr_format' => 'html',
|
85 |
+
'gdpr_email' => $_GET['search'],
|
86 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/export"),
|
87 |
+
]);
|
88 |
+
|
89 |
+
$links['export'] = add_query_arg([
|
90 |
+
'gdpr_action' => 'export',
|
91 |
+
'gdpr_format' => 'json',
|
92 |
+
'gdpr_email' => $_GET['search'],
|
93 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/export"),
|
94 |
+
]);
|
95 |
+
|
96 |
+
$links['anonymize'] = add_query_arg([
|
97 |
+
'gdpr_email' => $_GET['search'],
|
98 |
+
'gdpr_action' => 'forget',
|
99 |
+
'gdpr_force_action' => 'anonymize',
|
100 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/forget"),
|
101 |
+
]);
|
102 |
+
|
103 |
+
$links['delete'] = add_query_arg([
|
104 |
+
'gdpr_email' => $_GET['search'],
|
105 |
+
'gdpr_action' => 'forget',
|
106 |
+
'gdpr_force_action' => 'delete',
|
107 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/forget"),
|
108 |
+
]);
|
109 |
+
}
|
110 |
+
|
111 |
+
return gdpr('view')->render('admin/data-subjects/search-results', compact('email', 'hasData', 'links', 'userName', 'adminCap'));
|
112 |
+
}
|
113 |
+
|
114 |
+
public function renderSubmitButton()
|
115 |
+
{
|
116 |
+
// Intentionally left blank
|
117 |
+
}
|
118 |
+
|
119 |
+
public function searchRedirect()
|
120 |
+
{
|
121 |
+
if (isset($_POST['gdpr_email']) && $_POST['gdpr_email']) {
|
122 |
+
wp_safe_redirect(gdpr('helpers')->getAdminUrl('&gdpr-tab=data-subject&search=' . $_POST['gdpr_email']));
|
123 |
+
exit;
|
124 |
+
}
|
125 |
+
}
|
126 |
+
}
|
src/DataSubject/DataExporter.php
CHANGED
@@ -1,138 +1,138 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\DataSubject;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Handle formatting and downloading data subject's data.
|
7 |
-
*
|
8 |
-
* Class DataManager
|
9 |
-
*
|
10 |
-
* @package Codelight\GDPR\DataSubject
|
11 |
-
*/
|
12 |
-
class DataExporter
|
13 |
-
{
|
14 |
-
public function export(array $data, DataSubject $dataSubject, $format = 'html')
|
15 |
-
{
|
16 |
-
$data = $this->maybeUnserialize($data);
|
17 |
-
|
18 |
-
do_action('gdpr/export', $data, $dataSubject->getEmail(), $dataSubject, $format);
|
19 |
-
|
20 |
-
if ('html' === $format) {
|
21 |
-
$this->downloadHTML($data, $dataSubject);
|
22 |
-
} elseif ('json' === $format) {
|
23 |
-
$this->downloadJSON($data, $dataSubject);
|
24 |
-
}
|
25 |
-
}
|
26 |
-
|
27 |
-
/**
|
28 |
-
* Download a data subject's data in human-readable format,
|
29 |
-
* formatted as a table in an HTML document unless overridden.
|
30 |
-
*
|
31 |
-
* @param array $data
|
32 |
-
* @param DataSubject $dataSubject
|
33 |
-
*/
|
34 |
-
protected function downloadHTML(array $data, DataSubject $dataSubject)
|
35 |
-
{
|
36 |
-
// Allow extensions to send a different response
|
37 |
-
do_action('gdpr/export/html', $data, $dataSubject->getEmail(), $dataSubject);
|
38 |
-
|
39 |
-
$filename = 'data_' . date("Y-m-d_H:i:s") . '.html';
|
40 |
-
|
41 |
-
// By default, send a downloadable HTML file
|
42 |
-
header("Pragma: public");
|
43 |
-
header("Expires: 0");
|
44 |
-
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
|
45 |
-
header("Cache-Control: private", false);
|
46 |
-
header("Content-Type: text/html");
|
47 |
-
header("Content-Disposition: attachment; filename=\"{$filename}\";");
|
48 |
-
header("Content-Transfer-Encoding: binary");
|
49 |
-
|
50 |
-
echo $this->getHtmlData($data);
|
51 |
-
exit;
|
52 |
-
}
|
53 |
-
|
54 |
-
/**
|
55 |
-
* Download a data subject's data in machine-readable format,
|
56 |
-
* formatted as JSON unless overridden.
|
57 |
-
*
|
58 |
-
* @param array $data
|
59 |
-
* @param DataSubject $dataSubject
|
60 |
-
*/
|
61 |
-
protected function downloadJSON(array $data, DataSubject $dataSubject)
|
62 |
-
{
|
63 |
-
// Allow extensions to send a different response
|
64 |
-
do_action('gdpr/export/json', $data, $dataSubject->getEmail(), $dataSubject);
|
65 |
-
|
66 |
-
$filename = 'data_' . date("Y-m-d_H:i:s") . '.json';
|
67 |
-
|
68 |
-
// By default, encode to JSON and send a JSON response
|
69 |
-
header("Pragma: public");
|
70 |
-
header("Expires: 0");
|
71 |
-
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
|
72 |
-
header("Cache-Control: private", false);
|
73 |
-
header("Content-Type: application/json");
|
74 |
-
header("Content-Disposition: attachment; filename=\"{$filename}\";");
|
75 |
-
header("Content-Transfer-Encoding: binary");
|
76 |
-
|
77 |
-
wp_send_json($data);
|
78 |
-
}
|
79 |
-
|
80 |
-
protected function getHtmlData($data)
|
81 |
-
{
|
82 |
-
$table = $this->formatAsTable($this->maybeUnserialize($data));
|
83 |
-
return gdpr('view')->render('global/html-data', compact('table'));
|
84 |
-
}
|
85 |
-
|
86 |
-
protected function formatAsTable(array $data, $level = 0)
|
87 |
-
{
|
88 |
-
$output = "<table class='level-{$level}'>";
|
89 |
-
foreach ($data as $key => $value) {
|
90 |
-
$output .= "<tr>";
|
91 |
-
|
92 |
-
// Output key
|
93 |
-
$output .= "<td class='key'>";
|
94 |
-
$output .= esc_html($key);
|
95 |
-
$output .= "</td>";
|
96 |
-
|
97 |
-
// Output value
|
98 |
-
$output .= "<td class='value'>";
|
99 |
-
|
100 |
-
// Account for arrays with just one item, such as usermeta
|
101 |
-
if (is_array($value) && 1 === count($value)) {
|
102 |
-
$value = $value[0];
|
103 |
-
}
|
104 |
-
|
105 |
-
// In case of arrays, recurse
|
106 |
-
if (is_array($value)) {
|
107 |
-
$output .= $this->formatAsTable($value, ($level + 1));
|
108 |
-
} else {
|
109 |
-
$output .= esc_html($value);
|
110 |
-
}
|
111 |
-
$output .= "</td>";
|
112 |
-
|
113 |
-
$output .= "</tr>";
|
114 |
-
}
|
115 |
-
|
116 |
-
$output .= "</table>";
|
117 |
-
return $output;
|
118 |
-
}
|
119 |
-
|
120 |
-
/**
|
121 |
-
* Recursively maybe unserialize data
|
122 |
-
*
|
123 |
-
* @param array $data
|
124 |
-
* @return array
|
125 |
-
*/
|
126 |
-
protected function maybeUnserialize(array $data)
|
127 |
-
{
|
128 |
-
foreach ($data as &$datum) {
|
129 |
-
if (is_array($datum)) {
|
130 |
-
$datum = $this->maybeUnserialize($datum);
|
131 |
-
} else {
|
132 |
-
$datum = maybe_unserialize($datum);
|
133 |
-
}
|
134 |
-
}
|
135 |
-
|
136 |
-
return $data;
|
137 |
-
}
|
138 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\DataSubject;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Handle formatting and downloading data subject's data.
|
7 |
+
*
|
8 |
+
* Class DataManager
|
9 |
+
*
|
10 |
+
* @package Codelight\GDPR\DataSubject
|
11 |
+
*/
|
12 |
+
class DataExporter
|
13 |
+
{
|
14 |
+
public function export(array $data, DataSubject $dataSubject, $format = 'html')
|
15 |
+
{
|
16 |
+
$data = $this->maybeUnserialize($data);
|
17 |
+
|
18 |
+
do_action('gdpr/export', $data, $dataSubject->getEmail(), $dataSubject, $format);
|
19 |
+
|
20 |
+
if ('html' === $format) {
|
21 |
+
$this->downloadHTML($data, $dataSubject);
|
22 |
+
} elseif ('json' === $format) {
|
23 |
+
$this->downloadJSON($data, $dataSubject);
|
24 |
+
}
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Download a data subject's data in human-readable format,
|
29 |
+
* formatted as a table in an HTML document unless overridden.
|
30 |
+
*
|
31 |
+
* @param array $data
|
32 |
+
* @param DataSubject $dataSubject
|
33 |
+
*/
|
34 |
+
protected function downloadHTML(array $data, DataSubject $dataSubject)
|
35 |
+
{
|
36 |
+
// Allow extensions to send a different response
|
37 |
+
do_action('gdpr/export/html', $data, $dataSubject->getEmail(), $dataSubject);
|
38 |
+
|
39 |
+
$filename = 'data_' . date("Y-m-d_H:i:s") . '.html';
|
40 |
+
|
41 |
+
// By default, send a downloadable HTML file
|
42 |
+
header("Pragma: public");
|
43 |
+
header("Expires: 0");
|
44 |
+
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
|
45 |
+
header("Cache-Control: private", false);
|
46 |
+
header("Content-Type: text/html");
|
47 |
+
header("Content-Disposition: attachment; filename=\"{$filename}\";");
|
48 |
+
header("Content-Transfer-Encoding: binary");
|
49 |
+
|
50 |
+
echo $this->getHtmlData($data);
|
51 |
+
exit;
|
52 |
+
}
|
53 |
+
|
54 |
+
/**
|
55 |
+
* Download a data subject's data in machine-readable format,
|
56 |
+
* formatted as JSON unless overridden.
|
57 |
+
*
|
58 |
+
* @param array $data
|
59 |
+
* @param DataSubject $dataSubject
|
60 |
+
*/
|
61 |
+
protected function downloadJSON(array $data, DataSubject $dataSubject)
|
62 |
+
{
|
63 |
+
// Allow extensions to send a different response
|
64 |
+
do_action('gdpr/export/json', $data, $dataSubject->getEmail(), $dataSubject);
|
65 |
+
|
66 |
+
$filename = 'data_' . date("Y-m-d_H:i:s") . '.json';
|
67 |
+
|
68 |
+
// By default, encode to JSON and send a JSON response
|
69 |
+
header("Pragma: public");
|
70 |
+
header("Expires: 0");
|
71 |
+
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
|
72 |
+
header("Cache-Control: private", false);
|
73 |
+
header("Content-Type: application/json");
|
74 |
+
header("Content-Disposition: attachment; filename=\"{$filename}\";");
|
75 |
+
header("Content-Transfer-Encoding: binary");
|
76 |
+
|
77 |
+
wp_send_json($data);
|
78 |
+
}
|
79 |
+
|
80 |
+
protected function getHtmlData($data)
|
81 |
+
{
|
82 |
+
$table = $this->formatAsTable($this->maybeUnserialize($data));
|
83 |
+
return gdpr('view')->render('global/html-data', compact('table'));
|
84 |
+
}
|
85 |
+
|
86 |
+
protected function formatAsTable(array $data, $level = 0)
|
87 |
+
{
|
88 |
+
$output = "<table class='level-{$level}'>";
|
89 |
+
foreach ($data as $key => $value) {
|
90 |
+
$output .= "<tr>";
|
91 |
+
|
92 |
+
// Output key
|
93 |
+
$output .= "<td class='key'>";
|
94 |
+
$output .= esc_html($key);
|
95 |
+
$output .= "</td>";
|
96 |
+
|
97 |
+
// Output value
|
98 |
+
$output .= "<td class='value'>";
|
99 |
+
|
100 |
+
// Account for arrays with just one item, such as usermeta
|
101 |
+
if (is_array($value) && 1 === count($value)) {
|
102 |
+
$value = $value[0];
|
103 |
+
}
|
104 |
+
|
105 |
+
// In case of arrays, recurse
|
106 |
+
if (is_array($value)) {
|
107 |
+
$output .= $this->formatAsTable($value, ($level + 1));
|
108 |
+
} else {
|
109 |
+
$output .= esc_html($value);
|
110 |
+
}
|
111 |
+
$output .= "</td>";
|
112 |
+
|
113 |
+
$output .= "</tr>";
|
114 |
+
}
|
115 |
+
|
116 |
+
$output .= "</table>";
|
117 |
+
return $output;
|
118 |
+
}
|
119 |
+
|
120 |
+
/**
|
121 |
+
* Recursively maybe unserialize data
|
122 |
+
*
|
123 |
+
* @param array $data
|
124 |
+
* @return array
|
125 |
+
*/
|
126 |
+
protected function maybeUnserialize(array $data)
|
127 |
+
{
|
128 |
+
foreach ($data as &$datum) {
|
129 |
+
if (is_array($datum)) {
|
130 |
+
$datum = $this->maybeUnserialize($datum);
|
131 |
+
} else {
|
132 |
+
$datum = maybe_unserialize($datum);
|
133 |
+
}
|
134 |
+
}
|
135 |
+
|
136 |
+
return $data;
|
137 |
+
}
|
138 |
+
}
|
src/DataSubject/DataRepository.php
CHANGED
@@ -1,191 +1,191 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\DataSubject;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Class DataRepository
|
7 |
-
*
|
8 |
-
* @package Codelight\GDPR\DataSubject
|
9 |
-
*/
|
10 |
-
class DataRepository
|
11 |
-
{
|
12 |
-
/**
|
13 |
-
* DataRepository constructor.
|
14 |
-
*
|
15 |
-
* @param $email
|
16 |
-
*/
|
17 |
-
public function __construct($email)
|
18 |
-
{
|
19 |
-
$this->email = $email;
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Export all stored data. Triggers 'gdpr/data-subject/data' filter.
|
24 |
-
*/
|
25 |
-
public function getData($email)
|
26 |
-
{
|
27 |
-
return apply_filters('gdpr/data-subject/data', [], $email);
|
28 |
-
}
|
29 |
-
|
30 |
-
/**
|
31 |
-
* Trigger the configured 'export' action
|
32 |
-
*
|
33 |
-
* @param $email
|
34 |
-
* @return array|null
|
35 |
-
*/
|
36 |
-
public function export($email, $format, $force = false)
|
37 |
-
{
|
38 |
-
$action = gdpr('options')->get('export_action');
|
39 |
-
$data = null;
|
40 |
-
|
41 |
-
if ($force) {
|
42 |
-
$action = 'download';
|
43 |
-
}
|
44 |
-
|
45 |
-
switch($action) {
|
46 |
-
case 'download':
|
47 |
-
$data = $this->getData($email);
|
48 |
-
break;
|
49 |
-
case 'download_and_notify':
|
50 |
-
$data = $this->getData($email);
|
51 |
-
$this->notifyExportAction($email, $format);
|
52 |
-
break;
|
53 |
-
case 'notify':
|
54 |
-
$this->notifyExportRequest($email, $format);
|
55 |
-
break;
|
56 |
-
default:
|
57 |
-
$this->notifyExportRequest($email, $format);
|
58 |
-
break;
|
59 |
-
}
|
60 |
-
|
61 |
-
return $data;
|
62 |
-
}
|
63 |
-
|
64 |
-
/**
|
65 |
-
* Trigger the configured 'forget' action
|
66 |
-
*
|
67 |
-
* @param $email
|
68 |
-
*
|
69 |
-
* @return bool
|
70 |
-
*/
|
71 |
-
public function forget($email, $forceAction = null)
|
72 |
-
{
|
73 |
-
$action = gdpr('options')->get('delete_action');
|
74 |
-
|
75 |
-
if ($forceAction) {
|
76 |
-
$action = $forceAction;
|
77 |
-
}
|
78 |
-
|
79 |
-
switch($action) {
|
80 |
-
case 'delete':
|
81 |
-
$this->delete($email);
|
82 |
-
return true;
|
83 |
-
case 'delete_and_notify':
|
84 |
-
$userId = $this->delete($email);
|
85 |
-
$this->notifyForgetAction($email, $userId);
|
86 |
-
return true;
|
87 |
-
case 'anonymize':
|
88 |
-
$this->anonymize($email);
|
89 |
-
return true;
|
90 |
-
case 'anonymize_and_notify':
|
91 |
-
$userId = $this->anonymize($email);
|
92 |
-
$this->notifyForgetAction($email, $userId);
|
93 |
-
return true;
|
94 |
-
case 'notify':
|
95 |
-
$this->notifyForgetRequest($email);
|
96 |
-
return false;
|
97 |
-
default:
|
98 |
-
$this->notifyForgetRequest($email);
|
99 |
-
return false;
|
100 |
-
}
|
101 |
-
}
|
102 |
-
|
103 |
-
/**
|
104 |
-
* @param $email
|
105 |
-
*/
|
106 |
-
protected function anonymize($email)
|
107 |
-
{
|
108 |
-
$userId = null;
|
109 |
-
|
110 |
-
if (email_exists($email)) {
|
111 |
-
$userId = get_user_by('email', $email)->ID;
|
112 |
-
}
|
113 |
-
|
114 |
-
$anonymizedId = wp_generate_password(12, false);
|
115 |
-
do_action('gdpr/data-subject/anonymize', $email, $anonymizedId, $userId);
|
116 |
-
|
117 |
-
return $userId;
|
118 |
-
}
|
119 |
-
|
120 |
-
/**
|
121 |
-
* @param $email
|
122 |
-
*/
|
123 |
-
protected function delete($email)
|
124 |
-
{
|
125 |
-
$userId = null;
|
126 |
-
|
127 |
-
if (email_exists($email)) {
|
128 |
-
$userId = get_user_by('email', $email)->ID;
|
129 |
-
}
|
130 |
-
|
131 |
-
do_action('gdpr/data-subject/delete', $email, $userId);
|
132 |
-
|
133 |
-
return $userId;
|
134 |
-
}
|
135 |
-
|
136 |
-
/**
|
137 |
-
* @param $email
|
138 |
-
*/
|
139 |
-
protected function notifyExportAction($email, $format)
|
140 |
-
{
|
141 |
-
gdpr('helpers')->mail(
|
142 |
-
gdpr('options')->get('export_action_email'),
|
143 |
-
__("Data exported", 'gdpr-framework'),
|
144 |
-
gdpr('view')->render('email/action-export', compact('email', 'format')),
|
145 |
-
['Content-Type: text/html; charset=UTF-8']
|
146 |
-
);
|
147 |
-
}
|
148 |
-
|
149 |
-
/**
|
150 |
-
* @param $email
|
151 |
-
*/
|
152 |
-
protected function notifyExportRequest($email, $format)
|
153 |
-
{
|
154 |
-
$adminTabLink = esc_url(gdpr('helpers')->getAdminUrl('&gdpr-tab=data-subject&search=' . $email));
|
155 |
-
|
156 |
-
gdpr('helpers')->mail(
|
157 |
-
gdpr('options')->get('export_action_email'),
|
158 |
-
__("Data export request", 'gdpr-framework'),
|
159 |
-
gdpr('view')->render('email/request-export', compact('email', 'format', 'adminTabLink')),
|
160 |
-
['Content-Type: text/html; charset=UTF-8']
|
161 |
-
);
|
162 |
-
}
|
163 |
-
|
164 |
-
/**
|
165 |
-
* @param $email
|
166 |
-
*/
|
167 |
-
protected function notifyForgetAction($email, $userId = null)
|
168 |
-
{
|
169 |
-
gdpr('helpers')->mail(
|
170 |
-
gdpr('options')->get('delete_action_email'),
|
171 |
-
__("Data removed", 'gdpr-framework'),
|
172 |
-
gdpr('view')->render('email/action-forget', compact('email', 'userId')),
|
173 |
-
['Content-Type: text/html; charset=UTF-8']
|
174 |
-
);
|
175 |
-
}
|
176 |
-
|
177 |
-
/**
|
178 |
-
* @param $email
|
179 |
-
*/
|
180 |
-
protected function notifyForgetRequest($email)
|
181 |
-
{
|
182 |
-
$adminTabLink = esc_url(gdpr('helpers')->getAdminUrl('&gdpr-tab=data-subject&search=' . $email));
|
183 |
-
|
184 |
-
gdpr('helpers')->mail(
|
185 |
-
gdpr('options')->get('delete_action_email'),
|
186 |
-
__("Data removal request", 'gdpr-framework'),
|
187 |
-
gdpr('view')->render('email/request-forget', compact('email', 'adminTabLink')),
|
188 |
-
['Content-Type: text/html; charset=UTF-8']
|
189 |
-
);
|
190 |
-
}
|
191 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\DataSubject;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Class DataRepository
|
7 |
+
*
|
8 |
+
* @package Codelight\GDPR\DataSubject
|
9 |
+
*/
|
10 |
+
class DataRepository
|
11 |
+
{
|
12 |
+
/**
|
13 |
+
* DataRepository constructor.
|
14 |
+
*
|
15 |
+
* @param $email
|
16 |
+
*/
|
17 |
+
public function __construct($email)
|
18 |
+
{
|
19 |
+
$this->email = $email;
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Export all stored data. Triggers 'gdpr/data-subject/data' filter.
|
24 |
+
*/
|
25 |
+
public function getData($email)
|
26 |
+
{
|
27 |
+
return apply_filters('gdpr/data-subject/data', [], $email);
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Trigger the configured 'export' action
|
32 |
+
*
|
33 |
+
* @param $email
|
34 |
+
* @return array|null
|
35 |
+
*/
|
36 |
+
public function export($email, $format, $force = false)
|
37 |
+
{
|
38 |
+
$action = gdpr('options')->get('export_action');
|
39 |
+
$data = null;
|
40 |
+
|
41 |
+
if ($force) {
|
42 |
+
$action = 'download';
|
43 |
+
}
|
44 |
+
|
45 |
+
switch($action) {
|
46 |
+
case 'download':
|
47 |
+
$data = $this->getData($email);
|
48 |
+
break;
|
49 |
+
case 'download_and_notify':
|
50 |
+
$data = $this->getData($email);
|
51 |
+
$this->notifyExportAction($email, $format);
|
52 |
+
break;
|
53 |
+
case 'notify':
|
54 |
+
$this->notifyExportRequest($email, $format);
|
55 |
+
break;
|
56 |
+
default:
|
57 |
+
$this->notifyExportRequest($email, $format);
|
58 |
+
break;
|
59 |
+
}
|
60 |
+
|
61 |
+
return $data;
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* Trigger the configured 'forget' action
|
66 |
+
*
|
67 |
+
* @param $email
|
68 |
+
*
|
69 |
+
* @return bool
|
70 |
+
*/
|
71 |
+
public function forget($email, $forceAction = null)
|
72 |
+
{
|
73 |
+
$action = gdpr('options')->get('delete_action');
|
74 |
+
|
75 |
+
if ($forceAction) {
|
76 |
+
$action = $forceAction;
|
77 |
+
}
|
78 |
+
|
79 |
+
switch($action) {
|
80 |
+
case 'delete':
|
81 |
+
$this->delete($email);
|
82 |
+
return true;
|
83 |
+
case 'delete_and_notify':
|
84 |
+
$userId = $this->delete($email);
|
85 |
+
$this->notifyForgetAction($email, $userId);
|
86 |
+
return true;
|
87 |
+
case 'anonymize':
|
88 |
+
$this->anonymize($email);
|
89 |
+
return true;
|
90 |
+
case 'anonymize_and_notify':
|
91 |
+
$userId = $this->anonymize($email);
|
92 |
+
$this->notifyForgetAction($email, $userId);
|
93 |
+
return true;
|
94 |
+
case 'notify':
|
95 |
+
$this->notifyForgetRequest($email);
|
96 |
+
return false;
|
97 |
+
default:
|
98 |
+
$this->notifyForgetRequest($email);
|
99 |
+
return false;
|
100 |
+
}
|
101 |
+
}
|
102 |
+
|
103 |
+
/**
|
104 |
+
* @param $email
|
105 |
+
*/
|
106 |
+
protected function anonymize($email)
|
107 |
+
{
|
108 |
+
$userId = null;
|
109 |
+
|
110 |
+
if (email_exists($email)) {
|
111 |
+
$userId = get_user_by('email', $email)->ID;
|
112 |
+
}
|
113 |
+
|
114 |
+
$anonymizedId = wp_generate_password(12, false);
|
115 |
+
do_action('gdpr/data-subject/anonymize', $email, $anonymizedId, $userId);
|
116 |
+
|
117 |
+
return $userId;
|
118 |
+
}
|
119 |
+
|
120 |
+
/**
|
121 |
+
* @param $email
|
122 |
+
*/
|
123 |
+
protected function delete($email)
|
124 |
+
{
|
125 |
+
$userId = null;
|
126 |
+
|
127 |
+
if (email_exists($email)) {
|
128 |
+
$userId = get_user_by('email', $email)->ID;
|
129 |
+
}
|
130 |
+
|
131 |
+
do_action('gdpr/data-subject/delete', $email, $userId);
|
132 |
+
|
133 |
+
return $userId;
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* @param $email
|
138 |
+
*/
|
139 |
+
protected function notifyExportAction($email, $format)
|
140 |
+
{
|
141 |
+
gdpr('helpers')->mail(
|
142 |
+
gdpr('options')->get('export_action_email'),
|
143 |
+
__("Data exported", 'gdpr-framework'),
|
144 |
+
gdpr('view')->render('email/action-export', compact('email', 'format')),
|
145 |
+
['Content-Type: text/html; charset=UTF-8']
|
146 |
+
);
|
147 |
+
}
|
148 |
+
|
149 |
+
/**
|
150 |
+
* @param $email
|
151 |
+
*/
|
152 |
+
protected function notifyExportRequest($email, $format)
|
153 |
+
{
|
154 |
+
$adminTabLink = esc_url(gdpr('helpers')->getAdminUrl('&gdpr-tab=data-subject&search=' . $email));
|
155 |
+
|
156 |
+
gdpr('helpers')->mail(
|
157 |
+
gdpr('options')->get('export_action_email'),
|
158 |
+
__("Data export request", 'gdpr-framework'),
|
159 |
+
gdpr('view')->render('email/request-export', compact('email', 'format', 'adminTabLink')),
|
160 |
+
['Content-Type: text/html; charset=UTF-8']
|
161 |
+
);
|
162 |
+
}
|
163 |
+
|
164 |
+
/**
|
165 |
+
* @param $email
|
166 |
+
*/
|
167 |
+
protected function notifyForgetAction($email, $userId = null)
|
168 |
+
{
|
169 |
+
gdpr('helpers')->mail(
|
170 |
+
gdpr('options')->get('delete_action_email'),
|
171 |
+
__("Data removed", 'gdpr-framework'),
|
172 |
+
gdpr('view')->render('email/action-forget', compact('email', 'userId')),
|
173 |
+
['Content-Type: text/html; charset=UTF-8']
|
174 |
+
);
|
175 |
+
}
|
176 |
+
|
177 |
+
/**
|
178 |
+
* @param $email
|
179 |
+
*/
|
180 |
+
protected function notifyForgetRequest($email)
|
181 |
+
{
|
182 |
+
$adminTabLink = esc_url(gdpr('helpers')->getAdminUrl('&gdpr-tab=data-subject&search=' . $email));
|
183 |
+
|
184 |
+
gdpr('helpers')->mail(
|
185 |
+
gdpr('options')->get('delete_action_email'),
|
186 |
+
__("Data removal request", 'gdpr-framework'),
|
187 |
+
gdpr('view')->render('email/request-forget', compact('email', 'adminTabLink')),
|
188 |
+
['Content-Type: text/html; charset=UTF-8']
|
189 |
+
);
|
190 |
+
}
|
191 |
+
}
|
src/DataSubject/DataSubjectAdmin.php
CHANGED
@@ -1,18 +1,18 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\DataSubject;
|
4 |
-
|
5 |
-
class DataSubjectAdmin
|
6 |
-
{
|
7 |
-
public function __construct()
|
8 |
-
{
|
9 |
-
add_filter('gdpr/admin/tabs', [$this, 'registerTab'], 30);
|
10 |
-
}
|
11 |
-
|
12 |
-
public function registerTab($tabs)
|
13 |
-
{
|
14 |
-
$tabs['data-subject'] = gdpr()->make(AdminTabDataSubject::class);
|
15 |
-
|
16 |
-
return $tabs;
|
17 |
-
}
|
18 |
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\DataSubject;
|
4 |
+
|
5 |
+
class DataSubjectAdmin
|
6 |
+
{
|
7 |
+
public function __construct()
|
8 |
+
{
|
9 |
+
add_filter('gdpr/admin/tabs', [$this, 'registerTab'], 30);
|
10 |
+
}
|
11 |
+
|
12 |
+
public function registerTab($tabs)
|
13 |
+
{
|
14 |
+
$tabs['data-subject'] = gdpr()->make(AdminTabDataSubject::class);
|
15 |
+
|
16 |
+
return $tabs;
|
17 |
+
}
|
18 |
}
|
src/DataSubject/DataSubjectAuthenticator.php
CHANGED
@@ -1,130 +1,130 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\DataSubject;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Handle authenticating the data subject either by logged in user or by email/cookie
|
7 |
-
*
|
8 |
-
* Class DataSubjectAuthenticator
|
9 |
-
*
|
10 |
-
* @package Codelight\GDPR\DataSubject
|
11 |
-
*/
|
12 |
-
class DataSubjectAuthenticator
|
13 |
-
{
|
14 |
-
/**
|
15 |
-
* DataSubjectAuthenticator constructor.
|
16 |
-
*
|
17 |
-
* @param DataSubjectManager $dataSubjectManager
|
18 |
-
* @param DataSubjectIdentificator $dataSubjectIdentificator
|
19 |
-
*/
|
20 |
-
public function __construct(DataSubjectManager $dataSubjectManager, DataSubjectIdentificator $dataSubjectIdentificator)
|
21 |
-
{
|
22 |
-
$this->dataSubjectManager = $dataSubjectManager;
|
23 |
-
$this->dataSubjectIdentificator = $dataSubjectIdentificator;
|
24 |
-
}
|
25 |
-
|
26 |
-
/**
|
27 |
-
* Attempt to authenticate the data subject
|
28 |
-
*
|
29 |
-
* @return bool|\Codelight\GDPR\DataSubject\DataSubject
|
30 |
-
*/
|
31 |
-
public function authenticate()
|
32 |
-
{
|
33 |
-
// If the user is logged in, authenticate them
|
34 |
-
if (is_user_logged_in()) {
|
35 |
-
return apply_filters('gdpr/authenticate', $this->dataSubjectManager->getByLoggedInUser());
|
36 |
-
}
|
37 |
-
|
38 |
-
// If the request contains the identification cookie, validate it and identify the
|
39 |
-
// current user
|
40 |
-
$cookieData = $this->getIdentificationCookieData();
|
41 |
-
if ($cookieData && $this->dataSubjectIdentificator->isKeyValid($cookieData[0], $cookieData[1])) {
|
42 |
-
return apply_filters('gdpr/authenticate', $this->dataSubjectManager->getByEmail($cookieData[0]));
|
43 |
-
}
|
44 |
-
|
45 |
-
// Otherwise, we are not authenticated
|
46 |
-
return apply_filters('gdpr/authenticate', false);
|
47 |
-
}
|
48 |
-
|
49 |
-
/**
|
50 |
-
* If the request contains a new identification key, validate it, then set a new key
|
51 |
-
* to make the previous link obsolete.
|
52 |
-
*/
|
53 |
-
public function identify()
|
54 |
-
{
|
55 |
-
// Do not attempt to identify logged in users
|
56 |
-
if (is_user_logged_in()) {
|
57 |
-
return;
|
58 |
-
}
|
59 |
-
|
60 |
-
if (isset($_REQUEST['gdpr_key']) && isset($_REQUEST['email'])) {
|
61 |
-
|
62 |
-
$privacyToolsPageUrl = get_permalink(gdpr('options')->get('tools_page'));
|
63 |
-
|
64 |
-
if ($this->dataSubjectIdentificator->isKeyValid($_REQUEST['email'], $_REQUEST['gdpr_key'])) {
|
65 |
-
$this->setIdentificationCookie($_REQUEST['email']);
|
66 |
-
$url = $privacyToolsPageUrl;
|
67 |
-
} else {
|
68 |
-
$url = add_query_arg([
|
69 |
-
'gdpr_notice' => 'invalid_key',
|
70 |
-
], $privacyToolsPageUrl);
|
71 |
-
}
|
72 |
-
|
73 |
-
wp_safe_redirect($url);
|
74 |
-
exit;
|
75 |
-
}
|
76 |
-
}
|
77 |
-
|
78 |
-
/**
|
79 |
-
* Set the identification cookie with the given key
|
80 |
-
*
|
81 |
-
* @param $key
|
82 |
-
*/
|
83 |
-
public function setIdentificationCookie($email)
|
84 |
-
{
|
85 |
-
$key = $this->dataSubjectIdentificator->generateKey($email);
|
86 |
-
|
87 |
-
setcookie(
|
88 |
-
'gdpr_key',
|
89 |
-
$email . '|' . $key,
|
90 |
-
time() + (15 * 60),
|
91 |
-
COOKIEPATH,
|
92 |
-
COOKIE_DOMAIN,
|
93 |
-
false,
|
94 |
-
true
|
95 |
-
);
|
96 |
-
}
|
97 |
-
|
98 |
-
/**
|
99 |
-
* @return string
|
100 |
-
*/
|
101 |
-
public function getIdentificationCookieData()
|
102 |
-
{
|
103 |
-
return isset($_COOKIE['gdpr_key']) ? explode('|', $_COOKIE['gdpr_key']) : null;
|
104 |
-
}
|
105 |
-
|
106 |
-
/**
|
107 |
-
* Remove the cookie
|
108 |
-
*/
|
109 |
-
public function deleteSession($logout = true)
|
110 |
-
{
|
111 |
-
unset($_COOKIE['gdpr_key']);
|
112 |
-
|
113 |
-
setcookie(
|
114 |
-
'gdpr_key',
|
115 |
-
'',
|
116 |
-
time() - 3600,
|
117 |
-
COOKIEPATH,
|
118 |
-
COOKIE_DOMAIN,
|
119 |
-
false,
|
120 |
-
true
|
121 |
-
);
|
122 |
-
|
123 |
-
if ($logout) {
|
124 |
-
wp_logout();
|
125 |
-
} else {
|
126 |
-
wp_destroy_current_session();
|
127 |
-
wp_clear_auth_cookie();
|
128 |
-
}
|
129 |
-
}
|
130 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\DataSubject;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Handle authenticating the data subject either by logged in user or by email/cookie
|
7 |
+
*
|
8 |
+
* Class DataSubjectAuthenticator
|
9 |
+
*
|
10 |
+
* @package Codelight\GDPR\DataSubject
|
11 |
+
*/
|
12 |
+
class DataSubjectAuthenticator
|
13 |
+
{
|
14 |
+
/**
|
15 |
+
* DataSubjectAuthenticator constructor.
|
16 |
+
*
|
17 |
+
* @param DataSubjectManager $dataSubjectManager
|
18 |
+
* @param DataSubjectIdentificator $dataSubjectIdentificator
|
19 |
+
*/
|
20 |
+
public function __construct(DataSubjectManager $dataSubjectManager, DataSubjectIdentificator $dataSubjectIdentificator)
|
21 |
+
{
|
22 |
+
$this->dataSubjectManager = $dataSubjectManager;
|
23 |
+
$this->dataSubjectIdentificator = $dataSubjectIdentificator;
|
24 |
+
}
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Attempt to authenticate the data subject
|
28 |
+
*
|
29 |
+
* @return bool|\Codelight\GDPR\DataSubject\DataSubject
|
30 |
+
*/
|
31 |
+
public function authenticate()
|
32 |
+
{
|
33 |
+
// If the user is logged in, authenticate them
|
34 |
+
if (is_user_logged_in()) {
|
35 |
+
return apply_filters('gdpr/authenticate', $this->dataSubjectManager->getByLoggedInUser());
|
36 |
+
}
|
37 |
+
|
38 |
+
// If the request contains the identification cookie, validate it and identify the
|
39 |
+
// current user
|
40 |
+
$cookieData = $this->getIdentificationCookieData();
|
41 |
+
if ($cookieData && $this->dataSubjectIdentificator->isKeyValid($cookieData[0], $cookieData[1])) {
|
42 |
+
return apply_filters('gdpr/authenticate', $this->dataSubjectManager->getByEmail($cookieData[0]));
|
43 |
+
}
|
44 |
+
|
45 |
+
// Otherwise, we are not authenticated
|
46 |
+
return apply_filters('gdpr/authenticate', false);
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* If the request contains a new identification key, validate it, then set a new key
|
51 |
+
* to make the previous link obsolete.
|
52 |
+
*/
|
53 |
+
public function identify()
|
54 |
+
{
|
55 |
+
// Do not attempt to identify logged in users
|
56 |
+
if (is_user_logged_in()) {
|
57 |
+
return;
|
58 |
+
}
|
59 |
+
|
60 |
+
if (isset($_REQUEST['gdpr_key']) && isset($_REQUEST['email'])) {
|
61 |
+
|
62 |
+
$privacyToolsPageUrl = get_permalink(gdpr('options')->get('tools_page'));
|
63 |
+
|
64 |
+
if ($this->dataSubjectIdentificator->isKeyValid($_REQUEST['email'], $_REQUEST['gdpr_key'])) {
|
65 |
+
$this->setIdentificationCookie($_REQUEST['email']);
|
66 |
+
$url = $privacyToolsPageUrl;
|
67 |
+
} else {
|
68 |
+
$url = add_query_arg([
|
69 |
+
'gdpr_notice' => 'invalid_key',
|
70 |
+
], $privacyToolsPageUrl);
|
71 |
+
}
|
72 |
+
|
73 |
+
wp_safe_redirect($url);
|
74 |
+
exit;
|
75 |
+
}
|
76 |
+
}
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Set the identification cookie with the given key
|
80 |
+
*
|
81 |
+
* @param $key
|
82 |
+
*/
|
83 |
+
public function setIdentificationCookie($email)
|
84 |
+
{
|
85 |
+
$key = $this->dataSubjectIdentificator->generateKey($email);
|
86 |
+
|
87 |
+
setcookie(
|
88 |
+
'gdpr_key',
|
89 |
+
$email . '|' . $key,
|
90 |
+
time() + (15 * 60),
|
91 |
+
COOKIEPATH,
|
92 |
+
COOKIE_DOMAIN,
|
93 |
+
false,
|
94 |
+
true
|
95 |
+
);
|
96 |
+
}
|
97 |
+
|
98 |
+
/**
|
99 |
+
* @return string
|
100 |
+
*/
|
101 |
+
public function getIdentificationCookieData()
|
102 |
+
{
|
103 |
+
return isset($_COOKIE['gdpr_key']) ? explode('|', $_COOKIE['gdpr_key']) : null;
|
104 |
+
}
|
105 |
+
|
106 |
+
/**
|
107 |
+
* Remove the cookie
|
108 |
+
*/
|
109 |
+
public function deleteSession($logout = true)
|
110 |
+
{
|
111 |
+
unset($_COOKIE['gdpr_key']);
|
112 |
+
|
113 |
+
setcookie(
|
114 |
+
'gdpr_key',
|
115 |
+
'',
|
116 |
+
time() - 3600,
|
117 |
+
COOKIEPATH,
|
118 |
+
COOKIE_DOMAIN,
|
119 |
+
false,
|
120 |
+
true
|
121 |
+
);
|
122 |
+
|
123 |
+
if ($logout) {
|
124 |
+
wp_logout();
|
125 |
+
} else {
|
126 |
+
wp_destroy_current_session();
|
127 |
+
wp_clear_auth_cookie();
|
128 |
+
}
|
129 |
+
}
|
130 |
+
}
|
src/DataSubject/DataSubjectIdentificator.php
CHANGED
@@ -1,184 +1,184 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\DataSubject;
|
4 |
-
|
5 |
-
use Codelight\GDPR\Options\Options;
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Identify the data subject by unique temporary key
|
9 |
-
*
|
10 |
-
* Class DataSubjectIdentificator
|
11 |
-
*
|
12 |
-
* @package Codelight\GDPR\DataSubject
|
13 |
-
*/
|
14 |
-
class DataSubjectIdentificator
|
15 |
-
{
|
16 |
-
/* @var DataSubjectManager */
|
17 |
-
protected $dataSubjectManager;
|
18 |
-
|
19 |
-
/* @var Options */
|
20 |
-
protected $options;
|
21 |
-
|
22 |
-
/**
|
23 |
-
* DataSubjectIdentificator constructor.
|
24 |
-
*
|
25 |
-
* @param DataSubjectManager $dataSubjectManager
|
26 |
-
*/
|
27 |
-
public function __construct(DataSubjectManager $dataSubjectManager, Options $options)
|
28 |
-
{
|
29 |
-
$this->dataSubjectManager = $dataSubjectManager;
|
30 |
-
$this->options = $options;
|
31 |
-
}
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Check if there is any data associated with the given email address
|
35 |
-
*
|
36 |
-
* @param $email
|
37 |
-
* @return bool
|
38 |
-
*/
|
39 |
-
public function isDataSubject($email)
|
40 |
-
{
|
41 |
-
$dataSubject = $this->dataSubjectManager->getByEmail($email);
|
42 |
-
|
43 |
-
return apply_filters('gdpr/data-subject/has-data', $dataSubject->hasData(), $email);
|
44 |
-
}
|
45 |
-
|
46 |
-
/**
|
47 |
-
* Send the email with the link that allows data subject to authenticate
|
48 |
-
*
|
49 |
-
* @param $email
|
50 |
-
*/
|
51 |
-
public function sendIdentificationEmail($email)
|
52 |
-
{
|
53 |
-
$key = $this->generateKey($email);
|
54 |
-
$privacyToolsPageUrl = gdpr('helpers')->getPrivacyToolsPageUrl();
|
55 |
-
$identificationUrl = add_query_arg([
|
56 |
-
'gdpr_key' => $key,
|
57 |
-
'email' => $email,
|
58 |
-
], $privacyToolsPageUrl);
|
59 |
-
|
60 |
-
$siteName = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
|
61 |
-
|
62 |
-
// todo: handle or log email sending errors
|
63 |
-
gdpr('helpers')->mail(
|
64 |
-
$email,
|
65 |
-
__("Your personal data on", 'gdpr-framework') . ' ' . $siteName,
|
66 |
-
gdpr('view')->render('email/identify-data-subject', compact('identificationUrl', 'siteName')),
|
67 |
-
['Content-Type: text/html; charset=UTF-8']
|
68 |
-
);
|
69 |
-
}
|
70 |
-
|
71 |
-
/**
|
72 |
-
* Notify the email address that we do not store any data about them
|
73 |
-
*
|
74 |
-
* @param $email
|
75 |
-
*/
|
76 |
-
public function sendNoDataFoundEmail($email)
|
77 |
-
{
|
78 |
-
$siteName = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
|
79 |
-
|
80 |
-
gdpr('helpers')->mail(
|
81 |
-
$email,
|
82 |
-
__("Your personal data on", 'gdpr-framework') . ' ' . $siteName,
|
83 |
-
gdpr('view')->render('email/no-data', compact('siteName')),
|
84 |
-
['Content-Type: text/html; charset=UTF-8']
|
85 |
-
);
|
86 |
-
}
|
87 |
-
|
88 |
-
/**
|
89 |
-
* Check if the given key is valid for the given email
|
90 |
-
*
|
91 |
-
* @param $email
|
92 |
-
* @param $key
|
93 |
-
* @return bool
|
94 |
-
*/
|
95 |
-
public function isKeyValid($email, $key)
|
96 |
-
{
|
97 |
-
$keyData = $this->options->get("key_{$email}");
|
98 |
-
|
99 |
-
if (!$keyData) {
|
100 |
-
// No key exists
|
101 |
-
return false;
|
102 |
-
}
|
103 |
-
|
104 |
-
if (!isset($keyData['hashed-key']) || empty($keyData['hashed-key'])) {
|
105 |
-
// There was an error saving the data to database
|
106 |
-
return false;
|
107 |
-
}
|
108 |
-
|
109 |
-
if (!$this->validateKey($key, $keyData['hashed-key'])) {
|
110 |
-
// Invalid key
|
111 |
-
return false;
|
112 |
-
}
|
113 |
-
|
114 |
-
if ($keyData['valid-until'] < strtotime('now')) {
|
115 |
-
// expired key
|
116 |
-
return false;
|
117 |
-
}
|
118 |
-
|
119 |
-
// Double-check everything just to make sure we leave no errors in the code
|
120 |
-
return ($this->validateKey($key, $keyData['hashed-key']) && $keyData['valid-until'] > strtotime('now'));
|
121 |
-
}
|
122 |
-
|
123 |
-
/**
|
124 |
-
* Generate a secret key using the same functionality WP itself is using for Forgot Password requests
|
125 |
-
*
|
126 |
-
* @param $email
|
127 |
-
*/
|
128 |
-
public function generateKey($email)
|
129 |
-
{
|
130 |
-
$key = wp_generate_password(20, false);
|
131 |
-
$this->saveKey($email, $key);
|
132 |
-
|
133 |
-
return $key;
|
134 |
-
}
|
135 |
-
|
136 |
-
/**
|
137 |
-
* Save key into the database along with the expiration timestamp
|
138 |
-
*
|
139 |
-
* @param $email
|
140 |
-
* @param $key
|
141 |
-
*/
|
142 |
-
protected function saveKey($email, $key)
|
143 |
-
{
|
144 |
-
$this->options->set("key_{$email}", [
|
145 |
-
'email' => $email,
|
146 |
-
'hashed-key' => $this->hashKey($key),
|
147 |
-
'valid-until' => strtotime('+15 minutes'),
|
148 |
-
]);
|
149 |
-
}
|
150 |
-
|
151 |
-
/**
|
152 |
-
* @param $submittedKey
|
153 |
-
* @param $storedKey
|
154 |
-
*/
|
155 |
-
protected function validateKey($submittedKey, $storedKey)
|
156 |
-
{
|
157 |
-
return $this->getHasher()->CheckPassword($submittedKey, $storedKey);
|
158 |
-
}
|
159 |
-
|
160 |
-
/**
|
161 |
-
* Hash the key before saving to database to keep it hidden from the prying eyes of your sysadmin
|
162 |
-
*
|
163 |
-
* @param $key
|
164 |
-
* @return bool|string
|
165 |
-
*/
|
166 |
-
protected function hashKey($key)
|
167 |
-
{
|
168 |
-
return $this->getHasher()->HashPassword($key);
|
169 |
-
}
|
170 |
-
|
171 |
-
/**
|
172 |
-
* @return \PasswordHash
|
173 |
-
*/
|
174 |
-
protected function getHasher()
|
175 |
-
{
|
176 |
-
global $wp_hasher;
|
177 |
-
if (empty($wp_hasher)) {
|
178 |
-
require_once ABSPATH . WPINC . '/class-phpass.php';
|
179 |
-
$wp_hasher = new \PasswordHash(8, true);
|
180 |
-
}
|
181 |
-
|
182 |
-
return $wp_hasher;
|
183 |
-
}
|
184 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\DataSubject;
|
4 |
+
|
5 |
+
use Codelight\GDPR\Options\Options;
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Identify the data subject by unique temporary key
|
9 |
+
*
|
10 |
+
* Class DataSubjectIdentificator
|
11 |
+
*
|
12 |
+
* @package Codelight\GDPR\DataSubject
|
13 |
+
*/
|
14 |
+
class DataSubjectIdentificator
|
15 |
+
{
|
16 |
+
/* @var DataSubjectManager */
|
17 |
+
protected $dataSubjectManager;
|
18 |
+
|
19 |
+
/* @var Options */
|
20 |
+
protected $options;
|
21 |
+
|
22 |
+
/**
|
23 |
+
* DataSubjectIdentificator constructor.
|
24 |
+
*
|
25 |
+
* @param DataSubjectManager $dataSubjectManager
|
26 |
+
*/
|
27 |
+
public function __construct(DataSubjectManager $dataSubjectManager, Options $options)
|
28 |
+
{
|
29 |
+
$this->dataSubjectManager = $dataSubjectManager;
|
30 |
+
$this->options = $options;
|
31 |
+
}
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Check if there is any data associated with the given email address
|
35 |
+
*
|
36 |
+
* @param $email
|
37 |
+
* @return bool
|
38 |
+
*/
|
39 |
+
public function isDataSubject($email)
|
40 |
+
{
|
41 |
+
$dataSubject = $this->dataSubjectManager->getByEmail($email);
|
42 |
+
|
43 |
+
return apply_filters('gdpr/data-subject/has-data', $dataSubject->hasData(), $email);
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Send the email with the link that allows data subject to authenticate
|
48 |
+
*
|
49 |
+
* @param $email
|
50 |
+
*/
|
51 |
+
public function sendIdentificationEmail($email)
|
52 |
+
{
|
53 |
+
$key = $this->generateKey($email);
|
54 |
+
$privacyToolsPageUrl = gdpr('helpers')->getPrivacyToolsPageUrl();
|
55 |
+
$identificationUrl = add_query_arg([
|
56 |
+
'gdpr_key' => $key,
|
57 |
+
'email' => $email,
|
58 |
+
], $privacyToolsPageUrl);
|
59 |
+
|
60 |
+
$siteName = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
|
61 |
+
|
62 |
+
// todo: handle or log email sending errors
|
63 |
+
gdpr('helpers')->mail(
|
64 |
+
$email,
|
65 |
+
__("Your personal data on", 'gdpr-framework') . ' ' . $siteName,
|
66 |
+
gdpr('view')->render('email/identify-data-subject', compact('identificationUrl', 'siteName')),
|
67 |
+
['Content-Type: text/html; charset=UTF-8']
|
68 |
+
);
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Notify the email address that we do not store any data about them
|
73 |
+
*
|
74 |
+
* @param $email
|
75 |
+
*/
|
76 |
+
public function sendNoDataFoundEmail($email)
|
77 |
+
{
|
78 |
+
$siteName = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
|
79 |
+
|
80 |
+
gdpr('helpers')->mail(
|
81 |
+
$email,
|
82 |
+
__("Your personal data on", 'gdpr-framework') . ' ' . $siteName,
|
83 |
+
gdpr('view')->render('email/no-data', compact('siteName')),
|
84 |
+
['Content-Type: text/html; charset=UTF-8']
|
85 |
+
);
|
86 |
+
}
|
87 |
+
|
88 |
+
/**
|
89 |
+
* Check if the given key is valid for the given email
|
90 |
+
*
|
91 |
+
* @param $email
|
92 |
+
* @param $key
|
93 |
+
* @return bool
|
94 |
+
*/
|
95 |
+
public function isKeyValid($email, $key)
|
96 |
+
{
|
97 |
+
$keyData = $this->options->get("key_{$email}");
|
98 |
+
|
99 |
+
if (!$keyData) {
|
100 |
+
// No key exists
|
101 |
+
return false;
|
102 |
+
}
|
103 |
+
|
104 |
+
if (!isset($keyData['hashed-key']) || empty($keyData['hashed-key'])) {
|
105 |
+
// There was an error saving the data to database
|
106 |
+
return false;
|
107 |
+
}
|
108 |
+
|
109 |
+
if (!$this->validateKey($key, $keyData['hashed-key'])) {
|
110 |
+
// Invalid key
|
111 |
+
return false;
|
112 |
+
}
|
113 |
+
|
114 |
+
if ($keyData['valid-until'] < strtotime('now')) {
|
115 |
+
// expired key
|
116 |
+
return false;
|
117 |
+
}
|
118 |
+
|
119 |
+
// Double-check everything just to make sure we leave no errors in the code
|
120 |
+
return ($this->validateKey($key, $keyData['hashed-key']) && $keyData['valid-until'] > strtotime('now'));
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Generate a secret key using the same functionality WP itself is using for Forgot Password requests
|
125 |
+
*
|
126 |
+
* @param $email
|
127 |
+
*/
|
128 |
+
public function generateKey($email)
|
129 |
+
{
|
130 |
+
$key = wp_generate_password(20, false);
|
131 |
+
$this->saveKey($email, $key);
|
132 |
+
|
133 |
+
return $key;
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* Save key into the database along with the expiration timestamp
|
138 |
+
*
|
139 |
+
* @param $email
|
140 |
+
* @param $key
|
141 |
+
*/
|
142 |
+
protected function saveKey($email, $key)
|
143 |
+
{
|
144 |
+
$this->options->set("key_{$email}", [
|
145 |
+
'email' => $email,
|
146 |
+
'hashed-key' => $this->hashKey($key),
|
147 |
+
'valid-until' => strtotime('+15 minutes'),
|
148 |
+
]);
|
149 |
+
}
|
150 |
+
|
151 |
+
/**
|
152 |
+
* @param $submittedKey
|
153 |
+
* @param $storedKey
|
154 |
+
*/
|
155 |
+
protected function validateKey($submittedKey, $storedKey)
|
156 |
+
{
|
157 |
+
return $this->getHasher()->CheckPassword($submittedKey, $storedKey);
|
158 |
+
}
|
159 |
+
|
160 |
+
/**
|
161 |
+
* Hash the key before saving to database to keep it hidden from the prying eyes of your sysadmin
|
162 |
+
*
|
163 |
+
* @param $key
|
164 |
+
* @return bool|string
|
165 |
+
*/
|
166 |
+
protected function hashKey($key)
|
167 |
+
{
|
168 |
+
return $this->getHasher()->HashPassword($key);
|
169 |
+
}
|
170 |
+
|
171 |
+
/**
|
172 |
+
* @return \PasswordHash
|
173 |
+
*/
|
174 |
+
protected function getHasher()
|
175 |
+
{
|
176 |
+
global $wp_hasher;
|
177 |
+
if (empty($wp_hasher)) {
|
178 |
+
require_once ABSPATH . WPINC . '/class-phpass.php';
|
179 |
+
$wp_hasher = new \PasswordHash(8, true);
|
180 |
+
}
|
181 |
+
|
182 |
+
return $wp_hasher;
|
183 |
+
}
|
184 |
+
}
|
src/Helpers.php
CHANGED
@@ -1,170 +1,170 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* General helper functions
|
7 |
-
*
|
8 |
-
* Class Helpers
|
9 |
-
*
|
10 |
-
* @package Codelight\GDPR
|
11 |
-
*/
|
12 |
-
class Helpers
|
13 |
-
{
|
14 |
-
public function supportUrl($url = '')
|
15 |
-
{
|
16 |
-
return gdpr('config')->get('help.url') . $url;
|
17 |
-
}
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Get an associative array of EU countries
|
21 |
-
*
|
22 |
-
* @return array
|
23 |
-
*/
|
24 |
-
public function getEUCountryList()
|
25 |
-
{
|
26 |
-
return [
|
27 |
-
'AT' => _x('Austria', '(Admin)', 'gdpr-framework'),
|
28 |
-
'BE' => _x('Belgium', '(Admin)', 'gdpr-framework'),
|
29 |
-
'BG' => _x('Bulgaria', '(Admin)', 'gdpr-framework'),
|
30 |
-
'HR' => _x('Croatia','(Admin)', 'gdpr-framework'),
|
31 |
-
'CY' => _x('Cyprus', '(Admin)', 'gdpr-framework'),
|
32 |
-
'CZ' => _x('Czech Republic', '(Admin)', 'gdpr-framework'),
|
33 |
-
'DK' => _x('Denmark', '(Admin)', 'gdpr-framework'),
|
34 |
-
'EE' => _x('Estonia', '(Admin)', 'gdpr-framework'),
|
35 |
-
'FI' => _x('Finland', '(Admin)', 'gdpr-framework'),
|
36 |
-
'FR' => _x('France', '(Admin)', 'gdpr-framework'),
|
37 |
-
'DE' => _x('Germany', '(Admin)', 'gdpr-framework'),
|
38 |
-
'GR' => _x('Greece', '(Admin)', 'gdpr-framework'),
|
39 |
-
'HU' => _x('Hungary', '(Admin)', 'gdpr-framework'),
|
40 |
-
'IE' => _x('Ireland', '(Admin)', 'gdpr-framework'),
|
41 |
-
'IT' => _x('Italy', '(Admin)', 'gdpr-framework'),
|
42 |
-
'LV' => _x('Latvia', '(Admin)', 'gdpr-framework'),
|
43 |
-
'LT' => _x('Lithuania', '(Admin)', 'gdpr-framework'),
|
44 |
-
'LU' => _x('Luxembourg', '(Admin)', 'gdpr-framework'),
|
45 |
-
'MT' => _x('Malta', '(Admin)', 'gdpr-framework'),
|
46 |
-
'NL' => _x('Netherlands', '(Admin)', 'gdpr-framework'),
|
47 |
-
'PL' => _x('Poland', '(Admin)', 'gdpr-framework'),
|
48 |
-
'PT' => _x('Portugal', '(Admin)', 'gdpr-framework'),
|
49 |
-
'RO' => _x('Romania', '(Admin)', 'gdpr-framework'),
|
50 |
-
'SK' => _x('Slovakia', '(Admin)', 'gdpr-framework'),
|
51 |
-
'SI' => _x('Slovenia', '(Admin)', 'gdpr-framework'),
|
52 |
-
'ES' => _x('Spain', '(Admin)', 'gdpr-framework'),
|
53 |
-
'SE' => _x('Sweden', '(Admin)', 'gdpr-framework'),
|
54 |
-
'UK' => _x('United Kingdom', '(Admin)', 'gdpr-framework'),
|
55 |
-
];
|
56 |
-
}
|
57 |
-
|
58 |
-
/**
|
59 |
-
* Get a list of <option> values for the country selector
|
60 |
-
*
|
61 |
-
* @param null $current
|
62 |
-
*
|
63 |
-
* @return mixed
|
64 |
-
*/
|
65 |
-
public function getCountrySelectOptions($current = null)
|
66 |
-
{
|
67 |
-
$eu = $this->getEUCountryList();
|
68 |
-
$outside = [
|
69 |
-
"IS" => _x('Iceland', '(Admin)', 'gdpr-framework'),
|
70 |
-
"NO" => _x('Norway', '(Admin)', 'gdpr-framework'),
|
71 |
-
"LI" => _x('Liechtenstein', '(Admin)', 'gdpr-framework'),
|
72 |
-
"CH" => _x('Switzerland', '(Admin)', 'gdpr-framework'),
|
73 |
-
"US" => _x('United States', '(Admin)', 'gdpr-framework'),
|
74 |
-
"other" => _x('Rest of the world', '(Admin)', 'gdpr-framework'),
|
75 |
-
];
|
76 |
-
|
77 |
-
return gdpr('view')->render('global/country-options', compact('eu', 'outside', 'current'));
|
78 |
-
}
|
79 |
-
|
80 |
-
/**
|
81 |
-
* Check if a controller from the given country needs a representative in the EU
|
82 |
-
*
|
83 |
-
* @param $code
|
84 |
-
* @return bool
|
85 |
-
*/
|
86 |
-
public function countryNeedsRepresentative($code)
|
87 |
-
{
|
88 |
-
return in_array($code, ['US', 'other']);
|
89 |
-
}
|
90 |
-
|
91 |
-
/**
|
92 |
-
* Get the data protection authority information for a given country
|
93 |
-
*
|
94 |
-
* @param null $countryCode
|
95 |
-
* @return array
|
96 |
-
*/
|
97 |
-
public function getDataProtectionAuthorityInfo($countryCode = null)
|
98 |
-
{
|
99 |
-
if (!$countryCode) {
|
100 |
-
$countryCode = gdpr('options')->get('company_location');
|
101 |
-
}
|
102 |
-
|
103 |
-
$dpaData = require(gdpr('config')->get('plugin.path') . 'assets/data-protection-authorities.php');
|
104 |
-
|
105 |
-
if (isset($dpaData[$countryCode])) {
|
106 |
-
return $dpaData[$countryCode];
|
107 |
-
}
|
108 |
-
|
109 |
-
return [];
|
110 |
-
}
|
111 |
-
|
112 |
-
/**
|
113 |
-
* Get the info regarding all DPAs
|
114 |
-
*/
|
115 |
-
public function getDataProtectionAuthorities()
|
116 |
-
{
|
117 |
-
return require(gdpr('config')->get('plugin.path') . 'assets/data-protection-authorities.php');
|
118 |
-
}
|
119 |
-
|
120 |
-
public function getAdminUrl($suffix = '')
|
121 |
-
{
|
122 |
-
return admin_url('tools.php?page=privacy' . $suffix);
|
123 |
-
}
|
124 |
-
|
125 |
-
public function getDashboardDataPageUrl($suffix = '')
|
126 |
-
{
|
127 |
-
return admin_url('users.php?page=gdpr-profile' . $suffix);
|
128 |
-
}
|
129 |
-
|
130 |
-
public function getPrivacyToolsPageUrl()
|
131 |
-
{
|
132 |
-
$toolsPageId = gdpr('options')->get('tools_page');
|
133 |
-
return $toolsPageId ? get_permalink($toolsPageId) : '';
|
134 |
-
}
|
135 |
-
|
136 |
-
public function getPrivacyPolicyPageUrl()
|
137 |
-
{
|
138 |
-
$policyPageId = gdpr('options')->get('policy_page');
|
139 |
-
return $policyPageId ? get_permalink($policyPageId) : '';
|
140 |
-
}
|
141 |
-
|
142 |
-
public function error()
|
143 |
-
{
|
144 |
-
wp_die(
|
145 |
-
__('An error has occurred. Please contact the site administrator.', 'gdpr-framework')
|
146 |
-
);
|
147 |
-
}
|
148 |
-
|
149 |
-
public function docs($url = '')
|
150 |
-
{
|
151 |
-
return 'https://codelight.eu/wordpress-gdpr-framework/' . $url;
|
152 |
-
}
|
153 |
-
|
154 |
-
/**
|
155 |
-
* Wrapper around wp_mail() to filter the headers
|
156 |
-
* Example code for changing the sender email:
|
157 |
-
*
|
158 |
-
* add_filter('gdpr/mail/headers', function($headers) {
|
159 |
-
$headers[] = 'From: Firstname Lastname <test@example.com>';
|
160 |
-
return $headers;
|
161 |
-
});
|
162 |
-
*
|
163 |
-
*
|
164 |
-
*/
|
165 |
-
public function mail($to, $subject, $message, $headers = '', $attachments = [])
|
166 |
-
{
|
167 |
-
$headers = apply_filters('gdpr/mail/headers', $headers);
|
168 |
-
wp_mail($to, $subject, $message, $headers, $attachments);
|
169 |
-
}
|
170 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* General helper functions
|
7 |
+
*
|
8 |
+
* Class Helpers
|
9 |
+
*
|
10 |
+
* @package Codelight\GDPR
|
11 |
+
*/
|
12 |
+
class Helpers
|
13 |
+
{
|
14 |
+
public function supportUrl($url = '')
|
15 |
+
{
|
16 |
+
return gdpr('config')->get('help.url') . $url;
|
17 |
+
}
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Get an associative array of EU countries
|
21 |
+
*
|
22 |
+
* @return array
|
23 |
+
*/
|
24 |
+
public function getEUCountryList()
|
25 |
+
{
|
26 |
+
return [
|
27 |
+
'AT' => _x('Austria', '(Admin)', 'gdpr-framework'),
|
28 |
+
'BE' => _x('Belgium', '(Admin)', 'gdpr-framework'),
|
29 |
+
'BG' => _x('Bulgaria', '(Admin)', 'gdpr-framework'),
|
30 |
+
'HR' => _x('Croatia','(Admin)', 'gdpr-framework'),
|
31 |
+
'CY' => _x('Cyprus', '(Admin)', 'gdpr-framework'),
|
32 |
+
'CZ' => _x('Czech Republic', '(Admin)', 'gdpr-framework'),
|
33 |
+
'DK' => _x('Denmark', '(Admin)', 'gdpr-framework'),
|
34 |
+
'EE' => _x('Estonia', '(Admin)', 'gdpr-framework'),
|
35 |
+
'FI' => _x('Finland', '(Admin)', 'gdpr-framework'),
|
36 |
+
'FR' => _x('France', '(Admin)', 'gdpr-framework'),
|
37 |
+
'DE' => _x('Germany', '(Admin)', 'gdpr-framework'),
|
38 |
+
'GR' => _x('Greece', '(Admin)', 'gdpr-framework'),
|
39 |
+
'HU' => _x('Hungary', '(Admin)', 'gdpr-framework'),
|
40 |
+
'IE' => _x('Ireland', '(Admin)', 'gdpr-framework'),
|
41 |
+
'IT' => _x('Italy', '(Admin)', 'gdpr-framework'),
|
42 |
+
'LV' => _x('Latvia', '(Admin)', 'gdpr-framework'),
|
43 |
+
'LT' => _x('Lithuania', '(Admin)', 'gdpr-framework'),
|
44 |
+
'LU' => _x('Luxembourg', '(Admin)', 'gdpr-framework'),
|
45 |
+
'MT' => _x('Malta', '(Admin)', 'gdpr-framework'),
|
46 |
+
'NL' => _x('Netherlands', '(Admin)', 'gdpr-framework'),
|
47 |
+
'PL' => _x('Poland', '(Admin)', 'gdpr-framework'),
|
48 |
+
'PT' => _x('Portugal', '(Admin)', 'gdpr-framework'),
|
49 |
+
'RO' => _x('Romania', '(Admin)', 'gdpr-framework'),
|
50 |
+
'SK' => _x('Slovakia', '(Admin)', 'gdpr-framework'),
|
51 |
+
'SI' => _x('Slovenia', '(Admin)', 'gdpr-framework'),
|
52 |
+
'ES' => _x('Spain', '(Admin)', 'gdpr-framework'),
|
53 |
+
'SE' => _x('Sweden', '(Admin)', 'gdpr-framework'),
|
54 |
+
'UK' => _x('United Kingdom', '(Admin)', 'gdpr-framework'),
|
55 |
+
];
|
56 |
+
}
|
57 |
+
|
58 |
+
/**
|
59 |
+
* Get a list of <option> values for the country selector
|
60 |
+
*
|
61 |
+
* @param null $current
|
62 |
+
*
|
63 |
+
* @return mixed
|
64 |
+
*/
|
65 |
+
public function getCountrySelectOptions($current = null)
|
66 |
+
{
|
67 |
+
$eu = $this->getEUCountryList();
|
68 |
+
$outside = [
|
69 |
+
"IS" => _x('Iceland', '(Admin)', 'gdpr-framework'),
|
70 |
+
"NO" => _x('Norway', '(Admin)', 'gdpr-framework'),
|
71 |
+
"LI" => _x('Liechtenstein', '(Admin)', 'gdpr-framework'),
|
72 |
+
"CH" => _x('Switzerland', '(Admin)', 'gdpr-framework'),
|
73 |
+
"US" => _x('United States', '(Admin)', 'gdpr-framework'),
|
74 |
+
"other" => _x('Rest of the world', '(Admin)', 'gdpr-framework'),
|
75 |
+
];
|
76 |
+
|
77 |
+
return gdpr('view')->render('global/country-options', compact('eu', 'outside', 'current'));
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Check if a controller from the given country needs a representative in the EU
|
82 |
+
*
|
83 |
+
* @param $code
|
84 |
+
* @return bool
|
85 |
+
*/
|
86 |
+
public function countryNeedsRepresentative($code)
|
87 |
+
{
|
88 |
+
return in_array($code, ['US', 'other']);
|
89 |
+
}
|
90 |
+
|
91 |
+
/**
|
92 |
+
* Get the data protection authority information for a given country
|
93 |
+
*
|
94 |
+
* @param null $countryCode
|
95 |
+
* @return array
|
96 |
+
*/
|
97 |
+
public function getDataProtectionAuthorityInfo($countryCode = null)
|
98 |
+
{
|
99 |
+
if (!$countryCode) {
|
100 |
+
$countryCode = gdpr('options')->get('company_location');
|
101 |
+
}
|
102 |
+
|
103 |
+
$dpaData = require(gdpr('config')->get('plugin.path') . 'assets/data-protection-authorities.php');
|
104 |
+
|
105 |
+
if (isset($dpaData[$countryCode])) {
|
106 |
+
return $dpaData[$countryCode];
|
107 |
+
}
|
108 |
+
|
109 |
+
return [];
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* Get the info regarding all DPAs
|
114 |
+
*/
|
115 |
+
public function getDataProtectionAuthorities()
|
116 |
+
{
|
117 |
+
return require(gdpr('config')->get('plugin.path') . 'assets/data-protection-authorities.php');
|
118 |
+
}
|
119 |
+
|
120 |
+
public function getAdminUrl($suffix = '')
|
121 |
+
{
|
122 |
+
return admin_url('tools.php?page=privacy' . $suffix);
|
123 |
+
}
|
124 |
+
|
125 |
+
public function getDashboardDataPageUrl($suffix = '')
|
126 |
+
{
|
127 |
+
return admin_url('users.php?page=gdpr-profile' . $suffix);
|
128 |
+
}
|
129 |
+
|
130 |
+
public function getPrivacyToolsPageUrl()
|
131 |
+
{
|
132 |
+
$toolsPageId = gdpr('options')->get('tools_page');
|
133 |
+
return $toolsPageId ? get_permalink($toolsPageId) : '';
|
134 |
+
}
|
135 |
+
|
136 |
+
public function getPrivacyPolicyPageUrl()
|
137 |
+
{
|
138 |
+
$policyPageId = gdpr('options')->get('policy_page');
|
139 |
+
return $policyPageId ? get_permalink($policyPageId) : '';
|
140 |
+
}
|
141 |
+
|
142 |
+
public function error()
|
143 |
+
{
|
144 |
+
wp_die(
|
145 |
+
__('An error has occurred. Please contact the site administrator.', 'gdpr-framework')
|
146 |
+
);
|
147 |
+
}
|
148 |
+
|
149 |
+
public function docs($url = '')
|
150 |
+
{
|
151 |
+
return 'https://codelight.eu/wordpress-gdpr-framework/' . $url;
|
152 |
+
}
|
153 |
+
|
154 |
+
/**
|
155 |
+
* Wrapper around wp_mail() to filter the headers
|
156 |
+
* Example code for changing the sender email:
|
157 |
+
*
|
158 |
+
* add_filter('gdpr/mail/headers', function($headers) {
|
159 |
+
$headers[] = 'From: Firstname Lastname <test@example.com>';
|
160 |
+
return $headers;
|
161 |
+
});
|
162 |
+
*
|
163 |
+
*
|
164 |
+
*/
|
165 |
+
public function mail($to, $subject, $message, $headers = '', $attachments = [])
|
166 |
+
{
|
167 |
+
$headers = apply_filters('gdpr/mail/headers', $headers);
|
168 |
+
wp_mail($to, $subject, $message, $headers, $attachments);
|
169 |
+
}
|
170 |
+
}
|
src/Installer/Installer.php
CHANGED
@@ -1,303 +1,303 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Installer;
|
4 |
-
|
5 |
-
use Codelight\GDPR\Admin\AdminTabGeneral;
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Handle all installation activities
|
9 |
-
*
|
10 |
-
* Class Installer
|
11 |
-
*
|
12 |
-
* @package Codelight\GDPR\Installer
|
13 |
-
*/
|
14 |
-
class Installer
|
15 |
-
{
|
16 |
-
/* @var array */
|
17 |
-
protected $defaultSteps = [
|
18 |
-
'Codelight\GDPR\Installer\Steps\Welcome',
|
19 |
-
'Codelight\GDPR\Installer\Steps\Disclaimer',
|
20 |
-
'Codelight\GDPR\Installer\Steps\ConfigurationPages',
|
21 |
-
'Codelight\GDPR\Installer\Steps\ConfigurationSettings',
|
22 |
-
'Codelight\GDPR\Installer\Steps\PolicySettings',
|
23 |
-
'Codelight\GDPR\Installer\Steps\PolicyContents',
|
24 |
-
'Codelight\GDPR\Installer\Steps\Consent',
|
25 |
-
'Codelight\GDPR\Installer\Steps\Integrations',
|
26 |
-
'Codelight\GDPR\Installer\Steps\Finish',
|
27 |
-
];
|
28 |
-
|
29 |
-
/* @var array */
|
30 |
-
protected $steps = [];
|
31 |
-
|
32 |
-
/* @var InstallerWizard */
|
33 |
-
protected $wizard;
|
34 |
-
|
35 |
-
/* @var InstallerRouter */
|
36 |
-
protected $router;
|
37 |
-
|
38 |
-
/**
|
39 |
-
* Check if the installer is enabled and ensure the user has correct permissions to run it
|
40 |
-
*/
|
41 |
-
public function __construct(AdminTabGeneral $adminTab)
|
42 |
-
{
|
43 |
-
if (!$this->isInstallerEnabled()) {
|
44 |
-
return;
|
45 |
-
}
|
46 |
-
|
47 |
-
if (!$this->userHasPermissions()) {
|
48 |
-
return;
|
49 |
-
}
|
50 |
-
|
51 |
-
$this->adminTab = $adminTab;
|
52 |
-
|
53 |
-
$this->maybeDisplayDisclaimer();
|
54 |
-
$this->setupHooks();
|
55 |
-
|
56 |
-
if (!$this->isInstalled()) {
|
57 |
-
$this->setupSteps();
|
58 |
-
$this->runInstaller();
|
59 |
-
}
|
60 |
-
}
|
61 |
-
|
62 |
-
/**
|
63 |
-
* Setup actions and admin tab components
|
64 |
-
*/
|
65 |
-
protected function setupHooks()
|
66 |
-
{
|
67 |
-
add_action('admin_init', [$this, 'setupAdminGeneralTabButtons'], 0);
|
68 |
-
|
69 |
-
add_action('gdpr/admin/action/accept_disclaimer', [$this, 'acceptDisclaimer']);
|
70 |
-
|
71 |
-
add_action('gdpr/admin/action/restart_wizard', [$this, 'restartWizard']);
|
72 |
-
|
73 |
-
add_action('gdpr/admin/action/auto_install', [$this, 'autoInstall']);
|
74 |
-
add_action('gdpr/admin/action/skip_install', [$this, 'skipInstall']);
|
75 |
-
}
|
76 |
-
|
77 |
-
protected function runInstaller()
|
78 |
-
{
|
79 |
-
$this->wizard = new InstallerWizard;
|
80 |
-
$this->router = new InstallerRouter($this->steps);
|
81 |
-
|
82 |
-
// If we're currently on one of the installer steps, let the router handle it
|
83 |
-
if ($this->router->isInstallerStep()) {
|
84 |
-
return;
|
85 |
-
}
|
86 |
-
|
87 |
-
if ($this->getCurrentStepSlug()) {
|
88 |
-
// If the current step is set, display continue notice
|
89 |
-
$step = $this->router->findStep($this->getCurrentStepSlug());
|
90 |
-
// If step doesn't exist, then it means the step slugs have changed. Do nothing.
|
91 |
-
if (!$step) {
|
92 |
-
return;
|
93 |
-
}
|
94 |
-
$this->displayContinueNotice($step->getUrl());
|
95 |
-
} else {
|
96 |
-
// If the current step is not set, it means the installer hasn't been started yet
|
97 |
-
$this->displayWelcomeNotice();
|
98 |
-
}
|
99 |
-
}
|
100 |
-
|
101 |
-
/**
|
102 |
-
* If the admin has not accepted the disclaimer, render it
|
103 |
-
*/
|
104 |
-
public function maybeDisplayDisclaimer()
|
105 |
-
{
|
106 |
-
if (!gdpr('options')->get('plugin_disclaimer_accepted') && (isset($_GET['page']) && 'privacy' === $_GET['page'])) {
|
107 |
-
$acceptUrl = add_query_arg([
|
108 |
-
'gdpr_action' => 'accept_disclaimer',
|
109 |
-
'gdpr_nonce' => wp_create_nonce('gdpr/admin/action/accept_disclaimer'),
|
110 |
-
]);
|
111 |
-
gdpr('admin-notice')->add('admin/notices/disclaimer', compact('acceptUrl'));
|
112 |
-
}
|
113 |
-
}
|
114 |
-
|
115 |
-
/**
|
116 |
-
* Mark the disclaimer as accepted
|
117 |
-
*/
|
118 |
-
public function acceptDisclaimer()
|
119 |
-
{
|
120 |
-
gdpr('options')->set('plugin_disclaimer_accepted', 'yes');
|
121 |
-
wp_safe_redirect(gdpr('helpers')->getAdminUrl());
|
122 |
-
exit;
|
123 |
-
}
|
124 |
-
|
125 |
-
/**
|
126 |
-
* Display installer section in admin page
|
127 |
-
*/
|
128 |
-
public function setupAdminGeneralTabButtons()
|
129 |
-
{
|
130 |
-
/**
|
131 |
-
* Display wizard buttons
|
132 |
-
*/
|
133 |
-
$this->adminTab->registerSettingSection(
|
134 |
-
'gdpr-section-wizard',
|
135 |
-
_x('Setup Wizard', '(Admin)', 'gdpr-framework'),
|
136 |
-
[$this, 'renderWizardButtons']
|
137 |
-
);
|
138 |
-
}
|
139 |
-
|
140 |
-
/**
|
141 |
-
* Render the installer section
|
142 |
-
*/
|
143 |
-
public function renderWizardButtons()
|
144 |
-
{
|
145 |
-
$restartUrl = add_query_arg([
|
146 |
-
'gdpr_action' => 'restart_wizard',
|
147 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/restart_wizard"),
|
148 |
-
]);
|
149 |
-
|
150 |
-
echo gdpr('view')->render(
|
151 |
-
'admin/wizard-buttons',
|
152 |
-
compact('restartUrl')
|
153 |
-
);
|
154 |
-
}
|
155 |
-
|
156 |
-
/**
|
157 |
-
* Restart and redirect to first step
|
158 |
-
*/
|
159 |
-
public function restartWizard()
|
160 |
-
{
|
161 |
-
gdpr('options')->delete('installer_step');
|
162 |
-
gdpr('options')->delete('is_installed');
|
163 |
-
|
164 |
-
wp_safe_redirect(self_admin_url());
|
165 |
-
exit;
|
166 |
-
}
|
167 |
-
|
168 |
-
/**
|
169 |
-
* Allow plugins to modify the steps
|
170 |
-
*/
|
171 |
-
protected function setupSteps()
|
172 |
-
{
|
173 |
-
$steps = apply_filters('gdpr/installer/steps', $this->defaultSteps);
|
174 |
-
|
175 |
-
foreach ($steps as $index => $step) {
|
176 |
-
$this->steps[$index] = new $step;
|
177 |
-
}
|
178 |
-
}
|
179 |
-
|
180 |
-
/**
|
181 |
-
* The installer can be disabled by filter.
|
182 |
-
* Check if it's enabled
|
183 |
-
*
|
184 |
-
* @return bool
|
185 |
-
*/
|
186 |
-
protected function isInstallerEnabled()
|
187 |
-
{
|
188 |
-
return apply_filters('gdpr/installer/enabled', true);
|
189 |
-
}
|
190 |
-
|
191 |
-
/**
|
192 |
-
* Check if the current user has correct permissions to run the installer
|
193 |
-
*
|
194 |
-
* @return bool
|
195 |
-
*/
|
196 |
-
protected function userHasPermissions()
|
197 |
-
{
|
198 |
-
return current_user_can(apply_filters('gdpr/installer/permissions', 'manage_options'));
|
199 |
-
}
|
200 |
-
|
201 |
-
/**
|
202 |
-
* Check if the installer is already ran
|
203 |
-
*
|
204 |
-
* @return bool
|
205 |
-
*/
|
206 |
-
protected function isInstalled()
|
207 |
-
{
|
208 |
-
return gdpr('options')->get('is_installed');
|
209 |
-
}
|
210 |
-
|
211 |
-
/**
|
212 |
-
* @return string
|
213 |
-
*/
|
214 |
-
public function getCurrentStepSlug()
|
215 |
-
{
|
216 |
-
return gdpr('options')->get('installer_step');
|
217 |
-
}
|
218 |
-
|
219 |
-
/**
|
220 |
-
* Render an admin notice that will display the welcome message
|
221 |
-
*/
|
222 |
-
protected function displayWelcomeNotice()
|
223 |
-
{
|
224 |
-
// Make sure we display the notice only to admins
|
225 |
-
if (!current_user_can(apply_filters('gdpr/capability', 'manage_options'))) {
|
226 |
-
return;
|
227 |
-
}
|
228 |
-
|
229 |
-
$installerUrl = $this->steps[0]->getUrl();
|
230 |
-
$autoInstallUrl = add_query_arg([
|
231 |
-
'gdpr_action' => 'auto_install',
|
232 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/auto_install"),
|
233 |
-
]);
|
234 |
-
$skipUrl = add_query_arg([
|
235 |
-
'gdpr_action' => 'skip_install',
|
236 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/skip_install"),
|
237 |
-
]);
|
238 |
-
|
239 |
-
gdpr('admin-notice')->add(
|
240 |
-
'installer/welcome-notice',
|
241 |
-
compact('installerUrl', 'autoInstallUrl', 'skipUrl')
|
242 |
-
);
|
243 |
-
}
|
244 |
-
|
245 |
-
/**
|
246 |
-
* Render an admin notice that will display the continue button
|
247 |
-
*
|
248 |
-
* @param $url
|
249 |
-
*/
|
250 |
-
protected function displayContinueNotice($url)
|
251 |
-
{
|
252 |
-
// Make sure we display the notice only to admins
|
253 |
-
if (!current_user_can(apply_filters('gdpr/capability', 'manage_options'))) {
|
254 |
-
return;
|
255 |
-
}
|
256 |
-
|
257 |
-
$skipUrl = add_query_arg([
|
258 |
-
'gdpr_action' => 'skip_install',
|
259 |
-
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/skip_install"),
|
260 |
-
]);
|
261 |
-
|
262 |
-
gdpr('admin-notice')->add('installer/continue-notice', ['buttonUrl' => $url, 'skipUrl' => $skipUrl]);
|
263 |
-
}
|
264 |
-
|
265 |
-
/**
|
266 |
-
* Automatically create pages for Privacy Policy and set the corresponding options
|
267 |
-
*/
|
268 |
-
public function autoInstall()
|
269 |
-
{
|
270 |
-
$policyPageId = wp_insert_post([
|
271 |
-
'post_title' => __('Privacy Policy', 'gdpr-framework'),
|
272 |
-
'post_type' => 'page',
|
273 |
-
]);
|
274 |
-
|
275 |
-
gdpr('options')->set('policy_page', $policyPageId);
|
276 |
-
|
277 |
-
$toolsPageId = wp_insert_post([
|
278 |
-
'post_content' => '[gdpr_privacy_tools]',
|
279 |
-
'post_title' => __('Privacy Tools', 'gdpr-framework'),
|
280 |
-
'post_type' => 'page',
|
281 |
-
]);
|
282 |
-
gdpr('options')->set('tools_page', $toolsPageId);
|
283 |
-
|
284 |
-
// Woocommerce compatibility - automatically add their terms page
|
285 |
-
if (get_option('woocommerce_terms_page_id')) {
|
286 |
-
gdpr('options')->set('terms_page', get_option('woocommerce_terms_page_id'));
|
287 |
-
}
|
288 |
-
|
289 |
-
gdpr('options')->set('is_installed', 'yes');
|
290 |
-
wp_safe_redirect(gdpr('helpers')->getAdminUrl('&gdpr-tab=privacy-policy&gdpr-notice=autoinstall'));
|
291 |
-
exit;
|
292 |
-
}
|
293 |
-
|
294 |
-
/**
|
295 |
-
* Do nothing, but mark the installer as completed
|
296 |
-
*/
|
297 |
-
public function skipInstall()
|
298 |
-
{
|
299 |
-
gdpr('options')->set('is_installed', 'yes');
|
300 |
-
wp_safe_redirect(gdpr('helpers')->getAdminUrl());
|
301 |
-
exit;
|
302 |
-
}
|
303 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Installer;
|
4 |
+
|
5 |
+
use Codelight\GDPR\Admin\AdminTabGeneral;
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Handle all installation activities
|
9 |
+
*
|
10 |
+
* Class Installer
|
11 |
+
*
|
12 |
+
* @package Codelight\GDPR\Installer
|
13 |
+
*/
|
14 |
+
class Installer
|
15 |
+
{
|
16 |
+
/* @var array */
|
17 |
+
protected $defaultSteps = [
|
18 |
+
'Codelight\GDPR\Installer\Steps\Welcome',
|
19 |
+
'Codelight\GDPR\Installer\Steps\Disclaimer',
|
20 |
+
'Codelight\GDPR\Installer\Steps\ConfigurationPages',
|
21 |
+
'Codelight\GDPR\Installer\Steps\ConfigurationSettings',
|
22 |
+
'Codelight\GDPR\Installer\Steps\PolicySettings',
|
23 |
+
'Codelight\GDPR\Installer\Steps\PolicyContents',
|
24 |
+
'Codelight\GDPR\Installer\Steps\Consent',
|
25 |
+
'Codelight\GDPR\Installer\Steps\Integrations',
|
26 |
+
'Codelight\GDPR\Installer\Steps\Finish',
|
27 |
+
];
|
28 |
+
|
29 |
+
/* @var array */
|
30 |
+
protected $steps = [];
|
31 |
+
|
32 |
+
/* @var InstallerWizard */
|
33 |
+
protected $wizard;
|
34 |
+
|
35 |
+
/* @var InstallerRouter */
|
36 |
+
protected $router;
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Check if the installer is enabled and ensure the user has correct permissions to run it
|
40 |
+
*/
|
41 |
+
public function __construct(AdminTabGeneral $adminTab)
|
42 |
+
{
|
43 |
+
if (!$this->isInstallerEnabled()) {
|
44 |
+
return;
|
45 |
+
}
|
46 |
+
|
47 |
+
if (!$this->userHasPermissions()) {
|
48 |
+
return;
|
49 |
+
}
|
50 |
+
|
51 |
+
$this->adminTab = $adminTab;
|
52 |
+
|
53 |
+
$this->maybeDisplayDisclaimer();
|
54 |
+
$this->setupHooks();
|
55 |
+
|
56 |
+
if (!$this->isInstalled()) {
|
57 |
+
$this->setupSteps();
|
58 |
+
$this->runInstaller();
|
59 |
+
}
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* Setup actions and admin tab components
|
64 |
+
*/
|
65 |
+
protected function setupHooks()
|
66 |
+
{
|
67 |
+
add_action('admin_init', [$this, 'setupAdminGeneralTabButtons'], 0);
|
68 |
+
|
69 |
+
add_action('gdpr/admin/action/accept_disclaimer', [$this, 'acceptDisclaimer']);
|
70 |
+
|
71 |
+
add_action('gdpr/admin/action/restart_wizard', [$this, 'restartWizard']);
|
72 |
+
|
73 |
+
add_action('gdpr/admin/action/auto_install', [$this, 'autoInstall']);
|
74 |
+
add_action('gdpr/admin/action/skip_install', [$this, 'skipInstall']);
|
75 |
+
}
|
76 |
+
|
77 |
+
protected function runInstaller()
|
78 |
+
{
|
79 |
+
$this->wizard = new InstallerWizard;
|
80 |
+
$this->router = new InstallerRouter($this->steps);
|
81 |
+
|
82 |
+
// If we're currently on one of the installer steps, let the router handle it
|
83 |
+
if ($this->router->isInstallerStep()) {
|
84 |
+
return;
|
85 |
+
}
|
86 |
+
|
87 |
+
if ($this->getCurrentStepSlug()) {
|
88 |
+
// If the current step is set, display continue notice
|
89 |
+
$step = $this->router->findStep($this->getCurrentStepSlug());
|
90 |
+
// If step doesn't exist, then it means the step slugs have changed. Do nothing.
|
91 |
+
if (!$step) {
|
92 |
+
return;
|
93 |
+
}
|
94 |
+
$this->displayContinueNotice($step->getUrl());
|
95 |
+
} else {
|
96 |
+
// If the current step is not set, it means the installer hasn't been started yet
|
97 |
+
$this->displayWelcomeNotice();
|
98 |
+
}
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* If the admin has not accepted the disclaimer, render it
|
103 |
+
*/
|
104 |
+
public function maybeDisplayDisclaimer()
|
105 |
+
{
|
106 |
+
if (!gdpr('options')->get('plugin_disclaimer_accepted') && (isset($_GET['page']) && 'privacy' === $_GET['page'])) {
|
107 |
+
$acceptUrl = add_query_arg([
|
108 |
+
'gdpr_action' => 'accept_disclaimer',
|
109 |
+
'gdpr_nonce' => wp_create_nonce('gdpr/admin/action/accept_disclaimer'),
|
110 |
+
]);
|
111 |
+
gdpr('admin-notice')->add('admin/notices/disclaimer', compact('acceptUrl'));
|
112 |
+
}
|
113 |
+
}
|
114 |
+
|
115 |
+
/**
|
116 |
+
* Mark the disclaimer as accepted
|
117 |
+
*/
|
118 |
+
public function acceptDisclaimer()
|
119 |
+
{
|
120 |
+
gdpr('options')->set('plugin_disclaimer_accepted', 'yes');
|
121 |
+
wp_safe_redirect(gdpr('helpers')->getAdminUrl());
|
122 |
+
exit;
|
123 |
+
}
|
124 |
+
|
125 |
+
/**
|
126 |
+
* Display installer section in admin page
|
127 |
+
*/
|
128 |
+
public function setupAdminGeneralTabButtons()
|
129 |
+
{
|
130 |
+
/**
|
131 |
+
* Display wizard buttons
|
132 |
+
*/
|
133 |
+
$this->adminTab->registerSettingSection(
|
134 |
+
'gdpr-section-wizard',
|
135 |
+
_x('Setup Wizard', '(Admin)', 'gdpr-framework'),
|
136 |
+
[$this, 'renderWizardButtons']
|
137 |
+
);
|
138 |
+
}
|
139 |
+
|
140 |
+
/**
|
141 |
+
* Render the installer section
|
142 |
+
*/
|
143 |
+
public function renderWizardButtons()
|
144 |
+
{
|
145 |
+
$restartUrl = add_query_arg([
|
146 |
+
'gdpr_action' => 'restart_wizard',
|
147 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/restart_wizard"),
|
148 |
+
]);
|
149 |
+
|
150 |
+
echo gdpr('view')->render(
|
151 |
+
'admin/wizard-buttons',
|
152 |
+
compact('restartUrl')
|
153 |
+
);
|
154 |
+
}
|
155 |
+
|
156 |
+
/**
|
157 |
+
* Restart and redirect to first step
|
158 |
+
*/
|
159 |
+
public function restartWizard()
|
160 |
+
{
|
161 |
+
gdpr('options')->delete('installer_step');
|
162 |
+
gdpr('options')->delete('is_installed');
|
163 |
+
|
164 |
+
wp_safe_redirect(self_admin_url());
|
165 |
+
exit;
|
166 |
+
}
|
167 |
+
|
168 |
+
/**
|
169 |
+
* Allow plugins to modify the steps
|
170 |
+
*/
|
171 |
+
protected function setupSteps()
|
172 |
+
{
|
173 |
+
$steps = apply_filters('gdpr/installer/steps', $this->defaultSteps);
|
174 |
+
|
175 |
+
foreach ($steps as $index => $step) {
|
176 |
+
$this->steps[$index] = new $step;
|
177 |
+
}
|
178 |
+
}
|
179 |
+
|
180 |
+
/**
|
181 |
+
* The installer can be disabled by filter.
|
182 |
+
* Check if it's enabled
|
183 |
+
*
|
184 |
+
* @return bool
|
185 |
+
*/
|
186 |
+
protected function isInstallerEnabled()
|
187 |
+
{
|
188 |
+
return apply_filters('gdpr/installer/enabled', true);
|
189 |
+
}
|
190 |
+
|
191 |
+
/**
|
192 |
+
* Check if the current user has correct permissions to run the installer
|
193 |
+
*
|
194 |
+
* @return bool
|
195 |
+
*/
|
196 |
+
protected function userHasPermissions()
|
197 |
+
{
|
198 |
+
return current_user_can(apply_filters('gdpr/installer/permissions', 'manage_options'));
|
199 |
+
}
|
200 |
+
|
201 |
+
/**
|
202 |
+
* Check if the installer is already ran
|
203 |
+
*
|
204 |
+
* @return bool
|
205 |
+
*/
|
206 |
+
protected function isInstalled()
|
207 |
+
{
|
208 |
+
return gdpr('options')->get('is_installed');
|
209 |
+
}
|
210 |
+
|
211 |
+
/**
|
212 |
+
* @return string
|
213 |
+
*/
|
214 |
+
public function getCurrentStepSlug()
|
215 |
+
{
|
216 |
+
return gdpr('options')->get('installer_step');
|
217 |
+
}
|
218 |
+
|
219 |
+
/**
|
220 |
+
* Render an admin notice that will display the welcome message
|
221 |
+
*/
|
222 |
+
protected function displayWelcomeNotice()
|
223 |
+
{
|
224 |
+
// Make sure we display the notice only to admins
|
225 |
+
if (!current_user_can(apply_filters('gdpr/capability', 'manage_options'))) {
|
226 |
+
return;
|
227 |
+
}
|
228 |
+
|
229 |
+
$installerUrl = $this->steps[0]->getUrl();
|
230 |
+
$autoInstallUrl = add_query_arg([
|
231 |
+
'gdpr_action' => 'auto_install',
|
232 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/auto_install"),
|
233 |
+
]);
|
234 |
+
$skipUrl = add_query_arg([
|
235 |
+
'gdpr_action' => 'skip_install',
|
236 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/skip_install"),
|
237 |
+
]);
|
238 |
+
|
239 |
+
gdpr('admin-notice')->add(
|
240 |
+
'installer/welcome-notice',
|
241 |
+
compact('installerUrl', 'autoInstallUrl', 'skipUrl')
|
242 |
+
);
|
243 |
+
}
|
244 |
+
|
245 |
+
/**
|
246 |
+
* Render an admin notice that will display the continue button
|
247 |
+
*
|
248 |
+
* @param $url
|
249 |
+
*/
|
250 |
+
protected function displayContinueNotice($url)
|
251 |
+
{
|
252 |
+
// Make sure we display the notice only to admins
|
253 |
+
if (!current_user_can(apply_filters('gdpr/capability', 'manage_options'))) {
|
254 |
+
return;
|
255 |
+
}
|
256 |
+
|
257 |
+
$skipUrl = add_query_arg([
|
258 |
+
'gdpr_action' => 'skip_install',
|
259 |
+
'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/skip_install"),
|
260 |
+
]);
|
261 |
+
|
262 |
+
gdpr('admin-notice')->add('installer/continue-notice', ['buttonUrl' => $url, 'skipUrl' => $skipUrl]);
|
263 |
+
}
|
264 |
+
|
265 |
+
/**
|
266 |
+
* Automatically create pages for Privacy Policy and set the corresponding options
|
267 |
+
*/
|
268 |
+
public function autoInstall()
|
269 |
+
{
|
270 |
+
$policyPageId = wp_insert_post([
|
271 |
+
'post_title' => __('Privacy Policy', 'gdpr-framework'),
|
272 |
+
'post_type' => 'page',
|
273 |
+
]);
|
274 |
+
|
275 |
+
gdpr('options')->set('policy_page', $policyPageId);
|
276 |
+
|
277 |
+
$toolsPageId = wp_insert_post([
|
278 |
+
'post_content' => '[gdpr_privacy_tools]',
|
279 |
+
'post_title' => __('Privacy Tools', 'gdpr-framework'),
|
280 |
+
'post_type' => 'page',
|
281 |
+
]);
|
282 |
+
gdpr('options')->set('tools_page', $toolsPageId);
|
283 |
+
|
284 |
+
// Woocommerce compatibility - automatically add their terms page
|
285 |
+
if (get_option('woocommerce_terms_page_id')) {
|
286 |
+
gdpr('options')->set('terms_page', get_option('woocommerce_terms_page_id'));
|
287 |
+
}
|
288 |
+
|
289 |
+
gdpr('options')->set('is_installed', 'yes');
|
290 |
+
wp_safe_redirect(gdpr('helpers')->getAdminUrl('&gdpr-tab=privacy-policy&gdpr-notice=autoinstall'));
|
291 |
+
exit;
|
292 |
+
}
|
293 |
+
|
294 |
+
/**
|
295 |
+
* Do nothing, but mark the installer as completed
|
296 |
+
*/
|
297 |
+
public function skipInstall()
|
298 |
+
{
|
299 |
+
gdpr('options')->set('is_installed', 'yes');
|
300 |
+
wp_safe_redirect(gdpr('helpers')->getAdminUrl());
|
301 |
+
exit;
|
302 |
+
}
|
303 |
+
}
|
src/Installer/InstallerStep.php
CHANGED
@@ -1,200 +1,200 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Installer;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Handle the plumbing of an installer step
|
7 |
-
*
|
8 |
-
* Class InstallerStep
|
9 |
-
*
|
10 |
-
* @package Codelight\GDPR\Installer
|
11 |
-
*/
|
12 |
-
abstract class InstallerStep
|
13 |
-
{
|
14 |
-
/* @var string */
|
15 |
-
protected $stepType;
|
16 |
-
|
17 |
-
/* @var string */
|
18 |
-
protected $slug;
|
19 |
-
|
20 |
-
/* @var string */
|
21 |
-
protected $type;
|
22 |
-
|
23 |
-
/* @var string */
|
24 |
-
protected $template;
|
25 |
-
|
26 |
-
/* @var int */
|
27 |
-
protected $activeSteps;
|
28 |
-
|
29 |
-
/**
|
30 |
-
* Render a step for viewing
|
31 |
-
*/
|
32 |
-
public function run()
|
33 |
-
{
|
34 |
-
$this->enqueue();
|
35 |
-
$this->renderHeader();
|
36 |
-
$this->renderContent();
|
37 |
-
$this->renderNonce();
|
38 |
-
$this->renderFooter();
|
39 |
-
}
|
40 |
-
|
41 |
-
/**
|
42 |
-
* Validate the form submission
|
43 |
-
*
|
44 |
-
* @return bool
|
45 |
-
*/
|
46 |
-
public function validate()
|
47 |
-
{
|
48 |
-
return true;
|
49 |
-
}
|
50 |
-
|
51 |
-
/**
|
52 |
-
* Validate the nonce
|
53 |
-
*
|
54 |
-
* @return bool
|
55 |
-
*/
|
56 |
-
public function validateNonce()
|
57 |
-
{
|
58 |
-
return isset($_POST['gdpr_nonce']) && wp_verify_nonce($_POST['gdpr_nonce'], $this->slug);
|
59 |
-
}
|
60 |
-
|
61 |
-
/**
|
62 |
-
* Process the form submission
|
63 |
-
*/
|
64 |
-
public function submit()
|
65 |
-
{
|
66 |
-
|
67 |
-
}
|
68 |
-
|
69 |
-
|
70 |
-
/**
|
71 |
-
* Display error notice or something
|
72 |
-
*/
|
73 |
-
public function getErrors()
|
74 |
-
{
|
75 |
-
return $this->errors;
|
76 |
-
}
|
77 |
-
|
78 |
-
/**
|
79 |
-
* Register WP's default assets and plugin installer assets
|
80 |
-
*/
|
81 |
-
protected function enqueue()
|
82 |
-
{
|
83 |
-
wp_enqueue_style('common');
|
84 |
-
wp_enqueue_style('buttons');
|
85 |
-
|
86 |
-
/**
|
87 |
-
* GDPR installer custom styles
|
88 |
-
*/
|
89 |
-
wp_enqueue_style(
|
90 |
-
'gdpr-installer',
|
91 |
-
gdpr('config')->get('plugin.url') . 'assets/gdpr-installer.css'
|
92 |
-
);
|
93 |
-
|
94 |
-
wp_enqueue_style(
|
95 |
-
'select2css',
|
96 |
-
'//cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/css/select2.min.css'
|
97 |
-
);
|
98 |
-
|
99 |
-
wp_enqueue_script('jquery');
|
100 |
-
wp_enqueue_script('jquery-ui-core');
|
101 |
-
wp_enqueue_script('jquery-ui-widget');
|
102 |
-
wp_enqueue_script('jquery-ui-mouse');
|
103 |
-
wp_enqueue_script('jquery-ui-sortable');
|
104 |
-
wp_enqueue_script('jquery-ui-tabs');
|
105 |
-
wp_enqueue_script(
|
106 |
-
'select2',
|
107 |
-
'//cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/select2.min.js',
|
108 |
-
['jquery']
|
109 |
-
);
|
110 |
-
wp_enqueue_script(
|
111 |
-
'conditional-show',
|
112 |
-
gdpr('config')->get('plugin.url') . 'assets/conditional-show.js',
|
113 |
-
['jquery']
|
114 |
-
);
|
115 |
-
|
116 |
-
//global $wp_scripts;
|
117 |
-
//$ui = $wp_scripts->query('jquery-ui-core');
|
118 |
-
//wp_enqueue_style('jquery-ui-smoothness', "//ajax.googleapis.com/ajax/libs/jqueryui/{$ui->ver}/themes/smoothness/jquery-ui.min.css", false, null);
|
119 |
-
|
120 |
-
wp_enqueue_script(
|
121 |
-
'jquery-repeater',
|
122 |
-
gdpr('config')->get('plugin.url') . 'assets/jquery.repeater.min.js',
|
123 |
-
['jquery']
|
124 |
-
);
|
125 |
-
|
126 |
-
/**
|
127 |
-
* Installer javascript
|
128 |
-
*/
|
129 |
-
wp_enqueue_script(
|
130 |
-
'gdpr-installer',
|
131 |
-
gdpr('config')->get('plugin.url') . 'assets/gdpr-installer.js',
|
132 |
-
['jquery', 'select2']
|
133 |
-
);
|
134 |
-
}
|
135 |
-
|
136 |
-
/**
|
137 |
-
* Render the installer page header - html head, form, logo
|
138 |
-
*/
|
139 |
-
protected function renderHeader()
|
140 |
-
{
|
141 |
-
echo gdpr('view')->render('installer/header', ['activeSteps' => $this->activeSteps]);
|
142 |
-
}
|
143 |
-
|
144 |
-
/**
|
145 |
-
* Render the installer page content - should be overridden by child class
|
146 |
-
*/
|
147 |
-
protected function renderContent()
|
148 |
-
{
|
149 |
-
echo gdpr('view')->render($this->template);
|
150 |
-
}
|
151 |
-
|
152 |
-
/**
|
153 |
-
* Create and render the nonce based on the name of the current step
|
154 |
-
*/
|
155 |
-
protected function renderNonce()
|
156 |
-
{
|
157 |
-
$nonce = wp_create_nonce($this->slug);
|
158 |
-
echo gdpr('view')->render('installer/nonce', compact('nonce'));
|
159 |
-
}
|
160 |
-
|
161 |
-
/**
|
162 |
-
* Render the footer - nav buttons and closing tags
|
163 |
-
*/
|
164 |
-
protected function renderFooter()
|
165 |
-
{
|
166 |
-
echo gdpr('view')->render('installer/footer');
|
167 |
-
}
|
168 |
-
|
169 |
-
/**
|
170 |
-
* @return string
|
171 |
-
*/
|
172 |
-
public function getUrl()
|
173 |
-
{
|
174 |
-
return gdpr('config')->get('installer.wizardUrl') . $this->slug;
|
175 |
-
}
|
176 |
-
|
177 |
-
/**
|
178 |
-
* @return string
|
179 |
-
*/
|
180 |
-
public function getSlug()
|
181 |
-
{
|
182 |
-
if (is_null($this->slug)) {
|
183 |
-
trigger_error("GDPR: Slug not defined for step!", E_USER_ERROR);
|
184 |
-
}
|
185 |
-
|
186 |
-
return $this->slug;
|
187 |
-
}
|
188 |
-
|
189 |
-
/**
|
190 |
-
* @return string
|
191 |
-
*/
|
192 |
-
public function getType()
|
193 |
-
{
|
194 |
-
if (is_null($this->type)) {
|
195 |
-
trigger_error("GDPR: Type not defined for step {$this->slug}", E_USER_ERROR);
|
196 |
-
}
|
197 |
-
|
198 |
-
return $this->type;
|
199 |
-
}
|
200 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Installer;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Handle the plumbing of an installer step
|
7 |
+
*
|
8 |
+
* Class InstallerStep
|
9 |
+
*
|
10 |
+
* @package Codelight\GDPR\Installer
|
11 |
+
*/
|
12 |
+
abstract class InstallerStep
|
13 |
+
{
|
14 |
+
/* @var string */
|
15 |
+
protected $stepType;
|
16 |
+
|
17 |
+
/* @var string */
|
18 |
+
protected $slug;
|
19 |
+
|
20 |
+
/* @var string */
|
21 |
+
protected $type;
|
22 |
+
|
23 |
+
/* @var string */
|
24 |
+
protected $template;
|
25 |
+
|
26 |
+
/* @var int */
|
27 |
+
protected $activeSteps;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Render a step for viewing
|
31 |
+
*/
|
32 |
+
public function run()
|
33 |
+
{
|
34 |
+
$this->enqueue();
|
35 |
+
$this->renderHeader();
|
36 |
+
$this->renderContent();
|
37 |
+
$this->renderNonce();
|
38 |
+
$this->renderFooter();
|
39 |
+
}
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Validate the form submission
|
43 |
+
*
|
44 |
+
* @return bool
|
45 |
+
*/
|
46 |
+
public function validate()
|
47 |
+
{
|
48 |
+
return true;
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Validate the nonce
|
53 |
+
*
|
54 |
+
* @return bool
|
55 |
+
*/
|
56 |
+
public function validateNonce()
|
57 |
+
{
|
58 |
+
return isset($_POST['gdpr_nonce']) && wp_verify_nonce($_POST['gdpr_nonce'], $this->slug);
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Process the form submission
|
63 |
+
*/
|
64 |
+
public function submit()
|
65 |
+
{
|
66 |
+
|
67 |
+
}
|
68 |
+
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Display error notice or something
|
72 |
+
*/
|
73 |
+
public function getErrors()
|
74 |
+
{
|
75 |
+
return $this->errors;
|
76 |
+
}
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Register WP's default assets and plugin installer assets
|
80 |
+
*/
|
81 |
+
protected function enqueue()
|
82 |
+
{
|
83 |
+
wp_enqueue_style('common');
|
84 |
+
wp_enqueue_style('buttons');
|
85 |
+
|
86 |
+
/**
|
87 |
+
* GDPR installer custom styles
|
88 |
+
*/
|
89 |
+
wp_enqueue_style(
|
90 |
+
'gdpr-installer',
|
91 |
+
gdpr('config')->get('plugin.url') . 'assets/gdpr-installer.css'
|
92 |
+
);
|
93 |
+
|
94 |
+
wp_enqueue_style(
|
95 |
+
'select2css',
|
96 |
+
'//cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/css/select2.min.css'
|
97 |
+
);
|
98 |
+
|
99 |
+
wp_enqueue_script('jquery');
|
100 |
+
wp_enqueue_script('jquery-ui-core');
|
101 |
+
wp_enqueue_script('jquery-ui-widget');
|
102 |
+
wp_enqueue_script('jquery-ui-mouse');
|
103 |
+
wp_enqueue_script('jquery-ui-sortable');
|
104 |
+
wp_enqueue_script('jquery-ui-tabs');
|
105 |
+
wp_enqueue_script(
|
106 |
+
'select2',
|
107 |
+
'//cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/select2.min.js',
|
108 |
+
['jquery']
|
109 |
+
);
|
110 |
+
wp_enqueue_script(
|
111 |
+
'conditional-show',
|
112 |
+
gdpr('config')->get('plugin.url') . 'assets/conditional-show.js',
|
113 |
+
['jquery']
|
114 |
+
);
|
115 |
+
|
116 |
+
//global $wp_scripts;
|
117 |
+
//$ui = $wp_scripts->query('jquery-ui-core');
|
118 |
+
//wp_enqueue_style('jquery-ui-smoothness', "//ajax.googleapis.com/ajax/libs/jqueryui/{$ui->ver}/themes/smoothness/jquery-ui.min.css", false, null);
|
119 |
+
|
120 |
+
wp_enqueue_script(
|
121 |
+
'jquery-repeater',
|
122 |
+
gdpr('config')->get('plugin.url') . 'assets/jquery.repeater.min.js',
|
123 |
+
['jquery']
|
124 |
+
);
|
125 |
+
|
126 |
+
/**
|
127 |
+
* Installer javascript
|
128 |
+
*/
|
129 |
+
wp_enqueue_script(
|
130 |
+
'gdpr-installer',
|
131 |
+
gdpr('config')->get('plugin.url') . 'assets/gdpr-installer.js',
|
132 |
+
['jquery', 'select2']
|
133 |
+
);
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* Render the installer page header - html head, form, logo
|
138 |
+
*/
|
139 |
+
protected function renderHeader()
|
140 |
+
{
|
141 |
+
echo gdpr('view')->render('installer/header', ['activeSteps' => $this->activeSteps]);
|
142 |
+
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* Render the installer page content - should be overridden by child class
|
146 |
+
*/
|
147 |
+
protected function renderContent()
|
148 |
+
{
|
149 |
+
echo gdpr('view')->render($this->template);
|
150 |
+
}
|
151 |
+
|
152 |
+
/**
|
153 |
+
* Create and render the nonce based on the name of the current step
|
154 |
+
*/
|
155 |
+
protected function renderNonce()
|
156 |
+
{
|
157 |
+
$nonce = wp_create_nonce($this->slug);
|
158 |
+
echo gdpr('view')->render('installer/nonce', compact('nonce'));
|
159 |
+
}
|
160 |
+
|
161 |
+
/**
|
162 |
+
* Render the footer - nav buttons and closing tags
|
163 |
+
*/
|
164 |
+
protected function renderFooter()
|
165 |
+
{
|
166 |
+
echo gdpr('view')->render('installer/footer');
|
167 |
+
}
|
168 |
+
|
169 |
+
/**
|
170 |
+
* @return string
|
171 |
+
*/
|
172 |
+
public function getUrl()
|
173 |
+
{
|
174 |
+
return gdpr('config')->get('installer.wizardUrl') . $this->slug;
|
175 |
+
}
|
176 |
+
|
177 |
+
/**
|
178 |
+
* @return string
|
179 |
+
*/
|
180 |
+
public function getSlug()
|
181 |
+
{
|
182 |
+
if (is_null($this->slug)) {
|
183 |
+
trigger_error("GDPR: Slug not defined for step!", E_USER_ERROR);
|
184 |
+
}
|
185 |
+
|
186 |
+
return $this->slug;
|
187 |
+
}
|
188 |
+
|
189 |
+
/**
|
190 |
+
* @return string
|
191 |
+
*/
|
192 |
+
public function getType()
|
193 |
+
{
|
194 |
+
if (is_null($this->type)) {
|
195 |
+
trigger_error("GDPR: Type not defined for step {$this->slug}", E_USER_ERROR);
|
196 |
+
}
|
197 |
+
|
198 |
+
return $this->type;
|
199 |
+
}
|
200 |
+
}
|
src/Installer/Steps/ConfigurationPages.php
CHANGED
@@ -1,61 +1,61 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Installer\Steps;
|
4 |
-
|
5 |
-
use Codelight\GDPR\Installer\InstallerStep;
|
6 |
-
use Codelight\GDPR\Installer\InstallerStepInterface;
|
7 |
-
|
8 |
-
class ConfigurationPages extends InstallerStep implements InstallerStepInterface
|
9 |
-
{
|
10 |
-
protected $slug = 'configuration-pages';
|
11 |
-
|
12 |
-
protected $type = 'wizard';
|
13 |
-
|
14 |
-
protected $template = 'installer/steps/configuration-pages';
|
15 |
-
|
16 |
-
protected $activeSteps = 1;
|
17 |
-
|
18 |
-
protected function renderContent()
|
19 |
-
{
|
20 |
-
$privacyToolsPage = gdpr('options')->get('tools_page');
|
21 |
-
$privacyToolsPageSelector = wp_dropdown_pages([
|
22 |
-
'name' => 'gdpr_tools_page',
|
23 |
-
'show_option_none' => _x('— Create a new page —', '(Admin)', 'gdpr-framework'),
|
24 |
-
'option_none_value' => 'new',
|
25 |
-
'selected' => $privacyToolsPage ? $privacyToolsPage : 'new',
|
26 |
-
'echo' => false,
|
27 |
-
'class' => 'gdpr-select js-gdpr-select2',
|
28 |
-
]);
|
29 |
-
|
30 |
-
echo gdpr('view')->render(
|
31 |
-
$this->template,
|
32 |
-
compact(
|
33 |
-
'policyPage',
|
34 |
-
'policyPageSelector',
|
35 |
-
'privacyToolsPage',
|
36 |
-
'privacyToolsPageSelector'
|
37 |
-
)
|
38 |
-
);
|
39 |
-
}
|
40 |
-
|
41 |
-
public function submit()
|
42 |
-
{
|
43 |
-
if (isset($_POST['gdpr_create_tools_page']) && 'yes' === $_POST['gdpr_create_tools_page']) {
|
44 |
-
$id = $this->createPrivacyToolsPage();
|
45 |
-
gdpr('options')->set('tools_page', $id);
|
46 |
-
} else {
|
47 |
-
gdpr('options')->set('tools_page', $_POST['gdpr_tools_page']);
|
48 |
-
}
|
49 |
-
}
|
50 |
-
|
51 |
-
protected function createPrivacyToolsPage()
|
52 |
-
{
|
53 |
-
$id = wp_insert_post([
|
54 |
-
'post_content' => '[gdpr_privacy_tools]',
|
55 |
-
'post_title' => __('Privacy Tools', 'gdpr-framework'),
|
56 |
-
'post_type' => 'page',
|
57 |
-
]);
|
58 |
-
|
59 |
-
return $id;
|
60 |
-
}
|
61 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Installer\Steps;
|
4 |
+
|
5 |
+
use Codelight\GDPR\Installer\InstallerStep;
|
6 |
+
use Codelight\GDPR\Installer\InstallerStepInterface;
|
7 |
+
|
8 |
+
class ConfigurationPages extends InstallerStep implements InstallerStepInterface
|
9 |
+
{
|
10 |
+
protected $slug = 'configuration-pages';
|
11 |
+
|
12 |
+
protected $type = 'wizard';
|
13 |
+
|
14 |
+
protected $template = 'installer/steps/configuration-pages';
|
15 |
+
|
16 |
+
protected $activeSteps = 1;
|
17 |
+
|
18 |
+
protected function renderContent()
|
19 |
+
{
|
20 |
+
$privacyToolsPage = gdpr('options')->get('tools_page');
|
21 |
+
$privacyToolsPageSelector = wp_dropdown_pages([
|
22 |
+
'name' => 'gdpr_tools_page',
|
23 |
+
'show_option_none' => _x('— Create a new page —', '(Admin)', 'gdpr-framework'),
|
24 |
+
'option_none_value' => 'new',
|
25 |
+
'selected' => $privacyToolsPage ? $privacyToolsPage : 'new',
|
26 |
+
'echo' => false,
|
27 |
+
'class' => 'gdpr-select js-gdpr-select2',
|
28 |
+
]);
|
29 |
+
|
30 |
+
echo gdpr('view')->render(
|
31 |
+
$this->template,
|
32 |
+
compact(
|
33 |
+
'policyPage',
|
34 |
+
'policyPageSelector',
|
35 |
+
'privacyToolsPage',
|
36 |
+
'privacyToolsPageSelector'
|
37 |
+
)
|
38 |
+
);
|
39 |
+
}
|
40 |
+
|
41 |
+
public function submit()
|
42 |
+
{
|
43 |
+
if (isset($_POST['gdpr_create_tools_page']) && 'yes' === $_POST['gdpr_create_tools_page']) {
|
44 |
+
$id = $this->createPrivacyToolsPage();
|
45 |
+
gdpr('options')->set('tools_page', $id);
|
46 |
+
} else {
|
47 |
+
gdpr('options')->set('tools_page', $_POST['gdpr_tools_page']);
|
48 |
+
}
|
49 |
+
}
|
50 |
+
|
51 |
+
protected function createPrivacyToolsPage()
|
52 |
+
{
|
53 |
+
$id = wp_insert_post([
|
54 |
+
'post_content' => '[gdpr_privacy_tools]',
|
55 |
+
'post_title' => __('Privacy Tools', 'gdpr-framework'),
|
56 |
+
'post_type' => 'page',
|
57 |
+
]);
|
58 |
+
|
59 |
+
return $id;
|
60 |
+
}
|
61 |
+
}
|
src/Installer/Steps/ConfigurationSettings.php
CHANGED
@@ -1,71 +1,71 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Installer\Steps;
|
4 |
-
|
5 |
-
use Codelight\GDPR\Installer\InstallerStep;
|
6 |
-
use Codelight\GDPR\Installer\InstallerStepInterface;
|
7 |
-
|
8 |
-
class ConfigurationSettings extends InstallerStep implements InstallerStepInterface
|
9 |
-
{
|
10 |
-
protected $slug = 'configuration-settings';
|
11 |
-
|
12 |
-
protected $type = 'wizard';
|
13 |
-
|
14 |
-
protected $template = 'installer/steps/configuration-settings';
|
15 |
-
|
16 |
-
protected $activeSteps = 1;
|
17 |
-
|
18 |
-
protected function renderContent()
|
19 |
-
{
|
20 |
-
$privacyToolsPageUrl = get_permalink(gdpr('options')->get('tools_page'));
|
21 |
-
|
22 |
-
$deleteAction = gdpr('options')->get('delete_action');
|
23 |
-
$deleteActionEmail = gdpr('options')->get('delete_action_email');
|
24 |
-
|
25 |
-
$exportAction = gdpr('options')->get('export_action');
|
26 |
-
$exportActionEmail = gdpr('options')->get('export_action_email');
|
27 |
-
|
28 |
-
$reassign = gdpr('options')->get('delete_action_reassign');
|
29 |
-
$reassignUser = gdpr('options')->get('delete_action_reassign_user');
|
30 |
-
|
31 |
-
echo gdpr('view')->render(
|
32 |
-
$this->template,
|
33 |
-
compact(
|
34 |
-
'deleteAction',
|
35 |
-
'deleteActionEmail',
|
36 |
-
'exportAction',
|
37 |
-
'exportActionEmail',
|
38 |
-
'privacyToolsPageUrl',
|
39 |
-
'reassign',
|
40 |
-
'reassignUser'
|
41 |
-
)
|
42 |
-
);
|
43 |
-
}
|
44 |
-
|
45 |
-
public function submit()
|
46 |
-
{
|
47 |
-
if (isset($_POST['gdpr_export_action'])) {
|
48 |
-
gdpr('options')->set('delete_action', $_POST['gdpr_export_action']);
|
49 |
-
}
|
50 |
-
|
51 |
-
if (isset($_POST['gdpr_export_action_email'])) {
|
52 |
-
gdpr('options')->set('delete_action_email', $_POST['gdpr_export_action_email']);
|
53 |
-
}
|
54 |
-
|
55 |
-
if (isset($_POST['gdpr_delete_action'])) {
|
56 |
-
gdpr('options')->set('delete_action', $_POST['gdpr_delete_action']);
|
57 |
-
}
|
58 |
-
|
59 |
-
if (isset($_POST['gdpr_delete_action_email'])) {
|
60 |
-
gdpr('options')->set('delete_action_email', $_POST['gdpr_delete_action_email']);
|
61 |
-
}
|
62 |
-
|
63 |
-
if (isset($_POST['gdpr_delete_action_reassign'])) {
|
64 |
-
gdpr('options')->set('delete_action_reassign', $_POST['gdpr_delete_action_reassign']);
|
65 |
-
}
|
66 |
-
|
67 |
-
if (isset($_POST['gdpr_delete_action_reassign_user'])) {
|
68 |
-
gdpr('options')->set('delete_action_reassign_user', $_POST['gdpr_delete_action_reassign_user']);
|
69 |
-
}
|
70 |
-
}
|
71 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Installer\Steps;
|
4 |
+
|
5 |
+
use Codelight\GDPR\Installer\InstallerStep;
|
6 |
+
use Codelight\GDPR\Installer\InstallerStepInterface;
|
7 |
+
|
8 |
+
class ConfigurationSettings extends InstallerStep implements InstallerStepInterface
|
9 |
+
{
|
10 |
+
protected $slug = 'configuration-settings';
|
11 |
+
|
12 |
+
protected $type = 'wizard';
|
13 |
+
|
14 |
+
protected $template = 'installer/steps/configuration-settings';
|
15 |
+
|
16 |
+
protected $activeSteps = 1;
|
17 |
+
|
18 |
+
protected function renderContent()
|
19 |
+
{
|
20 |
+
$privacyToolsPageUrl = get_permalink(gdpr('options')->get('tools_page'));
|
21 |
+
|
22 |
+
$deleteAction = gdpr('options')->get('delete_action');
|
23 |
+
$deleteActionEmail = gdpr('options')->get('delete_action_email');
|
24 |
+
|
25 |
+
$exportAction = gdpr('options')->get('export_action');
|
26 |
+
$exportActionEmail = gdpr('options')->get('export_action_email');
|
27 |
+
|
28 |
+
$reassign = gdpr('options')->get('delete_action_reassign');
|
29 |
+
$reassignUser = gdpr('options')->get('delete_action_reassign_user');
|
30 |
+
|
31 |
+
echo gdpr('view')->render(
|
32 |
+
$this->template,
|
33 |
+
compact(
|
34 |
+
'deleteAction',
|
35 |
+
'deleteActionEmail',
|
36 |
+
'exportAction',
|
37 |
+
'exportActionEmail',
|
38 |
+
'privacyToolsPageUrl',
|
39 |
+
'reassign',
|
40 |
+
'reassignUser'
|
41 |
+
)
|
42 |
+
);
|
43 |
+
}
|
44 |
+
|
45 |
+
public function submit()
|
46 |
+
{
|
47 |
+
if (isset($_POST['gdpr_export_action'])) {
|
48 |
+
gdpr('options')->set('delete_action', $_POST['gdpr_export_action']);
|
49 |
+
}
|
50 |
+
|
51 |
+
if (isset($_POST['gdpr_export_action_email'])) {
|
52 |
+
gdpr('options')->set('delete_action_email', $_POST['gdpr_export_action_email']);
|
53 |
+
}
|
54 |
+
|
55 |
+
if (isset($_POST['gdpr_delete_action'])) {
|
56 |
+
gdpr('options')->set('delete_action', $_POST['gdpr_delete_action']);
|
57 |
+
}
|
58 |
+
|
59 |
+
if (isset($_POST['gdpr_delete_action_email'])) {
|
60 |
+
gdpr('options')->set('delete_action_email', $_POST['gdpr_delete_action_email']);
|
61 |
+
}
|
62 |
+
|
63 |
+
if (isset($_POST['gdpr_delete_action_reassign'])) {
|
64 |
+
gdpr('options')->set('delete_action_reassign', $_POST['gdpr_delete_action_reassign']);
|
65 |
+
}
|
66 |
+
|
67 |
+
if (isset($_POST['gdpr_delete_action_reassign_user'])) {
|
68 |
+
gdpr('options')->set('delete_action_reassign_user', $_POST['gdpr_delete_action_reassign_user']);
|
69 |
+
}
|
70 |
+
}
|
71 |
+
}
|
src/Installer/Steps/Consent.php
CHANGED
@@ -1,30 +1,30 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Installer\Steps;
|
4 |
-
|
5 |
-
use Codelight\GDPR\Installer\InstallerStep;
|
6 |
-
use Codelight\GDPR\Installer\InstallerStepInterface;
|
7 |
-
|
8 |
-
class Consent extends InstallerStep implements InstallerStepInterface
|
9 |
-
{
|
10 |
-
protected $slug = 'consent';
|
11 |
-
|
12 |
-
protected $type = 'wizard';
|
13 |
-
|
14 |
-
protected $template = 'installer/steps/consent';
|
15 |
-
|
16 |
-
protected $activeSteps = 3;
|
17 |
-
|
18 |
-
protected function renderContent()
|
19 |
-
{
|
20 |
-
$isRegistrationOpen = get_option('users_can_register');
|
21 |
-
$isCommentsEnabled = class_exists('Disable_Comments') ? false : true;
|
22 |
-
$privacyToolsPageUrl = get_permalink(gdpr('options')->get('tools_page'));
|
23 |
-
$hasGravityForms = class_exists('\GFForms');
|
24 |
-
|
25 |
-
echo gdpr('view')->render(
|
26 |
-
$this->template,
|
27 |
-
compact('isRegistrationOpen', 'isCommentsEnabled', 'privacyToolsPageUrl', 'hasGravityForms')
|
28 |
-
);
|
29 |
-
}
|
30 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Installer\Steps;
|
4 |
+
|
5 |
+
use Codelight\GDPR\Installer\InstallerStep;
|
6 |
+
use Codelight\GDPR\Installer\InstallerStepInterface;
|
7 |
+
|
8 |
+
class Consent extends InstallerStep implements InstallerStepInterface
|
9 |
+
{
|
10 |
+
protected $slug = 'consent';
|
11 |
+
|
12 |
+
protected $type = 'wizard';
|
13 |
+
|
14 |
+
protected $template = 'installer/steps/consent';
|
15 |
+
|
16 |
+
protected $activeSteps = 3;
|
17 |
+
|
18 |
+
protected function renderContent()
|
19 |
+
{
|
20 |
+
$isRegistrationOpen = get_option('users_can_register');
|
21 |
+
$isCommentsEnabled = class_exists('Disable_Comments') ? false : true;
|
22 |
+
$privacyToolsPageUrl = get_permalink(gdpr('options')->get('tools_page'));
|
23 |
+
$hasGravityForms = class_exists('\GFForms');
|
24 |
+
|
25 |
+
echo gdpr('view')->render(
|
26 |
+
$this->template,
|
27 |
+
compact('isRegistrationOpen', 'isCommentsEnabled', 'privacyToolsPageUrl', 'hasGravityForms')
|
28 |
+
);
|
29 |
+
}
|
30 |
+
}
|
src/Installer/Steps/Integrations.php
CHANGED
@@ -1,48 +1,47 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Installer\Steps;
|
4 |
-
|
5 |
-
use Codelight\GDPR\Installer\InstallerStep;
|
6 |
-
use Codelight\GDPR\Installer\InstallerStepInterface;
|
7 |
-
|
8 |
-
class Integrations extends InstallerStep implements InstallerStepInterface
|
9 |
-
{
|
10 |
-
protected $slug = 'integrations';
|
11 |
-
|
12 |
-
protected $type = 'wizard';
|
13 |
-
|
14 |
-
protected $template = 'installer/steps/integrations';
|
15 |
-
|
16 |
-
protected $activeSteps = 4;
|
17 |
-
|
18 |
-
protected function renderContent()
|
19 |
-
{
|
20 |
-
$enableThemeCompatibility = gdpr('options')->get('enable_theme_compatibility');
|
21 |
-
$currentTheme = gdpr('themes')->getCurrentThemeName();
|
22 |
-
$isThemeSupported = gdpr('themes')->isCurrentThemeSupported();
|
23 |
-
|
24 |
-
|
25 |
-
$
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
'
|
32 |
-
'
|
33 |
-
'
|
34 |
-
'
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Installer\Steps;
|
4 |
+
|
5 |
+
use Codelight\GDPR\Installer\InstallerStep;
|
6 |
+
use Codelight\GDPR\Installer\InstallerStepInterface;
|
7 |
+
|
8 |
+
class Integrations extends InstallerStep implements InstallerStepInterface
|
9 |
+
{
|
10 |
+
protected $slug = 'integrations';
|
11 |
+
|
12 |
+
protected $type = 'wizard';
|
13 |
+
|
14 |
+
protected $template = 'installer/steps/integrations';
|
15 |
+
|
16 |
+
protected $activeSteps = 4;
|
17 |
+
|
18 |
+
protected function renderContent()
|
19 |
+
{
|
20 |
+
$enableThemeCompatibility = gdpr('options')->get('enable_theme_compatibility');
|
21 |
+
$currentTheme = gdpr('themes')->getCurrentThemeName();
|
22 |
+
$isThemeSupported = gdpr('themes')->isCurrentThemeSupported();
|
23 |
+
|
24 |
+
$hasWooCommerce = false;
|
25 |
+
$hasEDD = false;
|
26 |
+
|
27 |
+
echo gdpr('view')->render(
|
28 |
+
$this->template,
|
29 |
+
compact(
|
30 |
+
'enableThemeCompatibility',
|
31 |
+
'hasEDD',
|
32 |
+
'hasWooCommerce',
|
33 |
+
'currentTheme',
|
34 |
+
'isThemeSupported'
|
35 |
+
)
|
36 |
+
);
|
37 |
+
}
|
38 |
+
|
39 |
+
public function submit()
|
40 |
+
{
|
41 |
+
if (isset($_POST['gdpr_enable_theme_compatibility']) && 'yes' === $_POST['gdpr_enable_theme_compatibility']) {
|
42 |
+
gdpr('options')->set('enable_theme_compatibility', true);
|
43 |
+
} else {
|
44 |
+
gdpr('options')->set('enable_theme_compatibility', false);
|
45 |
+
}
|
46 |
+
}
|
47 |
+
}
|
|
src/Installer/Steps/PolicyContents.php
CHANGED
@@ -1,31 +1,31 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
|
4 |
-
namespace Codelight\GDPR\Installer\Steps;
|
5 |
-
|
6 |
-
|
7 |
-
use Codelight\GDPR\Installer\InstallerStep;
|
8 |
-
use Codelight\GDPR\Installer\InstallerStepInterface;
|
9 |
-
|
10 |
-
class PolicyContents extends InstallerStep implements InstallerStepInterface
|
11 |
-
{
|
12 |
-
protected $slug = 'policy-contents';
|
13 |
-
|
14 |
-
protected $type = 'wizard';
|
15 |
-
|
16 |
-
protected $template = 'installer/steps/policy-contents';
|
17 |
-
|
18 |
-
protected $activeSteps = 2;
|
19 |
-
|
20 |
-
protected function renderContent()
|
21 |
-
{
|
22 |
-
$policyUrl = get_permalink(gdpr('options')->get('policy_page'));
|
23 |
-
$editPolicyUrl = get_edit_post_link(gdpr('options')->get('policy_page'));
|
24 |
-
$policyGenerated = gdpr('options')->get('policy_generated');
|
25 |
-
|
26 |
-
echo gdpr('view')->render(
|
27 |
-
$this->template,
|
28 |
-
compact('policyUrl', 'editPolicyUrl', 'policyGenerated')
|
29 |
-
);
|
30 |
-
}
|
31 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
|
4 |
+
namespace Codelight\GDPR\Installer\Steps;
|
5 |
+
|
6 |
+
|
7 |
+
use Codelight\GDPR\Installer\InstallerStep;
|
8 |
+
use Codelight\GDPR\Installer\InstallerStepInterface;
|
9 |
+
|
10 |
+
class PolicyContents extends InstallerStep implements InstallerStepInterface
|
11 |
+
{
|
12 |
+
protected $slug = 'policy-contents';
|
13 |
+
|
14 |
+
protected $type = 'wizard';
|
15 |
+
|
16 |
+
protected $template = 'installer/steps/policy-contents';
|
17 |
+
|
18 |
+
protected $activeSteps = 2;
|
19 |
+
|
20 |
+
protected function renderContent()
|
21 |
+
{
|
22 |
+
$policyUrl = get_permalink(gdpr('options')->get('policy_page'));
|
23 |
+
$editPolicyUrl = get_edit_post_link(gdpr('options')->get('policy_page'));
|
24 |
+
$policyGenerated = gdpr('options')->get('policy_generated');
|
25 |
+
|
26 |
+
echo gdpr('view')->render(
|
27 |
+
$this->template,
|
28 |
+
compact('policyUrl', 'editPolicyUrl', 'policyGenerated')
|
29 |
+
);
|
30 |
+
}
|
31 |
+
}
|
src/Installer/Steps/PolicySettings.php
CHANGED
@@ -1,215 +1,215 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Installer\Steps;
|
4 |
-
|
5 |
-
use Codelight\GDPR\Installer\InstallerStep;
|
6 |
-
use Codelight\GDPR\Installer\InstallerStepInterface;
|
7 |
-
|
8 |
-
class PolicySettings extends InstallerStep implements InstallerStepInterface
|
9 |
-
{
|
10 |
-
protected $slug = 'policy-settings';
|
11 |
-
|
12 |
-
protected $type = 'wizard';
|
13 |
-
|
14 |
-
protected $template = 'installer/steps/policy-settings';
|
15 |
-
|
16 |
-
protected $activeSteps = 2;
|
17 |
-
|
18 |
-
protected function renderContent()
|
19 |
-
{
|
20 |
-
$policyPage = gdpr('options')->get('policy_page');
|
21 |
-
$policyPageSelector = wp_dropdown_pages([
|
22 |
-
'name' => 'gdpr_policy_page',
|
23 |
-
'show_option_none' => _x('— Create a new page —', '(Admin)', 'gdpr-framework'),
|
24 |
-
'option_none_value' => 'new',
|
25 |
-
'selected' => $policyPage ? $policyPage : 'new',
|
26 |
-
'echo' => false,
|
27 |
-
'class' => 'gdpr-select js-gdpr-select2',
|
28 |
-
]);
|
29 |
-
|
30 |
-
$hasTermsPage = gdpr('options')->get('has_terms_page');
|
31 |
-
$termsPage = gdpr('options')->get('terms_page');
|
32 |
-
|
33 |
-
// Woo compatibility
|
34 |
-
if (!$termsPage && get_option('woocommerce_terms_page_id')) {
|
35 |
-
$hasTermsPage = 'yes';
|
36 |
-
$termsPage = get_option('woocommerce_terms_page_id');
|
37 |
-
$termsPageNote = _x(
|
38 |
-
'We have automatically selected your WooCommerce Terms & Conditions page.',
|
39 |
-
'(Admin)',
|
40 |
-
'gdpr-framework'
|
41 |
-
);
|
42 |
-
} else {
|
43 |
-
$termsPageNote = false;
|
44 |
-
}
|
45 |
-
|
46 |
-
$termsPageSelector = wp_dropdown_pages([
|
47 |
-
'name' => 'gdpr_terms_page',
|
48 |
-
'show_option_none' => _x('— Create a new page —', '(Admin)', 'gdpr-framework'),
|
49 |
-
'option_none_value' => 'new',
|
50 |
-
'selected' => $termsPage ? $termsPage : 'new',
|
51 |
-
'echo' => false,
|
52 |
-
'class' => 'gdpr-select js-gdpr-select2',
|
53 |
-
]);
|
54 |
-
|
55 |
-
$companyName = gdpr('options')->get('company_name');
|
56 |
-
$companyLocation = gdpr('options')->get('company_location');
|
57 |
-
$countryOptions = gdpr('helpers')->getCountrySelectOptions($companyLocation);
|
58 |
-
$contactEmail = gdpr('options')->get('contact_email') ?
|
59 |
-
gdpr('options')->get('contact_email') :
|
60 |
-
get_option('admin_email');
|
61 |
-
|
62 |
-
$representativeContactName = gdpr('options')->get('representative_contact_name');
|
63 |
-
$representativeContactEmail = gdpr('options')->get('representative_contact_email');
|
64 |
-
$representativeContactPhone = gdpr('options')->get('representative_contact_phone');
|
65 |
-
|
66 |
-
$dpaWebsite = gdpr('options')->get('dpa_name');
|
67 |
-
$dpaEmail = gdpr('options')->get('dpa_email');
|
68 |
-
$dpaPhone = gdpr('options')->get('dpa_phone');
|
69 |
-
$dpaData = json_encode(gdpr('helpers')->getDataProtectionAuthorities());
|
70 |
-
|
71 |
-
$hasDPO = gdpr('options')->get('has_dpo');
|
72 |
-
$dpoName = gdpr('options')->get('dpo_name');
|
73 |
-
$dpoEmail = gdpr('options')->get('dpo_email');
|
74 |
-
|
75 |
-
echo gdpr('view')->render(
|
76 |
-
$this->template,
|
77 |
-
compact(
|
78 |
-
'policyPage',
|
79 |
-
'policyPageSelector',
|
80 |
-
'companyName',
|
81 |
-
'companyLocation',
|
82 |
-
'contactEmail',
|
83 |
-
'countryOptions',
|
84 |
-
'hasDPO',
|
85 |
-
'dpoEmail',
|
86 |
-
'dpoName',
|
87 |
-
'representativeContactName',
|
88 |
-
'representativeContactEmail',
|
89 |
-
'representativeContactPhone',
|
90 |
-
'dpaWebsite',
|
91 |
-
'dpaEmail',
|
92 |
-
'dpaPhone',
|
93 |
-
'dpaData',
|
94 |
-
'hasTermsPage',
|
95 |
-
'termsPage',
|
96 |
-
'termsPageSelector',
|
97 |
-
'termsPageNote'
|
98 |
-
)
|
99 |
-
);
|
100 |
-
}
|
101 |
-
|
102 |
-
/*
|
103 |
-
public function validate()
|
104 |
-
{
|
105 |
-
if (!is_email($_POST['gdpr_contact_email'])) {
|
106 |
-
$this->errors = 'Company email is not a valid email!';
|
107 |
-
return false;
|
108 |
-
}
|
109 |
-
|
110 |
-
return true;
|
111 |
-
|
112 |
-
//filter_var($url, FILTER_VALIDATE_URL) === FALSE
|
113 |
-
}
|
114 |
-
*/
|
115 |
-
|
116 |
-
public function submit()
|
117 |
-
{
|
118 |
-
/**
|
119 |
-
* Policy page
|
120 |
-
*/
|
121 |
-
if (isset($_POST['gdpr_create_policy_page']) && 'yes' === $_POST['gdpr_create_policy_page']) {
|
122 |
-
$id = $this->createPolicyPage();
|
123 |
-
gdpr('options')->set('policy_page', $id);
|
124 |
-
} else {
|
125 |
-
gdpr('options')->set('policy_page', $_POST['gdpr_policy_page']);
|
126 |
-
}
|
127 |
-
|
128 |
-
/**
|
129 |
-
* 'Generate policy' checkbox
|
130 |
-
*/
|
131 |
-
if (isset($_POST['gdpr_generate_policy']) && 'yes' === $_POST['gdpr_generate_policy']) {
|
132 |
-
$this->generatePolicy();
|
133 |
-
gdpr('options')->set('policy_generated', true);
|
134 |
-
} else {
|
135 |
-
gdpr('options')->set('policy_generated', false);
|
136 |
-
}
|
137 |
-
|
138 |
-
/**
|
139 |
-
* Company information
|
140 |
-
*/
|
141 |
-
gdpr('options')->set('company_name', $_POST['gdpr_company_name']);
|
142 |
-
gdpr('options')->set('company_location', $_POST['gdpr_company_location']);
|
143 |
-
|
144 |
-
if (is_email($_POST['gdpr_contact_email'])) {
|
145 |
-
gdpr('options')->set('contact_email', $_POST['gdpr_contact_email']);
|
146 |
-
}
|
147 |
-
|
148 |
-
/**
|
149 |
-
* Data Protection Officer
|
150 |
-
*/
|
151 |
-
if (isset($_POST['gdpr_has_dpo'])) {
|
152 |
-
gdpr('options')->set('has_dpo', $_POST['gdpr_has_dpo']);
|
153 |
-
}
|
154 |
-
|
155 |
-
gdpr('options')->set('dpo_name', $_POST['gdpr_dpo_name']);
|
156 |
-
|
157 |
-
if (is_email($_POST['gdpr_dpo_email'])) {
|
158 |
-
gdpr('options')->set('dpo_email', $_POST['gdpr_dpo_email']);
|
159 |
-
}
|
160 |
-
|
161 |
-
/**
|
162 |
-
* Representative contact
|
163 |
-
*/
|
164 |
-
gdpr('options')->set('representative_contact_name', $_POST['gdpr_representative_contact_name']);
|
165 |
-
gdpr('options')->set('representative_contact_phone', $_POST['gdpr_representative_contact_phone']);
|
166 |
-
|
167 |
-
if (is_email($_POST['gdpr_representative_contact_email'])) {
|
168 |
-
gdpr('options')->set('representative_contact_email', $_POST['gdpr_representative_contact_email']);
|
169 |
-
}
|
170 |
-
|
171 |
-
/**
|
172 |
-
* Data protection authority
|
173 |
-
*/
|
174 |
-
gdpr('options')->set('dpa_website', $_POST['gdpr_dpa_website']);
|
175 |
-
gdpr('options')->set('dpa_phone', $_POST['gdpr_dpa_phone']);
|
176 |
-
|
177 |
-
if (is_email($_POST['gdpr_dpa_email'])) {
|
178 |
-
gdpr('options')->set('dpa_email', $_POST['gdpr_dpa_email']);
|
179 |
-
}
|
180 |
-
|
181 |
-
|
182 |
-
/**
|
183 |
-
* Terms page
|
184 |
-
*/
|
185 |
-
if (isset($_POST['gdpr_has_terms_page'])) {
|
186 |
-
gdpr('options')->set('has_terms_page', $_POST['gdpr_has_terms_page']);
|
187 |
-
}
|
188 |
-
|
189 |
-
if (isset($_POST['gdpr_has_terms_page']) && 'yes' === $_POST['gdpr_has_terms_page'] && isset($_POST['gdpr_terms_page'])) {
|
190 |
-
gdpr('options')->set('terms_page', $_POST['gdpr_terms_page']);
|
191 |
-
} else {
|
192 |
-
gdpr('options')->delete('terms_page');
|
193 |
-
}
|
194 |
-
}
|
195 |
-
|
196 |
-
protected function createPolicyPage()
|
197 |
-
{
|
198 |
-
$id = wp_insert_post([
|
199 |
-
'post_title' => __('Privacy Policy', 'gdpr-framework'),
|
200 |
-
'post_type' => 'page',
|
201 |
-
]);
|
202 |
-
|
203 |
-
return $id;
|
204 |
-
}
|
205 |
-
|
206 |
-
protected function generatePolicy()
|
207 |
-
{
|
208 |
-
wp_update_post([
|
209 |
-
'ID' => gdpr('options')->get('policy_page'),
|
210 |
-
'post_content' => gdpr('view')->render(
|
211 |
-
'policy/policy'
|
212 |
-
),
|
213 |
-
]);
|
214 |
-
}
|
215 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Installer\Steps;
|
4 |
+
|
5 |
+
use Codelight\GDPR\Installer\InstallerStep;
|
6 |
+
use Codelight\GDPR\Installer\InstallerStepInterface;
|
7 |
+
|
8 |
+
class PolicySettings extends InstallerStep implements InstallerStepInterface
|
9 |
+
{
|
10 |
+
protected $slug = 'policy-settings';
|
11 |
+
|
12 |
+
protected $type = 'wizard';
|
13 |
+
|
14 |
+
protected $template = 'installer/steps/policy-settings';
|
15 |
+
|
16 |
+
protected $activeSteps = 2;
|
17 |
+
|
18 |
+
protected function renderContent()
|
19 |
+
{
|
20 |
+
$policyPage = gdpr('options')->get('policy_page');
|
21 |
+
$policyPageSelector = wp_dropdown_pages([
|
22 |
+
'name' => 'gdpr_policy_page',
|
23 |
+
'show_option_none' => _x('— Create a new page —', '(Admin)', 'gdpr-framework'),
|
24 |
+
'option_none_value' => 'new',
|
25 |
+
'selected' => $policyPage ? $policyPage : 'new',
|
26 |
+
'echo' => false,
|
27 |
+
'class' => 'gdpr-select js-gdpr-select2',
|
28 |
+
]);
|
29 |
+
|
30 |
+
$hasTermsPage = gdpr('options')->get('has_terms_page');
|
31 |
+
$termsPage = gdpr('options')->get('terms_page');
|
32 |
+
|
33 |
+
// Woo compatibility
|
34 |
+
if (!$termsPage && get_option('woocommerce_terms_page_id')) {
|
35 |
+
$hasTermsPage = 'yes';
|
36 |
+
$termsPage = get_option('woocommerce_terms_page_id');
|
37 |
+
$termsPageNote = _x(
|
38 |
+
'We have automatically selected your WooCommerce Terms & Conditions page.',
|
39 |
+
'(Admin)',
|
40 |
+
'gdpr-framework'
|
41 |
+
);
|
42 |
+
} else {
|
43 |
+
$termsPageNote = false;
|
44 |
+
}
|
45 |
+
|
46 |
+
$termsPageSelector = wp_dropdown_pages([
|
47 |
+
'name' => 'gdpr_terms_page',
|
48 |
+
'show_option_none' => _x('— Create a new page —', '(Admin)', 'gdpr-framework'),
|
49 |
+
'option_none_value' => 'new',
|
50 |
+
'selected' => $termsPage ? $termsPage : 'new',
|
51 |
+
'echo' => false,
|
52 |
+
'class' => 'gdpr-select js-gdpr-select2',
|
53 |
+
]);
|
54 |
+
|
55 |
+
$companyName = gdpr('options')->get('company_name');
|
56 |
+
$companyLocation = gdpr('options')->get('company_location');
|
57 |
+
$countryOptions = gdpr('helpers')->getCountrySelectOptions($companyLocation);
|
58 |
+
$contactEmail = gdpr('options')->get('contact_email') ?
|
59 |
+
gdpr('options')->get('contact_email') :
|
60 |
+
get_option('admin_email');
|
61 |
+
|
62 |
+
$representativeContactName = gdpr('options')->get('representative_contact_name');
|
63 |
+
$representativeContactEmail = gdpr('options')->get('representative_contact_email');
|
64 |
+
$representativeContactPhone = gdpr('options')->get('representative_contact_phone');
|
65 |
+
|
66 |
+
$dpaWebsite = gdpr('options')->get('dpa_name');
|
67 |
+
$dpaEmail = gdpr('options')->get('dpa_email');
|
68 |
+
$dpaPhone = gdpr('options')->get('dpa_phone');
|
69 |
+
$dpaData = json_encode(gdpr('helpers')->getDataProtectionAuthorities());
|
70 |
+
|
71 |
+
$hasDPO = gdpr('options')->get('has_dpo');
|
72 |
+
$dpoName = gdpr('options')->get('dpo_name');
|
73 |
+
$dpoEmail = gdpr('options')->get('dpo_email');
|
74 |
+
|
75 |
+
echo gdpr('view')->render(
|
76 |
+
$this->template,
|
77 |
+
compact(
|
78 |
+
'policyPage',
|
79 |
+
'policyPageSelector',
|
80 |
+
'companyName',
|
81 |
+
'companyLocation',
|
82 |
+
'contactEmail',
|
83 |
+
'countryOptions',
|
84 |
+
'hasDPO',
|
85 |
+
'dpoEmail',
|
86 |
+
'dpoName',
|
87 |
+
'representativeContactName',
|
88 |
+
'representativeContactEmail',
|
89 |
+
'representativeContactPhone',
|
90 |
+
'dpaWebsite',
|
91 |
+
'dpaEmail',
|
92 |
+
'dpaPhone',
|
93 |
+
'dpaData',
|
94 |
+
'hasTermsPage',
|
95 |
+
'termsPage',
|
96 |
+
'termsPageSelector',
|
97 |
+
'termsPageNote'
|
98 |
+
)
|
99 |
+
);
|
100 |
+
}
|
101 |
+
|
102 |
+
/*
|
103 |
+
public function validate()
|
104 |
+
{
|
105 |
+
if (!is_email($_POST['gdpr_contact_email'])) {
|
106 |
+
$this->errors = 'Company email is not a valid email!';
|
107 |
+
return false;
|
108 |
+
}
|
109 |
+
|
110 |
+
return true;
|
111 |
+
|
112 |
+
//filter_var($url, FILTER_VALIDATE_URL) === FALSE
|
113 |
+
}
|
114 |
+
*/
|
115 |
+
|
116 |
+
public function submit()
|
117 |
+
{
|
118 |
+
/**
|
119 |
+
* Policy page
|
120 |
+
*/
|
121 |
+
if (isset($_POST['gdpr_create_policy_page']) && 'yes' === $_POST['gdpr_create_policy_page']) {
|
122 |
+
$id = $this->createPolicyPage();
|
123 |
+
gdpr('options')->set('policy_page', $id);
|
124 |
+
} else {
|
125 |
+
gdpr('options')->set('policy_page', $_POST['gdpr_policy_page']);
|
126 |
+
}
|
127 |
+
|
128 |
+
/**
|
129 |
+
* 'Generate policy' checkbox
|
130 |
+
*/
|
131 |
+
if (isset($_POST['gdpr_generate_policy']) && 'yes' === $_POST['gdpr_generate_policy']) {
|
132 |
+
$this->generatePolicy();
|
133 |
+
gdpr('options')->set('policy_generated', true);
|
134 |
+
} else {
|
135 |
+
gdpr('options')->set('policy_generated', false);
|
136 |
+
}
|
137 |
+
|
138 |
+
/**
|
139 |
+
* Company information
|
140 |
+
*/
|
141 |
+
gdpr('options')->set('company_name', $_POST['gdpr_company_name']);
|
142 |
+
gdpr('options')->set('company_location', $_POST['gdpr_company_location']);
|
143 |
+
|
144 |
+
if (is_email($_POST['gdpr_contact_email'])) {
|
145 |
+
gdpr('options')->set('contact_email', $_POST['gdpr_contact_email']);
|
146 |
+
}
|
147 |
+
|
148 |
+
/**
|
149 |
+
* Data Protection Officer
|
150 |
+
*/
|
151 |
+
if (isset($_POST['gdpr_has_dpo'])) {
|
152 |
+
gdpr('options')->set('has_dpo', $_POST['gdpr_has_dpo']);
|
153 |
+
}
|
154 |
+
|
155 |
+
gdpr('options')->set('dpo_name', $_POST['gdpr_dpo_name']);
|
156 |
+
|
157 |
+
if (is_email($_POST['gdpr_dpo_email'])) {
|
158 |
+
gdpr('options')->set('dpo_email', $_POST['gdpr_dpo_email']);
|
159 |
+
}
|
160 |
+
|
161 |
+
/**
|
162 |
+
* Representative contact
|
163 |
+
*/
|
164 |
+
gdpr('options')->set('representative_contact_name', $_POST['gdpr_representative_contact_name']);
|
165 |
+
gdpr('options')->set('representative_contact_phone', $_POST['gdpr_representative_contact_phone']);
|
166 |
+
|
167 |
+
if (is_email($_POST['gdpr_representative_contact_email'])) {
|
168 |
+
gdpr('options')->set('representative_contact_email', $_POST['gdpr_representative_contact_email']);
|
169 |
+
}
|
170 |
+
|
171 |
+
/**
|
172 |
+
* Data protection authority
|
173 |
+
*/
|
174 |
+
gdpr('options')->set('dpa_website', $_POST['gdpr_dpa_website']);
|
175 |
+
gdpr('options')->set('dpa_phone', $_POST['gdpr_dpa_phone']);
|
176 |
+
|
177 |
+
if (is_email($_POST['gdpr_dpa_email'])) {
|
178 |
+
gdpr('options')->set('dpa_email', $_POST['gdpr_dpa_email']);
|
179 |
+
}
|
180 |
+
|
181 |
+
|
182 |
+
/**
|
183 |
+
* Terms page
|
184 |
+
*/
|
185 |
+
if (isset($_POST['gdpr_has_terms_page'])) {
|
186 |
+
gdpr('options')->set('has_terms_page', $_POST['gdpr_has_terms_page']);
|
187 |
+
}
|
188 |
+
|
189 |
+
if (isset($_POST['gdpr_has_terms_page']) && 'yes' === $_POST['gdpr_has_terms_page'] && isset($_POST['gdpr_terms_page'])) {
|
190 |
+
gdpr('options')->set('terms_page', $_POST['gdpr_terms_page']);
|
191 |
+
} else {
|
192 |
+
gdpr('options')->delete('terms_page');
|
193 |
+
}
|
194 |
+
}
|
195 |
+
|
196 |
+
protected function createPolicyPage()
|
197 |
+
{
|
198 |
+
$id = wp_insert_post([
|
199 |
+
'post_title' => __('Privacy Policy', 'gdpr-framework'),
|
200 |
+
'post_type' => 'page',
|
201 |
+
]);
|
202 |
+
|
203 |
+
return $id;
|
204 |
+
}
|
205 |
+
|
206 |
+
protected function generatePolicy()
|
207 |
+
{
|
208 |
+
wp_update_post([
|
209 |
+
'ID' => gdpr('options')->get('policy_page'),
|
210 |
+
'post_content' => gdpr('view')->render(
|
211 |
+
'policy/policy'
|
212 |
+
),
|
213 |
+
]);
|
214 |
+
}
|
215 |
+
}
|
src/Modules/ContactForm7/ContactForm7.php
CHANGED
@@ -1,108 +1,108 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Modules\ContactForm7;
|
4 |
-
|
5 |
-
use Codelight\GDPR\Components\Consent\ConsentManager;
|
6 |
-
use Codelight\GDPR\DataSubject\DataSubjectManager;
|
7 |
-
|
8 |
-
class ContactForm7
|
9 |
-
{
|
10 |
-
public function __construct(DataSubjectManager $dataSubjectManager, ConsentManager $consentManager)
|
11 |
-
{
|
12 |
-
$this->dataSubjectManager = $dataSubjectManager;
|
13 |
-
$this->consentManager = $consentManager;
|
14 |
-
|
15 |
-
//add_action('wpcf7_init', [$this, 'addFormTags'], 10, 3);
|
16 |
-
//add_action('wpcf7_admin_init', [$this, 'addFormTagGenerators'], 9999, 3);
|
17 |
-
|
18 |
-
add_action('wpcf7_before_send_mail', [$this, 'processFormSubmission'], 10, 3);
|
19 |
-
}
|
20 |
-
|
21 |
-
public function addFormTags()
|
22 |
-
{
|
23 |
-
wpcf7_add_form_tag(
|
24 |
-
['gdpr_consent_text'],
|
25 |
-
[$this, 'renderPrivacyTag']
|
26 |
-
);
|
27 |
-
}
|
28 |
-
|
29 |
-
public function addFormTagGenerators()
|
30 |
-
{
|
31 |
-
$generator = \WPCF7_TagGenerator::get_instance();
|
32 |
-
|
33 |
-
$generator->add(
|
34 |
-
'gdpr_privacy',
|
35 |
-
_x('gdpr terms txt', '(Admin)', 'gdpr-framework'),
|
36 |
-
[$this, 'generatePrivacyTag']
|
37 |
-
);
|
38 |
-
}
|
39 |
-
|
40 |
-
public function generatePrivacyTag($contactForm, $args)
|
41 |
-
{
|
42 |
-
//$args = wp_parse_args( $args, array() );
|
43 |
-
//$description = _x( "Generate the default text for your Privacy Policy acceptance checkbox. For more details, see %s.", '(Admin)', 'gdpr-framework' );
|
44 |
-
//$descLink = wpcf7_link( _x( 'https://TODO', '(Admin)', 'gdpr-framework' ), _x( 'GDPR Terms', '(Admin)', 'gdpr-framework' ) );
|
45 |
-
//$content = $this->renderPrivacyTag();
|
46 |
-
|
47 |
-
echo gdpr('view')->render(
|
48 |
-
'modules/contact-form-7/generator-privacy',
|
49 |
-
compact('description', 'descLink', 'args', 'content')
|
50 |
-
);
|
51 |
-
}
|
52 |
-
|
53 |
-
public function renderPrivacyTag()
|
54 |
-
{
|
55 |
-
$privacyPolicyUrl = get_permalink(gdpr('options')->get('policy_page'));
|
56 |
-
|
57 |
-
return gdpr('view')->render(
|
58 |
-
'modules/contact-form-7/content-privacy',
|
59 |
-
compact('privacyPolicyUrl')
|
60 |
-
);
|
61 |
-
}
|
62 |
-
|
63 |
-
public function processFormSubmission(\WPCF7_ContactForm $form, $abort, \WPCF7_Submission $submission)
|
64 |
-
{
|
65 |
-
$consents = $this->findConsents($form, $submission);
|
66 |
-
|
67 |
-
if (!count($consents)) {
|
68 |
-
return;
|
69 |
-
}
|
70 |
-
|
71 |
-
$email = $this->findEmail($submission);
|
72 |
-
|
73 |
-
if (!$email) {
|
74 |
-
return;
|
75 |
-
}
|
76 |
-
|
77 |
-
$dataSubject = $this->dataSubjectManager->getByEmail($email);
|
78 |
-
|
79 |
-
foreach ($consents as $consent) {
|
80 |
-
$dataSubject->giveConsent($consent);
|
81 |
-
}
|
82 |
-
}
|
83 |
-
|
84 |
-
public function findConsents(\WPCF7_ContactForm $form, \WPCF7_Submission $submission)
|
85 |
-
{
|
86 |
-
$consents = [];
|
87 |
-
|
88 |
-
foreach ($form->scan_form_tags() as $tag) {
|
89 |
-
/* @var $tag \WPCF7_FormTag */
|
90 |
-
if ('acceptance' === $tag->type && $submission->get_posted_data()[$tag->name] && $this->consentManager->isRegisteredConsent($tag->name)) {
|
91 |
-
$consents[] = $tag->name;
|
92 |
-
}
|
93 |
-
}
|
94 |
-
|
95 |
-
return $consents;
|
96 |
-
}
|
97 |
-
|
98 |
-
public function findEmail(\WPCF7_Submission $submission)
|
99 |
-
{
|
100 |
-
if (isset($submission->get_posted_data()['your-email'])) {
|
101 |
-
return $submission->get_posted_data()['your-email'];
|
102 |
-
}
|
103 |
-
|
104 |
-
if (isset($submission->get_posted_data()['email'])) {
|
105 |
-
return $submission->get_posted_data()['email'];
|
106 |
-
}
|
107 |
-
}
|
108 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Modules\ContactForm7;
|
4 |
+
|
5 |
+
use Codelight\GDPR\Components\Consent\ConsentManager;
|
6 |
+
use Codelight\GDPR\DataSubject\DataSubjectManager;
|
7 |
+
|
8 |
+
class ContactForm7
|
9 |
+
{
|
10 |
+
public function __construct(DataSubjectManager $dataSubjectManager, ConsentManager $consentManager)
|
11 |
+
{
|
12 |
+
$this->dataSubjectManager = $dataSubjectManager;
|
13 |
+
$this->consentManager = $consentManager;
|
14 |
+
|
15 |
+
//add_action('wpcf7_init', [$this, 'addFormTags'], 10, 3);
|
16 |
+
//add_action('wpcf7_admin_init', [$this, 'addFormTagGenerators'], 9999, 3);
|
17 |
+
|
18 |
+
add_action('wpcf7_before_send_mail', [$this, 'processFormSubmission'], 10, 3);
|
19 |
+
}
|
20 |
+
|
21 |
+
public function addFormTags()
|
22 |
+
{
|
23 |
+
wpcf7_add_form_tag(
|
24 |
+
['gdpr_consent_text'],
|
25 |
+
[$this, 'renderPrivacyTag']
|
26 |
+
);
|
27 |
+
}
|
28 |
+
|
29 |
+
public function addFormTagGenerators()
|
30 |
+
{
|
31 |
+
$generator = \WPCF7_TagGenerator::get_instance();
|
32 |
+
|
33 |
+
$generator->add(
|
34 |
+
'gdpr_privacy',
|
35 |
+
_x('gdpr terms txt', '(Admin)', 'gdpr-framework'),
|
36 |
+
[$this, 'generatePrivacyTag']
|
37 |
+
);
|
38 |
+
}
|
39 |
+
|
40 |
+
public function generatePrivacyTag($contactForm, $args)
|
41 |
+
{
|
42 |
+
//$args = wp_parse_args( $args, array() );
|
43 |
+
//$description = _x( "Generate the default text for your Privacy Policy acceptance checkbox. For more details, see %s.", '(Admin)', 'gdpr-framework' );
|
44 |
+
//$descLink = wpcf7_link( _x( 'https://TODO', '(Admin)', 'gdpr-framework' ), _x( 'GDPR Terms', '(Admin)', 'gdpr-framework' ) );
|
45 |
+
//$content = $this->renderPrivacyTag();
|
46 |
+
|
47 |
+
echo gdpr('view')->render(
|
48 |
+
'modules/contact-form-7/generator-privacy',
|
49 |
+
compact('description', 'descLink', 'args', 'content')
|
50 |
+
);
|
51 |
+
}
|
52 |
+
|
53 |
+
public function renderPrivacyTag()
|
54 |
+
{
|
55 |
+
$privacyPolicyUrl = get_permalink(gdpr('options')->get('policy_page'));
|
56 |
+
|
57 |
+
return gdpr('view')->render(
|
58 |
+
'modules/contact-form-7/content-privacy',
|
59 |
+
compact('privacyPolicyUrl')
|
60 |
+
);
|
61 |
+
}
|
62 |
+
|
63 |
+
public function processFormSubmission(\WPCF7_ContactForm $form, $abort, \WPCF7_Submission $submission)
|
64 |
+
{
|
65 |
+
$consents = $this->findConsents($form, $submission);
|
66 |
+
|
67 |
+
if (!count($consents)) {
|
68 |
+
return;
|
69 |
+
}
|
70 |
+
|
71 |
+
$email = $this->findEmail($submission);
|
72 |
+
|
73 |
+
if (!$email) {
|
74 |
+
return;
|
75 |
+
}
|
76 |
+
|
77 |
+
$dataSubject = $this->dataSubjectManager->getByEmail($email);
|
78 |
+
|
79 |
+
foreach ($consents as $consent) {
|
80 |
+
$dataSubject->giveConsent($consent);
|
81 |
+
}
|
82 |
+
}
|
83 |
+
|
84 |
+
public function findConsents(\WPCF7_ContactForm $form, \WPCF7_Submission $submission)
|
85 |
+
{
|
86 |
+
$consents = [];
|
87 |
+
|
88 |
+
foreach ($form->scan_form_tags() as $tag) {
|
89 |
+
/* @var $tag \WPCF7_FormTag */
|
90 |
+
if ('acceptance' === $tag->type && $submission->get_posted_data()[$tag->name] && $this->consentManager->isRegisteredConsent($tag->name)) {
|
91 |
+
$consents[] = $tag->name;
|
92 |
+
}
|
93 |
+
}
|
94 |
+
|
95 |
+
return $consents;
|
96 |
+
}
|
97 |
+
|
98 |
+
public function findEmail(\WPCF7_Submission $submission)
|
99 |
+
{
|
100 |
+
if (isset($submission->get_posted_data()['your-email'])) {
|
101 |
+
return $submission->get_posted_data()['your-email'];
|
102 |
+
}
|
103 |
+
|
104 |
+
if (isset($submission->get_posted_data()['email'])) {
|
105 |
+
return $submission->get_posted_data()['email'];
|
106 |
+
}
|
107 |
+
}
|
108 |
+
}
|
src/Modules/WPML/WPML.php
CHANGED
@@ -1,153 +1,153 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR\Modules\WPML;
|
4 |
-
|
5 |
-
class WPML
|
6 |
-
{
|
7 |
-
protected $prefix = 'gdpr_';
|
8 |
-
|
9 |
-
protected $translatableOptions = [
|
10 |
-
'tools_page',
|
11 |
-
'policy_page',
|
12 |
-
'terms_page',
|
13 |
-
'consent_info',
|
14 |
-
];
|
15 |
-
|
16 |
-
public function __construct()
|
17 |
-
{
|
18 |
-
if (!class_exists('Sitepress')) {
|
19 |
-
return;
|
20 |
-
}
|
21 |
-
|
22 |
-
$this->setupOptionFilters();
|
23 |
-
}
|
24 |
-
|
25 |
-
protected function setupOptionFilters()
|
26 |
-
{
|
27 |
-
foreach ($this->translatableOptions as $option) {
|
28 |
-
add_filter("gdpr/options/get/{$option}", [$this, 'getTranslatedOption']);
|
29 |
-
|
30 |
-
$option = $this->prefix($option);
|
31 |
-
add_filter("pre_update_option_{$option}", [$this, 'setTranslatedOption'], 10, 2);
|
32 |
-
}
|
33 |
-
|
34 |
-
add_filter('gdpr/options/get/consent_types', [$this, 'getConsentTypes']);
|
35 |
-
add_filter('gdpr/options/set/consent_types', [$this, 'saveConsentTypes']);
|
36 |
-
}
|
37 |
-
|
38 |
-
public function getTranslatedOption($option)
|
39 |
-
{
|
40 |
-
if (!defined('ICL_LANGUAGE_CODE')) {
|
41 |
-
if (is_array($option)) {
|
42 |
-
return '';
|
43 |
-
} else {
|
44 |
-
return $option;
|
45 |
-
}
|
46 |
-
}
|
47 |
-
|
48 |
-
if (isset($option[ICL_LANGUAGE_CODE])) {
|
49 |
-
return $option[ICL_LANGUAGE_CODE];
|
50 |
-
} else {
|
51 |
-
return '';
|
52 |
-
}
|
53 |
-
}
|
54 |
-
|
55 |
-
public function setTranslatedOption($newValue, $oldValue)
|
56 |
-
{
|
57 |
-
if (!defined('ICL_LANGUAGE_CODE')) {
|
58 |
-
return $newValue;
|
59 |
-
}
|
60 |
-
|
61 |
-
if (is_array($oldValue)) {
|
62 |
-
$value = $oldValue;
|
63 |
-
} else {
|
64 |
-
$value = [];
|
65 |
-
}
|
66 |
-
|
67 |
-
$value[ICL_LANGUAGE_CODE] = $newValue;
|
68 |
-
|
69 |
-
return $value;
|
70 |
-
}
|
71 |
-
|
72 |
-
public function getConsentTypes($consentTypes)
|
73 |
-
{
|
74 |
-
if (!defined('ICL_LANGUAGE_CODE')) {
|
75 |
-
return $consentTypes;
|
76 |
-
}
|
77 |
-
|
78 |
-
$code = ICL_LANGUAGE_CODE;
|
79 |
-
$filteredConsentTypes = [];
|
80 |
-
|
81 |
-
if (count($consentTypes)) {
|
82 |
-
foreach ($consentTypes as $consentType) {
|
83 |
-
|
84 |
-
if ('privacy-policy' === $consentType['slug'] or 'terms-condition' === $consentType['slug']) {
|
85 |
-
$filteredConsentTypes[] = [
|
86 |
-
'slug' => isset($consentType['slug']) ? $consentType['slug'] : '',
|
87 |
-
'visible' => isset($consentType['visible']) ? $consentType['visible'] : 0,
|
88 |
-
'title' => isset($consentType["title"]) ? $consentType["title"] : '',
|
89 |
-
'description' => isset($consentType["description"]) ? $consentType["description"] : '',
|
90 |
-
];
|
91 |
-
} else {
|
92 |
-
$filteredConsentTypes[] = [
|
93 |
-
'slug' => isset($consentType['slug']) ? $consentType['slug'] : '',
|
94 |
-
'visible' => isset($consentType['visible']) ? $consentType['visible'] : 0,
|
95 |
-
'title' => isset($consentType["{$code}_title"]) ? $consentType["{$code}_title"] : '',
|
96 |
-
'description' => isset($consentType["{$code}_description"]) ? $consentType["{$code}_description"] : '',
|
97 |
-
];
|
98 |
-
}
|
99 |
-
}
|
100 |
-
}
|
101 |
-
|
102 |
-
return $filteredConsentTypes;
|
103 |
-
}
|
104 |
-
|
105 |
-
public function saveConsentTypes($newConsentTypes)
|
106 |
-
{
|
107 |
-
if (!defined('ICL_LANGUAGE_CODE')) {
|
108 |
-
return $newConsentTypes;
|
109 |
-
}
|
110 |
-
|
111 |
-
$code = ICL_LANGUAGE_CODE;
|
112 |
-
$translatedConsentTypes = [];
|
113 |
-
$currentConsentTypes = gdpr('options')->get('consent_types', null, false);
|
114 |
-
|
115 |
-
if (count($newConsentTypes)) {
|
116 |
-
foreach ($newConsentTypes as &$newConsentType) {
|
117 |
-
|
118 |
-
// Match an existing consent type with the new one
|
119 |
-
$slug = $newConsentType['slug'];
|
120 |
-
$existingConsentType = current(array_filter($currentConsentTypes, function($value) use ($slug) {
|
121 |
-
return $value['slug'] === $slug;
|
122 |
-
}));
|
123 |
-
|
124 |
-
if ($existingConsentType) {
|
125 |
-
// We have a matching existing consent - update translations, keep the rest
|
126 |
-
$existingConsentType["{$code}_title"] = $newConsentType['title'];
|
127 |
-
$existingConsentType["{$code}_description"] = $newConsentType['description'];
|
128 |
-
|
129 |
-
$translatedConsentTypes[] = $existingConsentType;
|
130 |
-
} else {
|
131 |
-
// We do not have a matching existin consent - just adjust the keys for language
|
132 |
-
$newConsentType["{$code}_title"] = $newConsentType['title'];
|
133 |
-
$newConsentType["{$code}_description"] = $newConsentType['description'];
|
134 |
-
unset($newConsentType['title']);
|
135 |
-
unset($newConsentType['description']);
|
136 |
-
|
137 |
-
$translatedConsentTypes[] = $newConsentType;
|
138 |
-
}
|
139 |
-
}
|
140 |
-
}
|
141 |
-
|
142 |
-
return $translatedConsentTypes;
|
143 |
-
}
|
144 |
-
|
145 |
-
public function prefix($name)
|
146 |
-
{
|
147 |
-
if (0 === strpos($name, $this->prefix)) {
|
148 |
-
return $name;
|
149 |
-
}
|
150 |
-
|
151 |
-
return $this->prefix . $name;
|
152 |
-
}
|
153 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Modules\WPML;
|
4 |
+
|
5 |
+
class WPML
|
6 |
+
{
|
7 |
+
protected $prefix = 'gdpr_';
|
8 |
+
|
9 |
+
protected $translatableOptions = [
|
10 |
+
'tools_page',
|
11 |
+
'policy_page',
|
12 |
+
'terms_page',
|
13 |
+
'consent_info',
|
14 |
+
];
|
15 |
+
|
16 |
+
public function __construct()
|
17 |
+
{
|
18 |
+
if (!class_exists('Sitepress')) {
|
19 |
+
return;
|
20 |
+
}
|
21 |
+
|
22 |
+
$this->setupOptionFilters();
|
23 |
+
}
|
24 |
+
|
25 |
+
protected function setupOptionFilters()
|
26 |
+
{
|
27 |
+
foreach ($this->translatableOptions as $option) {
|
28 |
+
add_filter("gdpr/options/get/{$option}", [$this, 'getTranslatedOption']);
|
29 |
+
|
30 |
+
$option = $this->prefix($option);
|
31 |
+
add_filter("pre_update_option_{$option}", [$this, 'setTranslatedOption'], 10, 2);
|
32 |
+
}
|
33 |
+
|
34 |
+
add_filter('gdpr/options/get/consent_types', [$this, 'getConsentTypes']);
|
35 |
+
add_filter('gdpr/options/set/consent_types', [$this, 'saveConsentTypes']);
|
36 |
+
}
|
37 |
+
|
38 |
+
public function getTranslatedOption($option)
|
39 |
+
{
|
40 |
+
if (!defined('ICL_LANGUAGE_CODE')) {
|
41 |
+
if (is_array($option)) {
|
42 |
+
return '';
|
43 |
+
} else {
|
44 |
+
return $option;
|
45 |
+
}
|
46 |
+
}
|
47 |
+
|
48 |
+
if (isset($option[ICL_LANGUAGE_CODE])) {
|
49 |
+
return $option[ICL_LANGUAGE_CODE];
|
50 |
+
} else {
|
51 |
+
return '';
|
52 |
+
}
|
53 |
+
}
|
54 |
+
|
55 |
+
public function setTranslatedOption($newValue, $oldValue)
|
56 |
+
{
|
57 |
+
if (!defined('ICL_LANGUAGE_CODE')) {
|
58 |
+
return $newValue;
|
59 |
+
}
|
60 |
+
|
61 |
+
if (is_array($oldValue)) {
|
62 |
+
$value = $oldValue;
|
63 |
+
} else {
|
64 |
+
$value = [];
|
65 |
+
}
|
66 |
+
|
67 |
+
$value[ICL_LANGUAGE_CODE] = $newValue;
|
68 |
+
|
69 |
+
return $value;
|
70 |
+
}
|
71 |
+
|
72 |
+
public function getConsentTypes($consentTypes)
|
73 |
+
{
|
74 |
+
if (!defined('ICL_LANGUAGE_CODE')) {
|
75 |
+
return $consentTypes;
|
76 |
+
}
|
77 |
+
|
78 |
+
$code = ICL_LANGUAGE_CODE;
|
79 |
+
$filteredConsentTypes = [];
|
80 |
+
|
81 |
+
if (count($consentTypes)) {
|
82 |
+
foreach ($consentTypes as $consentType) {
|
83 |
+
|
84 |
+
if (isset($consentType['slug']) && ('privacy-policy' === $consentType['slug'] or 'terms-condition' === $consentType['slug'])) {
|
85 |
+
$filteredConsentTypes[] = [
|
86 |
+
'slug' => isset($consentType['slug']) ? $consentType['slug'] : '',
|
87 |
+
'visible' => isset($consentType['visible']) ? $consentType['visible'] : 0,
|
88 |
+
'title' => isset($consentType["title"]) ? $consentType["title"] : '',
|
89 |
+
'description' => isset($consentType["description"]) ? $consentType["description"] : '',
|
90 |
+
];
|
91 |
+
} else {
|
92 |
+
$filteredConsentTypes[] = [
|
93 |
+
'slug' => isset($consentType['slug']) ? $consentType['slug'] : '',
|
94 |
+
'visible' => isset($consentType['visible']) ? $consentType['visible'] : 0,
|
95 |
+
'title' => isset($consentType["{$code}_title"]) ? $consentType["{$code}_title"] : '',
|
96 |
+
'description' => isset($consentType["{$code}_description"]) ? $consentType["{$code}_description"] : '',
|
97 |
+
];
|
98 |
+
}
|
99 |
+
}
|
100 |
+
}
|
101 |
+
|
102 |
+
return $filteredConsentTypes;
|
103 |
+
}
|
104 |
+
|
105 |
+
public function saveConsentTypes($newConsentTypes)
|
106 |
+
{
|
107 |
+
if (!defined('ICL_LANGUAGE_CODE')) {
|
108 |
+
return $newConsentTypes;
|
109 |
+
}
|
110 |
+
|
111 |
+
$code = ICL_LANGUAGE_CODE;
|
112 |
+
$translatedConsentTypes = [];
|
113 |
+
$currentConsentTypes = gdpr('options')->get('consent_types', null, false);
|
114 |
+
|
115 |
+
if (count($newConsentTypes)) {
|
116 |
+
foreach ($newConsentTypes as &$newConsentType) {
|
117 |
+
|
118 |
+
// Match an existing consent type with the new one
|
119 |
+
$slug = $newConsentType['slug'];
|
120 |
+
$existingConsentType = current(array_filter($currentConsentTypes, function($value) use ($slug) {
|
121 |
+
return $value['slug'] === $slug;
|
122 |
+
}));
|
123 |
+
|
124 |
+
if ($existingConsentType) {
|
125 |
+
// We have a matching existing consent - update translations, keep the rest
|
126 |
+
$existingConsentType["{$code}_title"] = $newConsentType['title'];
|
127 |
+
$existingConsentType["{$code}_description"] = $newConsentType['description'];
|
128 |
+
|
129 |
+
$translatedConsentTypes[] = $existingConsentType;
|
130 |
+
} else {
|
131 |
+
// We do not have a matching existin consent - just adjust the keys for language
|
132 |
+
$newConsentType["{$code}_title"] = $newConsentType['title'];
|
133 |
+
$newConsentType["{$code}_description"] = $newConsentType['description'];
|
134 |
+
unset($newConsentType['title']);
|
135 |
+
unset($newConsentType['description']);
|
136 |
+
|
137 |
+
$translatedConsentTypes[] = $newConsentType;
|
138 |
+
}
|
139 |
+
}
|
140 |
+
}
|
141 |
+
|
142 |
+
return $translatedConsentTypes;
|
143 |
+
}
|
144 |
+
|
145 |
+
public function prefix($name)
|
146 |
+
{
|
147 |
+
if (0 === strpos($name, $this->prefix)) {
|
148 |
+
return $name;
|
149 |
+
}
|
150 |
+
|
151 |
+
return $this->prefix . $name;
|
152 |
+
}
|
153 |
+
}
|
src/Router.php
CHANGED
@@ -1,166 +1,166 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR;
|
4 |
-
|
5 |
-
use Codelight\GDPR\DataSubject\DataSubjectAuthenticator;
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Handles automatically identifying context and triggering actions based on $_REQUEST['gdpr_action']
|
9 |
-
*
|
10 |
-
* Class Router
|
11 |
-
*
|
12 |
-
* @package Codelight\GDPR
|
13 |
-
*/
|
14 |
-
class Router
|
15 |
-
{
|
16 |
-
/* @var DataSubjectAuthenticator $authenticator */
|
17 |
-
protected $authenticator;
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Router constructor.
|
21 |
-
*
|
22 |
-
* @param DataSubjectAuthenticator $authenticator
|
23 |
-
*/
|
24 |
-
public function __construct(DataSubjectAuthenticator $authenticator)
|
25 |
-
{
|
26 |
-
$this->authenticator = $authenticator;
|
27 |
-
|
28 |
-
// Routing happens at priority 20 to allow other 'init' actions to complete before
|
29 |
-
add_action('init', [$this, 'routeFrontendRequest'], 20);
|
30 |
-
add_action('admin_init', [$this, 'routeAdminRequest'], 20);
|
31 |
-
}
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Get and sanitize the action parameter
|
35 |
-
*
|
36 |
-
* @return bool|mixed
|
37 |
-
*/
|
38 |
-
protected function getAction()
|
39 |
-
{
|
40 |
-
if (!isset($_REQUEST['gdpr_action'])) {
|
41 |
-
return false;
|
42 |
-
}
|
43 |
-
|
44 |
-
// Simple sanitization: allowed chars are alphanumeric, dash, underscore and forward slash.
|
45 |
-
return preg_replace("/[^a-zA-Z0-9_\-\/]/", "", $_REQUEST['gdpr_action']);
|
46 |
-
}
|
47 |
-
|
48 |
-
/**
|
49 |
-
* Detect and trigger proper action in front-end
|
50 |
-
*
|
51 |
-
* @param $action
|
52 |
-
*/
|
53 |
-
public function routeFrontendRequest()
|
54 |
-
{
|
55 |
-
// Since the 'init' hooks runs in both admin and non-admin requests, double-check where we are
|
56 |
-
if (is_admin()) {
|
57 |
-
return;
|
58 |
-
}
|
59 |
-
|
60 |
-
// Handle identification by email
|
61 |
-
$this->authenticator->identify();
|
62 |
-
|
63 |
-
$action = $this->getAction();
|
64 |
-
$nonce = isset($_REQUEST['gdpr_nonce']) ? $_REQUEST['gdpr_nonce'] : null;
|
65 |
-
|
66 |
-
if (!$action) {
|
67 |
-
return;
|
68 |
-
}
|
69 |
-
|
70 |
-
$dataSubject = $this->authenticator->authenticate();
|
71 |
-
|
72 |
-
if ($dataSubject) {
|
73 |
-
$tag = "gdpr/frontend/privacy-tools-page/action/{$action}";
|
74 |
-
if (wp_verify_nonce($nonce, $tag)) {
|
75 |
-
$key = isset($_REQUEST['gdpr_key']) ? $_REQUEST['gdpr_key'] : null;
|
76 |
-
do_action($tag, $dataSubject, $key);
|
77 |
-
} else {
|
78 |
-
wp_die(
|
79 |
-
sprintf(
|
80 |
-
__('Nonce error for action "%s". Please go back and try again!', 'gdpr-framework'),
|
81 |
-
esc_html($action)
|
82 |
-
)
|
83 |
-
);
|
84 |
-
}
|
85 |
-
} else {
|
86 |
-
$tag = "gdpr/frontend/action/{$action}";
|
87 |
-
if (wp_verify_nonce($nonce, $tag)) {
|
88 |
-
do_action($tag);
|
89 |
-
} else {
|
90 |
-
wp_die(
|
91 |
-
sprintf(
|
92 |
-
__('Nonce error for action "%s". Please go back and try again!', 'gdpr-framework'),
|
93 |
-
esc_html($action)
|
94 |
-
)
|
95 |
-
);
|
96 |
-
}
|
97 |
-
}
|
98 |
-
}
|
99 |
-
|
100 |
-
/**
|
101 |
-
* Detect and trigger proper action in admin
|
102 |
-
*
|
103 |
-
* @param $action
|
104 |
-
*/
|
105 |
-
public function routeAdminRequest()
|
106 |
-
{
|
107 |
-
$action = $this->getAction();
|
108 |
-
$nonce = isset($_REQUEST['gdpr_nonce']) ? $_REQUEST['gdpr_nonce'] : null;
|
109 |
-
|
110 |
-
if (!$action) {
|
111 |
-
return;
|
112 |
-
}
|
113 |
-
|
114 |
-
if (isset($_GET['page']) && 'gdpr-profile' === $_GET['page']) {
|
115 |
-
|
116 |
-
$dataSubject = $this->authenticator->authenticate();
|
117 |
-
if ($dataSubject) {
|
118 |
-
$tag = "gdpr/dashboard/privacy-tools/action/{$action}";
|
119 |
-
|
120 |
-
if (wp_verify_nonce($nonce, $tag)) {
|
121 |
-
do_action($tag, $dataSubject);
|
122 |
-
} else {
|
123 |
-
wp_die(
|
124 |
-
sprintf(
|
125 |
-
__('Nonce error for action "%s". Please go back and try again!', 'gdpr-framework'),
|
126 |
-
esc_html($action)
|
127 |
-
)
|
128 |
-
);
|
129 |
-
}
|
130 |
-
}
|
131 |
-
} else {
|
132 |
-
if ($this->checkAdminPermissions()) {
|
133 |
-
|
134 |
-
$tag = "gdpr/admin/action/{$action}";
|
135 |
-
|
136 |
-
if (wp_verify_nonce($nonce, $tag)) {
|
137 |
-
do_action($tag);
|
138 |
-
} else {
|
139 |
-
wp_die(
|
140 |
-
sprintf(
|
141 |
-
__('Nonce error for action "%s". Please go back and try again!', 'gdpr-framework'),
|
142 |
-
esc_html($action)
|
143 |
-
)
|
144 |
-
);
|
145 |
-
}
|
146 |
-
} else {
|
147 |
-
wp_die(
|
148 |
-
sprintf(
|
149 |
-
_x('You do not have the required permissions to perform this action!', '(Admin)', 'gdpr-framework'),
|
150 |
-
esc_html($action)
|
151 |
-
)
|
152 |
-
);
|
153 |
-
}
|
154 |
-
}
|
155 |
-
}
|
156 |
-
|
157 |
-
/**
|
158 |
-
* Check if the current user has the correct capability to perform an admin action
|
159 |
-
*
|
160 |
-
* @return bool
|
161 |
-
*/
|
162 |
-
protected function checkAdminPermissions()
|
163 |
-
{
|
164 |
-
return current_user_can(apply_filters('gdpr/capability', 'manage_options'));
|
165 |
-
}
|
166 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR;
|
4 |
+
|
5 |
+
use Codelight\GDPR\DataSubject\DataSubjectAuthenticator;
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Handles automatically identifying context and triggering actions based on $_REQUEST['gdpr_action']
|
9 |
+
*
|
10 |
+
* Class Router
|
11 |
+
*
|
12 |
+
* @package Codelight\GDPR
|
13 |
+
*/
|
14 |
+
class Router
|
15 |
+
{
|
16 |
+
/* @var DataSubjectAuthenticator $authenticator */
|
17 |
+
protected $authenticator;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Router constructor.
|
21 |
+
*
|
22 |
+
* @param DataSubjectAuthenticator $authenticator
|
23 |
+
*/
|
24 |
+
public function __construct(DataSubjectAuthenticator $authenticator)
|
25 |
+
{
|
26 |
+
$this->authenticator = $authenticator;
|
27 |
+
|
28 |
+
// Routing happens at priority 20 to allow other 'init' actions to complete before
|
29 |
+
add_action('init', [$this, 'routeFrontendRequest'], 20);
|
30 |
+
add_action('admin_init', [$this, 'routeAdminRequest'], 20);
|
31 |
+
}
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Get and sanitize the action parameter
|
35 |
+
*
|
36 |
+
* @return bool|mixed
|
37 |
+
*/
|
38 |
+
protected function getAction()
|
39 |
+
{
|
40 |
+
if (!isset($_REQUEST['gdpr_action'])) {
|
41 |
+
return false;
|
42 |
+
}
|
43 |
+
|
44 |
+
// Simple sanitization: allowed chars are alphanumeric, dash, underscore and forward slash.
|
45 |
+
return preg_replace("/[^a-zA-Z0-9_\-\/]/", "", $_REQUEST['gdpr_action']);
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Detect and trigger proper action in front-end
|
50 |
+
*
|
51 |
+
* @param $action
|
52 |
+
*/
|
53 |
+
public function routeFrontendRequest()
|
54 |
+
{
|
55 |
+
// Since the 'init' hooks runs in both admin and non-admin requests, double-check where we are
|
56 |
+
if (is_admin()) {
|
57 |
+
return;
|
58 |
+
}
|
59 |
+
|
60 |
+
// Handle identification by email
|
61 |
+
$this->authenticator->identify();
|
62 |
+
|
63 |
+
$action = $this->getAction();
|
64 |
+
$nonce = isset($_REQUEST['gdpr_nonce']) ? $_REQUEST['gdpr_nonce'] : null;
|
65 |
+
|
66 |
+
if (!$action) {
|
67 |
+
return;
|
68 |
+
}
|
69 |
+
|
70 |
+
$dataSubject = $this->authenticator->authenticate();
|
71 |
+
|
72 |
+
if ($dataSubject) {
|
73 |
+
$tag = "gdpr/frontend/privacy-tools-page/action/{$action}";
|
74 |
+
if (wp_verify_nonce($nonce, $tag)) {
|
75 |
+
$key = isset($_REQUEST['gdpr_key']) ? $_REQUEST['gdpr_key'] : null;
|
76 |
+
do_action($tag, $dataSubject, $key);
|
77 |
+
} else {
|
78 |
+
wp_die(
|
79 |
+
sprintf(
|
80 |
+
__('Nonce error for action "%s". Please go back and try again!', 'gdpr-framework'),
|
81 |
+
esc_html($action)
|
82 |
+
)
|
83 |
+
);
|
84 |
+
}
|
85 |
+
} else {
|
86 |
+
$tag = "gdpr/frontend/action/{$action}";
|
87 |
+
if (wp_verify_nonce($nonce, $tag)) {
|
88 |
+
do_action($tag);
|
89 |
+
} else {
|
90 |
+
wp_die(
|
91 |
+
sprintf(
|
92 |
+
__('Nonce error for action "%s". Please go back and try again!', 'gdpr-framework'),
|
93 |
+
esc_html($action)
|
94 |
+
)
|
95 |
+
);
|
96 |
+
}
|
97 |
+
}
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Detect and trigger proper action in admin
|
102 |
+
*
|
103 |
+
* @param $action
|
104 |
+
*/
|
105 |
+
public function routeAdminRequest()
|
106 |
+
{
|
107 |
+
$action = $this->getAction();
|
108 |
+
$nonce = isset($_REQUEST['gdpr_nonce']) ? $_REQUEST['gdpr_nonce'] : null;
|
109 |
+
|
110 |
+
if (!$action) {
|
111 |
+
return;
|
112 |
+
}
|
113 |
+
|
114 |
+
if (isset($_GET['page']) && 'gdpr-profile' === $_GET['page']) {
|
115 |
+
|
116 |
+
$dataSubject = $this->authenticator->authenticate();
|
117 |
+
if ($dataSubject) {
|
118 |
+
$tag = "gdpr/dashboard/privacy-tools/action/{$action}";
|
119 |
+
|
120 |
+
if (wp_verify_nonce($nonce, $tag)) {
|
121 |
+
do_action($tag, $dataSubject);
|
122 |
+
} else {
|
123 |
+
wp_die(
|
124 |
+
sprintf(
|
125 |
+
__('Nonce error for action "%s". Please go back and try again!', 'gdpr-framework'),
|
126 |
+
esc_html($action)
|
127 |
+
)
|
128 |
+
);
|
129 |
+
}
|
130 |
+
}
|
131 |
+
} else {
|
132 |
+
if ($this->checkAdminPermissions()) {
|
133 |
+
|
134 |
+
$tag = "gdpr/admin/action/{$action}";
|
135 |
+
|
136 |
+
if (wp_verify_nonce($nonce, $tag)) {
|
137 |
+
do_action($tag);
|
138 |
+
} else {
|
139 |
+
wp_die(
|
140 |
+
sprintf(
|
141 |
+
__('Nonce error for action "%s". Please go back and try again!', 'gdpr-framework'),
|
142 |
+
esc_html($action)
|
143 |
+
)
|
144 |
+
);
|
145 |
+
}
|
146 |
+
} else {
|
147 |
+
wp_die(
|
148 |
+
sprintf(
|
149 |
+
_x('You do not have the required permissions to perform this action!', '(Admin)', 'gdpr-framework'),
|
150 |
+
esc_html($action)
|
151 |
+
)
|
152 |
+
);
|
153 |
+
}
|
154 |
+
}
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Check if the current user has the correct capability to perform an admin action
|
159 |
+
*
|
160 |
+
* @return bool
|
161 |
+
*/
|
162 |
+
protected function checkAdminPermissions()
|
163 |
+
{
|
164 |
+
return current_user_can(apply_filters('gdpr/capability', 'manage_options'));
|
165 |
+
}
|
166 |
+
}
|
src/Setup.php
CHANGED
@@ -1,93 +1,94 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR;
|
4 |
-
|
5 |
-
use Codelight\GDPR\Admin\AdminTab;
|
6 |
-
use Codelight\GDPR\Components\Consent\ConsentManager;
|
7 |
-
use Codelight\GDPR\Components\PrivacyToolsPage\PrivacyToolsPage;
|
8 |
-
use Codelight\GDPR\Components\PrivacyPolicy\PrivacyPolicy;
|
9 |
-
use Codelight\GDPR\Components\Support\Support;
|
10 |
-
use Codelight\GDPR\Components\WordpressComments\WordpressComments;
|
11 |
-
use Codelight\GDPR\DataSubject\DataExporter;
|
12 |
-
use Codelight\GDPR\DataSubject\DataSubjectAdmin;
|
13 |
-
use Codelight\GDPR\DataSubject\DataSubjectIdentificator;
|
14 |
-
use Codelight\GDPR\DataSubject\DataSubjectManager;
|
15 |
-
use Codelight\GDPR\Modules\ContactForm7\ContactForm7;
|
16 |
-
use Codelight\GDPR\Components\Themes\Themes;
|
17 |
-
use Codelight\GDPR\Components\WordpressUser\WordpressUser;
|
18 |
-
use Codelight\GDPR\Modules\WPML\WPML;
|
19 |
-
use Codelight\GDPR\Options\Options;
|
20 |
-
|
21 |
-
/**
|
22 |
-
* Instantiate components
|
23 |
-
*
|
24 |
-
* Class Setup
|
25 |
-
* @package Codelight\GDPR
|
26 |
-
*/
|
27 |
-
class Setup
|
28 |
-
{
|
29 |
-
/**
|
30 |
-
* Setup constructor.
|
31 |
-
*/
|
32 |
-
public function __construct()
|
33 |
-
{
|
34 |
-
$this->registerComponents();
|
35 |
-
$this->runComponents();
|
36 |
-
|
37 |
-
add_action('init', function() {
|
38 |
-
|
39 |
-
if (!is_admin()) {
|
40 |
-
return;
|
41 |
-
}
|
42 |
-
|
43 |
-
gdpr()->singleton(SetupAdmin::class);
|
44 |
-
gdpr(SetupAdmin::class);
|
45 |
-
}, 0);
|
46 |
-
}
|
47 |
-
|
48 |
-
/**
|
49 |
-
* Register required components in the container
|
50 |
-
*/
|
51 |
-
protected function registerComponents()
|
52 |
-
{
|
53 |
-
gdpr()->bind(Router::class);
|
54 |
-
gdpr()->bind(DataExporter::class);
|
55 |
-
|
56 |
-
gdpr()->singleton(PrivacyToolsPage::class);
|
57 |
-
|
58 |
-
gdpr()->singleton(AdminTab::class);
|
59 |
-
gdpr()->singleton(DataSubjectManager::class);
|
60 |
-
gdpr()->singleton(DataSubjectIdentificator::class);
|
61 |
-
gdpr()->singleton(View::class);
|
62 |
-
gdpr()->singleton(Options::class);
|
63 |
-
gdpr()->singleton(ConsentManager::class);
|
64 |
-
gdpr()->singleton(Helpers::class);
|
65 |
-
gdpr()->singleton(Themes::class);
|
66 |
-
|
67 |
-
gdpr()->alias(View::class, 'view');
|
68 |
-
gdpr()->alias(Options::class, 'options');
|
69 |
-
gdpr()->alias(ConsentManager::class, 'consent');
|
70 |
-
gdpr()->alias(Helpers::class, 'helpers');
|
71 |
-
gdpr()->alias(Themes::class, 'themes');
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
gdpr()->make(
|
81 |
-
gdpr()->make(
|
82 |
-
gdpr()->make(
|
83 |
-
gdpr()->make(
|
84 |
-
gdpr()->make(
|
85 |
-
gdpr()->make(
|
86 |
-
gdpr()->make(
|
87 |
-
gdpr()->make(
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
gdpr()->make(
|
92 |
-
|
93 |
-
}
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR;
|
4 |
+
|
5 |
+
use Codelight\GDPR\Admin\AdminTab;
|
6 |
+
use Codelight\GDPR\Components\Consent\ConsentManager;
|
7 |
+
use Codelight\GDPR\Components\PrivacyToolsPage\PrivacyToolsPage;
|
8 |
+
use Codelight\GDPR\Components\PrivacyPolicy\PrivacyPolicy;
|
9 |
+
use Codelight\GDPR\Components\Support\Support;
|
10 |
+
use Codelight\GDPR\Components\WordpressComments\WordpressComments;
|
11 |
+
use Codelight\GDPR\DataSubject\DataExporter;
|
12 |
+
use Codelight\GDPR\DataSubject\DataSubjectAdmin;
|
13 |
+
use Codelight\GDPR\DataSubject\DataSubjectIdentificator;
|
14 |
+
use Codelight\GDPR\DataSubject\DataSubjectManager;
|
15 |
+
use Codelight\GDPR\Modules\ContactForm7\ContactForm7;
|
16 |
+
use Codelight\GDPR\Components\Themes\Themes;
|
17 |
+
use Codelight\GDPR\Components\WordpressUser\WordpressUser;
|
18 |
+
use Codelight\GDPR\Modules\WPML\WPML;
|
19 |
+
use Codelight\GDPR\Options\Options;
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Instantiate components
|
23 |
+
*
|
24 |
+
* Class Setup
|
25 |
+
* @package Codelight\GDPR
|
26 |
+
*/
|
27 |
+
class Setup
|
28 |
+
{
|
29 |
+
/**
|
30 |
+
* Setup constructor.
|
31 |
+
*/
|
32 |
+
public function __construct()
|
33 |
+
{
|
34 |
+
$this->registerComponents();
|
35 |
+
$this->runComponents();
|
36 |
+
|
37 |
+
add_action('init', function() {
|
38 |
+
|
39 |
+
if (!is_admin()) {
|
40 |
+
return;
|
41 |
+
}
|
42 |
+
|
43 |
+
gdpr()->singleton(SetupAdmin::class);
|
44 |
+
gdpr(SetupAdmin::class);
|
45 |
+
}, 0);
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Register required components in the container
|
50 |
+
*/
|
51 |
+
protected function registerComponents()
|
52 |
+
{
|
53 |
+
gdpr()->bind(Router::class);
|
54 |
+
gdpr()->bind(DataExporter::class);
|
55 |
+
|
56 |
+
gdpr()->singleton(PrivacyToolsPage::class);
|
57 |
+
|
58 |
+
gdpr()->singleton(AdminTab::class);
|
59 |
+
gdpr()->singleton(DataSubjectManager::class);
|
60 |
+
gdpr()->singleton(DataSubjectIdentificator::class);
|
61 |
+
gdpr()->singleton(View::class);
|
62 |
+
gdpr()->singleton(Options::class);
|
63 |
+
gdpr()->singleton(ConsentManager::class);
|
64 |
+
gdpr()->singleton(Helpers::class);
|
65 |
+
gdpr()->singleton(Themes::class);
|
66 |
+
|
67 |
+
gdpr()->alias(View::class, 'view');
|
68 |
+
gdpr()->alias(Options::class, 'options');
|
69 |
+
gdpr()->alias(ConsentManager::class, 'consent');
|
70 |
+
gdpr()->alias(Helpers::class, 'helpers');
|
71 |
+
gdpr()->alias(Themes::class, 'themes');
|
72 |
+
gdpr()->alias(DataSubjectManager::class, 'data-subject');
|
73 |
+
}
|
74 |
+
|
75 |
+
/**
|
76 |
+
* Check which components should be ran and run them
|
77 |
+
*/
|
78 |
+
protected function runComponents()
|
79 |
+
{
|
80 |
+
gdpr()->make(WPML::class);
|
81 |
+
gdpr()->make(Router::class);
|
82 |
+
gdpr()->make(DataSubjectIdentificator::class);
|
83 |
+
gdpr()->make(DataSubjectAdmin::class);
|
84 |
+
gdpr()->make(PrivacyToolsPage::class);
|
85 |
+
gdpr()->make(PrivacyPolicy::class);
|
86 |
+
gdpr()->make(WordpressComments::class);
|
87 |
+
gdpr()->make(WordpressUser::class);
|
88 |
+
gdpr()->make(Support::class);
|
89 |
+
|
90 |
+
// Integrations
|
91 |
+
gdpr()->make(Themes::class);
|
92 |
+
gdpr()->make(ContactForm7::class);
|
93 |
+
}
|
94 |
+
}
|
src/SetupAdmin.php
CHANGED
@@ -1,62 +1,62 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR;
|
4 |
-
|
5 |
-
use Codelight\GDPR\Admin\AdminError;
|
6 |
-
use Codelight\GDPR\Admin\AdminNotice;
|
7 |
-
use Codelight\GDPR\Admin\Modal;
|
8 |
-
use Codelight\GDPR\Admin\WordpressAdmin;
|
9 |
-
use Codelight\GDPR\Admin\WordpressAdminPage;
|
10 |
-
use Codelight\GDPR\Components\Consent\ConsentAdmin;
|
11 |
-
use Codelight\GDPR\Installer\Installer;
|
12 |
-
use Codelight\GDPR\Installer\AdminInstallerNotice;
|
13 |
-
|
14 |
-
/**
|
15 |
-
* Register and set up admin components.
|
16 |
-
* This class is instantiated at admin_init priority 0
|
17 |
-
*
|
18 |
-
* Class SetupAdmin
|
19 |
-
*
|
20 |
-
* @package Codelight\GDPR
|
21 |
-
*/
|
22 |
-
class SetupAdmin
|
23 |
-
{
|
24 |
-
/**
|
25 |
-
* SetupAdmin constructor.
|
26 |
-
*/
|
27 |
-
public function __construct()
|
28 |
-
{
|
29 |
-
$this->registerComponents();
|
30 |
-
$this->runComponents();
|
31 |
-
}
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Register components in the container
|
35 |
-
*/
|
36 |
-
protected function registerComponents()
|
37 |
-
{
|
38 |
-
gdpr()->singleton(WordpressAdmin::class);
|
39 |
-
gdpr()->singleton(WordpressAdminPage::class);
|
40 |
-
gdpr()->singleton(Installer::class);
|
41 |
-
|
42 |
-
// Not a singleton.
|
43 |
-
gdpr()->alias(AdminNotice::class, 'admin-notice');
|
44 |
-
gdpr()->alias(AdminError::class, 'admin-error');
|
45 |
-
gdpr()->alias(AdminInstallerNotice::class, 'installer-notice');
|
46 |
-
gdpr()->alias(Modal::class, 'admin-modal');
|
47 |
-
gdpr()->alias(WordpressAdminPage::class, 'admin-page');
|
48 |
-
|
49 |
-
gdpr()->bind(ConsentAdmin::class);
|
50 |
-
}
|
51 |
-
|
52 |
-
/**
|
53 |
-
* Run components
|
54 |
-
*/
|
55 |
-
protected function runComponents()
|
56 |
-
{
|
57 |
-
gdpr(WordpressAdmin::class);
|
58 |
-
gdpr(WordpressAdminPage::class);
|
59 |
-
gdpr(Installer::class);
|
60 |
-
gdpr(ConsentAdmin::class);
|
61 |
-
}
|
62 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR;
|
4 |
+
|
5 |
+
use Codelight\GDPR\Admin\AdminError;
|
6 |
+
use Codelight\GDPR\Admin\AdminNotice;
|
7 |
+
use Codelight\GDPR\Admin\Modal;
|
8 |
+
use Codelight\GDPR\Admin\WordpressAdmin;
|
9 |
+
use Codelight\GDPR\Admin\WordpressAdminPage;
|
10 |
+
use Codelight\GDPR\Components\Consent\ConsentAdmin;
|
11 |
+
use Codelight\GDPR\Installer\Installer;
|
12 |
+
use Codelight\GDPR\Installer\AdminInstallerNotice;
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Register and set up admin components.
|
16 |
+
* This class is instantiated at admin_init priority 0
|
17 |
+
*
|
18 |
+
* Class SetupAdmin
|
19 |
+
*
|
20 |
+
* @package Codelight\GDPR
|
21 |
+
*/
|
22 |
+
class SetupAdmin
|
23 |
+
{
|
24 |
+
/**
|
25 |
+
* SetupAdmin constructor.
|
26 |
+
*/
|
27 |
+
public function __construct()
|
28 |
+
{
|
29 |
+
$this->registerComponents();
|
30 |
+
$this->runComponents();
|
31 |
+
}
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Register components in the container
|
35 |
+
*/
|
36 |
+
protected function registerComponents()
|
37 |
+
{
|
38 |
+
gdpr()->singleton(WordpressAdmin::class);
|
39 |
+
gdpr()->singleton(WordpressAdminPage::class);
|
40 |
+
gdpr()->singleton(Installer::class);
|
41 |
+
|
42 |
+
// Not a singleton.
|
43 |
+
gdpr()->alias(AdminNotice::class, 'admin-notice');
|
44 |
+
gdpr()->alias(AdminError::class, 'admin-error');
|
45 |
+
gdpr()->alias(AdminInstallerNotice::class, 'installer-notice');
|
46 |
+
gdpr()->alias(Modal::class, 'admin-modal');
|
47 |
+
gdpr()->alias(WordpressAdminPage::class, 'admin-page');
|
48 |
+
|
49 |
+
gdpr()->bind(ConsentAdmin::class);
|
50 |
+
}
|
51 |
+
|
52 |
+
/**
|
53 |
+
* Run components
|
54 |
+
*/
|
55 |
+
protected function runComponents()
|
56 |
+
{
|
57 |
+
gdpr(WordpressAdmin::class);
|
58 |
+
gdpr(WordpressAdminPage::class);
|
59 |
+
gdpr(Installer::class);
|
60 |
+
gdpr(ConsentAdmin::class);
|
61 |
+
}
|
62 |
+
}
|
src/Updater/Updater.php
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR\Updater;
|
4 |
+
|
5 |
+
class Updater
|
6 |
+
{
|
7 |
+
public function __construct()
|
8 |
+
{
|
9 |
+
$currentVersion = $this->getVersion();
|
10 |
+
|
11 |
+
if ($currentVersion === GDPR_FRAMEWORK_VERSION) {
|
12 |
+
return;
|
13 |
+
}
|
14 |
+
|
15 |
+
if (version_compare($currentVersion, '1.0.5', '<')) {
|
16 |
+
$this->update_1_0_5();
|
17 |
+
}
|
18 |
+
}
|
19 |
+
|
20 |
+
/**
|
21 |
+
* @return string
|
22 |
+
*/
|
23 |
+
public function getVersion()
|
24 |
+
{
|
25 |
+
return get_option('gdpr_plugin_version', '1.0.0');
|
26 |
+
}
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Retroactively fix bug in v1.0.3 where the activation code didn't run properly
|
30 |
+
*/
|
31 |
+
public function update_1_0_5()
|
32 |
+
{
|
33 |
+
$model = new \Codelight\GDPR\Components\Consent\UserConsentModel();
|
34 |
+
$model->createTable();
|
35 |
+
|
36 |
+
if (apply_filters('gdpr/data-subject/anonymize/change_role', true) && ! get_role('anonymous')) {
|
37 |
+
|
38 |
+
add_role(
|
39 |
+
'anonymous',
|
40 |
+
_x('Anonymous', '(Admin)', 'gdpr-framework'),
|
41 |
+
[]
|
42 |
+
);
|
43 |
+
}
|
44 |
+
|
45 |
+
update_option('gdpr_plugin_version', '1.0.5');
|
46 |
+
}
|
47 |
+
}
|
src/View.php
CHANGED
@@ -1,64 +1,64 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Codelight\GDPR;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Handles locating templates from either the theme or plugin,
|
7 |
-
* injecting and extracting data and rendering them.
|
8 |
-
*
|
9 |
-
* Class View
|
10 |
-
* @package Codelight\GDPR
|
11 |
-
*/
|
12 |
-
class View
|
13 |
-
{
|
14 |
-
/**
|
15 |
-
* View constructor.
|
16 |
-
*/
|
17 |
-
public function __construct()
|
18 |
-
{
|
19 |
-
$this->dirs = $this->getTemplateDirectories();
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Render a given template.
|
24 |
-
*
|
25 |
-
* @param $template
|
26 |
-
* @param array $data
|
27 |
-
* @param null $templateDir
|
28 |
-
*
|
29 |
-
* @return string
|
30 |
-
*/
|
31 |
-
public function render($template, $data = [], $templateDir = null)
|
32 |
-
{
|
33 |
-
if (is_null($templateDir)) {
|
34 |
-
foreach ($this->dirs as $dir) {
|
35 |
-
if (file_exists($dir . $template . '.php')) {
|
36 |
-
$templateDir = $dir;
|
37 |
-
break;
|
38 |
-
}
|
39 |
-
}
|
40 |
-
}
|
41 |
-
|
42 |
-
extract($data);
|
43 |
-
ob_start();
|
44 |
-
require $templateDir . $template . '.php';
|
45 |
-
|
46 |
-
return ob_get_clean();
|
47 |
-
}
|
48 |
-
|
49 |
-
/**
|
50 |
-
* Get valid template directories and pass them through a filter
|
51 |
-
*
|
52 |
-
* @return array
|
53 |
-
*/
|
54 |
-
protected function getTemplateDirectories()
|
55 |
-
{
|
56 |
-
$directories = array_filter([
|
57 |
-
get_stylesheet_directory() . '/gdpr-framework/',
|
58 |
-
get_template_directory() . '/gdpr-framework/',
|
59 |
-
gdpr('config')->get('plugin.template_path'),
|
60 |
-
], 'is_dir');
|
61 |
-
|
62 |
-
return array_unique(apply_filters('gdpr/views', $directories));
|
63 |
-
}
|
64 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Codelight\GDPR;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Handles locating templates from either the theme or plugin,
|
7 |
+
* injecting and extracting data and rendering them.
|
8 |
+
*
|
9 |
+
* Class View
|
10 |
+
* @package Codelight\GDPR
|
11 |
+
*/
|
12 |
+
class View
|
13 |
+
{
|
14 |
+
/**
|
15 |
+
* View constructor.
|
16 |
+
*/
|
17 |
+
public function __construct()
|
18 |
+
{
|
19 |
+
$this->dirs = $this->getTemplateDirectories();
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Render a given template.
|
24 |
+
*
|
25 |
+
* @param $template
|
26 |
+
* @param array $data
|
27 |
+
* @param null $templateDir
|
28 |
+
*
|
29 |
+
* @return string
|
30 |
+
*/
|
31 |
+
public function render($template, $data = [], $templateDir = null)
|
32 |
+
{
|
33 |
+
if (is_null($templateDir)) {
|
34 |
+
foreach ($this->dirs as $dir) {
|
35 |
+
if (file_exists($dir . $template . '.php')) {
|
36 |
+
$templateDir = $dir;
|
37 |
+
break;
|
38 |
+
}
|
39 |
+
}
|
40 |
+
}
|
41 |
+
|
42 |
+
extract($data);
|
43 |
+
ob_start();
|
44 |
+
require $templateDir . $template . '.php';
|
45 |
+
|
46 |
+
return ob_get_clean();
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Get valid template directories and pass them through a filter
|
51 |
+
*
|
52 |
+
* @return array
|
53 |
+
*/
|
54 |
+
protected function getTemplateDirectories()
|
55 |
+
{
|
56 |
+
$directories = array_filter([
|
57 |
+
get_stylesheet_directory() . '/gdpr-framework/',
|
58 |
+
get_template_directory() . '/gdpr-framework/',
|
59 |
+
gdpr('config')->get('plugin.template_path'),
|
60 |
+
], 'is_dir');
|
61 |
+
|
62 |
+
return array_unique(apply_filters('gdpr/views', $directories));
|
63 |
+
}
|
64 |
+
}
|
vendor/autoload.php
CHANGED
@@ -4,4 +4,4 @@
|
|
4 |
|
5 |
require_once __DIR__ . '/composer/autoload_real.php';
|
6 |
|
7 |
-
return
|
4 |
|
5 |
require_once __DIR__ . '/composer/autoload_real.php';
|
6 |
|
7 |
+
return ComposerAutoloaderInit5f4ac86ae1a983fd118be68a8ad29c43::getLoader();
|
vendor/composer/autoload_real.php
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
|
3 |
// autoload_real.php @generated by Composer
|
4 |
|
5 |
-
class
|
6 |
{
|
7 |
private static $loader;
|
8 |
|
@@ -19,15 +19,15 @@ class ComposerAutoloaderInit9f3572d4c44534633256010eb339e06e
|
|
19 |
return self::$loader;
|
20 |
}
|
21 |
|
22 |
-
spl_autoload_register(array('
|
23 |
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
24 |
-
spl_autoload_unregister(array('
|
25 |
|
26 |
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
27 |
if ($useStaticLoader) {
|
28 |
require_once __DIR__ . '/autoload_static.php';
|
29 |
|
30 |
-
call_user_func(\Composer\Autoload\
|
31 |
} else {
|
32 |
$map = require __DIR__ . '/autoload_namespaces.php';
|
33 |
foreach ($map as $namespace => $path) {
|
@@ -48,19 +48,19 @@ class ComposerAutoloaderInit9f3572d4c44534633256010eb339e06e
|
|
48 |
$loader->register(true);
|
49 |
|
50 |
if ($useStaticLoader) {
|
51 |
-
$includeFiles = Composer\Autoload\
|
52 |
} else {
|
53 |
$includeFiles = require __DIR__ . '/autoload_files.php';
|
54 |
}
|
55 |
foreach ($includeFiles as $fileIdentifier => $file) {
|
56 |
-
|
57 |
}
|
58 |
|
59 |
return $loader;
|
60 |
}
|
61 |
}
|
62 |
|
63 |
-
function
|
64 |
{
|
65 |
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
66 |
require $file;
|
2 |
|
3 |
// autoload_real.php @generated by Composer
|
4 |
|
5 |
+
class ComposerAutoloaderInit5f4ac86ae1a983fd118be68a8ad29c43
|
6 |
{
|
7 |
private static $loader;
|
8 |
|
19 |
return self::$loader;
|
20 |
}
|
21 |
|
22 |
+
spl_autoload_register(array('ComposerAutoloaderInit5f4ac86ae1a983fd118be68a8ad29c43', 'loadClassLoader'), true, true);
|
23 |
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
24 |
+
spl_autoload_unregister(array('ComposerAutoloaderInit5f4ac86ae1a983fd118be68a8ad29c43', 'loadClassLoader'));
|
25 |
|
26 |
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
27 |
if ($useStaticLoader) {
|
28 |
require_once __DIR__ . '/autoload_static.php';
|
29 |
|
30 |
+
call_user_func(\Composer\Autoload\ComposerStaticInit5f4ac86ae1a983fd118be68a8ad29c43::getInitializer($loader));
|
31 |
} else {
|
32 |
$map = require __DIR__ . '/autoload_namespaces.php';
|
33 |
foreach ($map as $namespace => $path) {
|
48 |
$loader->register(true);
|
49 |
|
50 |
if ($useStaticLoader) {
|
51 |
+
$includeFiles = Composer\Autoload\ComposerStaticInit5f4ac86ae1a983fd118be68a8ad29c43::$files;
|
52 |
} else {
|
53 |
$includeFiles = require __DIR__ . '/autoload_files.php';
|
54 |
}
|
55 |
foreach ($includeFiles as $fileIdentifier => $file) {
|
56 |
+
composerRequire5f4ac86ae1a983fd118be68a8ad29c43($fileIdentifier, $file);
|
57 |
}
|
58 |
|
59 |
return $loader;
|
60 |
}
|
61 |
}
|
62 |
|
63 |
+
function composerRequire5f4ac86ae1a983fd118be68a8ad29c43($fileIdentifier, $file)
|
64 |
{
|
65 |
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
66 |
require $file;
|
vendor/composer/autoload_static.php
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
|
5 |
namespace Composer\Autoload;
|
6 |
|
7 |
-
class
|
8 |
{
|
9 |
public static $files = array (
|
10 |
'5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php',
|
@@ -72,8 +72,8 @@ class ComposerStaticInit9f3572d4c44534633256010eb339e06e
|
|
72 |
public static function getInitializer(ClassLoader $loader)
|
73 |
{
|
74 |
return \Closure::bind(function () use ($loader) {
|
75 |
-
$loader->prefixLengthsPsr4 =
|
76 |
-
$loader->prefixDirsPsr4 =
|
77 |
|
78 |
}, null, ClassLoader::class);
|
79 |
}
|
4 |
|
5 |
namespace Composer\Autoload;
|
6 |
|
7 |
+
class ComposerStaticInit5f4ac86ae1a983fd118be68a8ad29c43
|
8 |
{
|
9 |
public static $files = array (
|
10 |
'5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php',
|
72 |
public static function getInitializer(ClassLoader $loader)
|
73 |
{
|
74 |
return \Closure::bind(function () use ($loader) {
|
75 |
+
$loader->prefixLengthsPsr4 = ComposerStaticInit5f4ac86ae1a983fd118be68a8ad29c43::$prefixLengthsPsr4;
|
76 |
+
$loader->prefixDirsPsr4 = ComposerStaticInit5f4ac86ae1a983fd118be68a8ad29c43::$prefixDirsPsr4;
|
77 |
|
78 |
}, null, ClassLoader::class);
|
79 |
}
|
views/admin/consent.php
CHANGED
@@ -1,105 +1,105 @@
|
|
1 |
-
<hr>
|
2 |
-
|
3 |
-
<h3><?= _x('Default consent types', '(Admin)', 'gdpr-framework'); ?></h3>
|
4 |
-
<p><?= _x('These are the consent types that have been automatically registered by the framework or a plugin.', '(Admin)', 'gdpr-framework'); ?></p>
|
5 |
-
<?php if (count($defaultConsentTypes)): ?>
|
6 |
-
<table class="gdpr-consent">
|
7 |
-
<th><?= _x('Slug', '(Admin)', 'gdpr-framework'); ?></th>
|
8 |
-
<th><?= _x('Title', '(Admin)', 'gdpr-framework'); ?></th>
|
9 |
-
<th><?= _x('Description', '(Admin)', 'gdpr-framework'); ?></th>
|
10 |
-
<th><?= _x('Visibility', '(Admin)', 'gdpr-framework'); ?></th>
|
11 |
-
<?php foreach ($defaultConsentTypes as $consentType): ?>
|
12 |
-
<tr>
|
13 |
-
<td class="gdpr-consent-table-input"><?= $consentType['slug']; ?></td>
|
14 |
-
<td class="gdpr-consent-table-input"><?= $consentType['title']; ?></td>
|
15 |
-
<td class="gdpr-consent-table-desc"><?= $consentType['description']; ?></td>
|
16 |
-
<td>
|
17 |
-
<?php if ($consentType['visible']): ?>
|
18 |
-
<?= _x('Visible', '(Admin)', 'gdpr-framework'); ?>
|
19 |
-
<?php else: ?>
|
20 |
-
<?= _x('Hidden', '(Admin)', 'gdpr-framework'); ?>
|
21 |
-
<?php endif; ?>
|
22 |
-
</td>
|
23 |
-
</tr>
|
24 |
-
<?php endforeach; ?>
|
25 |
-
</table>
|
26 |
-
<?php endif; ?>
|
27 |
-
<br>
|
28 |
-
<hr>
|
29 |
-
<h3><?= _x('Custom consent types', '(Admin)', 'gdpr-framework'); ?></h3>
|
30 |
-
<p><?= _x('Here you can add custom consent types to track. They will not be used anywhere by default - you will need to build an integration for each of them.', '(Admin)', 'gdpr-framework'); ?></p>
|
31 |
-
<div class="js-gdpr-repeater" data-name="gdpr_consent_types">
|
32 |
-
<table class="gdpr-consent-admin" data-repeater-list="gdpr_consent_types">
|
33 |
-
<thead>
|
34 |
-
<th>
|
35 |
-
<?= _x('Machine-readable slug', '(Admin)', 'gdpr-framework'); ?>*
|
36 |
-
</th>
|
37 |
-
<th>
|
38 |
-
<?= _x('Title', '(Admin)', 'gdpr-framework'); ?>*
|
39 |
-
</th>
|
40 |
-
<th>
|
41 |
-
<?= _x('Description', '(Admin)', 'gdpr-framework'); ?>
|
42 |
-
</th>
|
43 |
-
<th>
|
44 |
-
<?= _x('Visible?', '(Admin)', 'gdpr-framework'); ?>
|
45 |
-
</th>
|
46 |
-
</thead>
|
47 |
-
<tr data-repeater-item>
|
48 |
-
<td class="gdpr-consent-table-input">
|
49 |
-
<input
|
50 |
-
type="text"
|
51 |
-
name="slug"
|
52 |
-
placeholder="<?= _x('Slug', '(Admin)', 'gdpr-framework'); ?>"
|
53 |
-
pattern="^[A-Za-z0-9_-]+$"
|
54 |
-
oninvalid="setCustomValidity('Please fill in this field using alphanumeric characters, dashes and underscores.')"
|
55 |
-
oninput="setCustomValidity('')"
|
56 |
-
required
|
57 |
-
/>
|
58 |
-
</td>
|
59 |
-
<td class="gdpr-consent-table-input">
|
60 |
-
<input type="text" name="title" placeholder="<?= _x('Title', '(Admin)', 'gdpr-framework'); ?>" required />
|
61 |
-
</td>
|
62 |
-
<td class="gdpr-consent-table-desc">
|
63 |
-
<textarea type="text" name="description" placeholder="<?= _x('Description', '(Admin)', 'gdpr-framework'); ?>"></textarea>
|
64 |
-
</td>
|
65 |
-
<td>
|
66 |
-
<label>
|
67 |
-
<input type="checkbox" name="visible" value="1"/>
|
68 |
-
<?= _x('Visible?', '(Admin)', 'gdpr-framework'); ?>
|
69 |
-
</label>
|
70 |
-
</td>
|
71 |
-
<td>
|
72 |
-
<input data-repeater-delete class="button button-primary" type="button" value="<?= _x('Remove', '(Admin)', 'gdpr-framework'); ?>"/>
|
73 |
-
</td>
|
74 |
-
</tr>
|
75 |
-
|
76 |
-
</table>
|
77 |
-
<div class="gdpr-consent-add-button">
|
78 |
-
<input data-repeater-create class="button button-primary" type="button" value="Add consent type"/>
|
79 |
-
</div>
|
80 |
-
<input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>" />
|
81 |
-
<input type="hidden" name="gdpr_action" value="update_consent_data" />
|
82 |
-
</div>
|
83 |
-
|
84 |
-
<?php if (count($customConsentTypes)): ?>
|
85 |
-
<script>
|
86 |
-
window.repeaterData = [];
|
87 |
-
window.repeaterData['gdpr_consent_types'] = <?= json_encode($customConsentTypes); ?>;
|
88 |
-
</script>
|
89 |
-
<?php endif; ?>
|
90 |
-
|
91 |
-
<br>
|
92 |
-
<hr>
|
93 |
-
<h3><?= _x('Additional info', '(Admin)', 'gdpr-framework'); ?></h3>
|
94 |
-
<p>
|
95 |
-
<?= _x('This text will be displayed to your data subjects on the Privacy Tools page.', '(Admin)', 'gdpr-framework'); ?>
|
96 |
-
</p>
|
97 |
-
<?php wp_editor(
|
98 |
-
wp_kses_post($consentInfo),
|
99 |
-
'gdpr_consent_info',
|
100 |
-
[
|
101 |
-
'textarea_rows' => 4,
|
102 |
-
]
|
103 |
-
);
|
104 |
-
?>
|
105 |
-
|
1 |
+
<hr>
|
2 |
+
|
3 |
+
<h3><?= _x('Default consent types', '(Admin)', 'gdpr-framework'); ?></h3>
|
4 |
+
<p><?= _x('These are the consent types that have been automatically registered by the framework or a plugin.', '(Admin)', 'gdpr-framework'); ?></p>
|
5 |
+
<?php if (count($defaultConsentTypes)): ?>
|
6 |
+
<table class="gdpr-consent">
|
7 |
+
<th><?= _x('Slug', '(Admin)', 'gdpr-framework'); ?></th>
|
8 |
+
<th><?= _x('Title', '(Admin)', 'gdpr-framework'); ?></th>
|
9 |
+
<th><?= _x('Description', '(Admin)', 'gdpr-framework'); ?></th>
|
10 |
+
<th><?= _x('Visibility', '(Admin)', 'gdpr-framework'); ?></th>
|
11 |
+
<?php foreach ($defaultConsentTypes as $consentType): ?>
|
12 |
+
<tr>
|
13 |
+
<td class="gdpr-consent-table-input"><?= $consentType['slug']; ?></td>
|
14 |
+
<td class="gdpr-consent-table-input"><?= $consentType['title']; ?></td>
|
15 |
+
<td class="gdpr-consent-table-desc"><?= $consentType['description']; ?></td>
|
16 |
+
<td>
|
17 |
+
<?php if ($consentType['visible']): ?>
|
18 |
+
<?= _x('Visible', '(Admin)', 'gdpr-framework'); ?>
|
19 |
+
<?php else: ?>
|
20 |
+
<?= _x('Hidden', '(Admin)', 'gdpr-framework'); ?>
|
21 |
+
<?php endif; ?>
|
22 |
+
</td>
|
23 |
+
</tr>
|
24 |
+
<?php endforeach; ?>
|
25 |
+
</table>
|
26 |
+
<?php endif; ?>
|
27 |
+
<br>
|
28 |
+
<hr>
|
29 |
+
<h3><?= _x('Custom consent types', '(Admin)', 'gdpr-framework'); ?></h3>
|
30 |
+
<p><?= _x('Here you can add custom consent types to track. They will not be used anywhere by default - you will need to build an integration for each of them.', '(Admin)', 'gdpr-framework'); ?></p>
|
31 |
+
<div class="js-gdpr-repeater" data-name="gdpr_consent_types">
|
32 |
+
<table class="gdpr-consent-admin" data-repeater-list="gdpr_consent_types">
|
33 |
+
<thead>
|
34 |
+
<th>
|
35 |
+
<?= _x('Machine-readable slug', '(Admin)', 'gdpr-framework'); ?>*
|
36 |
+
</th>
|
37 |
+
<th>
|
38 |
+
<?= _x('Title', '(Admin)', 'gdpr-framework'); ?>*
|
39 |
+
</th>
|
40 |
+
<th>
|
41 |
+
<?= _x('Description', '(Admin)', 'gdpr-framework'); ?>
|
42 |
+
</th>
|
43 |
+
<th>
|
44 |
+
<?= _x('Visible?', '(Admin)', 'gdpr-framework'); ?>
|
45 |
+
</th>
|
46 |
+
</thead>
|
47 |
+
<tr data-repeater-item>
|
48 |
+
<td class="gdpr-consent-table-input">
|
49 |
+
<input
|
50 |
+
type="text"
|
51 |
+
name="slug"
|
52 |
+
placeholder="<?= _x('Slug', '(Admin)', 'gdpr-framework'); ?>"
|
53 |
+
pattern="^[A-Za-z0-9_-]+$"
|
54 |
+
oninvalid="setCustomValidity('Please fill in this field using alphanumeric characters, dashes and underscores.')"
|
55 |
+
oninput="setCustomValidity('')"
|
56 |
+
required
|
57 |
+
/>
|
58 |
+
</td>
|
59 |
+
<td class="gdpr-consent-table-input">
|
60 |
+
<input type="text" name="title" placeholder="<?= _x('Title', '(Admin)', 'gdpr-framework'); ?>" required />
|
61 |
+
</td>
|
62 |
+
<td class="gdpr-consent-table-desc">
|
63 |
+
<textarea type="text" name="description" placeholder="<?= _x('Description', '(Admin)', 'gdpr-framework'); ?>"></textarea>
|
64 |
+
</td>
|
65 |
+
<td>
|
66 |
+
<label>
|
67 |
+
<input type="checkbox" name="visible" value="1"/>
|
68 |
+
<?= _x('Visible?', '(Admin)', 'gdpr-framework'); ?>
|
69 |
+
</label>
|
70 |
+
</td>
|
71 |
+
<td>
|
72 |
+
<input data-repeater-delete class="button button-primary" type="button" value="<?= _x('Remove', '(Admin)', 'gdpr-framework'); ?>"/>
|
73 |
+
</td>
|
74 |
+
</tr>
|
75 |
+
|
76 |
+
</table>
|
77 |
+
<div class="gdpr-consent-add-button">
|
78 |
+
<input data-repeater-create class="button button-primary" type="button" value="Add consent type"/>
|
79 |
+
</div>
|
80 |
+
<input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>" />
|
81 |
+
<input type="hidden" name="gdpr_action" value="update_consent_data" />
|
82 |
+
</div>
|
83 |
+
|
84 |
+
<?php if (count($customConsentTypes)): ?>
|
85 |
+
<script>
|
86 |
+
window.repeaterData = [];
|
87 |
+
window.repeaterData['gdpr_consent_types'] = <?= json_encode($customConsentTypes); ?>;
|
88 |
+
</script>
|
89 |
+
<?php endif; ?>
|
90 |
+
|
91 |
+
<br>
|
92 |
+
<hr>
|
93 |
+
<h3><?= _x('Additional info', '(Admin)', 'gdpr-framework'); ?></h3>
|
94 |
+
<p>
|
95 |
+
<?= _x('This text will be displayed to your data subjects on the Privacy Tools page.', '(Admin)', 'gdpr-framework'); ?>
|
96 |
+
</p>
|
97 |
+
<?php wp_editor(
|
98 |
+
wp_kses_post($consentInfo),
|
99 |
+
'gdpr_consent_info',
|
100 |
+
[
|
101 |
+
'textarea_rows' => 4,
|
102 |
+
]
|
103 |
+
);
|
104 |
+
?>
|
105 |
+
|
views/admin/data-subjects/search-form.php
CHANGED
@@ -1,18 +1,18 @@
|
|
1 |
-
<p>
|
2 |
-
<?= _x('On this page, you can find which data subjects personal data you are storing and download, export or delete it.', '(Admin)', 'gdpr-framework'); ?>
|
3 |
-
</p>
|
4 |
-
|
5 |
-
<hr>
|
6 |
-
|
7 |
-
<?= $results; ?>
|
8 |
-
|
9 |
-
<label>
|
10 |
-
<h3><?= _x('Find data subject by email', '(Admin)', 'gdpr-framework'); ?></h3>
|
11 |
-
<input type="email" name="gdpr_email" placeholder="<?= _x('Email address', '(Admin)', 'gdpr-framework'); ?>" />
|
12 |
-
</label>
|
13 |
-
|
14 |
-
<input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>" />
|
15 |
-
<input type="hidden" name="gdpr_action" value="search" />
|
16 |
-
<input class="button button-primary" type="submit" value="<?= _x('Search', '(Admin)', 'gdpr-framework'); ?>" />
|
17 |
-
|
18 |
-
<br><br>
|
1 |
+
<p>
|
2 |
+
<?= _x('On this page, you can find which data subjects personal data you are storing and download, export or delete it.', '(Admin)', 'gdpr-framework'); ?>
|
3 |
+
</p>
|
4 |
+
|
5 |
+
<hr>
|
6 |
+
|
7 |
+
<?= $results; ?>
|
8 |
+
|
9 |
+
<label>
|
10 |
+
<h3><?= _x('Find data subject by email', '(Admin)', 'gdpr-framework'); ?></h3>
|
11 |
+
<input type="email" name="gdpr_email" placeholder="<?= _x('Email address', '(Admin)', 'gdpr-framework'); ?>" />
|
12 |
+
</label>
|
13 |
+
|
14 |
+
<input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>" />
|
15 |
+
<input type="hidden" name="gdpr_action" value="search" />
|
16 |
+
<input class="button button-primary" type="submit" value="<?= _x('Search', '(Admin)', 'gdpr-framework'); ?>" />
|
17 |
+
|
18 |
+
<br><br>
|
views/admin/data-subjects/search-results.php
CHANGED
@@ -1,33 +1,33 @@
|
|
1 |
-
<div>
|
2 |
-
<h3>Results for: <?= esc_html($email); ?></h3>
|
3 |
-
<?php if ($hasData): ?>
|
4 |
-
|
5 |
-
<?php if (isset($links['profile'])): ?>
|
6 |
-
<p>
|
7 |
-
<strong><?= _x('Username', '(Admin)', 'gdpr-framework'); ?>:</strong>
|
8 |
-
<a href="<?= $links['profile']; ?>"><?= esc_html($userName); ?></a>
|
9 |
-
</p>
|
10 |
-
<?php else: ?>
|
11 |
-
<p>
|
12 |
-
<em><?= esc_html($email); ?> <?= _x('is not a registered user.', '(Admin)', 'gdpr-framework'); ?></em>
|
13 |
-
</p>
|
14 |
-
<?php endif; ?>
|
15 |
-
|
16 |
-
<a class="button button-primary" href="<?= esc_url($links['view']); ?>"><?= _x('Download data (html)', '(Admin)', 'gdpr-framework'); ?></a>
|
17 |
-
<a class="button button-primary" href="<?= esc_url($links['export']); ?>"><?= _x('Export data (json)', '(Admin)', 'gdpr-framework'); ?></a>
|
18 |
-
|
19 |
-
<?php if ($adminCap): ?>
|
20 |
-
<p>
|
21 |
-
<strong><?= _x('This user has admin capabilities. Deleting data via this interface is disabled.', '(Admin)', 'gdpr-framework'); ?></strong>
|
22 |
-
</p>
|
23 |
-
<?php else: ?>
|
24 |
-
<a class="button button-primary" href="<?= esc_url($links['anonymize']); ?>"><?= _x('Anonymize data', '(Admin)', 'gdpr-framework'); ?></a>
|
25 |
-
<a class="button button-primary" href="<?= esc_url($links['delete']); ?>"><?= _x('Delete data', '(Admin)', 'gdpr-framework'); ?></a>
|
26 |
-
<?php endif; ?>
|
27 |
-
|
28 |
-
<?php else: ?>
|
29 |
-
<p><?= _x('No data found!', '(Admin)', 'gdpr-framework'); ?></p>
|
30 |
-
<?php endif; ?>
|
31 |
-
</div>
|
32 |
-
<br>
|
33 |
-
<hr>
|
1 |
+
<div>
|
2 |
+
<h3>Results for: <?= esc_html($email); ?></h3>
|
3 |
+
<?php if ($hasData): ?>
|
4 |
+
|
5 |
+
<?php if (isset($links['profile'])): ?>
|
6 |
+
<p>
|
7 |
+
<strong><?= _x('Username', '(Admin)', 'gdpr-framework'); ?>:</strong>
|
8 |
+
<a href="<?= $links['profile']; ?>"><?= esc_html($userName); ?></a>
|
9 |
+
</p>
|
10 |
+
<?php else: ?>
|
11 |
+
<p>
|
12 |
+
<em><?= esc_html($email); ?> <?= _x('is not a registered user.', '(Admin)', 'gdpr-framework'); ?></em>
|
13 |
+
</p>
|
14 |
+
<?php endif; ?>
|
15 |
+
|
16 |
+
<a class="button button-primary" href="<?= esc_url($links['view']); ?>"><?= _x('Download data (html)', '(Admin)', 'gdpr-framework'); ?></a>
|
17 |
+
<a class="button button-primary" href="<?= esc_url($links['export']); ?>"><?= _x('Export data (json)', '(Admin)', 'gdpr-framework'); ?></a>
|
18 |
+
|
19 |
+
<?php if ($adminCap): ?>
|
20 |
+
<p>
|
21 |
+
<strong><?= _x('This user has admin capabilities. Deleting data via this interface is disabled.', '(Admin)', 'gdpr-framework'); ?></strong>
|
22 |
+
</p>
|
23 |
+
<?php else: ?>
|
24 |
+
<a class="button button-primary" href="<?= esc_url($links['anonymize']); ?>"><?= _x('Anonymize data', '(Admin)', 'gdpr-framework'); ?></a>
|
25 |
+
<a class="button button-primary" href="<?= esc_url($links['delete']); ?>"><?= _x('Delete data', '(Admin)', 'gdpr-framework'); ?></a>
|
26 |
+
<?php endif; ?>
|
27 |
+
|
28 |
+
<?php else: ?>
|
29 |
+
<p><?= _x('No data found!', '(Admin)', 'gdpr-framework'); ?></p>
|
30 |
+
<?php endif; ?>
|
31 |
+
</div>
|
32 |
+
<br>
|
33 |
+
<hr>
|
views/admin/general/delete-action-email.php
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
-
<input
|
2 |
-
type="email"
|
3 |
-
id="gdpr_delete_action_email"
|
4 |
-
name="gdpr_delete_action_email"
|
5 |
-
placeholder="<?= __('Email address', 'gdpr-framework'); ?>"
|
6 |
-
value="<?= esc_attr($deleteActionEmail); ?>"
|
7 |
-
/>
|
1 |
+
<input
|
2 |
+
type="email"
|
3 |
+
id="gdpr_delete_action_email"
|
4 |
+
name="gdpr_delete_action_email"
|
5 |
+
placeholder="<?= __('Email address', 'gdpr-framework'); ?>"
|
6 |
+
value="<?= esc_attr($deleteActionEmail); ?>"
|
7 |
+
/>
|
views/admin/general/delete-action-reassign.php
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
<select id="gdpr_delete_action_reassign" name="gdpr_delete_action_reassign" class="gdpr-select js-gdpr-conditional">
|
2 |
-
<option value="delete" <?= selected($reassign, 'delete'); ?>>
|
3 |
-
<?= _x('Delete content', '(Admin)', 'gdpr-framework'); ?>
|
4 |
-
</option>
|
5 |
-
<option value="reassign" <?= selected($reassign, 'reassign'); ?> data-show=".js-gdpr-delete-action-reassign-user">
|
6 |
-
<?= _x('Reassign content to a user', '(Admin)', 'gdpr-framework'); ?>
|
7 |
-
</option>
|
8 |
-
</select>
|
9 |
-
<p class="description">
|
10 |
-
<?= _x('If the user has submitted any content on your site, should it be deleted or reassigned to another user?', '(Admin)', 'gdpr-framework'); ?>
|
11 |
-
</p>
|
1 |
+
<select id="gdpr_delete_action_reassign" name="gdpr_delete_action_reassign" class="gdpr-select js-gdpr-conditional">
|
2 |
+
<option value="delete" <?= selected($reassign, 'delete'); ?>>
|
3 |
+
<?= _x('Delete content', '(Admin)', 'gdpr-framework'); ?>
|
4 |
+
</option>
|
5 |
+
<option value="reassign" <?= selected($reassign, 'reassign'); ?> data-show=".js-gdpr-delete-action-reassign-user">
|
6 |
+
<?= _x('Reassign content to a user', '(Admin)', 'gdpr-framework'); ?>
|
7 |
+
</option>
|
8 |
+
</select>
|
9 |
+
<p class="description">
|
10 |
+
<?= _x('If the user has submitted any content on your site, should it be deleted or reassigned to another user?', '(Admin)', 'gdpr-framework'); ?>
|
11 |
+
</p>
|
views/admin/general/delete-action.php
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
<select class="gdpr-select js-gdpr-conditional" name="gdpr_delete_action">
|
2 |
-
<?= gdpr('view')->render('global/delete-action', compact('deleteAction')); ?>
|
3 |
</select>
|
1 |
+
<select class="gdpr-select js-gdpr-conditional" name="gdpr_delete_action">
|
2 |
+
<?= gdpr('view')->render('global/delete-action', compact('deleteAction')); ?>
|
3 |
</select>
|
views/admin/general/description-data-page.php
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
<p class="description">
|
2 |
-
<?= _x('Select the page where users can go to control their data. This page must contain the [gdpr_privacy_tools] shortcode.', '(Admin)', 'gdpr-framework'); ?>
|
3 |
-
</p>
|
1 |
+
<p class="description">
|
2 |
+
<?= _x('Select the page where users can go to control their data. This page must contain the [gdpr_privacy_tools] shortcode.', '(Admin)', 'gdpr-framework'); ?>
|
3 |
+
</p>
|
views/admin/general/description-delete-action.php
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
<p class="description">
|
2 |
-
<?php _ex('What should happen if a data subject requests deleting their data.', '(Admin)', 'gdpr-framework'); ?>
|
3 |
-
</p>
|
1 |
+
<p class="description">
|
2 |
+
<?php _ex('What should happen if a data subject requests deleting their data.', '(Admin)', 'gdpr-framework'); ?>
|
3 |
+
</p>
|
views/admin/general/description-export-action.php
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
<p class="description">
|
2 |
-
<?php _ex('What should happen if a data subject requests viewing or exporting their data.', '(Admin)', 'gdpr-framework'); ?>
|
3 |
-
</p>
|
1 |
+
<p class="description">
|
2 |
+
<?php _ex('What should happen if a data subject requests viewing or exporting their data.', '(Admin)', 'gdpr-framework'); ?>
|
3 |
+
</p>
|
views/admin/general/description-terms-page.php
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
<p class="description">
|
2 |
-
<?php _ex('Optional. Select the page which contains your Terms & Conditions', '(Admin)', 'gdpr-framework'); ?>
|
3 |
-
</p>
|
1 |
+
<p class="description">
|
2 |
+
<?php _ex('Optional. Select the page which contains your Terms & Conditions', '(Admin)', 'gdpr-framework'); ?>
|
3 |
+
</p>
|
views/admin/general/enable.php
CHANGED
@@ -1,13 +1,13 @@
|
|
1 |
-
<input
|
2 |
-
type="checkbox"
|
3 |
-
id="gdpr_enable"
|
4 |
-
name="gdpr_enable"
|
5 |
-
value="1"
|
6 |
-
<?= checked($enabled, true); ?>
|
7 |
-
/>
|
8 |
-
<label for="gdpr_enable">
|
9 |
-
<?= _x('Enable the view, export and forget functionality for users and visitors', '(Admin)', 'gdpr-framework'); ?>
|
10 |
-
</label>
|
11 |
-
<p class="description">
|
12 |
-
<?= _x('Enable the Privacy Tools page on front-end and dashboard. This allows visitors to request viewing and deleting their personal data and withdraw consents.', '(Admin)', 'gdpr-framework'); ?>
|
13 |
-
</p>
|
1 |
+
<input
|
2 |
+
type="checkbox"
|
3 |
+
id="gdpr_enable"
|
4 |
+
name="gdpr_enable"
|
5 |
+
value="1"
|
6 |
+
<?= checked($enabled, true); ?>
|
7 |
+
/>
|
8 |
+
<label for="gdpr_enable">
|
9 |
+
<?= _x('Enable the view, export and forget functionality for users and visitors', '(Admin)', 'gdpr-framework'); ?>
|
10 |
+
</label>
|
11 |
+
<p class="description">
|
12 |
+
<?= _x('Enable the Privacy Tools page on front-end and dashboard. This allows visitors to request viewing and deleting their personal data and withdraw consents.', '(Admin)', 'gdpr-framework'); ?>
|
13 |
+
</p>
|
views/admin/general/export-action-email.php
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
-
<input
|
2 |
-
type="email"
|
3 |
-
id="gdpr_export_action_email"
|
4 |
-
name="gdpr_export_action_email"
|
5 |
-
placeholder="<?= __('Email address', 'gdpr-framework'); ?>"
|
6 |
-
value="<?= esc_attr($exportActionEmail); ?>"
|
7 |
-
/>
|
1 |
+
<input
|
2 |
+
type="email"
|
3 |
+
id="gdpr_export_action_email"
|
4 |
+
name="gdpr_export_action_email"
|
5 |
+
placeholder="<?= __('Email address', 'gdpr-framework'); ?>"
|
6 |
+
value="<?= esc_attr($exportActionEmail); ?>"
|
7 |
+
/>
|
views/admin/general/stylesheet.php
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
<input
|
2 |
-
type="checkbox"
|
3 |
-
id="gdpr_enable_stylesheet"
|
4 |
-
name="gdpr_enable_stylesheet"
|
5 |
-
value="1"
|
6 |
-
<?php echo checked($enabled, true); ?>
|
7 |
-
/>
|
8 |
-
<label for="gdpr_enable_stylesheet">
|
9 |
-
<?php _ex('Enable basic styling for Privacy Tools page.', '(Admin)', 'gdpr-framework'); ?>
|
10 |
-
</label>
|
1 |
+
<input
|
2 |
+
type="checkbox"
|
3 |
+
id="gdpr_enable_stylesheet"
|
4 |
+
name="gdpr_enable_stylesheet"
|
5 |
+
value="1"
|
6 |
+
<?php echo checked($enabled, true); ?>
|
7 |
+
/>
|
8 |
+
<label for="gdpr_enable_stylesheet">
|
9 |
+
<?php _ex('Enable basic styling for Privacy Tools page.', '(Admin)', 'gdpr-framework'); ?>
|
10 |
+
</label>
|
views/admin/general/theme-compatibility.php
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
<input
|
2 |
-
type="checkbox"
|
3 |
-
id="gdpr_enable_theme_compatibility"
|
4 |
-
name="gdpr_enable_theme_compatibility"
|
5 |
-
value="1"
|
6 |
-
<?= checked($enabled, true); ?>
|
7 |
-
/>
|
8 |
-
<label for="gdpr_enable_theme_compatibility">
|
9 |
-
<?= _x('Automatically add Privacy Policy and Privacy Tools links to your site footer.', '(Admin)', 'gdpr-framework'); ?>
|
10 |
-
</label>
|
1 |
+
<input
|
2 |
+
type="checkbox"
|
3 |
+
id="gdpr_enable_theme_compatibility"
|
4 |
+
name="gdpr_enable_theme_compatibility"
|
5 |
+
value="1"
|
6 |
+
<?= checked($enabled, true); ?>
|
7 |
+
/>
|
8 |
+
<label for="gdpr_enable_theme_compatibility">
|
9 |
+
<?= _x('Automatically add Privacy Policy and Privacy Tools links to your site footer.', '(Admin)', 'gdpr-framework'); ?>
|
10 |
+
</label>
|
views/admin/modals/footer.php
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
-
<div class="gdpr-modal-footer">
|
2 |
-
<a href="#" class="gdpr-close-modal">Close</a>
|
3 |
-
|
|
4 |
-
<a href="#">Get help</a>
|
5 |
-
</div>
|
6 |
-
</div>
|
1 |
+
<div class="gdpr-modal-footer">
|
2 |
+
<a href="#" class="gdpr-close-modal">Close</a>
|
3 |
+
|
|
4 |
+
<a href="#">Get help</a>
|
5 |
+
</div>
|
6 |
+
</div>
|
views/admin/modals/header.php
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
-
<div
|
2 |
-
id="<?= $data['id']; ?>"
|
3 |
-
class="hidden gdpr-modal"
|
4 |
-
data-gdpr-title="<?= isset($data['title']) ? $data['title'] : ''; ?>"
|
5 |
-
>
|
1 |
+
<div
|
2 |
+
id="<?= $data['id']; ?>"
|
3 |
+
class="hidden gdpr-modal"
|
4 |
+
data-gdpr-title="<?= isset($data['title']) ? $data['title'] : ''; ?>"
|
5 |
+
>
|
views/admin/modals/test.php
CHANGED
@@ -1,8 +1,8 @@
|
|
1 |
-
<h2>Test modal</h2>
|
2 |
-
<p>This is a test modal. It can have any sort of content, for example a bullet list.</p>
|
3 |
-
<ul>
|
4 |
-
<li>Item 1</li>
|
5 |
-
<li>Another item</li>
|
6 |
-
<li>Last item</li>
|
7 |
-
</ul>
|
8 |
-
<p>It should be used for displaying super helpful instructions.</p>
|
1 |
+
<h2>Test modal</h2>
|
2 |
+
<p>This is a test modal. It can have any sort of content, for example a bullet list.</p>
|
3 |
+
<ul>
|
4 |
+
<li>Item 1</li>
|
5 |
+
<li>Another item</li>
|
6 |
+
<li>Last item</li>
|
7 |
+
</ul>
|
8 |
+
<p>It should be used for displaying super helpful instructions.</p>
|
views/admin/notices/disclaimer.php
CHANGED
@@ -1,16 +1,16 @@
|
|
1 |
-
<p>
|
2 |
-
<strong>Disclaimer</strong><br>
|
3 |
-
Using The GDPR Framework does NOT guarantee compliance to GDPR.
|
4 |
-
By using this plugin, you agree to this disclaimer.
|
5 |
-
These templates and guides provided to you are drafted by legal professionals in order for you to understand your obligations better,
|
6 |
-
but they are NOT meant to constitute client-attorney relationship or personalized legal advice.
|
7 |
-
Codelight is not eligible for any claim or action based on any information or functionality provided by this plugin.
|
8 |
-
We expressly disclaim all liability in respect of usage of this plugin.
|
9 |
-
This plugin gives you general information and tools, but is NOT meant to serve as complete compliance package.
|
10 |
-
For compliance audit or further help <a href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>">contact legal professionals</a>.
|
11 |
-
As each business and situation is unique, you might need to modify, add or delete information in these templates.
|
12 |
-
In addition to this, you will need audit all your processing activities for achieving compliance to GDPR.
|
13 |
-
Compliance to GDPR is risk based ongoing process.
|
14 |
-
We are here to get you started.
|
15 |
-
</p>
|
16 |
-
<a class="button button-primary" href="<?= esc_url($acceptUrl); ?>">I accept</a>
|
1 |
+
<p>
|
2 |
+
<strong>Disclaimer</strong><br>
|
3 |
+
Using The GDPR Framework does NOT guarantee compliance to GDPR.
|
4 |
+
By using this plugin, you agree to this disclaimer.
|
5 |
+
These templates and guides provided to you are drafted by legal professionals in order for you to understand your obligations better,
|
6 |
+
but they are NOT meant to constitute client-attorney relationship or personalized legal advice.
|
7 |
+
Codelight is not eligible for any claim or action based on any information or functionality provided by this plugin.
|
8 |
+
We expressly disclaim all liability in respect of usage of this plugin.
|
9 |
+
This plugin gives you general information and tools, but is NOT meant to serve as complete compliance package.
|
10 |
+
For compliance audit or further help <a href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>">contact legal professionals</a>.
|
11 |
+
As each business and situation is unique, you might need to modify, add or delete information in these templates.
|
12 |
+
In addition to this, you will need audit all your processing activities for achieving compliance to GDPR.
|
13 |
+
Compliance to GDPR is risk based ongoing process.
|
14 |
+
We are here to get you started.
|
15 |
+
</p>
|
16 |
+
<a class="button button-primary" href="<?= esc_url($acceptUrl); ?>">I accept</a>
|
views/admin/notices/error.php
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
<div class="notice notice-error">
|
2 |
-
<p><?= $message; ?></p>
|
3 |
-
</div>
|
1 |
+
<div class="notice notice-error">
|
2 |
+
<p><?= $message; ?></p>
|
3 |
+
</div>
|
views/admin/notices/header.php
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
<div class="notice notice-gdpr">
|
2 |
-
<img class="gdpr-badge" src="<?= gdpr('config')->get('plugin.url'); ?>assets/gdpr-rhino.svg" />
|
3 |
-
<div class="gdpr-content">
|
4 |
-
<h2><?= _x('The GDPR Framework', '(Admin)', 'gdpr-framework'); ?></h2>
|
1 |
+
<div class="notice notice-gdpr">
|
2 |
+
<img class="gdpr-badge" src="<?= gdpr('config')->get('plugin.url'); ?>assets/gdpr-rhino.svg" />
|
3 |
+
<div class="gdpr-content">
|
4 |
+
<h2><?= _x('The GDPR Framework', '(Admin)', 'gdpr-framework'); ?></h2>
|
views/admin/notices/help.php
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
<p>
|
2 |
-
Need help? Take a look at our <a href="<?= gdpr('helpers')->docs('wordpress-site-owners-guide-to-gdpr/'); ?>" target="_blank">documentation</a>.
|
3 |
-
</p>
|
1 |
+
<p>
|
2 |
+
Need help? Take a look at our <a href="<?= gdpr('helpers')->docs('wordpress-site-owners-guide-to-gdpr/'); ?>" target="_blank">documentation</a>.
|
3 |
+
</p>
|
views/admin/notices/helper-autoinstall.php
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
<p>
|
2 |
-
<?= _x('A Privacy Policy page has been created, but it is empty. You can generate a policy template on this page.', '(Admin)', 'gdpr-framework'); ?>
|
3 |
-
</p>
|
4 |
-
<p>
|
5 |
-
<?= _x(
|
6 |
-
sprintf('Read more %shere%s', "<a href='{$helpUrl}'>", "</a>"),
|
7 |
-
'(Admin)',
|
8 |
-
'gdpr-framework'
|
9 |
-
); ?>
|
10 |
-
</p>
|
1 |
+
<p>
|
2 |
+
<?= _x('A Privacy Policy page has been created, but it is empty. You can generate a policy template on this page.', '(Admin)', 'gdpr-framework'); ?>
|
3 |
+
</p>
|
4 |
+
<p>
|
5 |
+
<?= _x(
|
6 |
+
sprintf('Read more %shere%s', "<a href='{$helpUrl}'>", "</a>"),
|
7 |
+
'(Admin)',
|
8 |
+
'gdpr-framework'
|
9 |
+
); ?>
|
10 |
+
</p>
|
views/admin/notices/helper-policy.php
CHANGED
@@ -1,9 +1,9 @@
|
|
1 |
-
<p>
|
2 |
-
<?= _x('Heads up - your Privacy Policy still requires some attention. Find the places marked with [TODO] and replace them with real content!', '(Admin)', 'gdpr-framework'); ?>
|
3 |
-
</p>
|
4 |
-
<p>
|
5 |
-
<?= _x(
|
6 |
-
sprintf('Read more about editing your Privacy Policy %shere%s', "<a href='{$helpUrl}'>", "</a>"),
|
7 |
-
'(Admin)','gdpr-framework'
|
8 |
-
); ?>
|
9 |
-
</p>
|
1 |
+
<p>
|
2 |
+
<?= _x('Heads up - your Privacy Policy still requires some attention. Find the places marked with [TODO] and replace them with real content!', '(Admin)', 'gdpr-framework'); ?>
|
3 |
+
</p>
|
4 |
+
<p>
|
5 |
+
<?= _x(
|
6 |
+
sprintf('Read more about editing your Privacy Policy %shere%s', "<a href='{$helpUrl}'>", "</a>"),
|
7 |
+
'(Admin)','gdpr-framework'
|
8 |
+
); ?>
|
9 |
+
</p>
|
views/admin/notices/helper-tools.php
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
<p>
|
2 |
-
<?= _x('The contents of this page should contain the [gdpr_tools] shortcode.', '(Admin)', 'gdpr-framework'); ?>
|
3 |
-
</p>
|
4 |
-
<p>
|
5 |
-
<?= _x(
|
6 |
-
sprintf('Read more %shere%s', "<a href='{$helpUrl}'>", "</a>"),
|
7 |
-
'(Admin)',
|
8 |
-
'gdpr-framework'
|
9 |
-
); ?>
|
10 |
-
</p>
|
1 |
+
<p>
|
2 |
+
<?= _x('The contents of this page should contain the [gdpr_tools] shortcode.', '(Admin)', 'gdpr-framework'); ?>
|
3 |
+
</p>
|
4 |
+
<p>
|
5 |
+
<?= _x(
|
6 |
+
sprintf('Read more %shere%s', "<a href='{$helpUrl}'>", "</a>"),
|
7 |
+
'(Admin)',
|
8 |
+
'gdpr-framework'
|
9 |
+
); ?>
|
10 |
+
</p>
|
views/admin/privacy-policy/description-policy-page.php
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
<p class="description">
|
2 |
-
<?= _x('Select the page which will contain your Privacy Policy', '(Admin)', 'gdpr-framework'); ?>
|
3 |
-
</p>
|
1 |
+
<p class="description">
|
2 |
+
<?= _x('Select the page which will contain your Privacy Policy', '(Admin)', 'gdpr-framework'); ?>
|
3 |
+
</p>
|
views/admin/privacy-policy/dpa.php
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
<script>
|
2 |
-
window.gdprDpaData = <?= $dpaData; ?>;
|
3 |
</script>
|
1 |
+
<script>
|
2 |
+
window.gdprDpaData = <?= $dpaData; ?>;
|
3 |
</script>
|
views/admin/privacy-policy/generated.php
CHANGED
@@ -1,21 +1,21 @@
|
|
1 |
-
<h3><?= _x('Privacy Policy', '(Admin)', 'gdpr-framework'); ?></h3>
|
2 |
-
<p>
|
3 |
-
<?= _x('Your Privacy Policy has been generated.', '(Admin)', 'gdpr-framework'); ?>
|
4 |
-
<?php if ($policyUrl): ?>
|
5 |
-
<?= __(
|
6 |
-
sprintf(
|
7 |
-
'You can copy and paste it to your %sPrivacy Policy page%s.',
|
8 |
-
"<a href='{$policyUrl}' target='_blank'>",
|
9 |
-
"</a>"
|
10 |
-
),
|
11 |
-
'(Admin)',
|
12 |
-
'gdpr-framework'
|
13 |
-
); ?>
|
14 |
-
<?php endif; ?>
|
15 |
-
</p>
|
16 |
-
|
17 |
-
<?= $editor; ?>
|
18 |
-
|
19 |
-
<br>
|
20 |
-
<a href="<?= $backUrl; ?>" class="button button-secondary"><?= _x('« Back', '(Admin)', 'gdpr-framework'); ?></a>
|
21 |
-
<br><br>
|
1 |
+
<h3><?= _x('Privacy Policy', '(Admin)', 'gdpr-framework'); ?></h3>
|
2 |
+
<p>
|
3 |
+
<?= _x('Your Privacy Policy has been generated.', '(Admin)', 'gdpr-framework'); ?>
|
4 |
+
<?php if ($policyUrl): ?>
|
5 |
+
<?= __(
|
6 |
+
sprintf(
|
7 |
+
'You can copy and paste it to your %sPrivacy Policy page%s.',
|
8 |
+
"<a href='{$policyUrl}' target='_blank'>",
|
9 |
+
"</a>"
|
10 |
+
),
|
11 |
+
'(Admin)',
|
12 |
+
'gdpr-framework'
|
13 |
+
); ?>
|
14 |
+
<?php endif; ?>
|
15 |
+
</p>
|
16 |
+
|
17 |
+
<?= $editor; ?>
|
18 |
+
|
19 |
+
<br>
|
20 |
+
<a href="<?= $backUrl; ?>" class="button button-secondary"><?= _x('« Back', '(Admin)', 'gdpr-framework'); ?></a>
|
21 |
+
<br><br>
|
views/admin/privacy-policy/header.php
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
<p>
|
2 |
-
<?= _x('This page allows you to generate a Privacy Policy based on the information you entered below.', '(Admin)', 'gdpr-framework'); ?>
|
3 |
-
</p>
|
1 |
+
<p>
|
2 |
+
<?= _x('This page allows you to generate a Privacy Policy based on the information you entered below.', '(Admin)', 'gdpr-framework'); ?>
|
3 |
+
</p>
|
views/admin/settings-page.php
CHANGED
@@ -1,46 +1,46 @@
|
|
1 |
-
<div class="wrap gdpr-framework-wrap">
|
2 |
-
<h2>
|
3 |
-
<?= _x('The GDPR Framework', '(Admin)', 'gdpr-framework'); ?>
|
4 |
-
</h2>
|
5 |
-
|
6 |
-
<?php if (!empty($_GET['updated'])) : ?>
|
7 |
-
<div id="setting-error-settings_updated" class="updated settings-error notice is-dismissible">
|
8 |
-
<p><strong><?php _ex('GDPR settings saved!', '(Admin)', 'gdpr-framework') ?></strong></p>
|
9 |
-
</div>
|
10 |
-
<?php endif; ?>
|
11 |
-
|
12 |
-
<?php if (count($tabs)): ?>
|
13 |
-
<nav class="nav-tab-wrapper">
|
14 |
-
<?php foreach ($tabs as $slug => $tab): ?>
|
15 |
-
<a href="<?= $tab['url']; ?>" class="nav-tab <?= $tab['active'] ? 'nav-tab-active' : ''; ?>">
|
16 |
-
<?= $tab['title'] ?>
|
17 |
-
</a>
|
18 |
-
<?php endforeach; ?>
|
19 |
-
</nav>
|
20 |
-
<?php endif; ?>
|
21 |
-
|
22 |
-
<form action="options.php" method="POST">
|
23 |
-
<?= $currentTabContents; ?>
|
24 |
-
</form>
|
25 |
-
|
26 |
-
<?php if ($signature): ?>
|
27 |
-
<hr>
|
28 |
-
<p>
|
29 |
-
<em>
|
30 |
-
<?= sprintf(
|
31 |
-
_x('The GDPR Framework. Built with ♥ by %sCodelight%s.', '(Admin)', 'gdpr-framework'),
|
32 |
-
'<a href="https://codelight.eu/" target="_blank">',
|
33 |
-
'</a>'
|
34 |
-
); ?>
|
35 |
-
|
36 |
-
|
|
37 |
-
|
38 |
-
<?= sprintf(
|
39 |
-
_x("Support our development efforts with a %s5-star rating%s.", '(Admin)', 'gdpr-framework'),
|
40 |
-
'<a href="https://wordpress.org/plugins/gdpr-framework/#reviews" target="_blank">',
|
41 |
-
'</a>'
|
42 |
-
); ?>
|
43 |
-
</em>
|
44 |
-
</p>
|
45 |
-
<?php endif; ?>
|
46 |
-
</div>
|
1 |
+
<div class="wrap gdpr-framework-wrap">
|
2 |
+
<h2>
|
3 |
+
<?= _x('The GDPR Framework', '(Admin)', 'gdpr-framework'); ?>
|
4 |
+
</h2>
|
5 |
+
|
6 |
+
<?php if (!empty($_GET['updated'])) : ?>
|
7 |
+
<div id="setting-error-settings_updated" class="updated settings-error notice is-dismissible">
|
8 |
+
<p><strong><?php _ex('GDPR settings saved!', '(Admin)', 'gdpr-framework') ?></strong></p>
|
9 |
+
</div>
|
10 |
+
<?php endif; ?>
|
11 |
+
|
12 |
+
<?php if (count($tabs)): ?>
|
13 |
+
<nav class="nav-tab-wrapper">
|
14 |
+
<?php foreach ($tabs as $slug => $tab): ?>
|
15 |
+
<a href="<?= $tab['url']; ?>" class="nav-tab <?= $tab['active'] ? 'nav-tab-active' : ''; ?>">
|
16 |
+
<?= $tab['title'] ?>
|
17 |
+
</a>
|
18 |
+
<?php endforeach; ?>
|
19 |
+
</nav>
|
20 |
+
<?php endif; ?>
|
21 |
+
|
22 |
+
<form action="options.php" method="POST">
|
23 |
+
<?= $currentTabContents; ?>
|
24 |
+
</form>
|
25 |
+
|
26 |
+
<?php if ($signature): ?>
|
27 |
+
<hr>
|
28 |
+
<p>
|
29 |
+
<em>
|
30 |
+
<?= sprintf(
|
31 |
+
_x('The GDPR Framework. Built with ♥ by %sCodelight%s.', '(Admin)', 'gdpr-framework'),
|
32 |
+
'<a href="https://codelight.eu/" target="_blank">',
|
33 |
+
'</a>'
|
34 |
+
); ?>
|
35 |
+
|
36 |
+
|
|
37 |
+
|
38 |
+
<?= sprintf(
|
39 |
+
_x("Support our development efforts with a %s5-star rating%s.", '(Admin)', 'gdpr-framework'),
|
40 |
+
'<a href="https://wordpress.org/plugins/gdpr-framework/#reviews" target="_blank">',
|
41 |
+
'</a>'
|
42 |
+
); ?>
|
43 |
+
</em>
|
44 |
+
</p>
|
45 |
+
<?php endif; ?>
|
46 |
+
</div>
|
views/admin/support/contents.php
CHANGED
@@ -1,62 +1,62 @@
|
|
1 |
-
<hr>
|
2 |
-
|
3 |
-
<section class="section">
|
4 |
-
<h3 class="align-center">
|
5 |
-
<?= _x('Need more info?', '(Admin)', 'gdpr-framework'); ?>
|
6 |
-
</h3>
|
7 |
-
<div class="row">
|
8 |
-
<div class="col">
|
9 |
-
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/1.png');"></div>
|
10 |
-
<a class="button button-primary" href="<?= gdpr('helpers')->docs('wordpress-site-owners-guide-to-gdpr/'); ?>" target="_blank">
|
11 |
-
<?= _x('Site Owner\'s guide to GDPR', '(Admin)', 'gdpr-framework'); ?>
|
12 |
-
</a>
|
13 |
-
<p>
|
14 |
-
<?= _x('Read the full guide on GDPR compliance.', '(Admin)', 'gdpr-framework'); ?>
|
15 |
-
</p>
|
16 |
-
</div>
|
17 |
-
<div class="col">
|
18 |
-
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/2.png');"></div>
|
19 |
-
<a class="button button-primary" href="<?= gdpr('helpers')->docs('knowledge-base'); ?>" target="_blank">
|
20 |
-
<?= _x('Knowledge base', '(Admin)', 'gdpr-framework'); ?>
|
21 |
-
</a>
|
22 |
-
<p>
|
23 |
-
<?= _x('Check out the knowledge base for common questions and answers.', '(Admin)', 'gdpr-framework'); ?>
|
24 |
-
</p>
|
25 |
-
</div>
|
26 |
-
<div class="col">
|
27 |
-
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/3.png');"></div>
|
28 |
-
<a class="button button-primary" href="<?= gdpr('helpers')->docs('developer-docs'); ?>" target="_blank">
|
29 |
-
<?= _x('Developer\'s guide to GDPR', '(Admin)', 'gdpr-framework'); ?>
|
30 |
-
</a>
|
31 |
-
<p>
|
32 |
-
<?= _x('We have a thorough guide to help making custom sites compliant.', '(Admin)', 'gdpr-framework'); ?>
|
33 |
-
</p>
|
34 |
-
</div>
|
35 |
-
</div>
|
36 |
-
</section>
|
37 |
-
|
38 |
-
<section class="section">
|
39 |
-
<h3 class="align-center">
|
40 |
-
<?= _x('Need help?', '(Admin)', 'gdpr-framework'); ?>
|
41 |
-
</h3>
|
42 |
-
<div class="row">
|
43 |
-
<div class="col">
|
44 |
-
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/4.png');"></div>
|
45 |
-
<a class="button button-primary" href="https://wordpress.org/support/plugin/gdpr-framework" target="_blank">
|
46 |
-
<?= _x('Submit a support request', '(Admin)', 'gdpr-framework'); ?>
|
47 |
-
</a>
|
48 |
-
<p>
|
49 |
-
<?= _x('Found a bug or problem with the plugin? Post in the wordpress.org support forum.', '(Admin)', 'gdpr-framework'); ?>
|
50 |
-
</p>
|
51 |
-
</div>
|
52 |
-
<div class="col">
|
53 |
-
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/5.png');"></div>
|
54 |
-
<a class="button button-primary" href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" target="_blank">
|
55 |
-
<?= _x('Request a consultation', '(Admin)', 'gdpr-framework'); ?>
|
56 |
-
</a>
|
57 |
-
<p>
|
58 |
-
<?= _x('Need development or legal assistance in making your site compliant? We can help!', '(Admin)', 'gdpr-framework'); ?>
|
59 |
-
</p>
|
60 |
-
</div>
|
61 |
-
</div>
|
62 |
-
</section>
|
1 |
+
<hr>
|
2 |
+
|
3 |
+
<section class="section">
|
4 |
+
<h3 class="align-center">
|
5 |
+
<?= _x('Need more info?', '(Admin)', 'gdpr-framework'); ?>
|
6 |
+
</h3>
|
7 |
+
<div class="row">
|
8 |
+
<div class="col">
|
9 |
+
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/1.png');"></div>
|
10 |
+
<a class="button button-primary" href="<?= gdpr('helpers')->docs('wordpress-site-owners-guide-to-gdpr/'); ?>" target="_blank">
|
11 |
+
<?= _x('Site Owner\'s guide to GDPR', '(Admin)', 'gdpr-framework'); ?>
|
12 |
+
</a>
|
13 |
+
<p>
|
14 |
+
<?= _x('Read the full guide on GDPR compliance.', '(Admin)', 'gdpr-framework'); ?>
|
15 |
+
</p>
|
16 |
+
</div>
|
17 |
+
<div class="col">
|
18 |
+
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/2.png');"></div>
|
19 |
+
<a class="button button-primary" href="<?= gdpr('helpers')->docs('knowledge-base'); ?>" target="_blank">
|
20 |
+
<?= _x('Knowledge base', '(Admin)', 'gdpr-framework'); ?>
|
21 |
+
</a>
|
22 |
+
<p>
|
23 |
+
<?= _x('Check out the knowledge base for common questions and answers.', '(Admin)', 'gdpr-framework'); ?>
|
24 |
+
</p>
|
25 |
+
</div>
|
26 |
+
<div class="col">
|
27 |
+
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/3.png');"></div>
|
28 |
+
<a class="button button-primary" href="<?= gdpr('helpers')->docs('developer-docs'); ?>" target="_blank">
|
29 |
+
<?= _x('Developer\'s guide to GDPR', '(Admin)', 'gdpr-framework'); ?>
|
30 |
+
</a>
|
31 |
+
<p>
|
32 |
+
<?= _x('We have a thorough guide to help making custom sites compliant.', '(Admin)', 'gdpr-framework'); ?>
|
33 |
+
</p>
|
34 |
+
</div>
|
35 |
+
</div>
|
36 |
+
</section>
|
37 |
+
|
38 |
+
<section class="section">
|
39 |
+
<h3 class="align-center">
|
40 |
+
<?= _x('Need help?', '(Admin)', 'gdpr-framework'); ?>
|
41 |
+
</h3>
|
42 |
+
<div class="row">
|
43 |
+
<div class="col">
|
44 |
+
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/4.png');"></div>
|
45 |
+
<a class="button button-primary" href="https://wordpress.org/support/plugin/gdpr-framework" target="_blank">
|
46 |
+
<?= _x('Submit a support request', '(Admin)', 'gdpr-framework'); ?>
|
47 |
+
</a>
|
48 |
+
<p>
|
49 |
+
<?= _x('Found a bug or problem with the plugin? Post in the wordpress.org support forum.', '(Admin)', 'gdpr-framework'); ?>
|
50 |
+
</p>
|
51 |
+
</div>
|
52 |
+
<div class="col">
|
53 |
+
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/5.png');"></div>
|
54 |
+
<a class="button button-primary" href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" target="_blank">
|
55 |
+
<?= _x('Request a consultation', '(Admin)', 'gdpr-framework'); ?>
|
56 |
+
</a>
|
57 |
+
<p>
|
58 |
+
<?= _x('Need development or legal assistance in making your site compliant? We can help!', '(Admin)', 'gdpr-framework'); ?>
|
59 |
+
</p>
|
60 |
+
</div>
|
61 |
+
</div>
|
62 |
+
</section>
|
views/admin/wizard-buttons.php
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
-
<a class="button button-primary" href="<?= esc_url($restartUrl); ?>">
|
2 |
-
<?= _x('Restart setup wizard', '(Admin)', 'gdpr-framework'); ?>
|
3 |
-
</a>
|
4 |
-
<br><br>
|
5 |
-
<hr>
|
1 |
+
<a class="button button-primary" href="<?= esc_url($restartUrl); ?>">
|
2 |
+
<?= _x('Restart setup wizard', '(Admin)', 'gdpr-framework'); ?>
|
3 |
+
</a>
|
4 |
+
<br><br>
|
5 |
+
<hr>
|
views/email/action-export.php
CHANGED
@@ -1,9 +1,9 @@
|
|
1 |
-
<p>
|
2 |
-
<?= _x(
|
3 |
-
sprintf('A data subject (%s) has just downloaded their data in %s format.', esc_html($email), esc_html($format)),
|
4 |
-
'(Admin)', 'gdpr-framework'
|
5 |
-
); ?>
|
6 |
-
</p>
|
7 |
-
<p>
|
8 |
-
<?= _x('This email is just for your information. You don\'t need to take any action', '(Admin)', 'gdpr-framework'); ?>
|
9 |
-
</p>
|
1 |
+
<p>
|
2 |
+
<?= _x(
|
3 |
+
sprintf('A data subject (%s) has just downloaded their data in %s format.', esc_html($email), esc_html($format)),
|
4 |
+
'(Admin)', 'gdpr-framework'
|
5 |
+
); ?>
|
6 |
+
</p>
|
7 |
+
<p>
|
8 |
+
<?= _x('This email is just for your information. You don\'t need to take any action', '(Admin)', 'gdpr-framework'); ?>
|
9 |
+
</p>
|
views/email/action-forget.php
CHANGED
@@ -1,13 +1,13 @@
|
|
1 |
-
<p>
|
2 |
-
<?= _x(
|
3 |
-
sprintf('A data subject (%s) has just removed all their data from your website.', esc_html($email)),
|
4 |
-
'(Admin)', 'gdpr-framework'
|
5 |
-
); ?> <br><br>
|
6 |
-
|
7 |
-
<?php if ($userId): ?>
|
8 |
-
<?= _x('The data subject had a user account on your website.', '(Admin)', 'gdpr-framework'); ?> (ID: <?= $userId; ?>).
|
9 |
-
<?php endif; ?>
|
10 |
-
</p>
|
11 |
-
<p>
|
12 |
-
<?= _x('This email is just for your information. You don\'t need to take any action', '(Admin)', 'gdpr-framework'); ?>
|
13 |
-
</p>
|
1 |
+
<p>
|
2 |
+
<?= _x(
|
3 |
+
sprintf('A data subject (%s) has just removed all their data from your website.', esc_html($email)),
|
4 |
+
'(Admin)', 'gdpr-framework'
|
5 |
+
); ?> <br><br>
|
6 |
+
|
7 |
+
<?php if ($userId): ?>
|
8 |
+
<?= _x('The data subject had a user account on your website.', '(Admin)', 'gdpr-framework'); ?> (ID: <?= $userId; ?>).
|
9 |
+
<?php endif; ?>
|
10 |
+
</p>
|
11 |
+
<p>
|
12 |
+
<?= _x('This email is just for your information. You don\'t need to take any action', '(Admin)', 'gdpr-framework'); ?>
|
13 |
+
</p>
|
views/email/identify-data-subject.php
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
<p>
|
2 |
-
<?= __('Someone has requested access to your data on', 'gdpr-framework'); ?> <?= esc_html($siteName); ?> <br/>
|
3 |
-
<?= __('If this was a mistake, just ignore this email and nothing will happen.', 'gdpr-framework'); ?> <br/>
|
4 |
-
<?= __('To manage your data, visit the following address:', 'gdpr-framework'); ?> <br/>
|
5 |
-
<a href="<?= esc_url($identificationUrl); ?>">
|
6 |
-
<?= esc_url($identificationUrl); ?>
|
7 |
-
</a>
|
8 |
-
</p>
|
9 |
-
<p>
|
10 |
-
<?= __('This link is valid for 15 minutes.', 'gdpr-framework'); ?>
|
11 |
-
</p>
|
1 |
+
<p>
|
2 |
+
<?= __('Someone has requested access to your data on', 'gdpr-framework'); ?> <?= esc_html($siteName); ?> <br/>
|
3 |
+
<?= __('If this was a mistake, just ignore this email and nothing will happen.', 'gdpr-framework'); ?> <br/>
|
4 |
+
<?= __('To manage your data, visit the following address:', 'gdpr-framework'); ?> <br/>
|
5 |
+
<a href="<?= esc_url($identificationUrl); ?>">
|
6 |
+
<?= esc_url($identificationUrl); ?>
|
7 |
+
</a>
|
8 |
+
</p>
|
9 |
+
<p>
|
10 |
+
<?= __('This link is valid for 15 minutes.', 'gdpr-framework'); ?>
|
11 |
+
</p>
|
views/email/no-data.php
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
-
<p>
|
2 |
-
<?= __('Someone has requested information about your personal data on', 'gdpr-framework'); ?> <?= esc_html($siteName); ?> <br/>
|
3 |
-
<?= __('None of your personal data is stored on', 'gdpr-framework'); ?> <?= esc_html($siteName); ?> <br/>
|
4 |
-
<br/>
|
5 |
-
<?= __('If this was a mistake or you did not request this email, just ignore it and nothing will happen.', 'gdpr-framework'); ?> <br/>
|
6 |
-
</p>
|
1 |
+
<p>
|
2 |
+
<?= __('Someone has requested information about your personal data on', 'gdpr-framework'); ?> <?= esc_html($siteName); ?> <br/>
|
3 |
+
<?= __('None of your personal data is stored on', 'gdpr-framework'); ?> <?= esc_html($siteName); ?> <br/>
|
4 |
+
<br/>
|
5 |
+
<?= __('If this was a mistake or you did not request this email, just ignore it and nothing will happen.', 'gdpr-framework'); ?> <br/>
|
6 |
+
</p>
|
views/email/request-export.php
CHANGED
@@ -1,14 +1,14 @@
|
|
1 |
-
<p>
|
2 |
-
<?= _x(
|
3 |
-
sprintf('A data subject (%s) has requested to download their data in %s format.', esc_html($email), esc_html($format)),
|
4 |
-
'(Admin)', 'gdpr-framework'
|
5 |
-
); ?>
|
6 |
-
<br>
|
7 |
-
<?= _x(
|
8 |
-
sprintf('To access the data subject\'s data, %sclick here%s', "<a href='{$adminTabLink}'>", '</a>'),
|
9 |
-
'(Admin)', 'gdpr-framework'
|
10 |
-
); ?>
|
11 |
-
</p>
|
12 |
-
<p>
|
13 |
-
<?= _x('As a reminder: according to GDPR, you have 30 days to comply.', '(Admin)', 'gdpr-framework'); ?>
|
14 |
-
</p>
|
1 |
+
<p>
|
2 |
+
<?= _x(
|
3 |
+
sprintf('A data subject (%s) has requested to download their data in %s format.', esc_html($email), esc_html($format)),
|
4 |
+
'(Admin)', 'gdpr-framework'
|
5 |
+
); ?>
|
6 |
+
<br>
|
7 |
+
<?= _x(
|
8 |
+
sprintf('To access the data subject\'s data, %sclick here%s', "<a href='{$adminTabLink}'>", '</a>'),
|
9 |
+
'(Admin)', 'gdpr-framework'
|
10 |
+
); ?>
|
11 |
+
</p>
|
12 |
+
<p>
|
13 |
+
<?= _x('As a reminder: according to GDPR, you have 30 days to comply.', '(Admin)', 'gdpr-framework'); ?>
|
14 |
+
</p>
|
views/email/request-forget.php
CHANGED
@@ -1,14 +1,14 @@
|
|
1 |
-
<p>
|
2 |
-
<?= _x(
|
3 |
-
sprintf('A data subject (%s) has requested to remove their data.', esc_html($email)),
|
4 |
-
'(Admin)', 'gdpr-framework'
|
5 |
-
); ?>
|
6 |
-
<br>
|
7 |
-
<?= _x(
|
8 |
-
sprintf('To access the data subject\'s data, %sclick here%s', "<a href='{$adminTabLink}'>", '</a>'),
|
9 |
-
'(Admin)', 'gdpr-framework'
|
10 |
-
); ?>
|
11 |
-
</p>
|
12 |
-
<p>
|
13 |
-
<?= _x('As a reminder: according to GDPR, you have 30 days to comply.', '(Admin)', 'gdpr-framework'); ?>
|
14 |
-
</p>
|
1 |
+
<p>
|
2 |
+
<?= _x(
|
3 |
+
sprintf('A data subject (%s) has requested to remove their data.', esc_html($email)),
|
4 |
+
'(Admin)', 'gdpr-framework'
|
5 |
+
); ?>
|
6 |
+
<br>
|
7 |
+
<?= _x(
|
8 |
+
sprintf('To access the data subject\'s data, %sclick here%s', "<a href='{$adminTabLink}'>", '</a>'),
|
9 |
+
'(Admin)', 'gdpr-framework'
|
10 |
+
); ?>
|
11 |
+
</p>
|
12 |
+
<p>
|
13 |
+
<?= _x('As a reminder: according to GDPR, you have 30 days to comply.', '(Admin)', 'gdpr-framework'); ?>
|
14 |
+
</p>
|
views/global/country-options.php
CHANGED
@@ -1,23 +1,23 @@
|
|
1 |
-
<option disabled>-- Choose --</option>
|
2 |
-
|
3 |
-
<optgroup label="Outside EU">
|
4 |
-
<?php foreach ($outside as $code => $name): ?>
|
5 |
-
<option
|
6 |
-
value="<?= esc_attr($code); ?>"
|
7 |
-
<?= selected($code, $current); ?>
|
8 |
-
<?php if (in_array($code, ['UK', 'US', 'other'])): ?>
|
9 |
-
data-show=".gdpr-representative"
|
10 |
-
<?php endif; ?>
|
11 |
-
>
|
12 |
-
<?= esc_html($name); ?>
|
13 |
-
</option>
|
14 |
-
<?php endforeach; ?>
|
15 |
-
</optgroup>
|
16 |
-
|
17 |
-
<optgroup label="European Union">
|
18 |
-
<?php foreach ($eu as $code => $name): ?>
|
19 |
-
<option value="<?= esc_attr($code); ?>" <?= selected($code, $current); ?>>
|
20 |
-
<?= esc_html($name); ?>
|
21 |
-
</option>
|
22 |
-
<?php endforeach; ?>
|
23 |
-
</optgroup>
|
1 |
+
<option disabled>-- Choose --</option>
|
2 |
+
|
3 |
+
<optgroup label="Outside EU">
|
4 |
+
<?php foreach ($outside as $code => $name): ?>
|
5 |
+
<option
|
6 |
+
value="<?= esc_attr($code); ?>"
|
7 |
+
<?= selected($code, $current); ?>
|
8 |
+
<?php if (in_array($code, ['UK', 'US', 'other'])): ?>
|
9 |
+
data-show=".gdpr-representative"
|
10 |
+
<?php endif; ?>
|
11 |
+
>
|
12 |
+
<?= esc_html($name); ?>
|
13 |
+
</option>
|
14 |
+
<?php endforeach; ?>
|
15 |
+
</optgroup>
|
16 |
+
|
17 |
+
<optgroup label="European Union">
|
18 |
+
<?php foreach ($eu as $code => $name): ?>
|
19 |
+
<option value="<?= esc_attr($code); ?>" <?= selected($code, $current); ?>>
|
20 |
+
<?= esc_html($name); ?>
|
21 |
+
</option>
|
22 |
+
<?php endforeach; ?>
|
23 |
+
</optgroup>
|
views/global/delete-action.php
CHANGED
@@ -1,20 +1,20 @@
|
|
1 |
-
<option value="anonymize" <?= selected($deleteAction, 'anonymize'); ?>>
|
2 |
-
<?= _x('Automatically anonymize data', '(Admin)', 'gdpr-framework') ?>
|
3 |
-
</option>
|
4 |
-
<option value="delete" <?= selected($deleteAction, 'delete'); ?> data-show=".js-gdpr-delete-action-reassign">
|
5 |
-
<?= _x('Automatically delete data', '(Admin)', 'gdpr-framework') ?>
|
6 |
-
</option>
|
7 |
-
<option value="anonymize_and_notify" <?= selected($deleteAction, 'anonymize_and_notify'); ?>
|
8 |
-
data-show=".js-gdpr-delete-action-email">
|
9 |
-
<?= _x('Automatically anonymize data and notify me via email', '(Admin)', 'gdpr-framework') ?>
|
10 |
-
</option>
|
11 |
-
<option value="delete_and_notify" <?= selected($deleteAction, 'delete_and_notify'); ?>
|
12 |
-
data-show=".js-gdpr-delete-action-email, .js-gdpr-delete-action-reassign">
|
13 |
-
<?= _x('Automatically delete data and notify me via email', '(Admin)', 'gdpr-framework') ?>
|
14 |
-
</option>
|
15 |
-
<option value="notify" <?= selected($deleteAction, 'notify'); ?> data-show=".js-gdpr-delete-action-email">
|
16 |
-
<?= _x('Only notify me via email', '(Admin)', 'gdpr-framework') ?>
|
17 |
-
</option>
|
18 |
-
|
19 |
-
|
20 |
-
|
1 |
+
<option value="anonymize" <?= selected($deleteAction, 'anonymize'); ?>>
|
2 |
+
<?= _x('Automatically anonymize data', '(Admin)', 'gdpr-framework') ?>
|
3 |
+
</option>
|
4 |
+
<option value="delete" <?= selected($deleteAction, 'delete'); ?> data-show=".js-gdpr-delete-action-reassign">
|
5 |
+
<?= _x('Automatically delete data', '(Admin)', 'gdpr-framework') ?>
|
6 |
+
</option>
|
7 |
+
<option value="anonymize_and_notify" <?= selected($deleteAction, 'anonymize_and_notify'); ?>
|
8 |
+
data-show=".js-gdpr-delete-action-email">
|
9 |
+
<?= _x('Automatically anonymize data and notify me via email', '(Admin)', 'gdpr-framework') ?>
|
10 |
+
</option>
|
11 |
+
<option value="delete_and_notify" <?= selected($deleteAction, 'delete_and_notify'); ?>
|
12 |
+
data-show=".js-gdpr-delete-action-email, .js-gdpr-delete-action-reassign">
|
13 |
+
<?= _x('Automatically delete data and notify me via email', '(Admin)', 'gdpr-framework') ?>
|
14 |
+
</option>
|
15 |
+
<option value="notify" <?= selected($deleteAction, 'notify'); ?> data-show=".js-gdpr-delete-action-email">
|
16 |
+
<?= _x('Only notify me via email', '(Admin)', 'gdpr-framework') ?>
|
17 |
+
</option>
|
18 |
+
|
19 |
+
|
20 |
+
|
views/global/export-action.php
CHANGED
@@ -1,14 +1,14 @@
|
|
1 |
-
<option value="download" <?= selected($exportAction, 'download'); ?>>
|
2 |
-
<?= _x('Automatically download data', '(Admin)', 'gdpr-framework') ?>
|
3 |
-
</option>
|
4 |
-
<option value="download_and_notify" <?= selected($exportAction, 'download_and_notify'); ?>
|
5 |
-
data-show=".js-gdpr-export-action-email">
|
6 |
-
<?= _x('Automatically download data and notify me via email', '(Admin)', 'gdpr-framework') ?>
|
7 |
-
</option>
|
8 |
-
<option value="notify" <?= selected($exportAction, 'notify'); ?>
|
9 |
-
data-show=".js-gdpr-export-action-email">
|
10 |
-
<?= _x('Only notify me via email', '(Admin)', 'gdpr-framework') ?>
|
11 |
-
</option>
|
12 |
-
|
13 |
-
|
14 |
-
|
1 |
+
<option value="download" <?= selected($exportAction, 'download'); ?>>
|
2 |
+
<?= _x('Automatically download data', '(Admin)', 'gdpr-framework') ?>
|
3 |
+
</option>
|
4 |
+
<option value="download_and_notify" <?= selected($exportAction, 'download_and_notify'); ?>
|
5 |
+
data-show=".js-gdpr-export-action-email">
|
6 |
+
<?= _x('Automatically download data and notify me via email', '(Admin)', 'gdpr-framework') ?>
|
7 |
+
</option>
|
8 |
+
<option value="notify" <?= selected($exportAction, 'notify'); ?>
|
9 |
+
data-show=".js-gdpr-export-action-email">
|
10 |
+
<?= _x('Only notify me via email', '(Admin)', 'gdpr-framework') ?>
|
11 |
+
</option>
|
12 |
+
|
13 |
+
|
14 |
+
|
views/global/html-data.php
CHANGED
@@ -1,39 +1,39 @@
|
|
1 |
-
<!doctype html>
|
2 |
-
<html lang="en-US">
|
3 |
-
<head>
|
4 |
-
<meta charset="UTF-8">
|
5 |
-
<title>Your data</title>
|
6 |
-
|
7 |
-
<style type="text/css">
|
8 |
-
table {
|
9 |
-
font-family: verdana,arial,sans-serif;
|
10 |
-
font-size:11px;
|
11 |
-
color:#333333;
|
12 |
-
border-width: 1px;
|
13 |
-
border-color: #3A3A3A;
|
14 |
-
border-collapse: collapse;
|
15 |
-
}
|
16 |
-
table th {
|
17 |
-
border-width: 1px;
|
18 |
-
padding: 8px;
|
19 |
-
border-style: solid;
|
20 |
-
border-color: #3A3A3A;
|
21 |
-
background-color: #B3B3B3;
|
22 |
-
}
|
23 |
-
table td {
|
24 |
-
border-width: 1px;
|
25 |
-
padding: 8px;
|
26 |
-
border-style: solid;
|
27 |
-
border-color: #3A3A3A;
|
28 |
-
background-color: #ffffff;
|
29 |
-
}
|
30 |
-
|
31 |
-
td.key {
|
32 |
-
font-weight: bold;
|
33 |
-
}
|
34 |
-
</style>
|
35 |
-
</head>
|
36 |
-
<body>
|
37 |
-
<?= $table; ?>
|
38 |
-
</body>
|
39 |
</html>
|
1 |
+
<!doctype html>
|
2 |
+
<html lang="en-US">
|
3 |
+
<head>
|
4 |
+
<meta charset="UTF-8">
|
5 |
+
<title>Your data</title>
|
6 |
+
|
7 |
+
<style type="text/css">
|
8 |
+
table {
|
9 |
+
font-family: verdana,arial,sans-serif;
|
10 |
+
font-size:11px;
|
11 |
+
color:#333333;
|
12 |
+
border-width: 1px;
|
13 |
+
border-color: #3A3A3A;
|
14 |
+
border-collapse: collapse;
|
15 |
+
}
|
16 |
+
table th {
|
17 |
+
border-width: 1px;
|
18 |
+
padding: 8px;
|
19 |
+
border-style: solid;
|
20 |
+
border-color: #3A3A3A;
|
21 |
+
background-color: #B3B3B3;
|
22 |
+
}
|
23 |
+
table td {
|
24 |
+
border-width: 1px;
|
25 |
+
padding: 8px;
|
26 |
+
border-style: solid;
|
27 |
+
border-color: #3A3A3A;
|
28 |
+
background-color: #ffffff;
|
29 |
+
}
|
30 |
+
|
31 |
+
td.key {
|
32 |
+
font-weight: bold;
|
33 |
+
}
|
34 |
+
</style>
|
35 |
+
</head>
|
36 |
+
<body>
|
37 |
+
<?= $table; ?>
|
38 |
+
</body>
|
39 |
</html>
|
views/installer/continue-notice.php
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
<p>
|
2 |
-
<?= _x('The The GDPR Framework setup has not been finalized yet.', '(Admin)', 'gdpr-framework'); ?> <br>
|
3 |
-
<?= _x('You can continue the setup at any time.', '(Admin)', 'gdpr-framework'); ?>
|
4 |
-
</p>
|
5 |
-
<a class="button button-primary" href="<?= $buttonUrl; ?>">
|
6 |
-
<?= _x('Continue the setup wizard', '(Admin)', 'gdpr-framework'); ?>
|
7 |
-
</a>
|
8 |
-
<a class="button button-secondary" href="<?= $skipUrl; ?>">
|
9 |
-
<?= _x('Hide this message', '(Admin)', 'gdpr-framework'); ?>
|
10 |
-
</a>
|
1 |
+
<p>
|
2 |
+
<?= _x('The The GDPR Framework setup has not been finalized yet.', '(Admin)', 'gdpr-framework'); ?> <br>
|
3 |
+
<?= _x('You can continue the setup at any time.', '(Admin)', 'gdpr-framework'); ?>
|
4 |
+
</p>
|
5 |
+
<a class="button button-primary" href="<?= $buttonUrl; ?>">
|
6 |
+
<?= _x('Continue the setup wizard', '(Admin)', 'gdpr-framework'); ?>
|
7 |
+
</a>
|
8 |
+
<a class="button button-secondary" href="<?= $skipUrl; ?>">
|
9 |
+
<?= _x('Hide this message', '(Admin)', 'gdpr-framework'); ?>
|
10 |
+
</a>
|
views/installer/footer.php
CHANGED
@@ -1,41 +1,41 @@
|
|
1 |
-
<!-- Close the installer form -->
|
2 |
-
</form>
|
3 |
-
|
4 |
-
<?php if (!isset($disableBackButton) or !$disableBackButton): ?>
|
5 |
-
<form method="POST">
|
6 |
-
<input type="hidden" name="gdpr-installer" value="previous" />
|
7 |
-
<input type="submit" class="button button-secondary gdpr-step-button gdpr-step-button-prev" value="« <?= __('Back'); ?>">
|
8 |
-
</form>
|
9 |
-
<?php endif; ?>
|
10 |
-
|
11 |
-
</div> <!-- .gdpr-content -->
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
<!--
|
16 |
-
<div class="gdpr-sticky">
|
17 |
-
<hr>
|
18 |
-
<a class="button button-primary" href="#">I need help</a>
|
19 |
-
</div>
|
20 |
-
-->
|
21 |
-
|
22 |
-
</div> <!-- .container -->
|
23 |
-
|
24 |
-
<div class="gdpr-footer-links">
|
25 |
-
<p>
|
26 |
-
You can always leave and continue the setup later from where you left off
|
27 |
-
</p>
|
28 |
-
<a class="button button-secondary" href="<?= admin_url(); ?>">
|
29 |
-
Go to Dashboard
|
30 |
-
</a>
|
31 |
-
</div>
|
32 |
-
|
33 |
-
<?php wp_print_scripts([
|
34 |
-
'gdpr-installer',
|
35 |
-
'jquery-repeater',
|
36 |
-
'select2',
|
37 |
-
'conditional-show'
|
38 |
-
]); ?>
|
39 |
-
<?php do_action('admin_print_footer_scripts'); ?>
|
40 |
-
</body>
|
41 |
-
</html>
|
1 |
+
<!-- Close the installer form -->
|
2 |
+
</form>
|
3 |
+
|
4 |
+
<?php if (!isset($disableBackButton) or !$disableBackButton): ?>
|
5 |
+
<form method="POST">
|
6 |
+
<input type="hidden" name="gdpr-installer" value="previous" />
|
7 |
+
<input type="submit" class="button button-secondary gdpr-step-button gdpr-step-button-prev" value="« <?= __('Back'); ?>">
|
8 |
+
</form>
|
9 |
+
<?php endif; ?>
|
10 |
+
|
11 |
+
</div> <!-- .gdpr-content -->
|
12 |
+
|
13 |
+
|
14 |
+
|
15 |
+
<!--
|
16 |
+
<div class="gdpr-sticky">
|
17 |
+
<hr>
|
18 |
+
<a class="button button-primary" href="#">I need help</a>
|
19 |
+
</div>
|
20 |
+
-->
|
21 |
+
|
22 |
+
</div> <!-- .container -->
|
23 |
+
|
24 |
+
<div class="gdpr-footer-links">
|
25 |
+
<p>
|
26 |
+
You can always leave and continue the setup later from where you left off
|
27 |
+
</p>
|
28 |
+
<a class="button button-secondary" href="<?= admin_url(); ?>">
|
29 |
+
Go to Dashboard
|
30 |
+
</a>
|
31 |
+
</div>
|
32 |
+
|
33 |
+
<?php wp_print_scripts([
|
34 |
+
'gdpr-installer',
|
35 |
+
'jquery-repeater',
|
36 |
+
'select2',
|
37 |
+
'conditional-show'
|
38 |
+
]); ?>
|
39 |
+
<?php do_action('admin_print_footer_scripts'); ?>
|
40 |
+
</body>
|
41 |
+
</html>
|
views/installer/header.php
CHANGED
@@ -1,64 +1,64 @@
|
|
1 |
-
<!DOCTYPE html>
|
2 |
-
<html <?php language_attributes(); ?>>
|
3 |
-
<head>
|
4 |
-
<meta name="viewport" content="width=device-width" />
|
5 |
-
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
6 |
-
<title>
|
7 |
-
<?php echo esc_html_x( 'WordPress GDPR › Setup Wizard', '(Admin)', 'gdpr-framework' ); ?>
|
8 |
-
</title>
|
9 |
-
<?php wp_print_scripts(['jquery']); ?>
|
10 |
-
<?php do_action('admin_print_styles'); ?>
|
11 |
-
<?php do_action('admin_head'); ?>
|
12 |
-
</head>
|
13 |
-
|
14 |
-
<body class="gdpr-installer wp-core-ui">
|
15 |
-
|
16 |
-
<div class="container gdpr-installer-container">
|
17 |
-
<div class="gdpr-header">
|
18 |
-
<div class="gdpr-header_left">
|
19 |
-
<img class="gdpr-logo" src="<?= gdpr('config')->get('plugin.url'); ?>/assets/gdpr-rhino.svg" />
|
20 |
-
</div>
|
21 |
-
<div class="gdpr-header_right">
|
22 |
-
<h1>
|
23 |
-
<?= _x('The GDPR Framework', '(Admin)', 'gdpr-framework'); ?>
|
24 |
-
</h1>
|
25 |
-
<a href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" class="button button-secondary button-side" target="_blank">
|
26 |
-
<?= _x('I need help', '(Admin)', 'gdpr-framework'); ?>
|
27 |
-
</a>
|
28 |
-
<a href="<?= gdpr('helpers')->docs('developer-docs'); ?>" class="button button-secondary button-side" target="_blank">
|
29 |
-
<?= _x('Developer Docs', '(Admin)', 'gdpr-framework'); ?>
|
30 |
-
</a>
|
31 |
-
</div>
|
32 |
-
</div>
|
33 |
-
<div class="gdpr-breadcrumbs">
|
34 |
-
<div class="gdpr-breadcrumbs_unit <?= $activeSteps > 0 ? 'active' : ''; ?>">
|
35 |
-
<div class="gdpr-breadcrumbs_item">
|
36 |
-
<?= _x('Configuration', '(Admin)', 'gdpr-framework'); ?>
|
37 |
-
</div>
|
38 |
-
</div>
|
39 |
-
<div class="gdpr-breadcrumbs_unit <?= $activeSteps > 1 ? 'active' : ''; ?>">
|
40 |
-
<div class="gdpr-breadcrumbs_item">
|
41 |
-
<?= _x('Privacy Policy', '(Admin)', 'gdpr-framework'); ?>
|
42 |
-
</div>
|
43 |
-
</div>
|
44 |
-
<div class="gdpr-breadcrumbs_unit <?= $activeSteps > 2 ? 'active' : ''; ?>">
|
45 |
-
<div class="gdpr-breadcrumbs_item">
|
46 |
-
<?= _x('Forms & Consent', '(Admin)', 'gdpr-framework'); ?>
|
47 |
-
</div>
|
48 |
-
</div>
|
49 |
-
<div class="gdpr-breadcrumbs_unit <?= $activeSteps > 3 ? 'active' : ''; ?>">
|
50 |
-
<div class="gdpr-breadcrumbs_item">
|
51 |
-
<?= _x('Integrations', '(Admin)', 'gdpr-framework'); ?>
|
52 |
-
</div>
|
53 |
-
</div>
|
54 |
-
</div>
|
55 |
-
|
56 |
-
<div class="gdpr-content">
|
57 |
-
|
58 |
-
<?php if (isset($_GET['gdpr-error'])): ?>
|
59 |
-
<p class="error">Failed to validate nonce! Please reload page and try again.</p>
|
60 |
-
<?php endif; ?>
|
61 |
-
|
62 |
-
<!-- Open the installer form -->
|
63 |
-
<form method="POST">
|
64 |
-
<input type="hidden" name="gdpr-installer" value="next" />
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html <?php language_attributes(); ?>>
|
3 |
+
<head>
|
4 |
+
<meta name="viewport" content="width=device-width" />
|
5 |
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
6 |
+
<title>
|
7 |
+
<?php echo esc_html_x( 'WordPress GDPR › Setup Wizard', '(Admin)', 'gdpr-framework' ); ?>
|
8 |
+
</title>
|
9 |
+
<?php wp_print_scripts(['jquery']); ?>
|
10 |
+
<?php do_action('admin_print_styles'); ?>
|
11 |
+
<?php do_action('admin_head'); ?>
|
12 |
+
</head>
|
13 |
+
|
14 |
+
<body class="gdpr-installer wp-core-ui">
|
15 |
+
|
16 |
+
<div class="container gdpr-installer-container">
|
17 |
+
<div class="gdpr-header">
|
18 |
+
<div class="gdpr-header_left">
|
19 |
+
<img class="gdpr-logo" src="<?= gdpr('config')->get('plugin.url'); ?>/assets/gdpr-rhino.svg" />
|
20 |
+
</div>
|
21 |
+
<div class="gdpr-header_right">
|
22 |
+
<h1>
|
23 |
+
<?= _x('The GDPR Framework', '(Admin)', 'gdpr-framework'); ?>
|
24 |
+
</h1>
|
25 |
+
<a href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" class="button button-secondary button-side" target="_blank">
|
26 |
+
<?= _x('I need help', '(Admin)', 'gdpr-framework'); ?>
|
27 |
+
</a>
|
28 |
+
<a href="<?= gdpr('helpers')->docs('developer-docs'); ?>" class="button button-secondary button-side" target="_blank">
|
29 |
+
<?= _x('Developer Docs', '(Admin)', 'gdpr-framework'); ?>
|
30 |
+
</a>
|
31 |
+
</div>
|
32 |
+
</div>
|
33 |
+
<div class="gdpr-breadcrumbs">
|
34 |
+
<div class="gdpr-breadcrumbs_unit <?= $activeSteps > 0 ? 'active' : ''; ?>">
|
35 |
+
<div class="gdpr-breadcrumbs_item">
|
36 |
+
<?= _x('Configuration', '(Admin)', 'gdpr-framework'); ?>
|
37 |
+
</div>
|
38 |
+
</div>
|
39 |
+
<div class="gdpr-breadcrumbs_unit <?= $activeSteps > 1 ? 'active' : ''; ?>">
|
40 |
+
<div class="gdpr-breadcrumbs_item">
|
41 |
+
<?= _x('Privacy Policy', '(Admin)', 'gdpr-framework'); ?>
|
42 |
+
</div>
|
43 |
+
</div>
|
44 |
+
<div class="gdpr-breadcrumbs_unit <?= $activeSteps > 2 ? 'active' : ''; ?>">
|
45 |
+
<div class="gdpr-breadcrumbs_item">
|
46 |
+
<?= _x('Forms & Consent', '(Admin)', 'gdpr-framework'); ?>
|
47 |
+
</div>
|
48 |
+
</div>
|
49 |
+
<div class="gdpr-breadcrumbs_unit <?= $activeSteps > 3 ? 'active' : ''; ?>">
|
50 |
+
<div class="gdpr-breadcrumbs_item">
|
51 |
+
<?= _x('Integrations', '(Admin)', 'gdpr-framework'); ?>
|
52 |
+
</div>
|
53 |
+
</div>
|
54 |
+
</div>
|
55 |
+
|
56 |
+
<div class="gdpr-content">
|
57 |
+
|
58 |
+
<?php if (isset($_GET['gdpr-error'])): ?>
|
59 |
+
<p class="error">Failed to validate nonce! Please reload page and try again.</p>
|
60 |
+
<?php endif; ?>
|
61 |
+
|
62 |
+
<!-- Open the installer form -->
|
63 |
+
<form method="POST">
|
64 |
+
<input type="hidden" name="gdpr-installer" value="next" />
|
views/installer/steps/configuration-pages.php
CHANGED
@@ -1,37 +1,37 @@
|
|
1 |
-
<h1>
|
2 |
-
Configuration (1/2)
|
3 |
-
</h1>
|
4 |
-
|
5 |
-
<h2>Privacy Tools page</h2>
|
6 |
-
<p>
|
7 |
-
The first major requirement of GDPR is that your customers need to be in control of their data. They have the
|
8 |
-
right to view, edit and request deleting their <a href="<?= gdpr('helpers')->docs('guide/wordpress-gdpr-definitions-you-need-to-know/#personal-data'); ?>" target="_blank">personal data</a>. Note that this also
|
9 |
-
applies to visitors who do not have accounts on your website.
|
10 |
-
</p>
|
11 |
-
<p>
|
12 |
-
For this, we will designate a page where customers will be able to authenticate via login or email and automatically do all of the above.
|
13 |
-
<a href="<?= gdpr('helpers')->docs('guide/privacy-tools-page-accessing-exporting-and-deleting-personal-data/'); ?>" target="_blank">Read more about the Privacy Tools page</a>
|
14 |
-
</p>
|
15 |
-
<hr>
|
16 |
-
|
17 |
-
<h4>Set up the Privacy Tools page</h4>
|
18 |
-
<fieldset>
|
19 |
-
<label>
|
20 |
-
<input type="radio" name="gdpr_create_tools_page" value="yes" class="js-gdpr-conditional" <?= !$privacyToolsPage ? 'checked': ''; ?>>
|
21 |
-
Automatically create a new page for Privacy Tools
|
22 |
-
</label>
|
23 |
-
|
24 |
-
<label>
|
25 |
-
<input type="radio" name="gdpr_create_tools_page" value="no" class="js-gdpr-conditional" data-show=".gdpr-select-privacy-tools-page" <?= $privacyToolsPage ? 'checked': ''; ?>> Select an existing page
|
26 |
-
</label>
|
27 |
-
</fieldset>
|
28 |
-
|
29 |
-
<p class="gdpr-select-privacy-tools-page hidden">
|
30 |
-
<label for="gdpr_tools_page">Select the page for Privacy Tools</label>
|
31 |
-
<?= $privacyToolsPageSelector; ?>
|
32 |
-
<strong>Important:</strong> Make sure that the page contains the <strong>[gdpr_privacy_tools]</strong> shortcode.
|
33 |
-
</p>
|
34 |
-
|
35 |
-
<hr>
|
36 |
-
<br>
|
37 |
-
<input type="submit" class="button button-gdpr button-right" value="Save »"/>
|
1 |
+
<h1>
|
2 |
+
Configuration (1/2)
|
3 |
+
</h1>
|
4 |
+
|
5 |
+
<h2>Privacy Tools page</h2>
|
6 |
+
<p>
|
7 |
+
The first major requirement of GDPR is that your customers need to be in control of their data. They have the
|
8 |
+
right to view, edit and request deleting their <a href="<?= gdpr('helpers')->docs('guide/wordpress-gdpr-definitions-you-need-to-know/#personal-data'); ?>" target="_blank">personal data</a>. Note that this also
|
9 |
+
applies to visitors who do not have accounts on your website.
|
10 |
+
</p>
|
11 |
+
<p>
|
12 |
+
For this, we will designate a page where customers will be able to authenticate via login or email and automatically do all of the above.
|
13 |
+
<a href="<?= gdpr('helpers')->docs('guide/privacy-tools-page-accessing-exporting-and-deleting-personal-data/'); ?>" target="_blank">Read more about the Privacy Tools page</a>
|
14 |
+
</p>
|
15 |
+
<hr>
|
16 |
+
|
17 |
+
<h4>Set up the Privacy Tools page</h4>
|
18 |
+
<fieldset>
|
19 |
+
<label>
|
20 |
+
<input type="radio" name="gdpr_create_tools_page" value="yes" class="js-gdpr-conditional" <?= !$privacyToolsPage ? 'checked': ''; ?>>
|
21 |
+
Automatically create a new page for Privacy Tools
|
22 |
+
</label>
|
23 |
+
|
24 |
+
<label>
|
25 |
+
<input type="radio" name="gdpr_create_tools_page" value="no" class="js-gdpr-conditional" data-show=".gdpr-select-privacy-tools-page" <?= $privacyToolsPage ? 'checked': ''; ?>> Select an existing page
|
26 |
+
</label>
|
27 |
+
</fieldset>
|
28 |
+
|
29 |
+
<p class="gdpr-select-privacy-tools-page hidden">
|
30 |
+
<label for="gdpr_tools_page">Select the page for Privacy Tools</label>
|
31 |
+
<?= $privacyToolsPageSelector; ?>
|
32 |
+
<strong>Important:</strong> Make sure that the page contains the <strong>[gdpr_privacy_tools]</strong> shortcode.
|
33 |
+
</p>
|
34 |
+
|
35 |
+
<hr>
|
36 |
+
<br>
|
37 |
+
<input type="submit" class="button button-gdpr button-right" value="Save »"/>
|
views/installer/steps/configuration-settings.php
CHANGED
@@ -1,87 +1,87 @@
|
|
1 |
-
<h1>
|
2 |
-
Configuration (2/2)
|
3 |
-
</h1>
|
4 |
-
<h2>✔ Privacy Tools page configured!</h2>
|
5 |
-
<p>
|
6 |
-
You can take a look at the Privacy Tools page <a href="<?= $privacyToolsPageUrl; ?>" target="_blank">here</a>. <br>
|
7 |
-
<br>
|
8 |
-
<a href="<?= gdpr('helpers')->docs('guide/privacy-tools-page-accessing-exporting-and-deleting-personal-data/'); ?>" target="_blank">Read more about the Privacy Tools page</a>
|
9 |
-
</p>
|
10 |
-
<hr>
|
11 |
-
|
12 |
-
<h2>Right to view & export data</h2>
|
13 |
-
<p>
|
14 |
-
Your customers have the right to review and export their personal data.
|
15 |
-
|
16 |
-
<label for="gdpr_export_action">Select what happens if a customer wishes to view or export their personal data</label>
|
17 |
-
|
18 |
-
<select class="gdpr-select js-gdpr-conditional" name="gdpr_export_action">
|
19 |
-
<?= gdpr('view')->render('global/export-action', compact('exportAction')); ?>
|
20 |
-
</select>
|
21 |
-
<span class="hidden js-gdpr-export-action-email">
|
22 |
-
<label for="export_action_email">
|
23 |
-
<?= _x('Enter the email address to notify', '(Admin)', 'gdpr-framework'); ?>
|
24 |
-
</label>
|
25 |
-
<input
|
26 |
-
type="email"
|
27 |
-
id="gdpr_export_action_email"
|
28 |
-
name="gdpr_export_action_email"
|
29 |
-
placeholder="<?= __('Email address', 'gdpr-framework'); ?>"
|
30 |
-
value="<?= esc_attr($exportActionEmail); ?>"
|
31 |
-
/>
|
32 |
-
</span>
|
33 |
-
</p>
|
34 |
-
<hr>
|
35 |
-
|
36 |
-
<h2>Right to be forgotten</h2>
|
37 |
-
<p>
|
38 |
-
Your customers have the right to request deleting their personal data.
|
39 |
-
|
40 |
-
<label for="gdpr_delete_action">Select what happens if a customer wishes to delete their personal data</label>
|
41 |
-
|
42 |
-
<select class="gdpr-select js-gdpr-conditional" name="gdpr_delete_action">
|
43 |
-
<?= gdpr('view')->render('global/delete-action', compact('deleteAction')); ?>
|
44 |
-
</select>
|
45 |
-
|
46 |
-
<span class="hidden js-gdpr-delete-action-reassign">
|
47 |
-
<label for="gdpr_delete_action_reassign">If the user has created any content (posts or pages), should it be deleted or reassigned?</label>
|
48 |
-
<select id="gdpr_delete_action_reassign" name="gdpr_delete_action_reassign" class="gdpr-select js-gdpr-conditional">
|
49 |
-
<option value="delete" <?= selected($reassign, 'delete'); ?>>
|
50 |
-
<?= _x('Delete content', '(Admin)', 'gdpr-framework'); ?>
|
51 |
-
</option>
|
52 |
-
<option value="reassign" <?= selected($reassign, 'reassign'); ?> data-show=".js-gdpr-delete-action-reassign-user">
|
53 |
-
<?= _x('Reassign content to a user', '(Admin)', 'gdpr-framework'); ?>
|
54 |
-
</option>
|
55 |
-
</select>
|
56 |
-
</span>
|
57 |
-
|
58 |
-
<span class="hidden js-gdpr-delete-action-reassign-user">
|
59 |
-
<label for="gdpr_delete_action_reassign_user">Select the user to reassign content to</label>
|
60 |
-
<?php wp_dropdown_users([
|
61 |
-
'name' => 'gdpr_delete_action_reassign_user',
|
62 |
-
'show_option_none' => _x('— Select —', '(Admin)', 'gdpr-framework'),
|
63 |
-
'option_none_value' => '0',
|
64 |
-
'selected' => $reassignUser,
|
65 |
-
'class' => 'js-gdpr-select2 gdpr-select',
|
66 |
-
'id' => 'gdpr_delete_action_reassign_user',
|
67 |
-
'role__in' => apply_filters('gdpr/options/reassign/roles', ['administrator', 'editor']),
|
68 |
-
]); ?>
|
69 |
-
</span>
|
70 |
-
|
71 |
-
<span class="hidden js-gdpr-delete-action-email">
|
72 |
-
<label for="delete_action_email">
|
73 |
-
<?= _x('Enter the email address to notify', '(Admin)', 'gdpr-framework'); ?>
|
74 |
-
</label>
|
75 |
-
<input
|
76 |
-
type="email"
|
77 |
-
id="gdpr_delete_action_email"
|
78 |
-
name="gdpr_delete_action_email"
|
79 |
-
placeholder="<?= __('Email address', 'gdpr-framework'); ?>"
|
80 |
-
value="<?= esc_attr($deleteActionEmail); ?>"
|
81 |
-
/>
|
82 |
-
</span>
|
83 |
-
</p>
|
84 |
-
|
85 |
-
<hr>
|
86 |
-
<br>
|
87 |
-
<input type="submit" class="button button-gdpr button-right" value="Save »"/>
|
1 |
+
<h1>
|
2 |
+
Configuration (2/2)
|
3 |
+
</h1>
|
4 |
+
<h2>✔ Privacy Tools page configured!</h2>
|
5 |
+
<p>
|
6 |
+
You can take a look at the Privacy Tools page <a href="<?= $privacyToolsPageUrl; ?>" target="_blank">here</a>. <br>
|
7 |
+
<br>
|
8 |
+
<a href="<?= gdpr('helpers')->docs('guide/privacy-tools-page-accessing-exporting-and-deleting-personal-data/'); ?>" target="_blank">Read more about the Privacy Tools page</a>
|
9 |
+
</p>
|
10 |
+
<hr>
|
11 |
+
|
12 |
+
<h2>Right to view & export data</h2>
|
13 |
+
<p>
|
14 |
+
Your customers have the right to review and export their personal data.
|
15 |
+
|
16 |
+
<label for="gdpr_export_action">Select what happens if a customer wishes to view or export their personal data</label>
|
17 |
+
|
18 |
+
<select class="gdpr-select js-gdpr-conditional" name="gdpr_export_action">
|
19 |
+
<?= gdpr('view')->render('global/export-action', compact('exportAction')); ?>
|
20 |
+
</select>
|
21 |
+
<span class="hidden js-gdpr-export-action-email">
|
22 |
+
<label for="export_action_email">
|
23 |
+
<?= _x('Enter the email address to notify', '(Admin)', 'gdpr-framework'); ?>
|
24 |
+
</label>
|
25 |
+
<input
|
26 |
+
type="email"
|
27 |
+
id="gdpr_export_action_email"
|
28 |
+
name="gdpr_export_action_email"
|
29 |
+
placeholder="<?= __('Email address', 'gdpr-framework'); ?>"
|
30 |
+
value="<?= esc_attr($exportActionEmail); ?>"
|
31 |
+
/>
|
32 |
+
</span>
|
33 |
+
</p>
|
34 |
+
<hr>
|
35 |
+
|
36 |
+
<h2>Right to be forgotten</h2>
|
37 |
+
<p>
|
38 |
+
Your customers have the right to request deleting their personal data.
|
39 |
+
|
40 |
+
<label for="gdpr_delete_action">Select what happens if a customer wishes to delete their personal data</label>
|
41 |
+
|
42 |
+
<select class="gdpr-select js-gdpr-conditional" name="gdpr_delete_action">
|
43 |
+
<?= gdpr('view')->render('global/delete-action', compact('deleteAction')); ?>
|
44 |
+
</select>
|
45 |
+
|
46 |
+
<span class="hidden js-gdpr-delete-action-reassign">
|
47 |
+
<label for="gdpr_delete_action_reassign">If the user has created any content (posts or pages), should it be deleted or reassigned?</label>
|
48 |
+
<select id="gdpr_delete_action_reassign" name="gdpr_delete_action_reassign" class="gdpr-select js-gdpr-conditional">
|
49 |
+
<option value="delete" <?= selected($reassign, 'delete'); ?>>
|
50 |
+
<?= _x('Delete content', '(Admin)', 'gdpr-framework'); ?>
|
51 |
+
</option>
|
52 |
+
<option value="reassign" <?= selected($reassign, 'reassign'); ?> data-show=".js-gdpr-delete-action-reassign-user">
|
53 |
+
<?= _x('Reassign content to a user', '(Admin)', 'gdpr-framework'); ?>
|
54 |
+
</option>
|
55 |
+
</select>
|
56 |
+
</span>
|
57 |
+
|
58 |
+
<span class="hidden js-gdpr-delete-action-reassign-user">
|
59 |
+
<label for="gdpr_delete_action_reassign_user">Select the user to reassign content to</label>
|
60 |
+
<?php wp_dropdown_users([
|
61 |
+
'name' => 'gdpr_delete_action_reassign_user',
|
62 |
+
'show_option_none' => _x('— Select —', '(Admin)', 'gdpr-framework'),
|
63 |
+
'option_none_value' => '0',
|
64 |
+
'selected' => $reassignUser,
|
65 |
+
'class' => 'js-gdpr-select2 gdpr-select',
|
66 |
+
'id' => 'gdpr_delete_action_reassign_user',
|
67 |
+
'role__in' => apply_filters('gdpr/options/reassign/roles', ['administrator', 'editor']),
|
68 |
+
]); ?>
|
69 |
+
</span>
|
70 |
+
|
71 |
+
<span class="hidden js-gdpr-delete-action-email">
|
72 |
+
<label for="delete_action_email">
|
73 |
+
<?= _x('Enter the email address to notify', '(Admin)', 'gdpr-framework'); ?>
|
74 |
+
</label>
|
75 |
+
<input
|
76 |
+
type="email"
|
77 |
+
id="gdpr_delete_action_email"
|
78 |
+
name="gdpr_delete_action_email"
|
79 |
+
placeholder="<?= __('Email address', 'gdpr-framework'); ?>"
|
80 |
+
value="<?= esc_attr($deleteActionEmail); ?>"
|
81 |
+
/>
|
82 |
+
</span>
|
83 |
+
</p>
|
84 |
+
|
85 |
+
<hr>
|
86 |
+
<br>
|
87 |
+
<input type="submit" class="button button-gdpr button-right" value="Save »"/>
|
views/installer/steps/consent.php
CHANGED
@@ -1,87 +1,87 @@
|
|
1 |
-
<h1>
|
2 |
-
Forms and Consent
|
3 |
-
</h1>
|
4 |
-
|
5 |
-
<h2>Introduction</h2>
|
6 |
-
|
7 |
-
<p>
|
8 |
-
GDPR brings very strict rules for gathering and processing personal data. The most important thing to remember is that
|
9 |
-
you need to have <strong>legal grounds</strong> for each and every type of data you gather and process. If you are not
|
10 |
-
familiar with what this means, we strongly recommend you read this post from the guide: <br>
|
11 |
-
<a href="<?= gdpr('helpers')->docs('guide/legal-grounds-for-processing-data/'); ?>" target="_blank">Consent and other legal grounds for processing data</a>
|
12 |
-
</p>
|
13 |
-
|
14 |
-
<p>
|
15 |
-
Under GDPR, <strong>all forms</strong> require special attention. You'll need to explain why you gather the data and
|
16 |
-
what you do with it. And if there are no other legal grounds, you'll need to ask for consent.
|
17 |
-
Note that your customers must also be able to <strong>withdraw</strong> each consent they have given.
|
18 |
-
</p>
|
19 |
-
|
20 |
-
<h2>WordPress forms</h2>
|
21 |
-
|
22 |
-
<p>
|
23 |
-
For <strong>posting comments</strong> and <strong>registering accounts</strong>,
|
24 |
-
you will need to ask your customers consent to the Privacy Policy. If your site allows comments or registration,
|
25 |
-
the GDPR Framework will automatically add consent checkboxes to the respective forms.
|
26 |
-
</p>
|
27 |
-
|
28 |
-
<h2>Withdrawing consent</h2>
|
29 |
-
|
30 |
-
<p>
|
31 |
-
Your customers can withdraw their given consents on the <a href="<?= $privacyToolsPageUrl; ?>" target="blank">Privacy Tools Page</a>.
|
32 |
-
</p>
|
33 |
-
<br>
|
34 |
-
<hr>
|
35 |
-
|
36 |
-
<?php if ($hasGravityForms): ?>
|
37 |
-
<h2>✔ Gravity Forms</h2>
|
38 |
-
<p>
|
39 |
-
We have detected that Gravity Forms is enabled on your site.
|
40 |
-
We're releasing Gravity Forms compatibility to the GDPR Framework shortly.
|
41 |
-
<!--
|
42 |
-
<a href="<?= gdpr('helpers')->docs('guide/making-your-forms-compliant/'); ?>" target="_blank">Read about making your Gravity forms GDPR compliant.</a>
|
43 |
-
-->
|
44 |
-
</p>
|
45 |
-
<hr>
|
46 |
-
<?php endif; ?>
|
47 |
-
|
48 |
-
<h2>✔ Contact Form 7</h2>
|
49 |
-
<p>
|
50 |
-
We have detected that Contact Form 7 is enabled on your site. The GDPR Framework is
|
51 |
-
compatible with Contact Form 7.
|
52 |
-
</p>
|
53 |
-
<p>
|
54 |
-
Each of the forms requires either a <strong>disclaimer</strong> or a <strong>consent checkbox</strong>.
|
55 |
-
We have created some tools to help you out!
|
56 |
-
</p>
|
57 |
-
<p>
|
58 |
-
<a href="<?= gdpr('helpers')->docs('guide/making-your-forms-compliant/'); ?>" target="_blank">Read about making your Contact Form 7 forms GDPR compliant.</a>
|
59 |
-
</p>
|
60 |
-
|
61 |
-
<hr>
|
62 |
-
|
63 |
-
<h2>Custom forms</h2>
|
64 |
-
<p>
|
65 |
-
<label for="gdpr_has_contact_forms">
|
66 |
-
<input
|
67 |
-
type="checkbox"
|
68 |
-
name="gdpr_has_contact_forms"
|
69 |
-
id="gdpr_has_contact_forms"
|
70 |
-
class="js-gdpr-conditional"
|
71 |
-
data-show=".gdpr-contact-custom"
|
72 |
-
value="yes"
|
73 |
-
>
|
74 |
-
I have custom forms on my website (e.g. contact forms, newsletter signups, lottery signups)
|
75 |
-
</label>
|
76 |
-
</p>
|
77 |
-
<p class="gdpr-contact-custom hidden">
|
78 |
-
Each of the forms on your site requires either a <strong>disclaimer</strong> or a <strong>consent checkbox</strong>. <br>
|
79 |
-
We cannot do this automatically - you need to do it yourself or request help from a developer. However, we have created some
|
80 |
-
tools to help you out!
|
81 |
-
<br>
|
82 |
-
<a href="<?= gdpr('helpers')->docs('guide/making-your-forms-compliant/'); ?>" target="_blank">Read about integrating custom forms</a>
|
83 |
-
</p>
|
84 |
-
|
85 |
-
<hr>
|
86 |
-
<br>
|
87 |
-
<input type="submit" class="button button-gdpr button-right" value="Continue »" />
|
1 |
+
<h1>
|
2 |
+
Forms and Consent
|
3 |
+
</h1>
|
4 |
+
|
5 |
+
<h2>Introduction</h2>
|
6 |
+
|
7 |
+
<p>
|
8 |
+
GDPR brings very strict rules for gathering and processing personal data. The most important thing to remember is that
|
9 |
+
you need to have <strong>legal grounds</strong> for each and every type of data you gather and process. If you are not
|
10 |
+
familiar with what this means, we strongly recommend you read this post from the guide: <br>
|
11 |
+
<a href="<?= gdpr('helpers')->docs('guide/legal-grounds-for-processing-data/'); ?>" target="_blank">Consent and other legal grounds for processing data</a>
|
12 |
+
</p>
|
13 |
+
|
14 |
+
<p>
|
15 |
+
Under GDPR, <strong>all forms</strong> require special attention. You'll need to explain why you gather the data and
|
16 |
+
what you do with it. And if there are no other legal grounds, you'll need to ask for consent.
|
17 |
+
Note that your customers must also be able to <strong>withdraw</strong> each consent they have given.
|
18 |
+
</p>
|
19 |
+
|
20 |
+
<h2>WordPress forms</h2>
|
21 |
+
|
22 |
+
<p>
|
23 |
+
For <strong>posting comments</strong> and <strong>registering accounts</strong>,
|
24 |
+
you will need to ask your customers consent to the Privacy Policy. If your site allows comments or registration,
|
25 |
+
the GDPR Framework will automatically add consent checkboxes to the respective forms.
|
26 |
+
</p>
|
27 |
+
|
28 |
+
<h2>Withdrawing consent</h2>
|
29 |
+
|
30 |
+
<p>
|
31 |
+
Your customers can withdraw their given consents on the <a href="<?= $privacyToolsPageUrl; ?>" target="blank">Privacy Tools Page</a>.
|
32 |
+
</p>
|
33 |
+
<br>
|
34 |
+
<hr>
|
35 |
+
|
36 |
+
<?php if ($hasGravityForms): ?>
|
37 |
+
<h2>✔ Gravity Forms</h2>
|
38 |
+
<p>
|
39 |
+
We have detected that Gravity Forms is enabled on your site.
|
40 |
+
We're releasing Gravity Forms compatibility to the GDPR Framework shortly.
|
41 |
+
<!--
|
42 |
+
<a href="<?= gdpr('helpers')->docs('guide/making-your-forms-compliant/'); ?>" target="_blank">Read about making your Gravity forms GDPR compliant.</a>
|
43 |
+
-->
|
44 |
+
</p>
|
45 |
+
<hr>
|
46 |
+
<?php endif; ?>
|
47 |
+
|
48 |
+
<h2>✔ Contact Form 7</h2>
|
49 |
+
<p>
|
50 |
+
We have detected that Contact Form 7 is enabled on your site. The GDPR Framework is
|
51 |
+
compatible with Contact Form 7.
|
52 |
+
</p>
|
53 |
+
<p>
|
54 |
+
Each of the forms requires either a <strong>disclaimer</strong> or a <strong>consent checkbox</strong>.
|
55 |
+
We have created some tools to help you out!
|
56 |
+
</p>
|
57 |
+
<p>
|
58 |
+
<a href="<?= gdpr('helpers')->docs('guide/making-your-forms-compliant/'); ?>" target="_blank">Read about making your Contact Form 7 forms GDPR compliant.</a>
|
59 |
+
</p>
|
60 |
+
|
61 |
+
<hr>
|
62 |
+
|
63 |
+
<h2>Custom forms</h2>
|
64 |
+
<p>
|
65 |
+
<label for="gdpr_has_contact_forms">
|
66 |
+
<input
|
67 |
+
type="checkbox"
|
68 |
+
name="gdpr_has_contact_forms"
|
69 |
+
id="gdpr_has_contact_forms"
|
70 |
+
class="js-gdpr-conditional"
|
71 |
+
data-show=".gdpr-contact-custom"
|
72 |
+
value="yes"
|
73 |
+
>
|
74 |
+
I have custom forms on my website (e.g. contact forms, newsletter signups, lottery signups)
|
75 |
+
</label>
|
76 |
+
</p>
|
77 |
+
<p class="gdpr-contact-custom hidden">
|
78 |
+
Each of the forms on your site requires either a <strong>disclaimer</strong> or a <strong>consent checkbox</strong>. <br>
|
79 |
+
We cannot do this automatically - you need to do it yourself or request help from a developer. However, we have created some
|
80 |
+
tools to help you out!
|
81 |
+
<br>
|
82 |
+
<a href="<?= gdpr('helpers')->docs('guide/making-your-forms-compliant/'); ?>" target="_blank">Read about integrating custom forms</a>
|
83 |
+
</p>
|
84 |
+
|
85 |
+
<hr>
|
86 |
+
<br>
|
87 |
+
<input type="submit" class="button button-gdpr button-right" value="Continue »" />
|
views/installer/steps/disclaimer.php
CHANGED
@@ -1,21 +1,21 @@
|
|
1 |
-
<h2>
|
2 |
-
Very Important Legal Stuff!
|
3 |
-
</h2>
|
4 |
-
<hr>
|
5 |
-
<p class="gdpr-disclaimer">
|
6 |
-
<strong>Disclaimer</strong><br>
|
7 |
-
Using The GDPR Framework does NOT guarantee compliance to GDPR.
|
8 |
-
By using this plugin, you agree to this disclaimer.
|
9 |
-
These templates and guides provided to you are drafted by legal professionals in order for you to understand your obligations better,
|
10 |
-
but they are NOT meant to constitute client-attorney relationship or personalized legal advice.
|
11 |
-
Codelight is not eligible for any claim or action based on any information or functionality provided by this plugin.
|
12 |
-
We expressly disclaim all liability in respect of usage of this plugin.
|
13 |
-
This plugin gives you general information and tools, but is NOT meant to serve as complete compliance package.
|
14 |
-
For compliance audit or further help <a href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" target="_blank">contact legal professionals</a>.
|
15 |
-
As each business and situation is unique, you might need to modify, add or delete information in these templates.
|
16 |
-
In addition to this, you will need audit all your processing activities for achieving compliance to GDPR.
|
17 |
-
Compliance to GDPR is risk based ongoing process.
|
18 |
-
We are here to get you started.
|
19 |
-
</p>
|
20 |
-
<hr>
|
21 |
-
<input type="submit" class="button button-gdpr button-large button-gdpr-large button-center" value="<?= _x('I accept', '(Admin)', 'gdpr-framework'); ?>" />
|
1 |
+
<h2>
|
2 |
+
Very Important Legal Stuff!
|
3 |
+
</h2>
|
4 |
+
<hr>
|
5 |
+
<p class="gdpr-disclaimer">
|
6 |
+
<strong>Disclaimer</strong><br>
|
7 |
+
Using The GDPR Framework does NOT guarantee compliance to GDPR.
|
8 |
+
By using this plugin, you agree to this disclaimer.
|
9 |
+
These templates and guides provided to you are drafted by legal professionals in order for you to understand your obligations better,
|
10 |
+
but they are NOT meant to constitute client-attorney relationship or personalized legal advice.
|
11 |
+
Codelight is not eligible for any claim or action based on any information or functionality provided by this plugin.
|
12 |
+
We expressly disclaim all liability in respect of usage of this plugin.
|
13 |
+
This plugin gives you general information and tools, but is NOT meant to serve as complete compliance package.
|
14 |
+
For compliance audit or further help <a href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" target="_blank">contact legal professionals</a>.
|
15 |
+
As each business and situation is unique, you might need to modify, add or delete information in these templates.
|
16 |
+
In addition to this, you will need audit all your processing activities for achieving compliance to GDPR.
|
17 |
+
Compliance to GDPR is risk based ongoing process.
|
18 |
+
We are here to get you started.
|
19 |
+
</p>
|
20 |
+
<hr>
|
21 |
+
<input type="submit" class="button button-gdpr button-large button-gdpr-large button-center" value="<?= _x('I accept', '(Admin)', 'gdpr-framework'); ?>" />
|
views/installer/steps/finish.php
CHANGED
@@ -1,69 +1,69 @@
|
|
1 |
-
<h2 class="align-center">
|
2 |
-
All done!
|
3 |
-
</h2>
|
4 |
-
<p class="align-center">
|
5 |
-
Congrats! You've just taken a huge step towards GDPR compliance!
|
6 |
-
</p>
|
7 |
-
|
8 |
-
<section class="section">
|
9 |
-
<h3 class="align-center">
|
10 |
-
<?= _x('Need more info?', '(Admin)', 'gdpr-framework'); ?>
|
11 |
-
</h3>
|
12 |
-
<div class="row">
|
13 |
-
<div class="col">
|
14 |
-
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/1.png');"></div>
|
15 |
-
<a class="button button-primary" href="<?= gdpr('helpers')->docs('wordpress-site-owners-guide-to-gdpr/'); ?>" target="_blank">
|
16 |
-
<?= _x('Site Owner\'s guide to GDPR', '(Admin)', 'gdpr-framework'); ?>
|
17 |
-
</a>
|
18 |
-
<p>
|
19 |
-
<?= _x('Read the full guide on GDPR compliance.', '(Admin)', 'gdpr-framework'); ?>
|
20 |
-
</p>
|
21 |
-
</div>
|
22 |
-
<div class="col">
|
23 |
-
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/2.png');"></div>
|
24 |
-
<a class="button button-primary" href="<?= gdpr('helpers')->docs('knowledge-base'); ?>" target="_blank">
|
25 |
-
<?= _x('Knowledge base', '(Admin)', 'gdpr-framework'); ?>
|
26 |
-
</a>
|
27 |
-
<p>
|
28 |
-
<?= _x('Check out the knowledge base for common questions and answers.', '(Admin)', 'gdpr-framework'); ?>
|
29 |
-
</p>
|
30 |
-
</div>
|
31 |
-
<div class="col">
|
32 |
-
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/3.png');"></div>
|
33 |
-
<a class="button button-primary" href="<?= gdpr('helpers')->docs('developer-docs'); ?>" target="_blank">
|
34 |
-
<?= _x('Developer\'s guide to GDPR', '(Admin)', 'gdpr-framework'); ?>
|
35 |
-
</a>
|
36 |
-
<p>
|
37 |
-
<?= _x('We have a thorough guide to help making custom sites compliant.', '(Admin)', 'gdpr-framework'); ?>
|
38 |
-
</p>
|
39 |
-
</div>
|
40 |
-
</div>
|
41 |
-
</section>
|
42 |
-
|
43 |
-
<section class="section">
|
44 |
-
<h3 class="align-center">
|
45 |
-
<?= _x('Need help?', '(Admin)', 'gdpr-framework'); ?>
|
46 |
-
</h3>
|
47 |
-
<div class="row">
|
48 |
-
<div class="col">
|
49 |
-
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/4.png');"></div>
|
50 |
-
<a class="button button-primary" href="https://wordpress.org/support/plugin/gdpr-framework" target="_blank">
|
51 |
-
<?= _x('Submit a support request', '(Admin)', 'gdpr-framework'); ?>
|
52 |
-
</a>
|
53 |
-
<p>
|
54 |
-
<?= _x('Found a bug or problem with the plugin? Post in the wordpress.org support forum.', '(Admin)', 'gdpr-framework'); ?>
|
55 |
-
</p>
|
56 |
-
</div>
|
57 |
-
<div class="col">
|
58 |
-
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/5.png');"></div>
|
59 |
-
<a class="button button-primary" href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" target="_blank">
|
60 |
-
<?= _x('Request a consultation', '(Admin)', 'gdpr-framework'); ?>
|
61 |
-
</a>
|
62 |
-
<p>
|
63 |
-
<?= _x('Need development or legal assistance in making your site compliant? We can help!', '(Admin)', 'gdpr-framework'); ?>
|
64 |
-
</p>
|
65 |
-
</div>
|
66 |
-
</div>
|
67 |
-
</section>
|
68 |
-
|
69 |
-
<input type="submit" class="button button-gdpr button-large button-gdpr-large button-center" value="Back to dashboard"" />
|
1 |
+
<h2 class="align-center">
|
2 |
+
All done!
|
3 |
+
</h2>
|
4 |
+
<p class="align-center">
|
5 |
+
Congrats! You've just taken a huge step towards GDPR compliance!
|
6 |
+
</p>
|
7 |
+
|
8 |
+
<section class="section">
|
9 |
+
<h3 class="align-center">
|
10 |
+
<?= _x('Need more info?', '(Admin)', 'gdpr-framework'); ?>
|
11 |
+
</h3>
|
12 |
+
<div class="row">
|
13 |
+
<div class="col">
|
14 |
+
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/1.png');"></div>
|
15 |
+
<a class="button button-primary" href="<?= gdpr('helpers')->docs('wordpress-site-owners-guide-to-gdpr/'); ?>" target="_blank">
|
16 |
+
<?= _x('Site Owner\'s guide to GDPR', '(Admin)', 'gdpr-framework'); ?>
|
17 |
+
</a>
|
18 |
+
<p>
|
19 |
+
<?= _x('Read the full guide on GDPR compliance.', '(Admin)', 'gdpr-framework'); ?>
|
20 |
+
</p>
|
21 |
+
</div>
|
22 |
+
<div class="col">
|
23 |
+
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/2.png');"></div>
|
24 |
+
<a class="button button-primary" href="<?= gdpr('helpers')->docs('knowledge-base'); ?>" target="_blank">
|
25 |
+
<?= _x('Knowledge base', '(Admin)', 'gdpr-framework'); ?>
|
26 |
+
</a>
|
27 |
+
<p>
|
28 |
+
<?= _x('Check out the knowledge base for common questions and answers.', '(Admin)', 'gdpr-framework'); ?>
|
29 |
+
</p>
|
30 |
+
</div>
|
31 |
+
<div class="col">
|
32 |
+
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/3.png');"></div>
|
33 |
+
<a class="button button-primary" href="<?= gdpr('helpers')->docs('developer-docs'); ?>" target="_blank">
|
34 |
+
<?= _x('Developer\'s guide to GDPR', '(Admin)', 'gdpr-framework'); ?>
|
35 |
+
</a>
|
36 |
+
<p>
|
37 |
+
<?= _x('We have a thorough guide to help making custom sites compliant.', '(Admin)', 'gdpr-framework'); ?>
|
38 |
+
</p>
|
39 |
+
</div>
|
40 |
+
</div>
|
41 |
+
</section>
|
42 |
+
|
43 |
+
<section class="section">
|
44 |
+
<h3 class="align-center">
|
45 |
+
<?= _x('Need help?', '(Admin)', 'gdpr-framework'); ?>
|
46 |
+
</h3>
|
47 |
+
<div class="row">
|
48 |
+
<div class="col">
|
49 |
+
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/4.png');"></div>
|
50 |
+
<a class="button button-primary" href="https://wordpress.org/support/plugin/gdpr-framework" target="_blank">
|
51 |
+
<?= _x('Submit a support request', '(Admin)', 'gdpr-framework'); ?>
|
52 |
+
</a>
|
53 |
+
<p>
|
54 |
+
<?= _x('Found a bug or problem with the plugin? Post in the wordpress.org support forum.', '(Admin)', 'gdpr-framework'); ?>
|
55 |
+
</p>
|
56 |
+
</div>
|
57 |
+
<div class="col">
|
58 |
+
<div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/5.png');"></div>
|
59 |
+
<a class="button button-primary" href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" target="_blank">
|
60 |
+
<?= _x('Request a consultation', '(Admin)', 'gdpr-framework'); ?>
|
61 |
+
</a>
|
62 |
+
<p>
|
63 |
+
<?= _x('Need development or legal assistance in making your site compliant? We can help!', '(Admin)', 'gdpr-framework'); ?>
|
64 |
+
</p>
|
65 |
+
</div>
|
66 |
+
</div>
|
67 |
+
</section>
|
68 |
+
|
69 |
+
<input type="submit" class="button button-gdpr button-large button-gdpr-large button-center" value="Back to dashboard"" />
|
views/installer/steps/integrations.php
CHANGED
@@ -1,52 +1,52 @@
|
|
1 |
-
<h1>
|
2 |
-
Integrations
|
3 |
-
</h1>
|
4 |
-
|
5 |
-
<h2>Theme compatibility</h2>
|
6 |
-
<p>
|
7 |
-
The links to Privacy Policy and Privacy Tools should be visible somewhere on your site.
|
8 |
-
A good place would be your site's footer.
|
9 |
-
</p>
|
10 |
-
<?php if ($isThemeSupported): ?>
|
11 |
-
<p>
|
12 |
-
We have detected that you are running <strong><?= esc_html(ucfirst($currentTheme)); ?> theme</strong>. We can automatically add the links to your site's footer if you'd like.
|
13 |
-
<label for="gdpr_enable_theme_compatibility">
|
14 |
-
<input
|
15 |
-
type="checkbox"
|
16 |
-
id="gdpr_enable_theme_compatibility"
|
17 |
-
name="gdpr_enable_theme_compatibility"
|
18 |
-
value="yes"
|
19 |
-
<?= checked($enableThemeCompatibility, true); ?>
|
20 |
-
/>
|
21 |
-
<?= _x('Automatically add Privacy Policy and Privacy Tools links to your site footer.', '(Admin)', 'gdpr-framework'); ?>
|
22 |
-
</label>
|
23 |
-
</p>
|
24 |
-
<?php endif; ?>
|
25 |
-
<hr>
|
26 |
-
|
27 |
-
<?php if ($hasWooCommerce): ?>
|
28 |
-
<h2>WooCommerce compatibility</h2>
|
29 |
-
<p>
|
30 |
-
TBD
|
31 |
-
</p>
|
32 |
-
<hr>
|
33 |
-
<?php endif; ?>
|
34 |
-
|
35 |
-
<?php if ($hasEDD): ?>
|
36 |
-
<h2>Easy Digital Downloads compatibility</h2>
|
37 |
-
<p>
|
38 |
-
TBD
|
39 |
-
</p>
|
40 |
-
<hr>
|
41 |
-
<?php endif; ?>
|
42 |
-
|
43 |
-
<h2>Custom development</h2>
|
44 |
-
<p>
|
45 |
-
If you've had a developer build any custom features for your site, you should also make sure that everything is properly GDPR-compliant.
|
46 |
-
<br>
|
47 |
-
<a href="<?= gdpr('helpers')->docs('developer-docs/'); ?>" target="_blank">Read about making custom-built sites and features GDPR-compliant.</a>
|
48 |
-
</p>
|
49 |
-
|
50 |
-
<hr>
|
51 |
-
<br>
|
52 |
-
<input type="submit" class="button button-gdpr button-right" value="Continue »" />
|
1 |
+
<h1>
|
2 |
+
Integrations
|
3 |
+
</h1>
|
4 |
+
|
5 |
+
<h2>Theme compatibility</h2>
|
6 |
+
<p>
|
7 |
+
The links to Privacy Policy and Privacy Tools should be visible somewhere on your site.
|
8 |
+
A good place would be your site's footer.
|
9 |
+
</p>
|
10 |
+
<?php if ($isThemeSupported): ?>
|
11 |
+
<p>
|
12 |
+
We have detected that you are running <strong><?= esc_html(ucfirst($currentTheme)); ?> theme</strong>. We can automatically add the links to your site's footer if you'd like.
|
13 |
+
<label for="gdpr_enable_theme_compatibility">
|
14 |
+
<input
|
15 |
+
type="checkbox"
|
16 |
+
id="gdpr_enable_theme_compatibility"
|
17 |
+
name="gdpr_enable_theme_compatibility"
|
18 |
+
value="yes"
|
19 |
+
<?= checked($enableThemeCompatibility, true); ?>
|
20 |
+
/>
|
21 |
+
<?= _x('Automatically add Privacy Policy and Privacy Tools links to your site footer.', '(Admin)', 'gdpr-framework'); ?>
|
22 |
+
</label>
|
23 |
+
</p>
|
24 |
+
<?php endif; ?>
|
25 |
+
<hr>
|
26 |
+
|
27 |
+
<?php if ($hasWooCommerce): ?>
|
28 |
+
<h2>WooCommerce compatibility</h2>
|
29 |
+
<p>
|
30 |
+
TBD
|
31 |
+
</p>
|
32 |
+
<hr>
|
33 |
+
<?php endif; ?>
|
34 |
+
|
35 |
+
<?php if ($hasEDD): ?>
|
36 |
+
<h2>Easy Digital Downloads compatibility</h2>
|
37 |
+
<p>
|
38 |
+
TBD
|
39 |
+
</p>
|
40 |
+
<hr>
|
41 |
+
<?php endif; ?>
|
42 |
+
|
43 |
+
<h2>Custom development</h2>
|
44 |
+
<p>
|
45 |
+
If you've had a developer build any custom features for your site, you should also make sure that everything is properly GDPR-compliant.
|
46 |
+
<br>
|
47 |
+
<a href="<?= gdpr('helpers')->docs('developer-docs/'); ?>" target="_blank">Read about making custom-built sites and features GDPR-compliant.</a>
|
48 |
+
</p>
|
49 |
+
|
50 |
+
<hr>
|
51 |
+
<br>
|
52 |
+
<input type="submit" class="button button-gdpr button-right" value="Continue »" />
|
views/installer/steps/policy-contents.php
CHANGED
@@ -1,25 +1,25 @@
|
|
1 |
-
<h1>
|
2 |
-
Privacy Policy (2/2)
|
3 |
-
</h1>
|
4 |
-
|
5 |
-
<h2>✔ Privacy Policy configured!</h2>
|
6 |
-
<?php if ($policyGenerated): ?>
|
7 |
-
<p>
|
8 |
-
Take a look at your new Privacy Policy page <a href="<?= $policyUrl; ?>" target="_blank">here</a>! <br>
|
9 |
-
Make sure you read it - you will need to know all this anyway. <br><br>
|
10 |
-
<strong>Important!</strong><br> The contents of your Privacy Policy depend on what your website (and
|
11 |
-
business) does exactly. Note that this is just a template. <strong>You will need to modify it to suit your needs</strong>. To do that,
|
12 |
-
go to the <a href="<?= $editPolicyUrl; ?>" target="_blank">admin Privacy Policy page</a> and just edit the contents of your policy.
|
13 |
-
</p>
|
14 |
-
<?php else: ?>
|
15 |
-
<p>
|
16 |
-
It looks like you selected an already existing Privacy Policy. <br>
|
17 |
-
Note that GDPR puts some new requirements on what you need to have in your Privacy Policy. <br>
|
18 |
-
<a href="<?= gdpr('helpers')->docs('guide/setting-up-the-privacy-policy/'); ?>" target="_blank">Read more about the requirements to your Privacy Policy</a>
|
19 |
-
</p>
|
20 |
-
<?php endif; ?>
|
21 |
-
|
22 |
-
<hr>
|
23 |
-
<br>
|
24 |
-
|
25 |
-
<input type="submit" class="button button-gdpr button-right" value="Save »" />
|
1 |
+
<h1>
|
2 |
+
Privacy Policy (2/2)
|
3 |
+
</h1>
|
4 |
+
|
5 |
+
<h2>✔ Privacy Policy configured!</h2>
|
6 |
+
<?php if ($policyGenerated): ?>
|
7 |
+
<p>
|
8 |
+
Take a look at your new Privacy Policy page <a href="<?= $policyUrl; ?>" target="_blank">here</a>! <br>
|
9 |
+
Make sure you read it - you will need to know all this anyway. <br><br>
|
10 |
+
<strong>Important!</strong><br> The contents of your Privacy Policy depend on what your website (and
|
11 |
+
business) does exactly. Note that this is just a template. <strong>You will need to modify it to suit your needs</strong>. To do that,
|
12 |
+
go to the <a href="<?= $editPolicyUrl; ?>" target="_blank">admin Privacy Policy page</a> and just edit the contents of your policy.
|
13 |
+
</p>
|
14 |
+
<?php else: ?>
|
15 |
+
<p>
|
16 |
+
It looks like you selected an already existing Privacy Policy. <br>
|
17 |
+
Note that GDPR puts some new requirements on what you need to have in your Privacy Policy. <br>
|
18 |
+
<a href="<?= gdpr('helpers')->docs('guide/setting-up-the-privacy-policy/'); ?>" target="_blank">Read more about the requirements to your Privacy Policy</a>
|
19 |
+
</p>
|
20 |
+
<?php endif; ?>
|
21 |
+
|
22 |
+
<hr>
|
23 |
+
<br>
|
24 |
+
|
25 |
+
<input type="submit" class="button button-gdpr button-right" value="Save »" />
|
views/installer/steps/policy-settings.php
CHANGED
@@ -1,185 +1,185 @@
|
|
1 |
-
<h1>
|
2 |
-
Privacy Policy (1/2)
|
3 |
-
</h1>
|
4 |
-
|
5 |
-
<h2>Privacy Policy page</h2>
|
6 |
-
<p>
|
7 |
-
The second major requirement of GDPR is a thorough Privacy Policy that explains all of the rights your customers
|
8 |
-
have and describes how exactly their data is used. We've put together a GDPR-compliant privacy policy template for you.
|
9 |
-
Fill in the fields below and a privacy policy will be generated automatically. Note that you will need to modify it later to suit your website and business. <br>
|
10 |
-
<a href="<?= gdpr('helpers')->docs('guide/setting-up-the-privacy-policy/'); ?>" target="_blank">Read more about the Privacy Policy</a><br><br>
|
11 |
-
If you already have a GDPR-compliant Privacy Policy, simply select the page where it is displayed and skip the rest.
|
12 |
-
<br>
|
13 |
-
</p>
|
14 |
-
|
15 |
-
<fieldset>
|
16 |
-
<label>
|
17 |
-
<input type="radio" name="gdpr_create_policy_page" value="yes" class="js-gdpr-conditional" <?php echo !$policyPage ? 'checked': ''; ?>>
|
18 |
-
Automatically create a new page for Privacy Policy
|
19 |
-
</label>
|
20 |
-
|
21 |
-
<label>
|
22 |
-
<input type="radio" name="gdpr_create_policy_page" value="no" class="js-gdpr-conditional" data-show=".gdpr-select-policy-page" <?php echo $policyPage ? 'checked': ''; ?>> I want to use an existing page
|
23 |
-
</label>
|
24 |
-
</fieldset>
|
25 |
-
|
26 |
-
<p class="gdpr-select-policy-page hidden">
|
27 |
-
<label for="gdpr_policy_page">Select the page where your Privacy Policy will be displayed</label>
|
28 |
-
<?= $policyPageSelector; ?>
|
29 |
-
</p>
|
30 |
-
|
31 |
-
<p>
|
32 |
-
We can generate a somewhat personalized Privacy Policy template for you based on some information you can fill in below.
|
33 |
-
Note that if you're using an existing page, this will overwrite the page contents.
|
34 |
-
|
35 |
-
<label for="gdpr_generate_policy">
|
36 |
-
<input
|
37 |
-
type="checkbox"
|
38 |
-
name="gdpr_generate_policy"
|
39 |
-
id="gdpr_generate_policy"
|
40 |
-
class="js-gdpr-conditional"
|
41 |
-
data-show=".gdpr-generator-fields"
|
42 |
-
value="yes"
|
43 |
-
>
|
44 |
-
Generate Privacy Policy
|
45 |
-
</label>
|
46 |
-
<em>Heads up - this will take some time to configure!</em>
|
47 |
-
</p>
|
48 |
-
|
49 |
-
<hr>
|
50 |
-
|
51 |
-
<div class="gdpr-generator-fields hidden">
|
52 |
-
|
53 |
-
<h2>Company information</h2>
|
54 |
-
<label for="gdpr_company_name">Company legal name</label>
|
55 |
-
<input type="text" id="gdpr_company_name" name="gdpr_company_name" value="<?= esc_attr($companyName); ?>"/>
|
56 |
-
<em>Enter the name of your company. If you are not registered as a company, enter your full name.</em>
|
57 |
-
|
58 |
-
<label for="gdpr_contact_email">Contact email</label>
|
59 |
-
<input type="email" id="gdpr_contact_email" name="gdpr_contact_email" value="<?= esc_attr($contactEmail); ?>"/>
|
60 |
-
<em>
|
61 |
-
Enter the contact email which should be used for GDPR and personal data related inquiries.<br>
|
62 |
-
This email will be displayed in the Privacy Policy.
|
63 |
-
</em>
|
64 |
-
|
65 |
-
<hr>
|
66 |
-
|
67 |
-
<h2>Company location</h2>
|
68 |
-
<label for="gdpr_company_location">Company location</label>
|
69 |
-
<select id="gdpr_company_location" name="gdpr_company_location" class="js-gdpr-select2 gdpr-select js-gdpr-conditional js-gdpr-country-selector">
|
70 |
-
<?= $countryOptions; ?>
|
71 |
-
</select>
|
72 |
-
<em>
|
73 |
-
Select the country where your company is registered. <br>
|
74 |
-
If you are not registered as a company, enter your country of residence.
|
75 |
-
</em>
|
76 |
-
<div class="gdpr-representative hidden">
|
77 |
-
<p>
|
78 |
-
|
79 |
-
If your company is located outside of the EU and the EFTA zone and you do not have a branch inside the EU,
|
80 |
-
GDPR requires you to appoint a representative contact which has to be a person or company located in the EU.
|
81 |
-
<a href="<?= gdpr('helpers')->docs('knowledge-base/do-i-need-to-appoint-an-eu-based-representative/'); ?>" target="_blank">Read more about appointing a representative and your options here</a>.
|
82 |
-
</p>
|
83 |
-
<p>
|
84 |
-
If you have a representative contact, enter the contact details below.
|
85 |
-
|
86 |
-
<label for="gdpr_representative_contact_name">Representative contact name</label>
|
87 |
-
<input type="text" value="<?= esc_attr($representativeContactName); ?>" id="gdpr_representative_contact_name" name="gdpr_representative_contact_name" data />
|
88 |
-
|
89 |
-
<label for="gdpr_representative_contact_email">Representative contact email</label>
|
90 |
-
<input type="email" value="<?= esc_attr($representativeContactEmail); ?>" id="gdpr_representative_contact_email" name="gdpr_representative_contact_email" />
|
91 |
-
|
92 |
-
<label for="gdpr_representative_contact_phone">Representative contact phone</label>
|
93 |
-
<input type="text" value="<?= esc_attr($representativeContactPhone); ?>" id="gdpr_representative_contact_phone" name="gdpr_representative_contact_phone" />
|
94 |
-
|
95 |
-
</p>
|
96 |
-
</div>
|
97 |
-
<br>
|
98 |
-
<hr>
|
99 |
-
|
100 |
-
<h2>Data Protection Authority</h2>
|
101 |
-
<p>
|
102 |
-
You are also obliged to provide the contact of your local supervisory authority.
|
103 |
-
|
104 |
-
<span class="gdpr-representative hidden">
|
105 |
-
<br><br>
|
106 |
-
You are located outside of the EU. This means that you must designate an EU country's data protection authority to be your supervisory authority.
|
107 |
-
Choose the Data Protection Authority of the country where most of your target audience resides. See the <a href="http://ec.europa.eu/justice/data-protection/article-29/structure/data-protection-authorities/index_en.htm" target="_blank">list of contacts here</a>.
|
108 |
-
</span>
|
109 |
-
|
110 |
-
<label for="gdpr_dpa_website">Data Protection Authority website</label>
|
111 |
-
<input type="text" value="<?= esc_attr($dpaWebsite); ?>" id="gdpr_dpa_website" name="gdpr_dpa_website" data-set="<?= esc_attr($dpaWebsite); ?>" />
|
112 |
-
|
113 |
-
<label for="gdpr_dpa_email">Data Protection Authority email</label>
|
114 |
-
<input type="email" value="<?= esc_attr($dpaEmail); ?>" id="gdpr_dpa_email" name="gdpr_dpa_email" data-set="<?= esc_attr($dpaEmail); ?>" />
|
115 |
-
|
116 |
-
<label for="gdpr_dpa_phone">Data Protection Authority phone</label>
|
117 |
-
<input type="text" value="<?= esc_attr($dpaPhone); ?>" id="gdpr_dpa_phone" name="gdpr_dpa_phone" data-set="<?= esc_attr($dpaPhone); ?>" />
|
118 |
-
</p>
|
119 |
-
<script>
|
120 |
-
window.gdprDpaData = <?= $dpaData; ?>;
|
121 |
-
</script>
|
122 |
-
|
123 |
-
<h2>Data Protection Officer</h2>
|
124 |
-
<p>
|
125 |
-
Under some circumstances, GDPR requires you to appoint a Data Protection Officer and display the contacts
|
126 |
-
in your Privacy Policy. If you don't know whether or not you need a DPO, read this article: <a href="<?= gdpr('helpers')->docs('knowledge-base/do-i-need-to-appoint-data-protection-officer-dpo/'); ?>" target="_blank">Do I need a Data Protection Officer?</a>
|
127 |
-
|
128 |
-
<label for="gdpr_has_dpo">
|
129 |
-
<input
|
130 |
-
type="checkbox"
|
131 |
-
name="gdpr_has_dpo"
|
132 |
-
id="gdpr_has_dpo"
|
133 |
-
class="js-gdpr-conditional"
|
134 |
-
data-show=".gdpr-dpo"
|
135 |
-
value="yes"
|
136 |
-
<?= checked($hasDPO, 'yes'); ?>
|
137 |
-
>
|
138 |
-
I have appointed a Data Protection Officer (DPO)
|
139 |
-
</label>
|
140 |
-
</p>
|
141 |
-
<p class="gdpr-dpo hidden">
|
142 |
-
<label for="gdpr_dpo_name">Data Protection Officer name</label>
|
143 |
-
<input type="text" id="gdpr_dpo_name" name="gdpr_dpo_name" value="<?= esc_attr($dpoName); ?>"/>
|
144 |
-
<em>This will be displayed in the Privacy Policy.</em>
|
145 |
-
|
146 |
-
<label for="gdpr_dpo_email">Data Protection Officer email</label>
|
147 |
-
<input type="email" id="gdpr_dpo_email" name="gdpr_dpo_email" value="<?= esc_attr($dpoEmail); ?>"/>
|
148 |
-
<em>This will be displayed in the Privacy Policy.</em>
|
149 |
-
</p>
|
150 |
-
<hr>
|
151 |
-
</div>
|
152 |
-
|
153 |
-
<h2>Terms & Conditions page</h2>
|
154 |
-
<p>
|
155 |
-
If you have a Terms & Conditions page, we will need to know where it is located. If you don't have a Terms & Conditions page, you can safely skip this step.<br>
|
156 |
-
If you are unsure if you need a T&C page, read this article:
|
157 |
-
<a href="<?= gdpr('helpers')->supportUrl('knowledge-base/do-i-need-a-terms-conditions-page/') ?>" target="_blank">Do I need a Terms & Conditions page?</a>
|
158 |
-
|
159 |
-
<label for="gdpr_has_terms_page">
|
160 |
-
<input
|
161 |
-
type="checkbox"
|
162 |
-
name="gdpr_has_terms_page"
|
163 |
-
id="gdpr_has_terms_page"
|
164 |
-
class="js-gdpr-conditional"
|
165 |
-
data-show=".gdpr-terms-page"
|
166 |
-
value="yes"
|
167 |
-
<?= checked($hasTermsPage, 'yes'); ?>
|
168 |
-
>
|
169 |
-
I have a Terms & Conditions page
|
170 |
-
</label>
|
171 |
-
</p>
|
172 |
-
<p>
|
173 |
-
<span class="gdpr-terms-page hidden">
|
174 |
-
<label for="gdpr_terms_page">Select the page where your Terms & Conditions are displayed</label>
|
175 |
-
<?php if ($termsPageNote): ?>
|
176 |
-
<em><?= esc_html($termsPageNote); ?></em>
|
177 |
-
<?php endif; ?>
|
178 |
-
<?= $termsPageSelector; ?>
|
179 |
-
<br>
|
180 |
-
</span>
|
181 |
-
</p>
|
182 |
-
|
183 |
-
<hr>
|
184 |
-
<br>
|
185 |
-
<input type="submit" class="button button-gdpr button-right" value="Save »" />
|
1 |
+
<h1>
|
2 |
+
Privacy Policy (1/2)
|
3 |
+
</h1>
|
4 |
+
|
5 |
+
<h2>Privacy Policy page</h2>
|
6 |
+
<p>
|
7 |
+
The second major requirement of GDPR is a thorough Privacy Policy that explains all of the rights your customers
|
8 |
+
have and describes how exactly their data is used. We've put together a GDPR-compliant privacy policy template for you.
|
9 |
+
Fill in the fields below and a privacy policy will be generated automatically. Note that you will need to modify it later to suit your website and business. <br>
|
10 |
+
<a href="<?= gdpr('helpers')->docs('guide/setting-up-the-privacy-policy/'); ?>" target="_blank">Read more about the Privacy Policy</a><br><br>
|
11 |
+
If you already have a GDPR-compliant Privacy Policy, simply select the page where it is displayed and skip the rest.
|
12 |
+
<br>
|
13 |
+
</p>
|
14 |
+
|
15 |
+
<fieldset>
|
16 |
+
<label>
|
17 |
+
<input type="radio" name="gdpr_create_policy_page" value="yes" class="js-gdpr-conditional" <?php echo !$policyPage ? 'checked': ''; ?>>
|
18 |
+
Automatically create a new page for Privacy Policy
|
19 |
+
</label>
|
20 |
+
|
21 |
+
<label>
|
22 |
+
<input type="radio" name="gdpr_create_policy_page" value="no" class="js-gdpr-conditional" data-show=".gdpr-select-policy-page" <?php echo $policyPage ? 'checked': ''; ?>> I want to use an existing page
|
23 |
+
</label>
|
24 |
+
</fieldset>
|
25 |
+
|
26 |
+
<p class="gdpr-select-policy-page hidden">
|
27 |
+
<label for="gdpr_policy_page">Select the page where your Privacy Policy will be displayed</label>
|
28 |
+
<?= $policyPageSelector; ?>
|
29 |
+
</p>
|
30 |
+
|
31 |
+
<p>
|
32 |
+
We can generate a somewhat personalized Privacy Policy template for you based on some information you can fill in below.
|
33 |
+
Note that if you're using an existing page, this will overwrite the page contents.
|
34 |
+
|
35 |
+
<label for="gdpr_generate_policy">
|
36 |
+
<input
|
37 |
+
type="checkbox"
|
38 |
+
name="gdpr_generate_policy"
|
39 |
+
id="gdpr_generate_policy"
|
40 |
+
class="js-gdpr-conditional"
|
41 |
+
data-show=".gdpr-generator-fields"
|
42 |
+
value="yes"
|
43 |
+
>
|
44 |
+
Generate Privacy Policy
|
45 |
+
</label>
|
46 |
+
<em>Heads up - this will take some time to configure!</em>
|
47 |
+
</p>
|
48 |
+
|
49 |
+
<hr>
|
50 |
+
|
51 |
+
<div class="gdpr-generator-fields hidden">
|
52 |
+
|
53 |
+
<h2>Company information</h2>
|
54 |
+
<label for="gdpr_company_name">Company legal name</label>
|
55 |
+
<input type="text" id="gdpr_company_name" name="gdpr_company_name" value="<?= esc_attr($companyName); ?>"/>
|
56 |
+
<em>Enter the name of your company. If you are not registered as a company, enter your full name.</em>
|
57 |
+
|
58 |
+
<label for="gdpr_contact_email">Contact email</label>
|
59 |
+
<input type="email" id="gdpr_contact_email" name="gdpr_contact_email" value="<?= esc_attr($contactEmail); ?>"/>
|
60 |
+
<em>
|
61 |
+
Enter the contact email which should be used for GDPR and personal data related inquiries.<br>
|
62 |
+
This email will be displayed in the Privacy Policy.
|
63 |
+
</em>
|
64 |
+
|
65 |
+
<hr>
|
66 |
+
|
67 |
+
<h2>Company location</h2>
|
68 |
+
<label for="gdpr_company_location">Company location</label>
|
69 |
+
<select id="gdpr_company_location" name="gdpr_company_location" class="js-gdpr-select2 gdpr-select js-gdpr-conditional js-gdpr-country-selector">
|
70 |
+
<?= $countryOptions; ?>
|
71 |
+
</select>
|
72 |
+
<em>
|
73 |
+
Select the country where your company is registered. <br>
|
74 |
+
If you are not registered as a company, enter your country of residence.
|
75 |
+
</em>
|
76 |
+
<div class="gdpr-representative hidden">
|
77 |
+
<p>
|
78 |
+
|
79 |
+
If your company is located outside of the EU and the EFTA zone and you do not have a branch inside the EU,
|
80 |
+
GDPR requires you to appoint a representative contact which has to be a person or company located in the EU.
|
81 |
+
<a href="<?= gdpr('helpers')->docs('knowledge-base/do-i-need-to-appoint-an-eu-based-representative/'); ?>" target="_blank">Read more about appointing a representative and your options here</a>.
|
82 |
+
</p>
|
83 |
+
<p>
|
84 |
+
If you have a representative contact, enter the contact details below.
|
85 |
+
|
86 |
+
<label for="gdpr_representative_contact_name">Representative contact name</label>
|
87 |
+
<input type="text" value="<?= esc_attr($representativeContactName); ?>" id="gdpr_representative_contact_name" name="gdpr_representative_contact_name" data />
|
88 |
+
|
89 |
+
<label for="gdpr_representative_contact_email">Representative contact email</label>
|
90 |
+
<input type="email" value="<?= esc_attr($representativeContactEmail); ?>" id="gdpr_representative_contact_email" name="gdpr_representative_contact_email" />
|
91 |
+
|
92 |
+
<label for="gdpr_representative_contact_phone">Representative contact phone</label>
|
93 |
+
<input type="text" value="<?= esc_attr($representativeContactPhone); ?>" id="gdpr_representative_contact_phone" name="gdpr_representative_contact_phone" />
|
94 |
+
|
95 |
+
</p>
|
96 |
+
</div>
|
97 |
+
<br>
|
98 |
+
<hr>
|
99 |
+
|
100 |
+
<h2>Data Protection Authority</h2>
|
101 |
+
<p>
|
102 |
+
You are also obliged to provide the contact of your local supervisory authority.
|
103 |
+
|
104 |
+
<span class="gdpr-representative hidden">
|
105 |
+
<br><br>
|
106 |
+
You are located outside of the EU. This means that you must designate an EU country's data protection authority to be your supervisory authority.
|
107 |
+
Choose the Data Protection Authority of the country where most of your target audience resides. See the <a href="http://ec.europa.eu/justice/data-protection/article-29/structure/data-protection-authorities/index_en.htm" target="_blank">list of contacts here</a>.
|
108 |
+
</span>
|
109 |
+
|
110 |
+
<label for="gdpr_dpa_website">Data Protection Authority website</label>
|
111 |
+
<input type="text" value="<?= esc_attr($dpaWebsite); ?>" id="gdpr_dpa_website" name="gdpr_dpa_website" data-set="<?= esc_attr($dpaWebsite); ?>" />
|
112 |
+
|
113 |
+
<label for="gdpr_dpa_email">Data Protection Authority email</label>
|
114 |
+
<input type="email" value="<?= esc_attr($dpaEmail); ?>" id="gdpr_dpa_email" name="gdpr_dpa_email" data-set="<?= esc_attr($dpaEmail); ?>" />
|
115 |
+
|
116 |
+
<label for="gdpr_dpa_phone">Data Protection Authority phone</label>
|
117 |
+
<input type="text" value="<?= esc_attr($dpaPhone); ?>" id="gdpr_dpa_phone" name="gdpr_dpa_phone" data-set="<?= esc_attr($dpaPhone); ?>" />
|
118 |
+
</p>
|
119 |
+
<script>
|
120 |
+
window.gdprDpaData = <?= $dpaData; ?>;
|
121 |
+
</script>
|
122 |
+
|
123 |
+
<h2>Data Protection Officer</h2>
|
124 |
+
<p>
|
125 |
+
Under some circumstances, GDPR requires you to appoint a Data Protection Officer and display the contacts
|
126 |
+
in your Privacy Policy. If you don't know whether or not you need a DPO, read this article: <a href="<?= gdpr('helpers')->docs('knowledge-base/do-i-need-to-appoint-data-protection-officer-dpo/'); ?>" target="_blank">Do I need a Data Protection Officer?</a>
|
127 |
+
|
128 |
+
<label for="gdpr_has_dpo">
|
129 |
+
<input
|
130 |
+
type="checkbox"
|
131 |
+
name="gdpr_has_dpo"
|
132 |
+
id="gdpr_has_dpo"
|
133 |
+
class="js-gdpr-conditional"
|
134 |
+
data-show=".gdpr-dpo"
|
135 |
+
value="yes"
|
136 |
+
<?= checked($hasDPO, 'yes'); ?>
|
137 |
+
>
|
138 |
+
I have appointed a Data Protection Officer (DPO)
|
139 |
+
</label>
|
140 |
+
</p>
|
141 |
+
<p class="gdpr-dpo hidden">
|
142 |
+
<label for="gdpr_dpo_name">Data Protection Officer name</label>
|
143 |
+
<input type="text" id="gdpr_dpo_name" name="gdpr_dpo_name" value="<?= esc_attr($dpoName); ?>"/>
|
144 |
+
<em>This will be displayed in the Privacy Policy.</em>
|
145 |
+
|
146 |
+
<label for="gdpr_dpo_email">Data Protection Officer email</label>
|
147 |
+
<input type="email" id="gdpr_dpo_email" name="gdpr_dpo_email" value="<?= esc_attr($dpoEmail); ?>"/>
|
148 |
+
<em>This will be displayed in the Privacy Policy.</em>
|
149 |
+
</p>
|
150 |
+
<hr>
|
151 |
+
</div>
|
152 |
+
|
153 |
+
<h2>Terms & Conditions page</h2>
|
154 |
+
<p>
|
155 |
+
If you have a Terms & Conditions page, we will need to know where it is located. If you don't have a Terms & Conditions page, you can safely skip this step.<br>
|
156 |
+
If you are unsure if you need a T&C page, read this article:
|
157 |
+
<a href="<?= gdpr('helpers')->supportUrl('knowledge-base/do-i-need-a-terms-conditions-page/') ?>" target="_blank">Do I need a Terms & Conditions page?</a>
|
158 |
+
|
159 |
+
<label for="gdpr_has_terms_page">
|
160 |
+
<input
|
161 |
+
type="checkbox"
|
162 |
+
name="gdpr_has_terms_page"
|
163 |
+
id="gdpr_has_terms_page"
|
164 |
+
class="js-gdpr-conditional"
|
165 |
+
data-show=".gdpr-terms-page"
|
166 |
+
value="yes"
|
167 |
+
<?= checked($hasTermsPage, 'yes'); ?>
|
168 |
+
>
|
169 |
+
I have a Terms & Conditions page
|
170 |
+
</label>
|
171 |
+
</p>
|
172 |
+
<p>
|
173 |
+
<span class="gdpr-terms-page hidden">
|
174 |
+
<label for="gdpr_terms_page">Select the page where your Terms & Conditions are displayed</label>
|
175 |
+
<?php if ($termsPageNote): ?>
|
176 |
+
<em><?= esc_html($termsPageNote); ?></em>
|
177 |
+
<?php endif; ?>
|
178 |
+
<?= $termsPageSelector; ?>
|
179 |
+
<br>
|
180 |
+
</span>
|
181 |
+
</p>
|
182 |
+
|
183 |
+
<hr>
|
184 |
+
<br>
|
185 |
+
<input type="submit" class="button button-gdpr button-right" value="Save »" />
|
views/installer/steps/welcome.php
CHANGED
@@ -1,18 +1,18 @@
|
|
1 |
-
<h2>
|
2 |
-
Welcome!
|
3 |
-
</h2>
|
4 |
-
<p>
|
5 |
-
<strong>The GDPR setup wizard will guide you through the legal and technical requirements for your site.</strong><br>
|
6 |
-
<br>
|
7 |
-
We have made this process as easy, fast and painless as possible for you. <br>
|
8 |
-
However, you should take some time to read and understand everything. Making your website (and business) properly compliant
|
9 |
-
requires understanding GDPR and how your website works. <br>
|
10 |
-
If you don't have the time to do that, you can always <a href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" target="_blank">request a consultation</a>.
|
11 |
-
</p>
|
12 |
-
<p>
|
13 |
-
The <a href="<?= gdpr('helpers')->docs('wordpress-site-owners-guide-to-gdpr/'); ?>" target="_blank">WordPress Site Owner's Guide to GDPR</a> will help you with any questions you might have during the
|
14 |
-
setup process.
|
15 |
-
</p>
|
16 |
-
<hr>
|
17 |
-
<p>Ready? Let's get this done!</p>
|
18 |
-
<input type="submit" class="button button-gdpr button-large button-gdpr-large button-center" value="Get started" />
|
1 |
+
<h2>
|
2 |
+
Welcome!
|
3 |
+
</h2>
|
4 |
+
<p>
|
5 |
+
<strong>The GDPR setup wizard will guide you through the legal and technical requirements for your site.</strong><br>
|
6 |
+
<br>
|
7 |
+
We have made this process as easy, fast and painless as possible for you. <br>
|
8 |
+
However, you should take some time to read and understand everything. Making your website (and business) properly compliant
|
9 |
+
requires understanding GDPR and how your website works. <br>
|
10 |
+
If you don't have the time to do that, you can always <a href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" target="_blank">request a consultation</a>.
|
11 |
+
</p>
|
12 |
+
<p>
|
13 |
+
The <a href="<?= gdpr('helpers')->docs('wordpress-site-owners-guide-to-gdpr/'); ?>" target="_blank">WordPress Site Owner's Guide to GDPR</a> will help you with any questions you might have during the
|
14 |
+
setup process.
|
15 |
+
</p>
|
16 |
+
<hr>
|
17 |
+
<p>Ready? Let's get this done!</p>
|
18 |
+
<input type="submit" class="button button-gdpr button-large button-gdpr-large button-center" value="Get started" />
|
views/installer/welcome-notice.php
CHANGED
@@ -1,16 +1,16 @@
|
|
1 |
-
<p>
|
2 |
-
The GDPR Framework has not been set up yet. Would you like to do that? <br>
|
3 |
-
Our setup wizard will guide you through the process.
|
4 |
-
</p>
|
5 |
-
|
6 |
-
<a class="button button-primary" href="<?= $installerUrl; ?>">
|
7 |
-
<?= _x('Run the setup wizard', '(Admin)', 'gdpr-framework'); ?>
|
8 |
-
</a>
|
9 |
-
|
10 |
-
<a class="button button-secondary" href="<?= $autoInstallUrl; ?>">
|
11 |
-
<?= _x('Auto-install pages', '(Admin)', 'gdpr-framework'); ?>
|
12 |
-
</a>
|
13 |
-
|
14 |
-
<a class="button button-secondary" href="<?= $skipUrl; ?>">
|
15 |
-
<?= _x('Skip and install manually', '(Admin)', 'gdpr-framework'); ?>
|
16 |
-
</a>
|
1 |
+
<p>
|
2 |
+
The GDPR Framework has not been set up yet. Would you like to do that? <br>
|
3 |
+
Our setup wizard will guide you through the process.
|
4 |
+
</p>
|
5 |
+
|
6 |
+
<a class="button button-primary" href="<?= $installerUrl; ?>">
|
7 |
+
<?= _x('Run the setup wizard', '(Admin)', 'gdpr-framework'); ?>
|
8 |
+
</a>
|
9 |
+
|
10 |
+
<a class="button button-secondary" href="<?= $autoInstallUrl; ?>">
|
11 |
+
<?= _x('Auto-install pages', '(Admin)', 'gdpr-framework'); ?>
|
12 |
+
</a>
|
13 |
+
|
14 |
+
<a class="button button-secondary" href="<?= $skipUrl; ?>">
|
15 |
+
<?= _x('Skip and install manually', '(Admin)', 'gdpr-framework'); ?>
|
16 |
+
</a>
|
views/modules/contact-form-7/content-privacy.php
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
-
<?= sprintf(
|
2 |
-
__('I accept the %sPrivacy Policy%s', 'gdpr-framework'),
|
3 |
-
"<a href='{$privacyPolicyUrl}' target='_blank'>",
|
4 |
-
'</a>'
|
5 |
-
); ?>
|
1 |
+
<?= sprintf(
|
2 |
+
__('I accept the %sPrivacy Policy%s', 'gdpr-framework'),
|
3 |
+
"<a href='{$privacyPolicyUrl}' target='_blank'>",
|
4 |
+
'</a>'
|
5 |
+
); ?>
|
views/modules/contact-form-7/generator-privacy.php
CHANGED
@@ -1,17 +1,17 @@
|
|
1 |
-
<div class="control-box">
|
2 |
-
<fieldset>
|
3 |
-
<legend><?php echo sprintf(esc_html($description), $descLink); ?></legend>
|
4 |
-
</fieldset>
|
5 |
-
<p>
|
6 |
-
<?= _x('This tag generates the default text for Terms & Conditions and/or Privacy Policy checkbox.', '(Admin)', 'gdpr-framework'); ?> <br/>
|
7 |
-
</p>
|
8 |
-
</div>
|
9 |
-
|
10 |
-
<div class="insert-box">
|
11 |
-
<input type="text" name="asdf" class="tag code" readonly="readonly" onfocus="this.select()"/>
|
12 |
-
|
13 |
-
<div class="submitbox">
|
14 |
-
<input type="button" class="button button-primary insert-tag"
|
15 |
-
value="<?php echo esc_attr(__('Insert', 'contact-form-7')); ?>"/>
|
16 |
-
</div>
|
17 |
-
</div>
|
1 |
+
<div class="control-box">
|
2 |
+
<fieldset>
|
3 |
+
<legend><?php echo sprintf(esc_html($description), $descLink); ?></legend>
|
4 |
+
</fieldset>
|
5 |
+
<p>
|
6 |
+
<?= _x('This tag generates the default text for Terms & Conditions and/or Privacy Policy checkbox.', '(Admin)', 'gdpr-framework'); ?> <br/>
|
7 |
+
</p>
|
8 |
+
</div>
|
9 |
+
|
10 |
+
<div class="insert-box">
|
11 |
+
<input type="text" name="asdf" class="tag code" readonly="readonly" onfocus="this.select()"/>
|
12 |
+
|
13 |
+
<div class="submitbox">
|
14 |
+
<input type="button" class="button button-primary insert-tag"
|
15 |
+
value="<?php echo esc_attr(__('Insert', 'contact-form-7')); ?>"/>
|
16 |
+
</div>
|
17 |
+
</div>
|
views/modules/wordpress-comments/terms-checkbox.php
CHANGED
@@ -1,20 +1,20 @@
|
|
1 |
-
<p class="gdpr-terms-container">
|
2 |
-
<label>
|
3 |
-
<input type="checkbox" name="gdpr_terms" id="gdpr_terms" value="1" required/>
|
4 |
-
<?php if ($termsUrl): ?>
|
5 |
-
<?= sprintf(
|
6 |
-
__('I accept the %sTerms and Conditions%s and the %sPrivacy Policy%s', 'gdpr-framework'),
|
7 |
-
"<a href='{$termsUrl}' target='_blank'>",
|
8 |
-
'</a>',
|
9 |
-
"<a href='{$privacyPolicyUrl}' target='_blank'>",
|
10 |
-
'</a>'
|
11 |
-
); ?>
|
12 |
-
<?php else: ?>
|
13 |
-
<?= sprintf(
|
14 |
-
__('I accept the %sPrivacy Policy%s', 'gdpr-framework'),
|
15 |
-
"<a href='{$privacyPolicyUrl}' target='_blank'>",
|
16 |
-
'</a>'
|
17 |
-
); ?>
|
18 |
-
<?php endif; ?>*
|
19 |
-
</label>
|
20 |
-
</p>
|
1 |
+
<p class="gdpr-terms-container">
|
2 |
+
<label>
|
3 |
+
<input type="checkbox" name="gdpr_terms" id="gdpr_terms" value="1" required/>
|
4 |
+
<?php if ($termsUrl): ?>
|
5 |
+
<?= sprintf(
|
6 |
+
__('I accept the %sTerms and Conditions%s and the %sPrivacy Policy%s', 'gdpr-framework'),
|
7 |
+
"<a href='{$termsUrl}' target='_blank'>",
|
8 |
+
'</a>',
|
9 |
+
"<a href='{$privacyPolicyUrl}' target='_blank'>",
|
10 |
+
'</a>'
|
11 |
+
); ?>
|
12 |
+
<?php else: ?>
|
13 |
+
<?= sprintf(
|
14 |
+
__('I accept the %sPrivacy Policy%s', 'gdpr-framework'),
|
15 |
+
"<a href='{$privacyPolicyUrl}' target='_blank'>",
|
16 |
+
'</a>'
|
17 |
+
); ?>
|
18 |
+
<?php endif; ?>*
|
19 |
+
</label>
|
20 |
+
</p>
|
views/modules/wordpress-user/dashboard/data-page/form-consent.php
CHANGED
@@ -1,39 +1,39 @@
|
|
1 |
-
<?php if (count($consentData) or $consentInfo): ?>
|
2 |
-
<hr>
|
3 |
-
<h2><?= __('Consent', 'gdpr-framework'); ?></h2>
|
4 |
-
<?php if (count($consentData)): ?>
|
5 |
-
<form method="post">
|
6 |
-
<p><?= __('Here you can withdraw any consents you have given.', 'gdpr-framework'); ?></p>
|
7 |
-
<table class="gdpr-consent gdpr-consent-user">
|
8 |
-
<th colspan="3"><?= __('Consents', 'gdpr-framework'); ?></th>
|
9 |
-
<?php foreach ($consentData as $item): ?>
|
10 |
-
<tr>
|
11 |
-
<td>
|
12 |
-
✔
|
13 |
-
</td>
|
14 |
-
<td class="gdpr-consent-user-title">
|
15 |
-
<?= $item['title']; ?>
|
16 |
-
</td>
|
17 |
-
<td class="gdpr-consent-user-desc">
|
18 |
-
<?= $item['description']; ?>
|
19 |
-
</td>
|
20 |
-
<td>
|
21 |
-
<?php if ('privacy-policy' !== $item['slug']): ?>
|
22 |
-
<a href="<?= esc_url($item['withdraw_url']); ?>" class="button button-primary">
|
23 |
-
<?= __('Withdraw', 'gdpr-framework'); ?>
|
24 |
-
</a>
|
25 |
-
<?php endif; ?>
|
26 |
-
</td>
|
27 |
-
</tr>
|
28 |
-
<?php endforeach; ?>
|
29 |
-
</table>
|
30 |
-
</form>
|
31 |
-
<?php endif; ?>
|
32 |
-
|
33 |
-
<?php if ($consentInfo): ?>
|
34 |
-
<p class="gdpr-consent-disclaimer">
|
35 |
-
<em><?= $consentInfo; ?></em>
|
36 |
-
</p>
|
37 |
-
<?php endif; ?>
|
38 |
-
|
39 |
-
<?php endif; ?>
|
1 |
+
<?php if (count($consentData) or $consentInfo): ?>
|
2 |
+
<hr>
|
3 |
+
<h2><?= __('Consent', 'gdpr-framework'); ?></h2>
|
4 |
+
<?php if (count($consentData)): ?>
|
5 |
+
<form method="post">
|
6 |
+
<p><?= __('Here you can withdraw any consents you have given.', 'gdpr-framework'); ?></p>
|
7 |
+
<table class="gdpr-consent gdpr-consent-user">
|
8 |
+
<th colspan="3"><?= __('Consents', 'gdpr-framework'); ?></th>
|
9 |
+
<?php foreach ($consentData as $item): ?>
|
10 |
+
<tr>
|
11 |
+
<td>
|
12 |
+
✔
|
13 |
+
</td>
|
14 |
+
<td class="gdpr-consent-user-title">
|
15 |
+
<?= $item['title']; ?>
|
16 |
+
</td>
|
17 |
+
<td class="gdpr-consent-user-desc">
|
18 |
+
<?= $item['description']; ?>
|
19 |
+
</td>
|
20 |
+
<td>
|
21 |
+
<?php if ('privacy-policy' !== $item['slug']): ?>
|
22 |
+
<a href="<?= esc_url($item['withdraw_url']); ?>" class="button button-primary">
|
23 |
+
<?= __('Withdraw', 'gdpr-framework'); ?>
|
24 |
+
</a>
|
25 |
+
<?php endif; ?>
|
26 |
+
</td>
|
27 |
+
</tr>
|
28 |
+
<?php endforeach; ?>
|
29 |
+
</table>
|
30 |
+
</form>
|
31 |
+
<?php endif; ?>
|
32 |
+
|
33 |
+
<?php if ($consentInfo): ?>
|
34 |
+
<p class="gdpr-consent-disclaimer">
|
35 |
+
<em><?= $consentInfo; ?></em>
|
36 |
+
</p>
|
37 |
+
<?php endif; ?>
|
38 |
+
|
39 |
+
<?php endif; ?>
|
views/modules/wordpress-user/dashboard/data-page/form-delete.php
CHANGED
@@ -1,30 +1,30 @@
|
|
1 |
-
<table class="form-table">
|
2 |
-
<tr>
|
3 |
-
<th>
|
4 |
-
<label>
|
5 |
-
<?= _x('Delete this user and all data', '(Admin)', 'gdpr-framework') ?>
|
6 |
-
</label>
|
7 |
-
</th>
|
8 |
-
<td>
|
9 |
-
<?php if ($showDelete): ?>
|
10 |
-
<a class="button" href="<?= esc_url($url); ?>">
|
11 |
-
<?= _x('Delete my data', '(Admin)', 'gdpr-framework') ?>
|
12 |
-
</a>
|
13 |
-
<br/>
|
14 |
-
<p class="description">
|
15 |
-
<?= __('Delete all data we have gathered about you.', 'gdpr-framework') ?> <br/>
|
16 |
-
<?= __('If you have a user account on our site, it will also be deleted.', 'gdpr-framework') ?> <br/>
|
17 |
-
<?= __('Be careful - this action is permanent and CANNOT be undone.', 'gdpr-framework') ?>
|
18 |
-
</p>
|
19 |
-
<?php else: ?>
|
20 |
-
<p>
|
21 |
-
<em>
|
22 |
-
<?= _x('You seem to have an administrator or equivalent role, so deleting/anonymizing via this page is disabled.', '(Admin)', 'gdpr-framework'); ?>
|
23 |
-
</em>
|
24 |
-
</p>
|
25 |
-
<?php endif; ?>
|
26 |
-
</td>
|
27 |
-
</tr>
|
28 |
-
</table>
|
29 |
-
|
30 |
-
|
1 |
+
<table class="form-table">
|
2 |
+
<tr>
|
3 |
+
<th>
|
4 |
+
<label>
|
5 |
+
<?= _x('Delete this user and all data', '(Admin)', 'gdpr-framework') ?>
|
6 |
+
</label>
|
7 |
+
</th>
|
8 |
+
<td>
|
9 |
+
<?php if ($showDelete): ?>
|
10 |
+
<a class="button" href="<?= esc_url($url); ?>">
|
11 |
+
<?= _x('Delete my data', '(Admin)', 'gdpr-framework') ?>
|
12 |
+
</a>
|
13 |
+
<br/>
|
14 |
+
<p class="description">
|
15 |
+
<?= __('Delete all data we have gathered about you.', 'gdpr-framework') ?> <br/>
|
16 |
+
<?= __('If you have a user account on our site, it will also be deleted.', 'gdpr-framework') ?> <br/>
|
17 |
+
<?= __('Be careful - this action is permanent and CANNOT be undone.', 'gdpr-framework') ?>
|
18 |
+
</p>
|
19 |
+
<?php else: ?>
|
20 |
+
<p>
|
21 |
+
<em>
|
22 |
+
<?= _x('You seem to have an administrator or equivalent role, so deleting/anonymizing via this page is disabled.', '(Admin)', 'gdpr-framework'); ?>
|
23 |
+
</em>
|
24 |
+
</p>
|
25 |
+
<?php endif; ?>
|
26 |
+
</td>
|
27 |
+
</tr>
|
28 |
+
</table>
|
29 |
+
|
30 |
+
|
views/modules/wordpress-user/dashboard/data-page/header.php
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
<h2>
|
2 |
-
<?= _x('Privacy Tools', '(Admin)', 'gdpr-framework'); ?>
|
3 |
-
</h2>
|
1 |
+
<h2>
|
2 |
+
<?= _x('Privacy Tools', '(Admin)', 'gdpr-framework'); ?>
|
3 |
+
</h2>
|
views/modules/wordpress-user/dashboard/form-export.php
CHANGED
@@ -1,24 +1,24 @@
|
|
1 |
-
<hr>
|
2 |
-
|
3 |
-
<table class="form-table">
|
4 |
-
<tr>
|
5 |
-
<th>
|
6 |
-
<label>
|
7 |
-
<?= __('Download your data', 'gdpr-framework') ?>
|
8 |
-
</label>
|
9 |
-
</th>
|
10 |
-
<td>
|
11 |
-
<a class="button button-primary" href="<?= esc_url($exportHTMLUrl); ?>">
|
12 |
-
<?= __('Download as table', 'gdpr-framework') ?>
|
13 |
-
</a>
|
14 |
-
<a class="button button-primary" href="<?= esc_url($exportJSONUrl); ?>">
|
15 |
-
<?= __('Export as JSON', 'gdpr-framework') ?>
|
16 |
-
</a>
|
17 |
-
<br />
|
18 |
-
<p class="description">
|
19 |
-
<?= __('You can download all your data formatted as a table for viewing.', 'gdpr-framework') ?> <br>
|
20 |
-
<?= __('Alternatively, you can export it in machine-readable JSON format.', 'gdpr-framework') ?>
|
21 |
-
</p>
|
22 |
-
</td>
|
23 |
-
</tr>
|
24 |
-
</table>
|
1 |
+
<hr>
|
2 |
+
|
3 |
+
<table class="form-table">
|
4 |
+
<tr>
|
5 |
+
<th>
|
6 |
+
<label>
|
7 |
+
<?= __('Download your data', 'gdpr-framework') ?>
|
8 |
+
</label>
|
9 |
+
</th>
|
10 |
+
<td>
|
11 |
+
<a class="button button-primary" href="<?= esc_url($exportHTMLUrl); ?>">
|
12 |
+
<?= __('Download as table', 'gdpr-framework') ?>
|
13 |
+
</a>
|
14 |
+
<a class="button button-primary" href="<?= esc_url($exportJSONUrl); ?>">
|
15 |
+
<?= __('Export as JSON', 'gdpr-framework') ?>
|
16 |
+
</a>
|
17 |
+
<br />
|
18 |
+
<p class="description">
|
19 |
+
<?= __('You can download all your data formatted as a table for viewing.', 'gdpr-framework') ?> <br>
|
20 |
+
<?= __('Alternatively, you can export it in machine-readable JSON format.', 'gdpr-framework') ?>
|
21 |
+
</p>
|
22 |
+
</td>
|
23 |
+
</tr>
|
24 |
+
</table>
|
views/modules/wordpress-user/dashboard/profile-page/form-delete.php
CHANGED
@@ -1,29 +1,29 @@
|
|
1 |
-
<table class="form-table">
|
2 |
-
<tr>
|
3 |
-
<th>
|
4 |
-
<label>
|
5 |
-
<?= _x('Delete this user and all data', '(Admin)', 'gdpr-framework') ?>
|
6 |
-
</label>
|
7 |
-
</th>
|
8 |
-
<td>
|
9 |
-
<?php if ($showDelete): ?>
|
10 |
-
<a class="button" href="<?= esc_url($deleteUrl); ?>">
|
11 |
-
<?= _x('Delete user and all data', '(Admin)', 'gdpr-framework') ?>
|
12 |
-
</a>
|
13 |
-
<a class="button" href="<?= esc_url($anonymizeUrl); ?>">
|
14 |
-
<?= _x('Anonymize user and all data', '(Admin)', 'gdpr-framework') ?>
|
15 |
-
</a>
|
16 |
-
<br/>
|
17 |
-
<p class="description">
|
18 |
-
<?= _x('Be careful - this action is permanent and CANNOT be undone.', 'gdpr-framework') ?>
|
19 |
-
</p>
|
20 |
-
<?php else: ?>
|
21 |
-
<p>
|
22 |
-
<em>
|
23 |
-
<?= _x('You seem to have an administrator or equivalent role, so deleting/anonymizing via this page is disabled.', '(Admin)', 'gdpr-framework'); ?>
|
24 |
-
</em>
|
25 |
-
</p>
|
26 |
-
<?php endif; ?>
|
27 |
-
</td>
|
28 |
-
</tr>
|
29 |
-
</table>
|
1 |
+
<table class="form-table">
|
2 |
+
<tr>
|
3 |
+
<th>
|
4 |
+
<label>
|
5 |
+
<?= _x('Delete this user and all data', '(Admin)', 'gdpr-framework') ?>
|
6 |
+
</label>
|
7 |
+
</th>
|
8 |
+
<td>
|
9 |
+
<?php if ($showDelete): ?>
|
10 |
+
<a class="button" href="<?= esc_url($deleteUrl); ?>">
|
11 |
+
<?= _x('Delete user and all data', '(Admin)', 'gdpr-framework') ?>
|
12 |
+
</a>
|
13 |
+
<a class="button" href="<?= esc_url($anonymizeUrl); ?>">
|
14 |
+
<?= _x('Anonymize user and all data', '(Admin)', 'gdpr-framework') ?>
|
15 |
+
</a>
|
16 |
+
<br/>
|
17 |
+
<p class="description">
|
18 |
+
<?= _x('Be careful - this action is permanent and CANNOT be undone.', 'gdpr-framework') ?>
|
19 |
+
</p>
|
20 |
+
<?php else: ?>
|
21 |
+
<p>
|
22 |
+
<em>
|
23 |
+
<?= _x('You seem to have an administrator or equivalent role, so deleting/anonymizing via this page is disabled.', '(Admin)', 'gdpr-framework'); ?>
|
24 |
+
</em>
|
25 |
+
</p>
|
26 |
+
<?php endif; ?>
|
27 |
+
</td>
|
28 |
+
</tr>
|
29 |
+
</table>
|
views/modules/wordpress-user/dashboard/profile-page/header.php
CHANGED
@@ -1,8 +1,8 @@
|
|
1 |
-
<h2>
|
2 |
-
<?= _x('GDPR Data', '(Admin)', 'gdpr-framework'); ?>
|
3 |
-
</h2>
|
4 |
-
<?php if ($isAnonymized): ?>
|
5 |
-
<p>
|
6 |
-
<em><?= _x('This user has been anonymized.', '(Admin)', 'gdpr-framework'); ?></em>
|
7 |
-
</p>
|
8 |
-
<?php endif; ?>
|
1 |
+
<h2>
|
2 |
+
<?= _x('GDPR Data', '(Admin)', 'gdpr-framework'); ?>
|
3 |
+
</h2>
|
4 |
+
<?php if ($isAnonymized): ?>
|
5 |
+
<p>
|
6 |
+
<em><?= _x('This user has been anonymized.', '(Admin)', 'gdpr-framework'); ?></em>
|
7 |
+
</p>
|
8 |
+
<?php endif; ?>
|
views/modules/wordpress-user/dashboard/profile-page/table-consent.php
CHANGED
@@ -1,18 +1,18 @@
|
|
1 |
-
<hr>
|
2 |
-
<?php if (count($consentData)): ?>
|
3 |
-
<table class="gdpr-consent">
|
4 |
-
<th colspan="2"><?= _x('Consents given', '(Admin)', 'gdpr-framework'); ?></th>
|
5 |
-
<?php foreach ($consentData as $item): ?>
|
6 |
-
<tr>
|
7 |
-
<td>
|
8 |
-
✔
|
9 |
-
</td>
|
10 |
-
<td>
|
11 |
-
<?= $item['title']; ?>
|
12 |
-
</td>
|
13 |
-
</tr>
|
14 |
-
<?php endforeach; ?>
|
15 |
-
</table>
|
16 |
-
<?php else: ?>
|
17 |
-
<p><?= _x('No consents given', '(Admin)', 'gdpr-framework'); ?>.</p>
|
18 |
-
<?php endif; ?>
|
1 |
+
<hr>
|
2 |
+
<?php if (count($consentData)): ?>
|
3 |
+
<table class="gdpr-consent">
|
4 |
+
<th colspan="2"><?= _x('Consents given', '(Admin)', 'gdpr-framework'); ?></th>
|
5 |
+
<?php foreach ($consentData as $item): ?>
|
6 |
+
<tr>
|
7 |
+
<td>
|
8 |
+
✔
|
9 |
+
</td>
|
10 |
+
<td>
|
11 |
+
<?= $item['title']; ?>
|
12 |
+
</td>
|
13 |
+
</tr>
|
14 |
+
<?php endforeach; ?>
|
15 |
+
</table>
|
16 |
+
<?php else: ?>
|
17 |
+
<p><?= _x('No consents given', '(Admin)', 'gdpr-framework'); ?>.</p>
|
18 |
+
<?php endif; ?>
|
views/modules/wordpress-user/registration-terms-checkbox.php
CHANGED
@@ -1,21 +1,21 @@
|
|
1 |
-
<p class="gdpr-terms-container" style="margin-bottom: 10px">
|
2 |
-
<label>
|
3 |
-
<input type="checkbox" name="gdpr_terms" id="gdpr_terms" value="1" />
|
4 |
-
|
5 |
-
<?php if ($termsUrl): ?>
|
6 |
-
<?= sprintf(
|
7 |
-
__('I accept the %sTerms and Conditions%s and the %sPrivacy Policy%s', 'gdpr-framework'),
|
8 |
-
"<a href='{$termsUrl}' target='_blank'>",
|
9 |
-
'</a>',
|
10 |
-
"<a href='{$privacyPolicyUrl}' target='_blank'>",
|
11 |
-
'</a>'
|
12 |
-
); ?>
|
13 |
-
<?php else: ?>
|
14 |
-
<?= sprintf(
|
15 |
-
__('I accept the %sPrivacy Policy%s', 'gdpr-framework'),
|
16 |
-
"<a href='{$privacyPolicyUrl}' target='_blank'>",
|
17 |
-
'</a>'
|
18 |
-
); ?>
|
19 |
-
<?php endif; ?>*
|
20 |
-
</label>
|
21 |
-
</p>
|
1 |
+
<p class="gdpr-terms-container" style="margin-bottom: 10px">
|
2 |
+
<label>
|
3 |
+
<input type="checkbox" name="gdpr_terms" id="gdpr_terms" value="1" />
|
4 |
+
|
5 |
+
<?php if ($termsUrl): ?>
|
6 |
+
<?= sprintf(
|
7 |
+
__('I accept the %sTerms and Conditions%s and the %sPrivacy Policy%s', 'gdpr-framework'),
|
8 |
+
"<a href='{$termsUrl}' target='_blank'>",
|
9 |
+
'</a>',
|
10 |
+
"<a href='{$privacyPolicyUrl}' target='_blank'>",
|
11 |
+
'</a>'
|
12 |
+
); ?>
|
13 |
+
<?php else: ?>
|
14 |
+
<?= sprintf(
|
15 |
+
__('I accept the %sPrivacy Policy%s', 'gdpr-framework'),
|
16 |
+
"<a href='{$privacyPolicyUrl}' target='_blank'>",
|
17 |
+
'</a>'
|
18 |
+
); ?>
|
19 |
+
<?php endif; ?>*
|
20 |
+
</label>
|
21 |
+
</p>
|
views/policy/policy.php
CHANGED
@@ -1,283 +1,283 @@
|
|
1 |
-
<h2>Privacy Policy</h2>
|
2 |
-
<p>
|
3 |
-
<?= esc_html($companyName); ?> is committed to safeguarding your privacy. Contact us at <a href="mailto:<?= esc_attr($contactEmail); ?>"><?= esc_html($contactEmail); ?></a> if you have any questions or problems regarding the use of your Personal Data and we will gladly assist you.
|
4 |
-
</p>
|
5 |
-
<p>
|
6 |
-
By using this site or/and our services, you consent to the Processing of your Personal Data as described in this Privacy Policy.
|
7 |
-
<?php if ($hasTerms): ?>
|
8 |
-
This Privacy Policy is a part of our Terms and Conditions; by agreeing to Terms and Conditions you also agree to this Policy. In the event of collision of terms used in Terms and Conditions and Privacy Policy, the latter shall prevail.
|
9 |
-
<?php endif; ?>
|
10 |
-
</p>
|
11 |
-
|
12 |
-
|
13 |
-
<h3>Table of Contents</h3>
|
14 |
-
<ol>
|
15 |
-
<li><a href="#gdpr-definitions">Definitions used in this Policy</a></li>
|
16 |
-
<li><a href="#gdpr-principles">Data protection principles we follow</a></li>
|
17 |
-
<li><a href="#gdpr-rights">What rights do you have regarding your Personal Data</a></li>
|
18 |
-
<li><a href="#gdpr-information">What Personal Data we gather about you</a></li>
|
19 |
-
<li><a href="#gdpr-processing">How we use your Personal Data</a></li>
|
20 |
-
<li><a href="#gdpr-sharing">Who else has access to your Personal Data</a></li>
|
21 |
-
<li><a href="#gdpr-security">How we secure your data</a></li>
|
22 |
-
<li><a href="#gdpr-cookies">Information about cookies</a></li>
|
23 |
-
<li><a href="#gdpr-contact">Contact information</a></li>
|
24 |
-
</ol>
|
25 |
-
|
26 |
-
|
27 |
-
<h3 id="gdpr-definitions">Definitions</h3>
|
28 |
-
<p>
|
29 |
-
<strong>Personal Data</strong> – any information relating to an identified or identifiable natural person.
|
30 |
-
<strong>Processing</strong> – any operation or set of operations which is performed on Personal Data or on sets of Personal Data.
|
31 |
-
<strong>Data subject</strong> - a natural person whose Personal Data is being Processed.
|
32 |
-
<strong>Child</strong> - a natural person under 16 years of age.
|
33 |
-
<strong>We/us</strong> (either capitalized or not) – <?= esc_html($companyName); ?>
|
34 |
-
</p>
|
35 |
-
|
36 |
-
|
37 |
-
<h3 id="gdpr-principles">Data Protection Principles</h3>
|
38 |
-
<p>
|
39 |
-
We promise to follow the following data protection principles:
|
40 |
-
</p>
|
41 |
-
<ul>
|
42 |
-
<li>
|
43 |
-
Processing is lawful, fair, transparent. Our Processing activities have lawful grounds. We always consider your rights before Processing Personal Data. We will provide you information regarding Processing upon request.
|
44 |
-
<li>
|
45 |
-
Processing is limited to the purpose. Our Processing activities fit the purpose for which Personal Data was gathered.
|
46 |
-
</li>
|
47 |
-
<li>
|
48 |
-
Processing is done with minimal data. We only gather and Process the minimal amount of Personal Data required for any purpose.
|
49 |
-
</li>
|
50 |
-
<li>
|
51 |
-
Processing is limited with a time period. We will not store your personal data for longer than needed.
|
52 |
-
</li>
|
53 |
-
<li>
|
54 |
-
We will do our best to ensure the accuracy of data.
|
55 |
-
</li>
|
56 |
-
<li>
|
57 |
-
We will do our best to ensure the integrity and confidentiality of data.
|
58 |
-
</li>
|
59 |
-
</ul>
|
60 |
-
|
61 |
-
|
62 |
-
<h3 id="gdpr-rights">Data Subject's rights</h3>
|
63 |
-
<p>
|
64 |
-
The Data Subject has the following rights:
|
65 |
-
</p>
|
66 |
-
<ol>
|
67 |
-
<li>Right to information – meaning you have to right to know whether your Personal Data is being processed; what data is gathered, from where it is obtained and why and by whom it is processed.</li>
|
68 |
-
<li>Right to access – meaning you have the right to access the data collected from/about you. This includes your right to request and obtain a copy of your Personal Data gathered.</li>
|
69 |
-
<li>Right to rectification – meaning you have the right to request rectification or erasure of your Personal Data that is inaccurate or incomplete.</li>
|
70 |
-
<li>Right to erasure – meaning in certain circumstances you can request for your Personal Data to be erased from our records.</li>
|
71 |
-
<li>Right to restrict processing – meaning where certain conditions apply, you have the right to restrict the Processing of your Personal Data.</li>
|
72 |
-
<li>Right to object to processing – meaning in certain cases you have the right to object to Processing of your Personal Data, for example in the case of direct marketing.</li>
|
73 |
-
<li>Right to object to automated Processing – meaning you have the right to object to automated Processing, including profiling; and not to be subject to a decision based solely on automated Processing. This right you can exercise whenever there is an outcome of the profiling that produces legal effects concerning or significantly affecting you.</li>
|
74 |
-
<li>Right to data portability – you have the right to obtain your Personal Data in a machine-readable format or if it is feasible, as a direct transfer from one Processor to another.</li>
|
75 |
-
<li>Right to lodge a complaint – in the event that we refuse your request under the Rights of Access, we will provide you with a reason as to why. If you are not satisfied with the way your request has been handled please contact us.</li>
|
76 |
-
<li>Right for the help of <a href="#gdpr-contact">supervisory authority</a> – meaning you have the right for the help of a supervisory authority and the right for other legal remedies such as claiming damages.</li>
|
77 |
-
<li>Right to withdraw consent – you have the right withdraw any given consent for Processing of your Personal Data.</li>
|
78 |
-
</ol>
|
79 |
-
|
80 |
-
|
81 |
-
<h3 id="gdpr-information">Data we gather</h3>
|
82 |
-
<p>
|
83 |
-
<strong>[TODO] - Information you have provided us with</strong><br>
|
84 |
-
This might be your e-mail address, name, billing address, home address etc – mainly information that is necessary for delivering you a product/service or to enhance your customer experience with us. We save the information you provide us with in order for you to comment or perform other activities on the website. This information includes, for example, your name and e-mail address.
|
85 |
-
</p>
|
86 |
-
<p>
|
87 |
-
<strong>[TODO] - Information automatically collected about you</strong><br>
|
88 |
-
This includes information that is automatically stored by cookies and other session tools. For example, your shopping cart information, your IP address, your shopping history (if there is any) etc. This information is used to improve your customer experience. When you use our services or look at the contents of our website, your activities may be logged.
|
89 |
-
</p>
|
90 |
-
|
91 |
-
<p>
|
92 |
-
<strong>[TODO] - Information from our partners</strong><br>
|
93 |
-
We gather information from our trusted partners with confirmation that they have legal grounds to share that information with us. This is either information you have provided them directly with or that they have gathered about you on other legal grounds. See the list of our partners <a href="#gdpr-sharing">here</a>.
|
94 |
-
</p>
|
95 |
-
|
96 |
-
<p>
|
97 |
-
<strong>Publicly available information</strong><br>
|
98 |
-
We might gather information about you that is publicly available.
|
99 |
-
</p>
|
100 |
-
|
101 |
-
|
102 |
-
<h3 id="gdpr-processing">How we use your Personal Data</h3>
|
103 |
-
|
104 |
-
<p>
|
105 |
-
We use your Personal Data in order to:
|
106 |
-
</p>
|
107 |
-
<ul>
|
108 |
-
<li>provide our service to you. This includes for example registering your account; providing you with other products and services that you have requested; providing you with promotional items at your request and communicating with you in relation to those products and services; communicating and interacting with you; and notifying you of changes to any services.</li>
|
109 |
-
<li>enhance your customer experience;</li>
|
110 |
-
<li>fulfil an obligation under law or contract;</li>
|
111 |
-
<li><strong>[TODO]</strong></li>
|
112 |
-
</ul>
|
113 |
-
|
114 |
-
<p>
|
115 |
-
We use your Personal Data on legitimate grounds and/or with your Consent.
|
116 |
-
</p>
|
117 |
-
|
118 |
-
<p>
|
119 |
-
On the grounds of entering into a contract or fulfilling contractual obligations, we Process your Personal Data for the following purposes:
|
120 |
-
</p>
|
121 |
-
<ul>
|
122 |
-
<li>to identify you;</li>
|
123 |
-
<li>to provide you a service or to send/offer you a product;</li>
|
124 |
-
<li>to communicate either for sales or invoicing;</li>
|
125 |
-
<li><strong>[TODO]</strong></li>
|
126 |
-
</ul>
|
127 |
-
|
128 |
-
<p>
|
129 |
-
On the ground of legitimate interest, we Process your Personal Data for the following purposes:
|
130 |
-
</p>
|
131 |
-
<ul>
|
132 |
-
<li>to send you personalized offers* (from us and/or our carefully selected partners);</li>
|
133 |
-
<li>to administer and analyse our client base (purchasing behaviour and history) in order to improve the quality, variety, and availability of products/ services offered/provided;</li>
|
134 |
-
<li>to conduct questionnaires concerning client satisfaction;</li>
|
135 |
-
<li><strong>[TODO]</strong></li>
|
136 |
-
</ul>
|
137 |
-
<p>
|
138 |
-
As long as you have not informed us otherwise, we consider offering you products/services that are similar or same to your purchasing history/browsing behaviour to be our legitimate interest.
|
139 |
-
</p>
|
140 |
-
|
141 |
-
<p>
|
142 |
-
With your consent we Process your Personal Data for the following purposes:
|
143 |
-
</p>
|
144 |
-
<ul>
|
145 |
-
<li>to send you newsletters and campaign offers (from us and/or our carefully selected partners);</li>
|
146 |
-
<li>for other purposes we have asked your consent for;</li>
|
147 |
-
<li><strong>[TODO]</strong></li>
|
148 |
-
</ul>
|
149 |
-
|
150 |
-
<p>
|
151 |
-
We Process your Personal Data in order to fulfil obligation rising from law and/or use your Personal Data for options provided by law. We reserve the right to anonymise Personal Data gathered and to use any such data. We will use data outside the scope of this Policy only when it is anonymised. We save your billing information and other information gathered about you for as long as needed for accounting purposes or other obligations deriving from law, but not longer than <strong>[TODO]</strong>
|
152 |
-
</p>
|
153 |
-
|
154 |
-
<p>
|
155 |
-
We might process your Personal Data for additional purposes that are not mentioned here, but are compatible with the original purpose for which the data was gathered. To do this, we will ensure that:
|
156 |
-
</p>
|
157 |
-
<ul>
|
158 |
-
<li>the link between purposes, context and nature of Personal Data is suitable for further Processing;</li>
|
159 |
-
<li>the further Processing would not harm your interests and</li>
|
160 |
-
<li>there would be appropriate safeguard for Processing.</li>
|
161 |
-
</ul>
|
162 |
-
<p>
|
163 |
-
We will inform you of any further Processing and purposes.
|
164 |
-
</p>
|
165 |
-
|
166 |
-
|
167 |
-
<h3 id="gdpr-sharing">Who else can access your Personal Data</h3>
|
168 |
-
<p>
|
169 |
-
We do not share your Personal Data with strangers. Personal Data about you is in some cases provided to our trusted partners in order to either make providing the service to you possible or to enhance your customer experience. We share your data with:
|
170 |
-
</p>
|
171 |
-
<p>
|
172 |
-
<strong>Our processing partners:</strong>
|
173 |
-
</p>
|
174 |
-
<ul>
|
175 |
-
<li><strong>[TODO]</strong></li>
|
176 |
-
</ul>
|
177 |
-
|
178 |
-
<p>
|
179 |
-
<strong>Our business partners:</strong>
|
180 |
-
</p>
|
181 |
-
<ul>
|
182 |
-
<li><strong>[TODO]</strong></li>
|
183 |
-
</ul>
|
184 |
-
|
185 |
-
<p>
|
186 |
-
<strong>Connected third parties:</strong>
|
187 |
-
</p>
|
188 |
-
<ul>
|
189 |
-
<li><strong>[TODO]</strong></li>
|
190 |
-
</ul>
|
191 |
-
|
192 |
-
<p>
|
193 |
-
We only work with Processing partners who are able to ensure adequate level of protection to your Personal Data. We disclose your Personal Data to third parties or public officials when we are legally obliged to do so. We might disclose your Personal Data to third parties if you have consented to it or if there are other legal grounds for it.
|
194 |
-
</p>
|
195 |
-
|
196 |
-
|
197 |
-
<h3 id="gdpr-security">How we secure your data</h3>
|
198 |
-
|
199 |
-
<p>
|
200 |
-
We do our best to keep your Personal Data safe. We use safe protocols for communication and transferring data (such as HTTPS). We use anonymising and pseudonymising where suitable. We monitor our systems for possible vulnerabilities and attacks.<strong>[TODO]</strong> - describe additional security measures.
|
201 |
-
</p>
|
202 |
-
<p>
|
203 |
-
Even though we try our best we can not guarantee the security of information. However, we promise to notify suitable authorities of data breaches. We will also notify you if there is a threat to your rights or interests. We will do everything we reasonably can to prevent security breaches and to assist authorities should any breaches occur.
|
204 |
-
</p>
|
205 |
-
<p>
|
206 |
-
If you have an account with us, note that you have to keep your username and password secret.
|
207 |
-
</p>
|
208 |
-
|
209 |
-
<h3>Children</h3>
|
210 |
-
<p>
|
211 |
-
We do not intend to collect or knowingly collect information from children. We do not target children with our services.
|
212 |
-
</p>
|
213 |
-
|
214 |
-
<h3 id="gdpr-cookies">Cookies and other technologies we use</h3>
|
215 |
-
<p>
|
216 |
-
We use cookies and/or similar technologies to analyse customer behaviour, administer the website, track users' movements, and to collect information about users. This is done in order to personalise and enhance your experience with us.
|
217 |
-
</p>
|
218 |
-
|
219 |
-
<p>
|
220 |
-
A cookie is a tiny text file stored on your computer. Cookies store information that is used to help make sites work. Only we can access the cookies created by our website. You can control your cookies at the browser level. Choosing to disable cookies may hinder your use of certain functions.
|
221 |
-
</p>
|
222 |
-
|
223 |
-
<p>
|
224 |
-
<strong>We use cookies for the following purposes:</strong>
|
225 |
-
</p>
|
226 |
-
<ul>
|
227 |
-
<li>Necessary cookies – these cookies are required for you to be able to use some important features on our website, such as logging in. These cookies don't collect any personal information.</li>
|
228 |
-
<li>Functionality cookies – these cookies provide functionality that makes using our service more convenient and makes providing more personalised features possible. For example, they might remember your name and e-mail in comment forms so you don't have to re-enter this information next time when commenting.</li>
|
229 |
-
<li>Analytics cookies - these cookies are used to track the use and performance of our website and services</li>
|
230 |
-
<li>Advertising cookies - these cookies are used to deliver advertisements that are relevant to you and to your interests. In addition, they are used to limit the number of times you see an advertisement. They are usually placed to the website by advertising networks with the website operator’s permission. These cookies remember that you have visited a website and this information is shared with other organisations such as advertisers. Often targeting or advertising cookies will be linked to site functionality provided by the other organisation.</li>
|
231 |
-
</ul>
|
232 |
-
|
233 |
-
<p>
|
234 |
-
You can remove cookies stored in your computer via your browser settings. Alternatively, you can control some 3rd party cookies by using a privacy enhancement platform such as <a href="http://optout.aboutads.info/#!/" target="_blank">optout.aboutads.info</a> or <a href="http://www.youronlinechoices.com/" target="_blank">youronlinechoices.com</a>. For more information about cookies, visit <a href="http://www.allaboutcookies.org" target="_blank">allaboutcookies.org</a>.
|
235 |
-
</p>
|
236 |
-
|
237 |
-
<p>
|
238 |
-
We use Google Analytics to measure traffic on our website. Google has their own Privacy Policy which you can review <a href="https://support.google.com/analytics/answer/6004245" target="_blank">here</a>. If you'd like to opt out of tracking by Google Analytics, visit the <a href="https://tools.google.com/dlpage/gaoptout" target="_blank">Google Analytics opt-out page</a>.
|
239 |
-
</p>
|
240 |
-
|
241 |
-
|
242 |
-
<h3 id="gdpr-contact">Contact Information</h3>
|
243 |
-
<?php if ($hasDpo): ?>
|
244 |
-
<p>
|
245 |
-
<strong id="gdpr-dpo">Data Protection Officer</strong><br>
|
246 |
-
If you have any questions regarding Processing your Personal Data, your rights regarding your Personal Data or this Privacy Policy, contact our Data Protection Officer<?= esc_html($dpoName); ?> at <a href="mailto:<?= esc_attr($dpoEmail); ?>"><?= esc_html($dpoEmail); ?></a>
|
247 |
-
</p>
|
248 |
-
<?php endif; ?>
|
249 |
-
|
250 |
-
<?php if ($hasRepresentative): ?>
|
251 |
-
<p>
|
252 |
-
<strong id="gdpr-representative">Representative Contact in the EU</strong>
|
253 |
-
<?php if ($representativeContactName): ?>
|
254 |
-
Name: <?= esc_html($representativeContactName); ?>
|
255 |
-
<?php endif; ?>
|
256 |
-
<?php if ($representativeContactEmail): ?>
|
257 |
-
Email: <a href="mailto:<?= esc_attr($representativeContactEmail); ?>"><?= esc_html($representativeContactEmail); ?></a><br>
|
258 |
-
<?php endif; ?>
|
259 |
-
<?php if ($representativeContactPhone): ?>
|
260 |
-
Phone: <?= esc_html($representativeContactPhone); ?>
|
261 |
-
<?php endif; ?>
|
262 |
-
</p>
|
263 |
-
<?php endif; ?>
|
264 |
-
|
265 |
-
<p>
|
266 |
-
<strong id="gdpr-dpa">Supervisory Authority</strong><br>
|
267 |
-
<?php if ($dpaWebsite): ?>
|
268 |
-
Website: <a href="<?= esc_attr($dpaWebsite); ?>" target="_blank"><?= esc_html($dpaWebsite); ?></a> <br>
|
269 |
-
<?php endif; ?>
|
270 |
-
<?php if ($dpaEmail): ?>
|
271 |
-
Email: <a href="mailto:<?= esc_attr($dpaEmail); ?>"><?= esc_html($dpaEmail); ?></a><br>
|
272 |
-
<?php endif; ?>
|
273 |
-
<?php if ($dpaPhone): ?>
|
274 |
-
Phone: <?= esc_html($dpaPhone); ?>
|
275 |
-
<?php endif; ?>
|
276 |
-
</p>
|
277 |
-
|
278 |
-
|
279 |
-
<h3 id="gdpr-changes">Changes to this Privacy Policy</h3>
|
280 |
-
<p>
|
281 |
-
We reserve the right to make change to this Privacy Policy.
|
282 |
-
Last modification was made <?= $date; ?>.
|
283 |
-
</p>
|
1 |
+
<h2>Privacy Policy</h2>
|
2 |
+
<p>
|
3 |
+
<?= esc_html($companyName); ?> is committed to safeguarding your privacy. Contact us at <a href="mailto:<?= esc_attr($contactEmail); ?>"><?= esc_html($contactEmail); ?></a> if you have any questions or problems regarding the use of your Personal Data and we will gladly assist you.
|
4 |
+
</p>
|
5 |
+
<p>
|
6 |
+
By using this site or/and our services, you consent to the Processing of your Personal Data as described in this Privacy Policy.
|
7 |
+
<?php if ($hasTerms): ?>
|
8 |
+
This Privacy Policy is a part of our Terms and Conditions; by agreeing to Terms and Conditions you also agree to this Policy. In the event of collision of terms used in Terms and Conditions and Privacy Policy, the latter shall prevail.
|
9 |
+
<?php endif; ?>
|
10 |
+
</p>
|
11 |
+
|
12 |
+
|
13 |
+
<h3>Table of Contents</h3>
|
14 |
+
<ol>
|
15 |
+
<li><a href="#gdpr-definitions">Definitions used in this Policy</a></li>
|
16 |
+
<li><a href="#gdpr-principles">Data protection principles we follow</a></li>
|
17 |
+
<li><a href="#gdpr-rights">What rights do you have regarding your Personal Data</a></li>
|
18 |
+
<li><a href="#gdpr-information">What Personal Data we gather about you</a></li>
|
19 |
+
<li><a href="#gdpr-processing">How we use your Personal Data</a></li>
|
20 |
+
<li><a href="#gdpr-sharing">Who else has access to your Personal Data</a></li>
|
21 |
+
<li><a href="#gdpr-security">How we secure your data</a></li>
|
22 |
+
<li><a href="#gdpr-cookies">Information about cookies</a></li>
|
23 |
+
<li><a href="#gdpr-contact">Contact information</a></li>
|
24 |
+
</ol>
|
25 |
+
|
26 |
+
|
27 |
+
<h3 id="gdpr-definitions">Definitions</h3>
|
28 |
+
<p>
|
29 |
+
<strong>Personal Data</strong> – any information relating to an identified or identifiable natural person.
|
30 |
+
<strong>Processing</strong> – any operation or set of operations which is performed on Personal Data or on sets of Personal Data.
|
31 |
+
<strong>Data subject</strong> - a natural person whose Personal Data is being Processed.
|
32 |
+
<strong>Child</strong> - a natural person under 16 years of age.
|
33 |
+
<strong>We/us</strong> (either capitalized or not) – <?= esc_html($companyName); ?>
|
34 |
+
</p>
|
35 |
+
|
36 |
+
|
37 |
+
<h3 id="gdpr-principles">Data Protection Principles</h3>
|
38 |
+
<p>
|
39 |
+
We promise to follow the following data protection principles:
|
40 |
+
</p>
|
41 |
+
<ul>
|
42 |
+
<li>
|
43 |
+
Processing is lawful, fair, transparent. Our Processing activities have lawful grounds. We always consider your rights before Processing Personal Data. We will provide you information regarding Processing upon request.
|
44 |
+
<li>
|
45 |
+
Processing is limited to the purpose. Our Processing activities fit the purpose for which Personal Data was gathered.
|
46 |
+
</li>
|
47 |
+
<li>
|
48 |
+
Processing is done with minimal data. We only gather and Process the minimal amount of Personal Data required for any purpose.
|
49 |
+
</li>
|
50 |
+
<li>
|
51 |
+
Processing is limited with a time period. We will not store your personal data for longer than needed.
|
52 |
+
</li>
|
53 |
+
<li>
|
54 |
+
We will do our best to ensure the accuracy of data.
|
55 |
+
</li>
|
56 |
+
<li>
|
57 |
+
We will do our best to ensure the integrity and confidentiality of data.
|
58 |
+
</li>
|
59 |
+
</ul>
|
60 |
+
|
61 |
+
|
62 |
+
<h3 id="gdpr-rights">Data Subject's rights</h3>
|
63 |
+
<p>
|
64 |
+
The Data Subject has the following rights:
|
65 |
+
</p>
|
66 |
+
<ol>
|
67 |
+
<li>Right to information – meaning you have to right to know whether your Personal Data is being processed; what data is gathered, from where it is obtained and why and by whom it is processed.</li>
|
68 |
+
<li>Right to access – meaning you have the right to access the data collected from/about you. This includes your right to request and obtain a copy of your Personal Data gathered.</li>
|
69 |
+
<li>Right to rectification – meaning you have the right to request rectification or erasure of your Personal Data that is inaccurate or incomplete.</li>
|
70 |
+
<li>Right to erasure – meaning in certain circumstances you can request for your Personal Data to be erased from our records.</li>
|
71 |
+
<li>Right to restrict processing – meaning where certain conditions apply, you have the right to restrict the Processing of your Personal Data.</li>
|
72 |
+
<li>Right to object to processing – meaning in certain cases you have the right to object to Processing of your Personal Data, for example in the case of direct marketing.</li>
|
73 |
+
<li>Right to object to automated Processing – meaning you have the right to object to automated Processing, including profiling; and not to be subject to a decision based solely on automated Processing. This right you can exercise whenever there is an outcome of the profiling that produces legal effects concerning or significantly affecting you.</li>
|
74 |
+
<li>Right to data portability – you have the right to obtain your Personal Data in a machine-readable format or if it is feasible, as a direct transfer from one Processor to another.</li>
|
75 |
+
<li>Right to lodge a complaint – in the event that we refuse your request under the Rights of Access, we will provide you with a reason as to why. If you are not satisfied with the way your request has been handled please contact us.</li>
|
76 |
+
<li>Right for the help of <a href="#gdpr-contact">supervisory authority</a> – meaning you have the right for the help of a supervisory authority and the right for other legal remedies such as claiming damages.</li>
|
77 |
+
<li>Right to withdraw consent – you have the right withdraw any given consent for Processing of your Personal Data.</li>
|
78 |
+
</ol>
|
79 |
+
|
80 |
+
|
81 |
+
<h3 id="gdpr-information">Data we gather</h3>
|
82 |
+
<p>
|
83 |
+
<strong>[TODO] - Information you have provided us with</strong><br>
|
84 |
+
This might be your e-mail address, name, billing address, home address etc – mainly information that is necessary for delivering you a product/service or to enhance your customer experience with us. We save the information you provide us with in order for you to comment or perform other activities on the website. This information includes, for example, your name and e-mail address.
|
85 |
+
</p>
|
86 |
+
<p>
|
87 |
+
<strong>[TODO] - Information automatically collected about you</strong><br>
|
88 |
+
This includes information that is automatically stored by cookies and other session tools. For example, your shopping cart information, your IP address, your shopping history (if there is any) etc. This information is used to improve your customer experience. When you use our services or look at the contents of our website, your activities may be logged.
|
89 |
+
</p>
|
90 |
+
|
91 |
+
<p>
|
92 |
+
<strong>[TODO] - Information from our partners</strong><br>
|
93 |
+
We gather information from our trusted partners with confirmation that they have legal grounds to share that information with us. This is either information you have provided them directly with or that they have gathered about you on other legal grounds. See the list of our partners <a href="#gdpr-sharing">here</a>.
|
94 |
+
</p>
|
95 |
+
|
96 |
+
<p>
|
97 |
+
<strong>Publicly available information</strong><br>
|
98 |
+
We might gather information about you that is publicly available.
|
99 |
+
</p>
|
100 |
+
|
101 |
+
|
102 |
+
<h3 id="gdpr-processing">How we use your Personal Data</h3>
|
103 |
+
|
104 |
+
<p>
|
105 |
+
We use your Personal Data in order to:
|
106 |
+
</p>
|
107 |
+
<ul>
|
108 |
+
<li>provide our service to you. This includes for example registering your account; providing you with other products and services that you have requested; providing you with promotional items at your request and communicating with you in relation to those products and services; communicating and interacting with you; and notifying you of changes to any services.</li>
|
109 |
+
<li>enhance your customer experience;</li>
|
110 |
+
<li>fulfil an obligation under law or contract;</li>
|
111 |
+
<li><strong>[TODO]</strong></li>
|
112 |
+
</ul>
|
113 |
+
|
114 |
+
<p>
|
115 |
+
We use your Personal Data on legitimate grounds and/or with your Consent.
|
116 |
+
</p>
|
117 |
+
|
118 |
+
<p>
|
119 |
+
On the grounds of entering into a contract or fulfilling contractual obligations, we Process your Personal Data for the following purposes:
|
120 |
+
</p>
|
121 |
+
<ul>
|
122 |
+
<li>to identify you;</li>
|
123 |
+
<li>to provide you a service or to send/offer you a product;</li>
|
124 |
+
<li>to communicate either for sales or invoicing;</li>
|
125 |
+
<li><strong>[TODO]</strong></li>
|
126 |
+
</ul>
|
127 |
+
|
128 |
+
<p>
|
129 |
+
On the ground of legitimate interest, we Process your Personal Data for the following purposes:
|
130 |
+
</p>
|
131 |
+
<ul>
|
132 |
+
<li>to send you personalized offers* (from us and/or our carefully selected partners);</li>
|
133 |
+
<li>to administer and analyse our client base (purchasing behaviour and history) in order to improve the quality, variety, and availability of products/ services offered/provided;</li>
|
134 |
+
<li>to conduct questionnaires concerning client satisfaction;</li>
|
135 |
+
<li><strong>[TODO]</strong></li>
|
136 |
+
</ul>
|
137 |
+
<p>
|
138 |
+
As long as you have not informed us otherwise, we consider offering you products/services that are similar or same to your purchasing history/browsing behaviour to be our legitimate interest.
|
139 |
+
</p>
|
140 |
+
|
141 |
+
<p>
|
142 |
+
With your consent we Process your Personal Data for the following purposes:
|
143 |
+
</p>
|
144 |
+
<ul>
|
145 |
+
<li>to send you newsletters and campaign offers (from us and/or our carefully selected partners);</li>
|
146 |
+
<li>for other purposes we have asked your consent for;</li>
|
147 |
+
<li><strong>[TODO]</strong></li>
|
148 |
+
</ul>
|
149 |
+
|
150 |
+
<p>
|
151 |
+
We Process your Personal Data in order to fulfil obligation rising from law and/or use your Personal Data for options provided by law. We reserve the right to anonymise Personal Data gathered and to use any such data. We will use data outside the scope of this Policy only when it is anonymised. We save your billing information and other information gathered about you for as long as needed for accounting purposes or other obligations deriving from law, but not longer than <strong>[TODO]</strong>
|
152 |
+
</p>
|
153 |
+
|
154 |
+
<p>
|
155 |
+
We might process your Personal Data for additional purposes that are not mentioned here, but are compatible with the original purpose for which the data was gathered. To do this, we will ensure that:
|
156 |
+
</p>
|
157 |
+
<ul>
|
158 |
+
<li>the link between purposes, context and nature of Personal Data is suitable for further Processing;</li>
|
159 |
+
<li>the further Processing would not harm your interests and</li>
|
160 |
+
<li>there would be appropriate safeguard for Processing.</li>
|
161 |
+
</ul>
|
162 |
+
<p>
|
163 |
+
We will inform you of any further Processing and purposes.
|
164 |
+
</p>
|
165 |
+
|
166 |
+
|
167 |
+
<h3 id="gdpr-sharing">Who else can access your Personal Data</h3>
|
168 |
+
<p>
|
169 |
+
We do not share your Personal Data with strangers. Personal Data about you is in some cases provided to our trusted partners in order to either make providing the service to you possible or to enhance your customer experience. We share your data with:
|
170 |
+
</p>
|
171 |
+
<p>
|
172 |
+
<strong>Our processing partners:</strong>
|
173 |
+
</p>
|
174 |
+
<ul>
|
175 |
+
<li><strong>[TODO]</strong></li>
|
176 |
+
</ul>
|
177 |
+
|
178 |
+
<p>
|
179 |
+
<strong>Our business partners:</strong>
|
180 |
+
</p>
|
181 |
+
<ul>
|
182 |
+
<li><strong>[TODO]</strong></li>
|
183 |
+
</ul>
|
184 |
+
|
185 |
+
<p>
|
186 |
+
<strong>Connected third parties:</strong>
|
187 |
+
</p>
|
188 |
+
<ul>
|
189 |
+
<li><strong>[TODO]</strong></li>
|
190 |
+
</ul>
|
191 |
+
|
192 |
+
<p>
|
193 |
+
We only work with Processing partners who are able to ensure adequate level of protection to your Personal Data. We disclose your Personal Data to third parties or public officials when we are legally obliged to do so. We might disclose your Personal Data to third parties if you have consented to it or if there are other legal grounds for it.
|
194 |
+
</p>
|
195 |
+
|
196 |
+
|
197 |
+
<h3 id="gdpr-security">How we secure your data</h3>
|
198 |
+
|
199 |
+
<p>
|
200 |
+
We do our best to keep your Personal Data safe. We use safe protocols for communication and transferring data (such as HTTPS). We use anonymising and pseudonymising where suitable. We monitor our systems for possible vulnerabilities and attacks.<strong>[TODO]</strong> - describe additional security measures.
|
201 |
+
</p>
|
202 |
+
<p>
|
203 |
+
Even though we try our best we can not guarantee the security of information. However, we promise to notify suitable authorities of data breaches. We will also notify you if there is a threat to your rights or interests. We will do everything we reasonably can to prevent security breaches and to assist authorities should any breaches occur.
|
204 |
+
</p>
|
205 |
+
<p>
|
206 |
+
If you have an account with us, note that you have to keep your username and password secret.
|
207 |
+
</p>
|
208 |
+
|
209 |
+
<h3>Children</h3>
|
210 |
+
<p>
|
211 |
+
We do not intend to collect or knowingly collect information from children. We do not target children with our services.
|
212 |
+
</p>
|
213 |
+
|
214 |
+
<h3 id="gdpr-cookies">Cookies and other technologies we use</h3>
|
215 |
+
<p>
|
216 |
+
We use cookies and/or similar technologies to analyse customer behaviour, administer the website, track users' movements, and to collect information about users. This is done in order to personalise and enhance your experience with us.
|
217 |
+
</p>
|
218 |
+
|
219 |
+
<p>
|
220 |
+
A cookie is a tiny text file stored on your computer. Cookies store information that is used to help make sites work. Only we can access the cookies created by our website. You can control your cookies at the browser level. Choosing to disable cookies may hinder your use of certain functions.
|
221 |
+
</p>
|
222 |
+
|
223 |
+
<p>
|
224 |
+
<strong>We use cookies for the following purposes:</strong>
|
225 |
+
</p>
|
226 |
+
<ul>
|
227 |
+
<li>Necessary cookies – these cookies are required for you to be able to use some important features on our website, such as logging in. These cookies don't collect any personal information.</li>
|
228 |
+
<li>Functionality cookies – these cookies provide functionality that makes using our service more convenient and makes providing more personalised features possible. For example, they might remember your name and e-mail in comment forms so you don't have to re-enter this information next time when commenting.</li>
|
229 |
+
<li>Analytics cookies - these cookies are used to track the use and performance of our website and services</li>
|
230 |
+
<li>Advertising cookies - these cookies are used to deliver advertisements that are relevant to you and to your interests. In addition, they are used to limit the number of times you see an advertisement. They are usually placed to the website by advertising networks with the website operator’s permission. These cookies remember that you have visited a website and this information is shared with other organisations such as advertisers. Often targeting or advertising cookies will be linked to site functionality provided by the other organisation.</li>
|
231 |
+
</ul>
|
232 |
+
|
233 |
+
<p>
|
234 |
+
You can remove cookies stored in your computer via your browser settings. Alternatively, you can control some 3rd party cookies by using a privacy enhancement platform such as <a href="http://optout.aboutads.info/#!/" target="_blank">optout.aboutads.info</a> or <a href="http://www.youronlinechoices.com/" target="_blank">youronlinechoices.com</a>. For more information about cookies, visit <a href="http://www.allaboutcookies.org" target="_blank">allaboutcookies.org</a>.
|
235 |
+
</p>
|
236 |
+
|
237 |
+
<p>
|
238 |
+
We use Google Analytics to measure traffic on our website. Google has their own Privacy Policy which you can review <a href="https://support.google.com/analytics/answer/6004245" target="_blank">here</a>. If you'd like to opt out of tracking by Google Analytics, visit the <a href="https://tools.google.com/dlpage/gaoptout" target="_blank">Google Analytics opt-out page</a>.
|
239 |
+
</p>
|
240 |
+
|
241 |
+
|
242 |
+
<h3 id="gdpr-contact">Contact Information</h3>
|
243 |
+
<?php if ($hasDpo): ?>
|
244 |
+
<p>
|
245 |
+
<strong id="gdpr-dpo">Data Protection Officer</strong><br>
|
246 |
+
If you have any questions regarding Processing your Personal Data, your rights regarding your Personal Data or this Privacy Policy, contact our Data Protection Officer<?= esc_html($dpoName); ?> at <a href="mailto:<?= esc_attr($dpoEmail); ?>"><?= esc_html($dpoEmail); ?></a>
|
247 |
+
</p>
|
248 |
+
<?php endif; ?>
|
249 |
+
|
250 |
+
<?php if ($hasRepresentative): ?>
|
251 |
+
<p>
|
252 |
+
<strong id="gdpr-representative">Representative Contact in the EU</strong>
|
253 |
+
<?php if ($representativeContactName): ?>
|
254 |
+
Name: <?= esc_html($representativeContactName); ?>
|
255 |
+
<?php endif; ?>
|
256 |
+
<?php if ($representativeContactEmail): ?>
|
257 |
+
Email: <a href="mailto:<?= esc_attr($representativeContactEmail); ?>"><?= esc_html($representativeContactEmail); ?></a><br>
|
258 |
+
<?php endif; ?>
|
259 |
+
<?php if ($representativeContactPhone): ?>
|
260 |
+
Phone: <?= esc_html($representativeContactPhone); ?>
|
261 |
+
<?php endif; ?>
|
262 |
+
</p>
|
263 |
+
<?php endif; ?>
|
264 |
+
|
265 |
+
<p>
|
266 |
+
<strong id="gdpr-dpa">Supervisory Authority</strong><br>
|
267 |
+
<?php if ($dpaWebsite): ?>
|
268 |
+
Website: <a href="<?= esc_attr($dpaWebsite); ?>" target="_blank"><?= esc_html($dpaWebsite); ?></a> <br>
|
269 |
+
<?php endif; ?>
|
270 |
+
<?php if ($dpaEmail): ?>
|
271 |
+
Email: <a href="mailto:<?= esc_attr($dpaEmail); ?>"><?= esc_html($dpaEmail); ?></a><br>
|
272 |
+
<?php endif; ?>
|
273 |
+
<?php if ($dpaPhone): ?>
|
274 |
+
Phone: <?= esc_html($dpaPhone); ?>
|
275 |
+
<?php endif; ?>
|
276 |
+
</p>
|
277 |
+
|
278 |
+
|
279 |
+
<h3 id="gdpr-changes">Changes to this Privacy Policy</h3>
|
280 |
+
<p>
|
281 |
+
We reserve the right to make change to this Privacy Policy.
|
282 |
+
Last modification was made <?= $date; ?>.
|
283 |
+
</p>
|
views/privacy-tools/form-consent.php
CHANGED
@@ -1,39 +1,39 @@
|
|
1 |
-
<?php if (count($consentData) or $consentInfo): ?>
|
2 |
-
<h2><?= __('Consent', 'gdpr-framework'); ?></h2>
|
3 |
-
|
4 |
-
<?php if (count($consentData)): ?>
|
5 |
-
<p>
|
6 |
-
<?= __('Here you can withdraw any consents you have given.', 'gdpr-framework'); ?>
|
7 |
-
</p>
|
8 |
-
<table class="gdpr-consent">
|
9 |
-
<th colspan="4"><?= __('Consent types', 'gdpr-framework'); ?></th>
|
10 |
-
<?php foreach ($consentData as $item): ?>
|
11 |
-
<tr>
|
12 |
-
<td>
|
13 |
-
✔
|
14 |
-
</td>
|
15 |
-
<td>
|
16 |
-
<?= $item['title']; ?>
|
17 |
-
</td>
|
18 |
-
<td>
|
19 |
-
<em><?= $item['description']; ?></em>
|
20 |
-
</td>
|
21 |
-
<td>
|
22 |
-
<?php if ('privacy-policy' !== $item['slug']): ?>
|
23 |
-
<a href="<?= esc_url($item['withdraw_url']); ?>" class="button button-primary">
|
24 |
-
<?= __('Withdraw', 'gdpr-framework'); ?>
|
25 |
-
</a>
|
26 |
-
<?php endif; ?>
|
27 |
-
</td>
|
28 |
-
</tr>
|
29 |
-
<?php endforeach; ?>
|
30 |
-
</table>
|
31 |
-
<?php endif; ?>
|
32 |
-
|
33 |
-
<?php if ($consentInfo): ?>
|
34 |
-
<div class="gdpr-consent-disclaimer">
|
35 |
-
<?= $consentInfo; ?>
|
36 |
-
</div>
|
37 |
-
<?php endif; ?>
|
38 |
-
<hr>
|
39 |
-
<?php endif; ?>
|
1 |
+
<?php if (count($consentData) or $consentInfo): ?>
|
2 |
+
<h2><?= __('Consent', 'gdpr-framework'); ?></h2>
|
3 |
+
|
4 |
+
<?php if (count($consentData)): ?>
|
5 |
+
<p>
|
6 |
+
<?= __('Here you can withdraw any consents you have given.', 'gdpr-framework'); ?>
|
7 |
+
</p>
|
8 |
+
<table class="gdpr-consent">
|
9 |
+
<th colspan="4"><?= __('Consent types', 'gdpr-framework'); ?></th>
|
10 |
+
<?php foreach ($consentData as $item): ?>
|
11 |
+
<tr>
|
12 |
+
<td>
|
13 |
+
✔
|
14 |
+
</td>
|
15 |
+
<td>
|
16 |
+
<?= $item['title']; ?>
|
17 |
+
</td>
|
18 |
+
<td>
|
19 |
+
<em><?= $item['description']; ?></em>
|
20 |
+
</td>
|
21 |
+
<td>
|
22 |
+
<?php if ('privacy-policy' !== $item['slug']): ?>
|
23 |
+
<a href="<?= esc_url($item['withdraw_url']); ?>" class="button button-primary">
|
24 |
+
<?= __('Withdraw', 'gdpr-framework'); ?>
|
25 |
+
</a>
|
26 |
+
<?php endif; ?>
|
27 |
+
</td>
|
28 |
+
</tr>
|
29 |
+
<?php endforeach; ?>
|
30 |
+
</table>
|
31 |
+
<?php endif; ?>
|
32 |
+
|
33 |
+
<?php if ($consentInfo): ?>
|
34 |
+
<div class="gdpr-consent-disclaimer">
|
35 |
+
<?= $consentInfo; ?>
|
36 |
+
</div>
|
37 |
+
<?php endif; ?>
|
38 |
+
<hr>
|
39 |
+
<?php endif; ?>
|
views/privacy-tools/form-delete.php
CHANGED
@@ -1,18 +1,18 @@
|
|
1 |
-
<h2><?= __('Delete my user and data', 'gdpr-framework') ?></h2>
|
2 |
-
|
3 |
-
<div class="gdpr-delete-button">
|
4 |
-
<form method="GET">
|
5 |
-
<input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>"/>
|
6 |
-
<input type="hidden" name="gdpr_action" value="<?= $action; ?>"/>
|
7 |
-
<input type="submit" class="button button-primary" value="<?= __('Delete my data', 'gdpr-framework') ?>"/>
|
8 |
-
</form>
|
9 |
-
</div>
|
10 |
-
|
11 |
-
<br/>
|
12 |
-
<p class="description">
|
13 |
-
<?= __('Delete all data we have gathered about you.', 'gdpr-framework') ?> <br/>
|
14 |
-
<?= __('If you have a user account on our site, it will also be deleted.', 'gdpr-framework') ?> <br/>
|
15 |
-
<?= __('Be careful - this action is permanent and CANNOT be undone.', 'gdpr-framework') ?>
|
16 |
-
</p>
|
17 |
-
|
18 |
-
<hr>
|
1 |
+
<h2><?= __('Delete my user and data', 'gdpr-framework') ?></h2>
|
2 |
+
|
3 |
+
<div class="gdpr-delete-button">
|
4 |
+
<form method="GET">
|
5 |
+
<input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>"/>
|
6 |
+
<input type="hidden" name="gdpr_action" value="<?= $action; ?>"/>
|
7 |
+
<input type="submit" class="button button-primary" value="<?= __('Delete my data', 'gdpr-framework') ?>"/>
|
8 |
+
</form>
|
9 |
+
</div>
|
10 |
+
|
11 |
+
<br/>
|
12 |
+
<p class="description">
|
13 |
+
<?= __('Delete all data we have gathered about you.', 'gdpr-framework') ?> <br/>
|
14 |
+
<?= __('If you have a user account on our site, it will also be deleted.', 'gdpr-framework') ?> <br/>
|
15 |
+
<?= __('Be careful - this action is permanent and CANNOT be undone.', 'gdpr-framework') ?>
|
16 |
+
</p>
|
17 |
+
|
18 |
+
<hr>
|
views/privacy-tools/form-export.php
CHANGED
@@ -1,26 +1,26 @@
|
|
1 |
-
<h2><?= __('Download your data', 'gdpr-framework') ?></h2>
|
2 |
-
|
3 |
-
<p class="description">
|
4 |
-
<?= __('You can download all your data formatted as a table for viewing.', 'gdpr-framework') ?> <br>
|
5 |
-
<?= __('Alternatively, you can export it in machine-readable JSON format.', 'gdpr-framework') ?>
|
6 |
-
</p>
|
7 |
-
|
8 |
-
<div class="gdpr-download-button">
|
9 |
-
<form method="POST">
|
10 |
-
<input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>" />
|
11 |
-
<input type="hidden" name="gdpr_action" value="export" />
|
12 |
-
<input type="hidden" name="gdpr_format" value="html" />
|
13 |
-
<input type="submit" class="button button-primary" value="<?= __('Download as table', 'gdpr-framework') ?>" />
|
14 |
-
</form>
|
15 |
-
</div>
|
16 |
-
|
17 |
-
<div class="gdpr-export-button">
|
18 |
-
<form method="POST">
|
19 |
-
<input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>" />
|
20 |
-
<input type="hidden" name="gdpr_action" value="export" />
|
21 |
-
<input type="hidden" name="gdpr_format" value="json" />
|
22 |
-
<input type="submit" class="button button-primary" value="<?= __('Export as JSON', 'gdpr-framework') ?>" />
|
23 |
-
</form>
|
24 |
-
</div>
|
25 |
-
|
26 |
-
<hr>
|
1 |
+
<h2><?= __('Download your data', 'gdpr-framework') ?></h2>
|
2 |
+
|
3 |
+
<p class="description">
|
4 |
+
<?= __('You can download all your data formatted as a table for viewing.', 'gdpr-framework') ?> <br>
|
5 |
+
<?= __('Alternatively, you can export it in machine-readable JSON format.', 'gdpr-framework') ?>
|
6 |
+
</p>
|
7 |
+
|
8 |
+
<div class="gdpr-download-button">
|
9 |
+
<form method="POST">
|
10 |
+
<input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>" />
|
11 |
+
<input type="hidden" name="gdpr_action" value="export" />
|
12 |
+
<input type="hidden" name="gdpr_format" value="html" />
|
13 |
+
<input type="submit" class="button button-primary" value="<?= __('Download as table', 'gdpr-framework') ?>" />
|
14 |
+
</form>
|
15 |
+
</div>
|
16 |
+
|
17 |
+
<div class="gdpr-export-button">
|
18 |
+
<form method="POST">
|
19 |
+
<input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>" />
|
20 |
+
<input type="hidden" name="gdpr_action" value="export" />
|
21 |
+
<input type="hidden" name="gdpr_format" value="json" />
|
22 |
+
<input type="submit" class="button button-primary" value="<?= __('Export as JSON', 'gdpr-framework') ?>" />
|
23 |
+
</form>
|
24 |
+
</div>
|
25 |
+
|
26 |
+
<hr>
|
views/privacy-tools/form-identify.php
CHANGED
@@ -1,28 +1,30 @@
|
|
1 |
-
<?php do_action('gdpr/privacy-tools-page/identify/before'); ?>
|
2 |
-
|
3 |
-
<?php if (isset($_REQUEST['gdpr_notice']) && in_array($_REQUEST['gdpr_notice'], ['data_deleted', 'request_sent'])): ?>
|
4 |
-
<p>
|
5 |
-
<br>
|
6 |
-
|
7 |
-
<a href="<?= get_home_url() ?>">
|
8 |
-
<?= __('Back to front page', 'gdpr-framework'); ?>
|
9 |
-
</a>
|
10 |
-
</p>
|
11 |
-
<?php else: ?>
|
12 |
-
|
13 |
-
<h3>
|
14 |
-
<?=
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
<
|
20 |
-
<input type="
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
<?php
|
|
|
|
1 |
+
<?php do_action('gdpr/privacy-tools-page/identify/before'); ?>
|
2 |
+
|
3 |
+
<?php if (isset($_REQUEST['gdpr_notice']) && in_array($_REQUEST['gdpr_notice'], ['data_deleted', 'request_sent'])): ?>
|
4 |
+
<p>
|
5 |
+
<br>
|
6 |
+
|
7 |
+
<a href="<?= get_home_url() ?>">
|
8 |
+
<?= __('Back to front page', 'gdpr-framework'); ?>
|
9 |
+
</a>
|
10 |
+
</p>
|
11 |
+
<?php else: ?>
|
12 |
+
|
13 |
+
<h3>
|
14 |
+
<?=
|
15 |
+
__('Please identify yourself via e-mail', 'gdpr-framework');
|
16 |
+
?>
|
17 |
+
</h3>
|
18 |
+
<form>
|
19 |
+
<label for="gdpr_email"><?= __('Enter your email address', 'gdpr-framework') ?></label>
|
20 |
+
<input type="hidden" name="gdpr_action" value="identify" />
|
21 |
+
<input type="hidden" name="gdpr_nonce" value="<?= $nonce ?>" />
|
22 |
+
<input type="email" id="gdpr_email" name="email" placeholder="<?= __('Enter your email address', 'gdpr-framework') ?>" />
|
23 |
+
<?php do_action('gdpr/privacy-tools-page/identify'); ?>
|
24 |
+
|
25 |
+
<input type="submit" value="<?= __('Send email', 'gdpr-framework') ?>" />
|
26 |
+
</form>
|
27 |
+
|
28 |
+
<?php endif; ?>
|
29 |
+
|
30 |
+
<?php do_action('gdpr/privacy-tools-page/identify/after'); ?>
|
views/privacy-tools/notice-admin-role.php
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
-
<h2><?= __('Delete my user and data', 'gdpr-framework') ?></h2>
|
2 |
-
<p class="description">
|
3 |
-
<em>
|
4 |
-
<?= _x('Data deletion is disabled for administrative accounts.', '(Admin)', 'gdpr-framework'); ?>
|
5 |
-
</em>
|
6 |
-
</p>
|
1 |
+
<h2><?= __('Delete my user and data', 'gdpr-framework') ?></h2>
|
2 |
+
<p class="description">
|
3 |
+
<em>
|
4 |
+
<?= _x('Data deletion is disabled for administrative accounts.', '(Admin)', 'gdpr-framework'); ?>
|
5 |
+
</em>
|
6 |
+
</p>
|
views/privacy-tools/notices.php
CHANGED
@@ -1,25 +1,25 @@
|
|
1 |
-
<div class="gdpr-notice">
|
2 |
-
<?php if ('email_sent' === $_REQUEST['gdpr_notice']): ?>
|
3 |
-
<?= __('We will send you an email with the link to access your data. Please check your spam folder as well!', 'gdpr-framework'); ?>
|
4 |
-
<?php endif; ?>
|
5 |
-
|
6 |
-
<?php if ('invalid_email' === $_REQUEST['gdpr_notice']): ?>
|
7 |
-
<?= __('The email you entered does not appear to be a valid email.', 'gdpr-framework'); ?>
|
8 |
-
<?php endif; ?>
|
9 |
-
|
10 |
-
<?php if ('invalid_key' === $_REQUEST['gdpr_notice']): ?>
|
11 |
-
<?= __('Sorry - the link seems to have expired. Please try again!', 'gdpr-framework'); ?>
|
12 |
-
<?php endif; ?>
|
13 |
-
|
14 |
-
<?php if ('consent_withdrawn' === $_REQUEST['gdpr_notice']): ?>
|
15 |
-
<?= __('Consent withdrawn.', 'gdpr-framework'); ?>
|
16 |
-
<?php endif; ?>
|
17 |
-
|
18 |
-
<?php if ('request_sent' === $_REQUEST['gdpr_notice']): ?>
|
19 |
-
<?= __('We have received your request and will reply within 30 days.', 'gdpr-framework'); ?>
|
20 |
-
<?php endif; ?>
|
21 |
-
|
22 |
-
<?php if ('data_deleted' === $_REQUEST['gdpr_notice']): ?>
|
23 |
-
<?= __('Your personal data has been removed!', 'gdpr-framework'); ?>
|
24 |
-
<?php endif; ?>
|
25 |
-
</div>
|
1 |
+
<div class="gdpr-notice">
|
2 |
+
<?php if ('email_sent' === $_REQUEST['gdpr_notice']): ?>
|
3 |
+
<?= __('We will send you an email with the link to access your data. Please check your spam folder as well!', 'gdpr-framework'); ?>
|
4 |
+
<?php endif; ?>
|
5 |
+
|
6 |
+
<?php if ('invalid_email' === $_REQUEST['gdpr_notice']): ?>
|
7 |
+
<?= __('The email you entered does not appear to be a valid email.', 'gdpr-framework'); ?>
|
8 |
+
<?php endif; ?>
|
9 |
+
|
10 |
+
<?php if ('invalid_key' === $_REQUEST['gdpr_notice']): ?>
|
11 |
+
<?= __('Sorry - the link seems to have expired. Please try again!', 'gdpr-framework'); ?>
|
12 |
+
<?php endif; ?>
|
13 |
+
|
14 |
+
<?php if ('consent_withdrawn' === $_REQUEST['gdpr_notice']): ?>
|
15 |
+
<?= __('Consent withdrawn.', 'gdpr-framework'); ?>
|
16 |
+
<?php endif; ?>
|
17 |
+
|
18 |
+
<?php if ('request_sent' === $_REQUEST['gdpr_notice']): ?>
|
19 |
+
<?= __('We have received your request and will reply within 30 days.', 'gdpr-framework'); ?>
|
20 |
+
<?php endif; ?>
|
21 |
+
|
22 |
+
<?php if ('data_deleted' === $_REQUEST['gdpr_notice']): ?>
|
23 |
+
<?= __('Your personal data has been removed!', 'gdpr-framework'); ?>
|
24 |
+
<?php endif; ?>
|
25 |
+
</div>
|
views/privacy-tools/privacy-tools.php
CHANGED
@@ -1,13 +1,13 @@
|
|
1 |
-
<div class="gdpr-framework-privacy-tools">
|
2 |
-
<?php do_action('gdpr/frontend/privacy-tools-page/content/before', $dataSubject); ?>
|
3 |
-
|
4 |
-
<p>
|
5 |
-
<?= __('You are identified as', 'gdpr-framework'); ?> <strong><?= esc_html($email); ?></strong>
|
6 |
-
</p>
|
7 |
-
|
8 |
-
<hr>
|
9 |
-
|
10 |
-
<?php do_action('gdpr/frontend/privacy-tools-page/content', $dataSubject); ?>
|
11 |
-
|
12 |
-
<?php do_action('gdpr/frontend/privacy-tools-page/content/after', $dataSubject); ?>
|
13 |
-
</div>
|
1 |
+
<div class="gdpr-framework-privacy-tools">
|
2 |
+
<?php do_action('gdpr/frontend/privacy-tools-page/content/before', $dataSubject); ?>
|
3 |
+
|
4 |
+
<p>
|
5 |
+
<?= __('You are identified as', 'gdpr-framework'); ?> <strong><?= esc_html($email); ?></strong>
|
6 |
+
</p>
|
7 |
+
|
8 |
+
<hr>
|
9 |
+
|
10 |
+
<?php do_action('gdpr/frontend/privacy-tools-page/content', $dataSubject); ?>
|
11 |
+
|
12 |
+
<?php do_action('gdpr/frontend/privacy-tools-page/content/after', $dataSubject); ?>
|
13 |
+
</div>
|
views/themes/storefront/footer.php
CHANGED
@@ -1,8 +1,8 @@
|
|
1 |
-
|
|
2 |
-
<a href="<?= esc_url($privacyPolicyUrl); ?>" style="color: #6d6d6d">
|
3 |
-
<?= __('Privacy Policy', 'gdpr-framework'); ?>
|
4 |
-
</a>
|
5 |
-
|
|
6 |
-
<a href="<?= esc_url($privacyToolsPageUrl); ?>" style="color: #6d6d6d">
|
7 |
-
<?= __('Privacy Tools', 'gdpr-framework'); ?>
|
8 |
-
</a>
|
1 |
+
|
|
2 |
+
<a href="<?= esc_url($privacyPolicyUrl); ?>" style="color: #6d6d6d">
|
3 |
+
<?= __('Privacy Policy', 'gdpr-framework'); ?>
|
4 |
+
</a>
|
5 |
+
|
|
6 |
+
<a href="<?= esc_url($privacyToolsPageUrl); ?>" style="color: #6d6d6d">
|
7 |
+
<?= __('Privacy Tools', 'gdpr-framework'); ?>
|
8 |
+
</a>
|
views/themes/twentyseventeen/footer.php
CHANGED
@@ -1,9 +1,9 @@
|
|
1 |
-
<div>
|
2 |
-
<a href="<?= esc_url($privacyPolicyUrl); ?>">
|
3 |
-
<?= __('Privacy Policy', 'gdpr-framework'); ?>
|
4 |
-
</a>
|
5 |
-
|
|
6 |
-
<a href="<?= esc_url($privacyToolsPageUrl); ?>">
|
7 |
-
<?= __('Privacy Tools', 'gdpr-framework'); ?>
|
8 |
-
</a>
|
9 |
-
</div>
|
1 |
+
<div>
|
2 |
+
<a href="<?= esc_url($privacyPolicyUrl); ?>">
|
3 |
+
<?= __('Privacy Policy', 'gdpr-framework'); ?>
|
4 |
+
</a>
|
5 |
+
|
|
6 |
+
<a href="<?= esc_url($privacyToolsPageUrl); ?>">
|
7 |
+
<?= __('Privacy Tools', 'gdpr-framework'); ?>
|
8 |
+
</a>
|
9 |
+
</div>
|
views/themes/twentysixteen/footer.php
CHANGED
@@ -1,12 +1,12 @@
|
|
1 |
-
<div style="margin-bottom: 10px">
|
2 |
-
<span class="site-title">
|
3 |
-
<a href="<?= esc_url($privacyPolicyUrl); ?>">
|
4 |
-
<?= __('Privacy Policy', 'gdpr-framework'); ?>
|
5 |
-
</a>
|
6 |
-
</span>
|
7 |
-
<span>
|
8 |
-
<a href="<?= esc_url($privacyToolsPageUrl); ?>">
|
9 |
-
<?= __('Privacy Tools', 'gdpr-framework'); ?>
|
10 |
-
</a>
|
11 |
-
</span>
|
12 |
-
</div>
|
1 |
+
<div style="margin-bottom: 10px">
|
2 |
+
<span class="site-title">
|
3 |
+
<a href="<?= esc_url($privacyPolicyUrl); ?>">
|
4 |
+
<?= __('Privacy Policy', 'gdpr-framework'); ?>
|
5 |
+
</a>
|
6 |
+
</span>
|
7 |
+
<span>
|
8 |
+
<a href="<?= esc_url($privacyToolsPageUrl); ?>">
|
9 |
+
<?= __('Privacy Tools', 'gdpr-framework'); ?>
|
10 |
+
</a>
|
11 |
+
</span>
|
12 |
+
</div>
|