PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 4.57.0
MailPoet – Newsletters, Email Marketing, and Automation v4.57.0
5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / Segments / WP.php
mailpoet / lib / Segments Last commit date
DynamicSegments 1 year ago SegmentDependencyValidator.php 3 years ago SegmentListingRepository.php 1 year ago SegmentSaveController.php 3 years ago SegmentSubscribersRepository.php 1 year ago SegmentsFinder.php 3 years ago SegmentsRepository.php 2 years ago SegmentsSimpleListRepository.php 1 year ago SubscribersFinder.php 2 years ago WP.php 2 years ago WooCommerce.php 1 year ago index.php 3 years ago
WP.php
406 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\Segments;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Config\SubscriberChangesNotifier;
9 use MailPoet\DI\ContainerWrapper;
10 use MailPoet\Entities\SegmentEntity;
11 use MailPoet\Entities\SubscriberEntity;
12 use MailPoet\Entities\SubscriberSegmentEntity;
13 use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
14 use MailPoet\Services\Validator;
15 use MailPoet\Settings\SettingsController;
16 use MailPoet\Subscribers\ConfirmationEmailMailer;
17 use MailPoet\Subscribers\Source;
18 use MailPoet\Subscribers\SubscriberSegmentRepository;
19 use MailPoet\Subscribers\SubscribersRepository;
20 use MailPoet\WooCommerce\Helper as WooCommerceHelper;
21 use MailPoet\WP\Functions as WPFunctions;
22 use MailPoetVendor\Carbon\Carbon;
23 use MailPoetVendor\Doctrine\ORM\EntityManager;
24
25 class WP {
26
27 /** @var WPFunctions */
28 private $wp;
29
30 /** @var WelcomeScheduler */
31 private $welcomeScheduler;
32
33 /** @var WooCommerceHelper */
34 private $wooHelper;
35
36 /** @var SubscribersRepository */
37 private $subscribersRepository;
38
39 /** @var SubscriberChangesNotifier */
40 private $subscriberChangesNotifier;
41
42 private $subscriberSegmentRepository;
43
44 /** @var Validator */
45 private $validator;
46
47 /** @var SegmentsRepository */
48 private $segmentsRepository;
49
50 /** @var EntityManager */
51 private $entityManager;
52
53 /** @var string */
54 private $subscribersTable;
55
56 /** @var \MailPoetVendor\Doctrine\DBAL\Connection */
57 private $databaseConnection;
58
59 public function __construct(
60 WPFunctions $wp,
61 WelcomeScheduler $welcomeScheduler,
62 WooCommerceHelper $wooHelper,
63 SubscribersRepository $subscribersRepository,
64 SubscriberSegmentRepository $subscriberSegmentRepository,
65 SubscriberChangesNotifier $subscriberChangesNotifier,
66 Validator $validator,
67 SegmentsRepository $segmentsRepository,
68 EntityManager $entityManager
69 ) {
70 $this->wp = $wp;
71 $this->welcomeScheduler = $welcomeScheduler;
72 $this->wooHelper = $wooHelper;
73 $this->subscribersRepository = $subscribersRepository;
74 $this->subscriberSegmentRepository = $subscriberSegmentRepository;
75 $this->subscriberChangesNotifier = $subscriberChangesNotifier;
76 $this->validator = $validator;
77 $this->segmentsRepository = $segmentsRepository;
78 $this->entityManager = $entityManager;
79 $this->databaseConnection = $this->entityManager->getConnection();
80 $this->subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
81 }
82
83 /**
84 * @param int $wpUserId
85 * @param array|false $oldWpUserData
86 */
87 public function synchronizeUser(int $wpUserId, $oldWpUserData = false): void {
88 $wpUser = \get_userdata($wpUserId);
89 if ($wpUser === false) return;
90
91 $subscriber = $this->subscribersRepository->findOneBy(['wpUserId' => $wpUserId]);
92
93 $currentFilter = $this->wp->currentFilter();
94 // Delete
95 if (in_array($currentFilter, ['delete_user', 'deleted_user', 'remove_user_from_blog'])) {
96 if ($subscriber instanceof SubscriberEntity) {
97 $this->deleteSubscriber($subscriber);
98 }
99 return;
100 }
101 $this->handleCreatingOrUpdatingSubscriber($currentFilter, $wpUser, $subscriber, $oldWpUserData);
102 }
103
104 private function deleteSubscriber(SubscriberEntity $subscriber): void {
105 $this->subscribersRepository->remove($subscriber);
106 $this->subscribersRepository->flush();
107 }
108
109 /**
110 * @param string $currentFilter
111 * @param \WP_User $wpUser
112 * @param ?SubscriberEntity $subscriber
113 * @param array|false $oldWpUserData
114 */
115 private function handleCreatingOrUpdatingSubscriber(string $currentFilter, \WP_User $wpUser, ?SubscriberEntity $subscriber = null, $oldWpUserData = false): void {
116 // Add or update
117 $wpSegment = $this->segmentsRepository->getWPUsersSegment();
118
119 // find subscriber by email when is null
120 if (is_null($subscriber)) {
121 $subscriber = $this->subscribersRepository->findOneBy(['email' => $wpUser->user_email]); // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
122 }
123
124 // get first name & last name
125 $firstName = html_entity_decode($wpUser->first_name); // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
126 $lastName = html_entity_decode($wpUser->last_name); // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
127 if (empty($wpUser->first_name) && empty($wpUser->last_name)) { // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
128 $firstName = html_entity_decode($wpUser->display_name); // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
129 }
130 $signupConfirmationEnabled = SettingsController::getInstance()->get('signup_confirmation.enabled');
131 $status = $signupConfirmationEnabled ? SubscriberEntity::STATUS_UNCONFIRMED : SubscriberEntity::STATUS_SUBSCRIBED;
132 // we want to mark a new subscriber as unsubscribe when the checkbox from registration is unchecked
133 if (isset($_POST['mailpoet']['subscribe_on_register_active']) && (bool)$_POST['mailpoet']['subscribe_on_register_active'] === true) {
134 $status = SubscriberEntity::STATUS_UNSUBSCRIBED;
135 }
136
137 // subscriber data
138 $data = [
139 'wp_user_id' => $wpUser->ID,
140 'email' => $wpUser->user_email, // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
141 'first_name' => $firstName,
142 'last_name' => $lastName,
143 'status' => $status,
144 'source' => Source::WORDPRESS_USER,
145 ];
146
147 if (!is_null($subscriber)) {
148 $data['id'] = $subscriber->getId();
149 unset($data['status']); // don't override status for existing users
150 unset($data['source']); // don't override status for existing users
151 }
152
153 $addingNewUserToDisabledWPSegment = $wpSegment->getDeletedAt() !== null && $currentFilter === 'user_register';
154
155 $otherActiveSegments = [];
156 if ($subscriber) {
157 $otherActiveSegments = array_filter($subscriber->getSegments()->toArray() ?? [], function (SegmentEntity $segment) {
158 return $segment->getType() !== SegmentEntity::TYPE_WP_USERS && $segment->getDeletedAt() === null;
159 });
160 }
161 $isWooCustomer = $this->wooHelper->isWooCommerceActive() && in_array('customer', $wpUser->roles, true);
162 // When WP Segment is disabled force trashed state and unconfirmed status for new WPUsers without active segment
163 // or who are not WooCommerce customers at the same time since customers are added to the WooCommerce list
164 if ($addingNewUserToDisabledWPSegment && !$otherActiveSegments && !$isWooCustomer) {
165 $data['deleted_at'] = Carbon::createFromTimestamp($this->wp->currentTime('timestamp'));
166 $data['status'] = SubscriberEntity::STATUS_UNCONFIRMED;
167 }
168
169 try {
170 $subscriber = $this->createOrUpdateSubscriber($data, $subscriber);
171 } catch (\Exception $e) {
172 return; // fails silently as this was the behavior of this methods before the Doctrine refactor.
173 }
174
175 // add subscriber to the WP Users segment
176 $this->subscriberSegmentRepository->subscribeToSegments(
177 $subscriber,
178 [$wpSegment]
179 );
180
181 if (!$signupConfirmationEnabled && $subscriber->getStatus() === SubscriberEntity::STATUS_SUBSCRIBED && $currentFilter === 'user_register') {
182 $subscriberSegment = $this->subscriberSegmentRepository->findOneBy([
183 'subscriber' => $subscriber->getId(),
184 'segment' => $wpSegment->getId(),
185 ]);
186
187 if (!is_null($subscriberSegment)) {
188 $this->wp->doAction('mailpoet_segment_subscribed', $subscriberSegment);
189 }
190 }
191
192 $subscribeOnRegisterEnabled = SettingsController::getInstance()->get('subscribe.on_register.enabled');
193 $sendConfirmationEmail =
194 $signupConfirmationEnabled
195 && $subscribeOnRegisterEnabled
196 && $currentFilter !== 'profile_update'
197 && !$addingNewUserToDisabledWPSegment;
198
199 if ($sendConfirmationEmail && ($subscriber->getStatus() === SubscriberEntity::STATUS_UNCONFIRMED)) {
200 /** @var ConfirmationEmailMailer $confirmationEmailMailer */
201 $confirmationEmailMailer = ContainerWrapper::getInstance()->get(ConfirmationEmailMailer::class);
202 try {
203 $confirmationEmailMailer->sendConfirmationEmailOnce($subscriber);
204 } catch (\Exception $e) {
205 // ignore errors
206 }
207 }
208
209 // welcome email
210 $scheduleWelcomeNewsletter = false;
211 if (in_array($currentFilter, ['profile_update', 'user_register', 'add_user_role', 'set_user_role'])) {
212 $scheduleWelcomeNewsletter = true;
213 }
214 if ($scheduleWelcomeNewsletter === true) {
215 $this->welcomeScheduler->scheduleWPUserWelcomeNotification(
216 $subscriber->getId(),
217 (array)$wpUser,
218 (array)$oldWpUserData
219 );
220 }
221 }
222
223 private function createOrUpdateSubscriber(array $data, ?SubscriberEntity $subscriber = null): SubscriberEntity {
224 if (is_null($subscriber)) {
225 $subscriber = new SubscriberEntity();
226 }
227
228 $subscriber->setWpUserId($data['wp_user_id']);
229 $subscriber->setEmail($data['email']);
230 $subscriber->setFirstName($data['first_name']);
231 $subscriber->setLastName($data['last_name']);
232
233 if (isset($data['status'])) {
234 $subscriber->setStatus($data['status']);
235 }
236
237 if (isset($data['source'])) {
238 $subscriber->setSource($data['source']);
239 }
240
241 if (isset($data['deleted_at'])) {
242 $subscriber->setDeletedAt($data['deleted_at']);
243 }
244
245 $this->subscribersRepository->persist($subscriber);
246 $this->subscribersRepository->flush();
247
248 return $subscriber;
249 }
250
251 public function synchronizeUsers(): bool {
252 // Save timestamp about changes and update before insert
253 $this->subscriberChangesNotifier->subscribersBatchCreate();
254 $this->subscriberChangesNotifier->subscribersBatchUpdate();
255
256 $updatedUsersEmails = $this->updateSubscribersEmails();
257 $insertedUsersEmails = $this->insertSubscribers();
258 $this->removeUpdatedSubscribersWithInvalidEmail(array_merge($updatedUsersEmails, $insertedUsersEmails));
259 // There is high chance that an update will be made
260 $this->subscriberChangesNotifier->subscribersBatchUpdate();
261 unset($updatedUsersEmails);
262 unset($insertedUsersEmails);
263 $this->updateFirstNames();
264 $this->updateLastNames();
265 $this->updateFirstNameIfMissing();
266 $this->insertUsersToSegment();
267 $this->removeOrphanedSubscribers();
268 $this->subscribersRepository->invalidateTotalSubscribersCache();
269 $this->subscribersRepository->refreshAll();
270
271 return true;
272 }
273
274 private function removeUpdatedSubscribersWithInvalidEmail(array $updatedEmails): void {
275 $invalidWpUserIds = array_map(function($item) {
276 return $item['id'];
277 },
278 array_filter($updatedEmails, function($updatedEmail) {
279 return !$this->validator->validateEmail($updatedEmail['email']);
280 }));
281 if (!$invalidWpUserIds) {
282 return;
283 }
284
285 $this->subscribersRepository->removeByWpUserIds($invalidWpUserIds);
286 }
287
288 private function updateSubscribersEmails(): array {
289 global $wpdb;
290
291 $stmt = $this->databaseConnection->executeQuery('SELECT NOW();');
292 $startTime = $stmt->fetchOne();
293
294 if (!is_string($startTime)) {
295 throw new \RuntimeException("Failed to fetch the current time.");
296 }
297
298 $updateSql =
299 "UPDATE IGNORE {$this->subscribersTable} s
300 INNER JOIN {$wpdb->users} as wu ON s.wp_user_id = wu.id
301 SET s.email = wu.user_email";
302 $this->databaseConnection->executeStatement($updateSql);
303
304 $selectSql =
305 "SELECT wp_user_id as id, email FROM {$this->subscribersTable}
306 WHERE updated_at >= '{$startTime}'";
307 $updatedEmails = $this->databaseConnection->fetchAllAssociative($selectSql);
308
309 return $updatedEmails;
310 }
311
312 private function insertSubscribers(): array {
313 global $wpdb;
314 $wpSegment = $this->segmentsRepository->getWPUsersSegment();
315
316 if ($wpSegment->getDeletedAt() !== null) {
317 $subscriberStatus = SubscriberEntity::STATUS_UNCONFIRMED;
318 $deletedAt = 'CURRENT_TIMESTAMP()';
319 } else {
320 $signupConfirmationEnabled = SettingsController::getInstance()->get('signup_confirmation.enabled');
321 $subscriberStatus = $signupConfirmationEnabled ? SubscriberEntity::STATUS_UNCONFIRMED : SubscriberEntity::STATUS_SUBSCRIBED;
322 $deletedAt = 'null';
323 }
324
325 // Fetch users that are not in the subscribers table
326 $selectSql =
327 "SELECT u.id, u.user_email as email
328 FROM {$wpdb->users} u
329 LEFT JOIN {$this->subscribersTable} AS s ON s.wp_user_id = u.id
330 WHERE s.wp_user_id IS NULL AND u.user_email != ''";
331 $insertedUserIds = $this->databaseConnection->fetchAllAssociative($selectSql);
332
333 // Insert new users into the subscribers table
334 $insertSql =
335 "INSERT IGNORE INTO {$this->subscribersTable} (wp_user_id, email, status, created_at, `source`, deleted_at)
336 SELECT wu.id, wu.user_email, :subscriberStatus, CURRENT_TIMESTAMP(), :source, {$deletedAt}
337 FROM {$wpdb->users} wu
338 LEFT JOIN {$this->subscribersTable} s ON wu.id = s.wp_user_id
339 WHERE s.wp_user_id IS NULL AND wu.user_email != ''
340 ON DUPLICATE KEY UPDATE wp_user_id = wu.id";
341 $stmt = $this->databaseConnection->prepare($insertSql);
342 $stmt->bindValue('subscriberStatus', $subscriberStatus);
343 $stmt->bindValue('source', Source::WORDPRESS_USER);
344 $stmt->executeStatement();
345
346 return $insertedUserIds;
347 }
348
349 private function updateFirstNames(): void {
350 global $wpdb;
351
352 $sql =
353 "UPDATE {$this->subscribersTable} s
354 JOIN {$wpdb->usermeta} as wpum ON s.wp_user_id = wpum.user_id AND wpum.meta_key = 'first_name'
355 SET s.first_name = SUBSTRING(wpum.meta_value, 1, 255)
356 WHERE s.first_name = ''
357 AND s.wp_user_id IS NOT NULL
358 AND wpum.meta_value IS NOT NULL";
359
360 $this->databaseConnection->executeStatement($sql);
361 }
362
363 private function updateLastNames(): void {
364 global $wpdb;
365
366 $sql =
367 "UPDATE {$this->subscribersTable} s
368 JOIN {$wpdb->usermeta} as wpum ON s.wp_user_id = wpum.user_id AND wpum.meta_key = 'last_name'
369 SET s.last_name = SUBSTRING(wpum.meta_value, 1, 255)
370 WHERE s.last_name = ''
371 AND s.wp_user_id IS NOT NULL
372 AND wpum.meta_value IS NOT NULL";
373
374 $this->databaseConnection->executeStatement($sql);
375 }
376
377 private function updateFirstNameIfMissing(): void {
378 global $wpdb;
379
380 $sql =
381 "UPDATE {$this->subscribersTable} s
382 JOIN {$wpdb->users} wu ON s.wp_user_id = wu.id
383 SET s.first_name = wu.display_name
384 WHERE s.first_name = ''
385 AND s.wp_user_id IS NOT NULL";
386
387 $this->databaseConnection->executeStatement($sql);
388 }
389
390 private function insertUsersToSegment(): void {
391 $wpSegment = $this->segmentsRepository->getWPUsersSegment();
392 $subscribersSegmentTable = $this->entityManager->getClassMetadata(SubscriberSegmentEntity::class)->getTableName();
393
394 $sql =
395 "INSERT IGNORE INTO {$subscribersSegmentTable} (subscriber_id, segment_id, created_at)
396 SELECT s.id, '{$wpSegment->getId()}', CURRENT_TIMESTAMP() FROM {$this->subscribersTable} s
397 WHERE s.wp_user_id > 0";
398
399 $this->databaseConnection->executeStatement($sql);
400 }
401
402 private function removeOrphanedSubscribers(): void {
403 $this->subscribersRepository->removeOrphanedSubscribersFromWpSegment();
404 }
405 }
406