PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.3.8
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.3.8
4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 4.2.0 4.2.1 All 138 releases
learnpress / inc / WPGDPR / ErasePersonalData.php

ErasePersonalData.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.3.8, at inc/WPGDPR/ErasePersonalData.php

272 lines 8.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace LearnPress\WPGDPR;
4
5 use Exception;
6 use LearnPress\Databases\DataBase;
7 use LearnPress\Databases\PostDB;
8 use LearnPress\Filters\FilterBase;
9 use LearnPress\Filters\OrderPostFilter;
10 use LearnPress\Helpers\Singleton;
11 use LearnPress\Models\UserItems\UserItemModel;
12 use LP_Debug;
13 use LP_Helper;
14 use LP_Post_DB;
15 use LP_Order_Filter;
16 use LP_User_Items_Filter;
17 use LP_User_Items_DB;
18 use LP_Filter;
19 use LP_User_Items_Result_DB;
20 use Throwable;
21 use WP_User;
22
23 /**
24 * class ErasePersonalData
25 *
26 * @since 4.2.9.3
27 * @version 1.0.0
28 */
29 class ErasePersonalData {
30 use Singleton;
31
32 public function init() {
33 add_filter(
34 'wp_privacy_personal_data_erasers',
35 function ( $erasers ) {
36 $erasers['lp_user_eraser'] = array(
37 'eraser_friendly_name' => __( 'LP Data Eraser', 'learnpress' ),
38 'callback' => array( $this, 'eraser_callback' ),
39 );
40
41 return $erasers;
42 }
43 );
44 }
45
46 /**
47 * Erase personal data callback
48 *
49 * @param string $email
50 * @param int $page
51 *
52 * @return array
53 */
54 public function eraser_callback( $email, $page ) {
55 $response = array(
56 'items_removed' => false,
57 'items_retained' => false,
58 'messages' => array(),
59 'done' => false,
60 );
61
62 try {
63 $user = get_user_by( 'email', $email );
64 if ( $user ) {
65 $this->eraser_user_data( $user );
66 } else {
67 $this->eraser_data_via_email( $email );
68 }
69
70 $response['items_removed'] = true;
71 $response['messages'] = array(
72 __( 'LP erasers Personal Data done', 'learnpress' ),
73 __( '- Eraser Orders of User', 'learnpress' ),
74 __( '- Eraser attend course of User', 'learnpress' ),
75 __( '- Eraser attend lessons, quizzes... of User', 'learnpress' ),
76 );
77 $response['done'] = true;
78 } catch ( Throwable $e ) {
79 LP_Debug::error_log( $e );
80 $response['messages'][] = $e->getMessage();
81 $response['done'] = true;
82 }
83
84 return $response;
85 }
86
87 /**
88 * Delete related data via email
89 *
90 * If not exists user, only email, it is Guest
91 * So only delete data on tables learnpress_user_items,
92 * posts type lp_order, learnpress_order_items, learnpress_order_itemmeta
93 *
94 * @param string $email
95 *
96 * @throws Exception
97 */
98 public function eraser_data_via_email( string $email ) {
99 $postDB = PostDB::getInstance();
100 $filter = new OrderPostFilter();
101 $filter->only_fields[] = 'p.ID';
102 $filter->join[] = "INNER JOIN $postDB->tb_postmeta AS pm ON p.ID = pm.post_id";
103 $filter->where[] = $postDB->wpdb->prepare(
104 'AND pm.meta_key=%s AND pm.meta_value=%s',
105 '_checkout_email',
106 $email
107 );
108 $order_ids = $postDB->get_posts( $filter );
109 if ( ! $order_ids ) {
110 return;
111 }
112
113 $order_ids = PostDb::get_values_by_key( $order_ids );
114 $order_ids = array_map( 'absint', $order_ids );
115 $order_ids_str = implode( ',', $order_ids );
116
117 // Delete data on tables: order_items and order_itemmeta
118 $this->delete_order_itemmeta( $order_ids_str );
119 $this->delete_order_items( $order_ids_str );
120 // Delete order post and meta.
121 foreach ( $order_ids as $order_id ) {
122 // Delete data on tables: learnpress_order_items
123 $filter_user_items = new LP_User_Items_Filter();
124 $filter_user_items->ref_type = LP_ORDER_CPT;
125 $filter_user_items->ref_id = $order_id;
126 $userItemModel = UserItemModel::get_user_item_model_from_db( $filter_user_items );
127 if ( $userItemModel ) {
128 $userItemModel->delete();
129 }
130
131 wp_delete_post( $order_id, true );
132 }
133 }
134
135 /**
136 * Find order item ids on table learnpress_order_items
137 * Then delete data on table learnpress_order_itemmeta
138 *
139 * @throws Exception
140 */
141 public function delete_order_itemmeta( $order_ids_str ) {
142 $db = DataBase::getInstance();
143 $filter_order_itemmeta = new FilterBase();
144 $filter_order_itemmeta->only_fields[] = 'order_item_id';
145 $filter_order_itemmeta->run_query_count = false;
146 $filter_order_itemmeta->collection = $db->tb_lp_order_items;
147 $filter_order_itemmeta->where[] = "AND order_id IN ($order_ids_str)";
148 $filter_order_itemmeta->return_string_query = 1;
149 $query_order_item_ids_str = $db->execute( $filter_order_itemmeta );
150
151 $filter = new FilterBase();
152 $filter->where[] = "AND learnpress_order_item_id IN ($query_order_item_ids_str)";
153 $filter->collection = $db->tb_lp_order_itemmeta;
154 $db->delete_execute( $filter );
155 }
156
157 /**
158 * Delete order ids on table learnpress_order_items
159 *
160 * @throws Exception
161 */
162 public function delete_order_items( $order_ids_str ) {
163 $db = DataBase::getInstance();
164 $filter_order_item = new FilterBase();
165 $filter_order_item->where[] = "AND order_id IN ($order_ids_str)";
166 $filter_order_item->collection = $db->tb_lp_order_items;
167 $db->delete_execute( $filter_order_item );
168 }
169
170 /**
171 * Erase user data
172 *
173 * @param WP_User $user
174 *
175 * @throws Exception
176 */
177 public function eraser_user_data( WP_User $user ) {
178 $user_id = $user->ID;
179 $db = DataBase::getInstance();
180
181 // Delete data uer meta which meta_key start with _lp
182 $filter_usermeta = new FilterBase();
183 $filter_usermeta->where[] = $db->wpdb->prepare(
184 'AND user_id = %d AND meta_key LIKE %s',
185 $user_id,
186 $db->wpdb->esc_like( '_lp' ) . '%'
187 );
188 $filter_usermeta->collection = $db->wpdb->usermeta;
189 $db->delete_execute( $filter_usermeta );
190 // End delete user meta
191
192 // Find all user item ids of user
193 $filter_user_items = new LP_User_Items_Filter();
194 $filter_user_items->user_id = $user_id;
195 $user_items_db = LP_User_Items_DB::getInstance();
196 $user_items = $user_items_db->get_user_items( $filter_user_items );
197 if ( $user_items ) {
198 foreach ( $user_items as $user_item ) {
199 // Delete user item and user itemmeta
200 $userItemModel = new UserItemModel( $user_item );
201 $userItemModel->delete();
202
203 // Delete user item results.
204 $filter_user_item_results = new FilterBase();
205 $filter_user_item_results->where[] = $db->wpdb->prepare(
206 'AND user_item_id = %d',
207 $userItemModel->get_user_item_id()
208 );
209 $filter_user_item_results->collection = $db->tb_lp_user_item_results;
210 $db->delete_execute( $filter_user_item_results );
211 }
212 }
213
214 // Find all orders of user
215 $postDB = PostDB::getInstance();
216 $orderPostFilter = new OrderPostFilter();
217 $orderPostFilter->only_fields[] = 'p.ID';
218 $orderPostFilter->join[] = "INNER JOIN $postDB->tb_postmeta AS pm ON p.ID = pm.post_id";
219 $orderPostFilter->where[] = $postDB->wpdb->prepare(
220 'AND pm.meta_key=%s AND pm.meta_value=%s',
221 '_user_id',
222 $user_id
223 );
224 $order_ids = $postDB->get_posts( $orderPostFilter );
225 if ( $order_ids ) {
226 $order_ids = PostDb::get_values_by_key( $order_ids );
227 $order_ids = array_map( 'absint', $order_ids );
228 $order_ids_str = implode( ',', $order_ids );
229 $this->delete_order_itemmeta( $order_ids_str );
230 $this->delete_order_items( $order_ids_str );
231
232 foreach ( $order_ids as $order_id ) {
233 wp_delete_post( $order_id, true );
234 }
235 }
236 // End delete orders of user
237
238 // Find user orders which have multiple user ids
239 $user_id_str = $postDB->wpdb->prepare( '%"%d"%', $user_id );
240 $orderPostFilter->where = array(
241 $postDB->wpdb->prepare(
242 'AND pm.meta_key=%s AND pm.meta_value LIKE %s',
243 '_user_id',
244 $user_id_str
245 ),
246 );
247
248 $order_ids_multiple_users = $postDB->get_posts( $orderPostFilter );
249 if ( $order_ids_multiple_users ) {
250 $order_ids = PostDb::get_values_by_key( $order_ids_multiple_users );
251 $order_ids = array_map( 'absint', $order_ids );
252 foreach ( $order_ids as $order_id ) {
253 $user_ids = get_post_meta( $order_id, '_user_id', true );
254
255 if ( count( $user_ids ) <= 1 ) {
256 // If only 1 user id, delete order
257 $this->delete_order_itemmeta( $order_id );
258 $this->delete_order_items( $order_id );
259 wp_delete_post( $order_id, true );
260 } else {
261 // Search and unset user id of user on array user ids
262 $current_user_order_pos = array_search( $user_id, $user_ids );
263 if ( $current_user_order_pos !== false ) {
264 unset( $user_ids[ $current_user_order_pos ] );
265 update_post_meta( $order_id, '_user_id', $user_ids );
266 }
267 }
268 }
269 }
270 }
271 }
272