PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 4.05.02
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v4.05.02
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
formidable / classes / models / FrmPersonalData.php

FrmPersonalData.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 4.05.02, at classes/models/FrmPersonalData.php

180 lines 4.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 class FrmPersonalData {
4
5 private $limit = 200;
6
7 private $page = 1;
8
9 public function __construct() {
10 add_filter( 'wp_privacy_personal_data_erasers', array( $this, 'register_data_eraser' ) );
11 add_filter( 'wp_privacy_personal_data_exporters', array( $this, 'register_exporter' ) );
12 }
13
14 /**
15 * Add options to the WordPress personal data exporter
16 *
17 * @since 3.02
18 *
19 * @param array $exporters
20 *
21 * @return array
22 */
23 public function register_exporter( $exporters ) {
24 $exporters['formidable-exporter'] = array(
25 'exporter_friendly_name' => __( 'Formidable Forms Exporter', 'formidable' ),
26 'callback' => array( $this, 'export_data' ),
27 );
28
29 return $exporters;
30 }
31
32 /**
33 * Add options to the WordPress personal data eraser
34 *
35 * @since 3.02
36 *
37 * @param array $erasers
38 *
39 * @return array
40 */
41 public function register_data_eraser( $erasers ) {
42 $erasers['formidable-eraser'] = array(
43 'eraser_friendly_name' => __( 'Formidable Forms entries', 'formidable' ),
44 'callback' => array( $this, 'erase_data' ),
45 );
46
47 return $erasers;
48 }
49
50 public function export_data( $email, $page = 1 ) {
51 $this->page = absint( $page );
52
53 $data_to_export = array(
54 'data' => array(),
55 'done' => true,
56 );
57
58 $entries = $this->get_user_entries( $email );
59 if ( empty( $entries ) ) {
60 return $data_to_export;
61 }
62
63 foreach ( (array) $entries as $entry ) {
64 $data_to_export['data'][] = array(
65 'group_id' => 'formidable',
66 'group_label' => __( 'Form Submissions', 'formidable' ),
67 'item_id' => esc_attr( 'entry-' . $entry ),
68 'data' => $this->prepare_entry_data( $entry ),
69 );
70 }
71
72 $data_to_export['done'] = count( $entries ) < $this->limit;
73
74 return $data_to_export;
75 }
76
77 /**
78 * @return array
79 */
80 public function erase_data( $email, $page = 1 ) {
81 $data_removed = array(
82 'items_removed' => false,
83 'items_retained' => false,
84 'messages' => array(),
85 'done' => true,
86 );
87
88 if ( empty( $email ) ) {
89 return $data_removed;
90 }
91
92 $this->page = absint( $page );
93 $entries = $this->get_user_entries( $email );
94 if ( empty( $entries ) ) {
95 return $data_removed;
96 }
97
98 // TODO: Add an option to anonymize the entries with wp_privacy_anonymize_data( 'email', 'e@e.com' );
99
100 foreach ( (array) $entries as $entry ) {
101 $removed = FrmEntry::destroy( $entry );
102
103 if ( $removed ) {
104 $data_removed['items_removed'] = true;
105 } else {
106 $data_removed['items_retained'] = true;
107 }
108 }
109
110 $data_removed['done'] = count( $entries ) < $this->limit;
111
112 return $data_removed;
113 }
114
115 /**
116 * Get all entries that were submitted by this user while logged in,
117 * or with a field value that matches the email address
118 *
119 * @param string $email
120 *
121 * @return array of entry ids
122 */
123 private function get_user_entries( $email ) {
124 $query_args = array(
125 'order_by' => 'item_id ASC',
126 'limit' => $this->get_current_page(),
127 );
128
129 $user = get_user_by( 'email', $email );
130
131 $entries_by_email = FrmDb::get_col( 'frm_item_metas', array( 'meta_value' => $email ), 'item_id', $query_args );
132
133 if ( empty( $user ) ) {
134 // no matching user, so return the entry ids we have
135 return $entries_by_email;
136 }
137
138 $query_args['order_by'] = 'id ASC';
139
140 $entries_by_user = FrmDb::get_col( 'frm_items', array( 'user_id' => $user->ID ), 'id', $query_args );
141
142 $entry_ids = array_merge( (array) $entries_by_user, (array) $entries_by_email );
143 $entry_ids = array_unique( array_filter( $entry_ids ) );
144
145 return $entry_ids;
146 }
147
148 private function get_current_page() {
149 $start = ( $this->page - 1 ) * $this->limit;
150
151 return FrmDb::esc_limit( $start . ',' . $this->limit );
152 }
153
154 /**
155 * @param int $entry
156 *
157 * @return array
158 */
159 private function prepare_entry_data( $entry ) {
160 $entry = FrmEntry::getOne( $entry, true );
161
162 $entry_data = array();
163 foreach ( $entry->metas as $field_id => $meta ) {
164 $field = FrmField::getOne( $field_id );
165
166 $entry_data[] = array(
167 'name' => $field->name,
168 'value' => FrmFieldsHelper::get_unfiltered_display_value(
169 array(
170 'field' => $field,
171 'value' => $meta,
172 )
173 ),
174 );
175 }
176
177 return $entry_data;
178 }
179 }
180