PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.8
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.8
4.4.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 All 139 releases
← All changes | inc/WPGDPR/ErasePersonalData.php +271 -271 4.3.94.4.8 View file →
@@ -1,271 +1,271 @@
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 -}
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 +}