PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 3.06.06
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v3.06.06
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 3.06.06, at classes/models/FrmPersonalData.php

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