Version Description
- 2019-11-25 =
- Improved: minor changes and fixes.
Download this release
Release Info
Developer | wysija |
Plugin | MailPoet Newsletters (New) |
Version | 3.40.1 |
Comparing to | |
See all releases |
Code changes from version 3.40.0 to 3.40.1
- generated/FreeCachedContainer.php +233 -5
- lang/mailpoet-ar.mo +0 -0
- lang/mailpoet-bg_BG.mo +0 -0
- lang/mailpoet-ca.mo +0 -0
- lang/mailpoet-cs_CZ.mo +0 -0
- lang/mailpoet-da_DK.mo +0 -0
- lang/mailpoet-de_DE-formal.mo +0 -0
- lang/mailpoet-de_DE.mo +0 -0
- lang/mailpoet-el.mo +0 -0
- lang/mailpoet-en_GB.mo +0 -0
- lang/mailpoet-es_ES.mo +0 -0
- lang/mailpoet-es_MX.mo +0 -0
- lang/mailpoet-fa_IR.mo +0 -0
- lang/mailpoet-fr_CA.mo +0 -0
- lang/mailpoet-fr_FR.mo +0 -0
- lang/mailpoet-he_IL.mo +0 -0
- lang/mailpoet-hu_HU.mo +0 -0
- lang/mailpoet-it_IT.mo +0 -0
- lang/mailpoet-ja.mo +0 -0
- lang/mailpoet-nb_NO.mo +0 -0
- lang/mailpoet-nl_NL.mo +0 -0
- lang/mailpoet-pl_PL.mo +0 -0
- lang/mailpoet-pt_BR.mo +0 -0
- lang/mailpoet-pt_PT.mo +0 -0
- lang/mailpoet-ro_RO.mo +0 -0
- lang/mailpoet-ru_RU.mo +0 -0
- lang/mailpoet-sq.mo +0 -0
- lang/mailpoet-sr_RS.mo +0 -0
- lang/mailpoet-sv_SE.mo +0 -0
- lang/mailpoet-tr_TR.mo +0 -0
- lang/mailpoet-vi.mo +0 -0
- lang/mailpoet-zh_CN.mo +0 -0
- lang/mailpoet.pot +25 -21
- lib/API/JSON/v1/ImportExport.php +3 -3
- lib/API/JSON/v1/Newsletters.php +2 -1
- lib/API/JSON/v1/SendingTaskSubscribers.php +11 -1
- lib/API/JSON/v1/Settings.php +3 -3
- lib/AdminPages/Pages/Settings.php +1 -1
- lib/Analytics/Reporter.php +1 -1
- lib/Config/DeactivationSurvey.php +2 -2
- lib/Config/MP2Migrator.php +4 -4
- lib/Cron/CronTrigger.php +26 -13
- lib/Cron/CronWorkerScheduler.php +44 -0
- lib/Cron/Daemon.php +17 -17
- lib/Cron/DaemonHttpRunner.php +8 -5
- lib/Cron/Triggers/MailPoet.php +10 -5
- lib/Cron/Triggers/WordPress.php +69 -49
- lib/Cron/Workers/AuthorizedSendingEmailsCheck.php +3 -3
- lib/Cron/Workers/Beamer.php +4 -4
- lib/Cron/Workers/Bounce.php +9 -10
- lib/Cron/Workers/ExportFilesCleanup.php +4 -1
- lib/Cron/Workers/InactiveSubscribers.php +8 -9
- lib/Cron/Workers/KeyCheck/KeyCheckWorker.php +1 -1
- lib/Cron/Workers/KeyCheck/PremiumKeyCheck.php +2 -2
- lib/Cron/Workers/KeyCheck/SendingServiceKeyCheck.php +2 -2
- lib/Cron/Workers/Scheduler.php +9 -10
- lib/Cron/Workers/SendingQueue/Migration.php +20 -24
- lib/Cron/Workers/SendingQueue/SendingQueue.php +20 -16
- lib/Cron/Workers/SimpleWorker.php +49 -78
- lib/Cron/Workers/StatsNotifications/AutomatedEmails.php +4 -9
- lib/Cron/Workers/StatsNotifications/Worker.php +5 -9
- lib/Cron/Workers/SubscriberLinkTokens.php +3 -3
- lib/Cron/Workers/UnsubscribeTokens.php +4 -4
- lib/Cron/Workers/WooCommercePastOrders.php +6 -7
- lib/Cron/Workers/WooCommerceSync.php +3 -7
- lib/Cron/Workers/WorkersFactory.php +39 -179
- lib/DI/ContainerConfigurator.php +20 -0
- lib/Doctrine/EntityTraits/AutoincrementedIdTrait.php +1 -1
- lib/Models/Model.php +6 -2
- lib/Models/Newsletter.php +2 -2
- lib/Models/ScheduledTask.php +40 -0
- lib/Models/StatisticsClicks.php +1 -1
- lib/Models/StatisticsWooCommercePurchases.php +2 -2
- lib/Newsletter/Scheduler/PostNotificationScheduler.php +10 -5
- lib/Newsletter/Shortcodes/Categories/Subscriber.php +4 -2
- lib/Router/Endpoints/Track.php +1 -1
- lib/Router/Endpoints/ViewInBrowser.php +1 -1
- lib/Services/Bridge.php +28 -9
- lib/Settings/UserFlagsController.php +6 -2
- lib/Statistics/GATracking.php +1 -1
- lib/Statistics/Track/WooCommercePurchases.php +6 -2
- lib/Subscribers/ImportExport/Export/DynamicSubscribersGetter.php +5 -1
- lib/Subscribers/ImportExport/Import/Import.php +3 -0
- lib/Tasks/Sending.php +4 -3
- lib/Tasks/State.php +3 -2
- lib/Util/Helpers.php +3 -0
- lib/Util/Security.php +9 -1
- lib/Util/Sudzy/ValidModel.php +1 -1
- lib/Util/pQuery/pQuery.php +6 -0
- lib/WP/Functions.php +8 -4
- mailpoet.php +2 -2
- readme.txt +4 -1
- vendor-prefixed/autoload.php +1 -1
- vendor/autoload.php +1 -1
- vendor/composer/autoload_real.php +7 -7
- vendor/composer/autoload_static.php +5 -5
generated/FreeCachedContainer.php
CHANGED
@@ -93,13 +93,32 @@ class FreeCachedContainer extends Container
|
|
93 |
'mailpoet\\config\\shortcodes' => 'MailPoet\\Config\\Shortcodes',
|
94 |
'mailpoet\\cron\\cronhelper' => 'MailPoet\\Cron\\CronHelper',
|
95 |
'mailpoet\\cron\\crontrigger' => 'MailPoet\\Cron\\CronTrigger',
|
|
|
96 |
'mailpoet\\cron\\daemon' => 'MailPoet\\Cron\\Daemon',
|
97 |
'mailpoet\\cron\\daemonhttprunner' => 'MailPoet\\Cron\\DaemonHttpRunner',
|
98 |
'mailpoet\\cron\\supervisor' => 'MailPoet\\Cron\\Supervisor',
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
99 |
'mailpoet\\cron\\workers\\sendingqueue\\sendingerrorhandler' => 'MailPoet\\Cron\\Workers\\SendingQueue\\SendingErrorHandler',
|
|
|
|
|
100 |
'mailpoet\\cron\\workers\\statsnotifications\\newsletterlinkrepository' => 'MailPoet\\Cron\\Workers\\StatsNotifications\\NewsletterLinkRepository',
|
101 |
'mailpoet\\cron\\workers\\statsnotifications\\scheduler' => 'MailPoet\\Cron\\Workers\\StatsNotifications\\Scheduler',
|
102 |
'mailpoet\\cron\\workers\\statsnotifications\\statsnotificationsrepository' => 'MailPoet\\Cron\\Workers\\StatsNotifications\\StatsNotificationsRepository',
|
|
|
|
|
|
|
|
|
|
|
103 |
'mailpoet\\cron\\workers\\workersfactory' => 'MailPoet\\Cron\\Workers\\WorkersFactory',
|
104 |
'mailpoet\\customfields\\apidatasanitizer' => 'MailPoet\\CustomFields\\ApiDataSanitizer',
|
105 |
'mailpoet\\di\\containerwrapper' => 'MailPoet\\DI\\ContainerWrapper',
|
@@ -252,13 +271,32 @@ class FreeCachedContainer extends Container
|
|
252 |
'MailPoet\\Config\\Shortcodes' => 'getShortcodesService',
|
253 |
'MailPoet\\Cron\\CronHelper' => 'getCronHelperService',
|
254 |
'MailPoet\\Cron\\CronTrigger' => 'getCronTriggerService',
|
|
|
255 |
'MailPoet\\Cron\\Daemon' => 'getDaemonService',
|
256 |
'MailPoet\\Cron\\DaemonHttpRunner' => 'getDaemonHttpRunnerService',
|
257 |
'MailPoet\\Cron\\Supervisor' => 'getSupervisorService',
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
258 |
'MailPoet\\Cron\\Workers\\SendingQueue\\SendingErrorHandler' => 'getSendingErrorHandlerService',
|
|
|
|
|
259 |
'MailPoet\\Cron\\Workers\\StatsNotifications\\NewsletterLinkRepository' => 'getNewsletterLinkRepositoryService',
|
260 |
-
'MailPoet\\Cron\\Workers\\StatsNotifications\\Scheduler' => '
|
261 |
'MailPoet\\Cron\\Workers\\StatsNotifications\\StatsNotificationsRepository' => 'getStatsNotificationsRepositoryService',
|
|
|
|
|
|
|
|
|
|
|
262 |
'MailPoet\\Cron\\Workers\\WorkersFactory' => 'getWorkersFactoryService',
|
263 |
'MailPoet\\CustomFields\\ApiDataSanitizer' => 'getApiDataSanitizerService',
|
264 |
'MailPoet\\DI\\ContainerWrapper' => 'getContainerWrapperService',
|
@@ -1057,7 +1095,17 @@ class FreeCachedContainer extends Container
|
|
1057 |
*/
|
1058 |
protected function getCronTriggerService()
|
1059 |
{
|
1060 |
-
return $this->services['MailPoet\\Cron\\CronTrigger'] = new \MailPoet\Cron\CronTrigger(${($_ = isset($this->services['MailPoet\\Settings\\SettingsController']) ? $this->services['MailPoet\\Settings\\SettingsController'] : $this->getSettingsControllerService()) && false ?: '_'});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1061 |
}
|
1062 |
|
1063 |
/**
|
@@ -1077,7 +1125,7 @@ class FreeCachedContainer extends Container
|
|
1077 |
*/
|
1078 |
protected function getDaemonHttpRunnerService()
|
1079 |
{
|
1080 |
-
return $this->services['MailPoet\\Cron\\DaemonHttpRunner'] = new \MailPoet\Cron\DaemonHttpRunner(${($_ = isset($this->services['MailPoet\\Cron\\Daemon']) ? $this->services['MailPoet\\Cron\\Daemon'] : $this->getDaemonService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Cron\\CronHelper']) ? $this->services['MailPoet\\Cron\\CronHelper'] : $this->getCronHelperService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Settings\\SettingsController']) ? $this->services['MailPoet\\Settings\\SettingsController'] : $this->getSettingsControllerService()) && false ?: '_'});
|
1081 |
}
|
1082 |
|
1083 |
/**
|
@@ -1090,6 +1138,116 @@ class FreeCachedContainer extends Container
|
|
1090 |
return $this->services['MailPoet\\Cron\\Supervisor'] = new \MailPoet\Cron\Supervisor(${($_ = isset($this->services['MailPoet\\Cron\\CronHelper']) ? $this->services['MailPoet\\Cron\\CronHelper'] : $this->getCronHelperService()) && false ?: '_'});
|
1091 |
}
|
1092 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1093 |
/**
|
1094 |
* Gets the public 'MailPoet\Cron\Workers\SendingQueue\SendingErrorHandler' shared autowired service.
|
1095 |
*
|
@@ -1100,6 +1258,76 @@ class FreeCachedContainer extends Container
|
|
1100 |
return $this->services['MailPoet\\Cron\\Workers\\SendingQueue\\SendingErrorHandler'] = new \MailPoet\Cron\Workers\SendingQueue\SendingErrorHandler();
|
1101 |
}
|
1102 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1103 |
/**
|
1104 |
* Gets the public 'MailPoet\Cron\Workers\WorkersFactory' shared autowired service.
|
1105 |
*
|
@@ -1107,7 +1335,7 @@ class FreeCachedContainer extends Container
|
|
1107 |
*/
|
1108 |
protected function getWorkersFactoryService()
|
1109 |
{
|
1110 |
-
return $this->services['MailPoet\\Cron\\Workers\\WorkersFactory'] = new \MailPoet\Cron\Workers\WorkersFactory(${($_ = isset($this->services['MailPoet\\
|
1111 |
}
|
1112 |
|
1113 |
/**
|
@@ -1567,7 +1795,7 @@ class FreeCachedContainer extends Container
|
|
1567 |
*
|
1568 |
* @return \MailPoet\Cron\Workers\StatsNotifications\Scheduler
|
1569 |
*/
|
1570 |
-
protected function
|
1571 |
{
|
1572 |
return $this->services['MailPoet\\Cron\\Workers\\StatsNotifications\\Scheduler'] = new \MailPoet\Cron\Workers\StatsNotifications\Scheduler(${($_ = isset($this->services['MailPoet\\Settings\\SettingsController']) ? $this->services['MailPoet\\Settings\\SettingsController'] : $this->getSettingsControllerService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoetVendor\\Doctrine\\ORM\\EntityManager']) ? $this->services['MailPoetVendor\\Doctrine\\ORM\\EntityManager'] : $this->getEntityManagerService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Cron\\Workers\\StatsNotifications\\StatsNotificationsRepository']) ? $this->services['MailPoet\\Cron\\Workers\\StatsNotifications\\StatsNotificationsRepository'] : $this->getStatsNotificationsRepositoryService()) && false ?: '_'});
|
1573 |
}
|
93 |
'mailpoet\\config\\shortcodes' => 'MailPoet\\Config\\Shortcodes',
|
94 |
'mailpoet\\cron\\cronhelper' => 'MailPoet\\Cron\\CronHelper',
|
95 |
'mailpoet\\cron\\crontrigger' => 'MailPoet\\Cron\\CronTrigger',
|
96 |
+
'mailpoet\\cron\\cronworkerscheduler' => 'MailPoet\\Cron\\CronWorkerScheduler',
|
97 |
'mailpoet\\cron\\daemon' => 'MailPoet\\Cron\\Daemon',
|
98 |
'mailpoet\\cron\\daemonhttprunner' => 'MailPoet\\Cron\\DaemonHttpRunner',
|
99 |
'mailpoet\\cron\\supervisor' => 'MailPoet\\Cron\\Supervisor',
|
100 |
+
'mailpoet\\cron\\triggers\\mailpoet' => 'MailPoet\\Cron\\Triggers\\MailPoet',
|
101 |
+
'mailpoet\\cron\\triggers\\wordpress' => 'MailPoet\\Cron\\Triggers\\WordPress',
|
102 |
+
'mailpoet\\cron\\workers\\authorizedsendingemailscheck' => 'MailPoet\\Cron\\Workers\\AuthorizedSendingEmailsCheck',
|
103 |
+
'mailpoet\\cron\\workers\\beamer' => 'MailPoet\\Cron\\Workers\\Beamer',
|
104 |
+
'mailpoet\\cron\\workers\\bounce' => 'MailPoet\\Cron\\Workers\\Bounce',
|
105 |
+
'mailpoet\\cron\\workers\\exportfilescleanup' => 'MailPoet\\Cron\\Workers\\ExportFilesCleanup',
|
106 |
+
'mailpoet\\cron\\workers\\inactivesubscribers' => 'MailPoet\\Cron\\Workers\\InactiveSubscribers',
|
107 |
+
'mailpoet\\cron\\workers\\keycheck\\premiumkeycheck' => 'MailPoet\\Cron\\Workers\\KeyCheck\\PremiumKeyCheck',
|
108 |
+
'mailpoet\\cron\\workers\\keycheck\\sendingservicekeycheck' => 'MailPoet\\Cron\\Workers\\KeyCheck\\SendingServiceKeyCheck',
|
109 |
+
'mailpoet\\cron\\workers\\scheduler' => 'MailPoet\\Cron\\Workers\\Scheduler',
|
110 |
+
'mailpoet\\cron\\workers\\sendingqueue\\migration' => 'MailPoet\\Cron\\Workers\\SendingQueue\\Migration',
|
111 |
'mailpoet\\cron\\workers\\sendingqueue\\sendingerrorhandler' => 'MailPoet\\Cron\\Workers\\SendingQueue\\SendingErrorHandler',
|
112 |
+
'mailpoet\\cron\\workers\\sendingqueue\\sendingqueue' => 'MailPoet\\Cron\\Workers\\SendingQueue\\SendingQueue',
|
113 |
+
'mailpoet\\cron\\workers\\statsnotifications\\automatedemails' => 'MailPoet\\Cron\\Workers\\StatsNotifications\\AutomatedEmails',
|
114 |
'mailpoet\\cron\\workers\\statsnotifications\\newsletterlinkrepository' => 'MailPoet\\Cron\\Workers\\StatsNotifications\\NewsletterLinkRepository',
|
115 |
'mailpoet\\cron\\workers\\statsnotifications\\scheduler' => 'MailPoet\\Cron\\Workers\\StatsNotifications\\Scheduler',
|
116 |
'mailpoet\\cron\\workers\\statsnotifications\\statsnotificationsrepository' => 'MailPoet\\Cron\\Workers\\StatsNotifications\\StatsNotificationsRepository',
|
117 |
+
'mailpoet\\cron\\workers\\statsnotifications\\worker' => 'MailPoet\\Cron\\Workers\\StatsNotifications\\Worker',
|
118 |
+
'mailpoet\\cron\\workers\\subscriberlinktokens' => 'MailPoet\\Cron\\Workers\\SubscriberLinkTokens',
|
119 |
+
'mailpoet\\cron\\workers\\unsubscribetokens' => 'MailPoet\\Cron\\Workers\\UnsubscribeTokens',
|
120 |
+
'mailpoet\\cron\\workers\\woocommercepastorders' => 'MailPoet\\Cron\\Workers\\WooCommercePastOrders',
|
121 |
+
'mailpoet\\cron\\workers\\woocommercesync' => 'MailPoet\\Cron\\Workers\\WooCommerceSync',
|
122 |
'mailpoet\\cron\\workers\\workersfactory' => 'MailPoet\\Cron\\Workers\\WorkersFactory',
|
123 |
'mailpoet\\customfields\\apidatasanitizer' => 'MailPoet\\CustomFields\\ApiDataSanitizer',
|
124 |
'mailpoet\\di\\containerwrapper' => 'MailPoet\\DI\\ContainerWrapper',
|
271 |
'MailPoet\\Config\\Shortcodes' => 'getShortcodesService',
|
272 |
'MailPoet\\Cron\\CronHelper' => 'getCronHelperService',
|
273 |
'MailPoet\\Cron\\CronTrigger' => 'getCronTriggerService',
|
274 |
+
'MailPoet\\Cron\\CronWorkerScheduler' => 'getCronWorkerSchedulerService',
|
275 |
'MailPoet\\Cron\\Daemon' => 'getDaemonService',
|
276 |
'MailPoet\\Cron\\DaemonHttpRunner' => 'getDaemonHttpRunnerService',
|
277 |
'MailPoet\\Cron\\Supervisor' => 'getSupervisorService',
|
278 |
+
'MailPoet\\Cron\\Triggers\\MailPoet' => 'getMailPoetService',
|
279 |
+
'MailPoet\\Cron\\Triggers\\WordPress' => 'getWordPressService',
|
280 |
+
'MailPoet\\Cron\\Workers\\AuthorizedSendingEmailsCheck' => 'getAuthorizedSendingEmailsCheckService',
|
281 |
+
'MailPoet\\Cron\\Workers\\Beamer' => 'getBeamerService',
|
282 |
+
'MailPoet\\Cron\\Workers\\Bounce' => 'getBounceService',
|
283 |
+
'MailPoet\\Cron\\Workers\\ExportFilesCleanup' => 'getExportFilesCleanupService',
|
284 |
+
'MailPoet\\Cron\\Workers\\InactiveSubscribers' => 'getInactiveSubscribersService',
|
285 |
+
'MailPoet\\Cron\\Workers\\KeyCheck\\PremiumKeyCheck' => 'getPremiumKeyCheckService',
|
286 |
+
'MailPoet\\Cron\\Workers\\KeyCheck\\SendingServiceKeyCheck' => 'getSendingServiceKeyCheckService',
|
287 |
+
'MailPoet\\Cron\\Workers\\Scheduler' => 'getSchedulerService',
|
288 |
+
'MailPoet\\Cron\\Workers\\SendingQueue\\Migration' => 'getMigrationService',
|
289 |
'MailPoet\\Cron\\Workers\\SendingQueue\\SendingErrorHandler' => 'getSendingErrorHandlerService',
|
290 |
+
'MailPoet\\Cron\\Workers\\SendingQueue\\SendingQueue' => 'getSendingQueue2Service',
|
291 |
+
'MailPoet\\Cron\\Workers\\StatsNotifications\\AutomatedEmails' => 'getAutomatedEmailsService',
|
292 |
'MailPoet\\Cron\\Workers\\StatsNotifications\\NewsletterLinkRepository' => 'getNewsletterLinkRepositoryService',
|
293 |
+
'MailPoet\\Cron\\Workers\\StatsNotifications\\Scheduler' => 'getScheduler2Service',
|
294 |
'MailPoet\\Cron\\Workers\\StatsNotifications\\StatsNotificationsRepository' => 'getStatsNotificationsRepositoryService',
|
295 |
+
'MailPoet\\Cron\\Workers\\StatsNotifications\\Worker' => 'getWorkerService',
|
296 |
+
'MailPoet\\Cron\\Workers\\SubscriberLinkTokens' => 'getSubscriberLinkTokensService',
|
297 |
+
'MailPoet\\Cron\\Workers\\UnsubscribeTokens' => 'getUnsubscribeTokensService',
|
298 |
+
'MailPoet\\Cron\\Workers\\WooCommercePastOrders' => 'getWooCommercePastOrdersService',
|
299 |
+
'MailPoet\\Cron\\Workers\\WooCommerceSync' => 'getWooCommerceSyncService',
|
300 |
'MailPoet\\Cron\\Workers\\WorkersFactory' => 'getWorkersFactoryService',
|
301 |
'MailPoet\\CustomFields\\ApiDataSanitizer' => 'getApiDataSanitizerService',
|
302 |
'MailPoet\\DI\\ContainerWrapper' => 'getContainerWrapperService',
|
1095 |
*/
|
1096 |
protected function getCronTriggerService()
|
1097 |
{
|
1098 |
+
return $this->services['MailPoet\\Cron\\CronTrigger'] = new \MailPoet\Cron\CronTrigger(${($_ = isset($this->services['MailPoet\\Cron\\Triggers\\MailPoet']) ? $this->services['MailPoet\\Cron\\Triggers\\MailPoet'] : $this->getMailPoetService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Cron\\Triggers\\WordPress']) ? $this->services['MailPoet\\Cron\\Triggers\\WordPress'] : $this->getWordPressService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Settings\\SettingsController']) ? $this->services['MailPoet\\Settings\\SettingsController'] : $this->getSettingsControllerService()) && false ?: '_'});
|
1099 |
+
}
|
1100 |
+
|
1101 |
+
/**
|
1102 |
+
* Gets the public 'MailPoet\Cron\CronWorkerScheduler' shared autowired service.
|
1103 |
+
*
|
1104 |
+
* @return \MailPoet\Cron\CronWorkerScheduler
|
1105 |
+
*/
|
1106 |
+
protected function getCronWorkerSchedulerService()
|
1107 |
+
{
|
1108 |
+
return $this->services['MailPoet\\Cron\\CronWorkerScheduler'] = new \MailPoet\Cron\CronWorkerScheduler(${($_ = isset($this->services['MailPoet\\WP\\Functions']) ? $this->services['MailPoet\\WP\\Functions'] : ($this->services['MailPoet\\WP\\Functions'] = new \MailPoet\WP\Functions())) && false ?: '_'});
|
1109 |
}
|
1110 |
|
1111 |
/**
|
1125 |
*/
|
1126 |
protected function getDaemonHttpRunnerService()
|
1127 |
{
|
1128 |
+
return $this->services['MailPoet\\Cron\\DaemonHttpRunner'] = new \MailPoet\Cron\DaemonHttpRunner(${($_ = isset($this->services['MailPoet\\Cron\\Daemon']) ? $this->services['MailPoet\\Cron\\Daemon'] : $this->getDaemonService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Cron\\CronHelper']) ? $this->services['MailPoet\\Cron\\CronHelper'] : $this->getCronHelperService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Settings\\SettingsController']) ? $this->services['MailPoet\\Settings\\SettingsController'] : $this->getSettingsControllerService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Cron\\Triggers\\WordPress']) ? $this->services['MailPoet\\Cron\\Triggers\\WordPress'] : $this->getWordPressService()) && false ?: '_'});
|
1129 |
}
|
1130 |
|
1131 |
/**
|
1138 |
return $this->services['MailPoet\\Cron\\Supervisor'] = new \MailPoet\Cron\Supervisor(${($_ = isset($this->services['MailPoet\\Cron\\CronHelper']) ? $this->services['MailPoet\\Cron\\CronHelper'] : $this->getCronHelperService()) && false ?: '_'});
|
1139 |
}
|
1140 |
|
1141 |
+
/**
|
1142 |
+
* Gets the public 'MailPoet\Cron\Triggers\MailPoet' shared autowired service.
|
1143 |
+
*
|
1144 |
+
* @return \MailPoet\Cron\Triggers\MailPoet
|
1145 |
+
*/
|
1146 |
+
protected function getMailPoetService()
|
1147 |
+
{
|
1148 |
+
return $this->services['MailPoet\\Cron\\Triggers\\MailPoet'] = new \MailPoet\Cron\Triggers\MailPoet(${($_ = isset($this->services['MailPoet\\Cron\\Supervisor']) ? $this->services['MailPoet\\Cron\\Supervisor'] : $this->getSupervisorService()) && false ?: '_'});
|
1149 |
+
}
|
1150 |
+
|
1151 |
+
/**
|
1152 |
+
* Gets the public 'MailPoet\Cron\Triggers\WordPress' shared autowired service.
|
1153 |
+
*
|
1154 |
+
* @return \MailPoet\Cron\Triggers\WordPress
|
1155 |
+
*/
|
1156 |
+
protected function getWordPressService()
|
1157 |
+
{
|
1158 |
+
return $this->services['MailPoet\\Cron\\Triggers\\WordPress'] = new \MailPoet\Cron\Triggers\WordPress(${($_ = isset($this->services['MailPoet\\Cron\\CronHelper']) ? $this->services['MailPoet\\Cron\\CronHelper'] : $this->getCronHelperService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Cron\\Triggers\\MailPoet']) ? $this->services['MailPoet\\Cron\\Triggers\\MailPoet'] : $this->getMailPoetService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Settings\\SettingsController']) ? $this->services['MailPoet\\Settings\\SettingsController'] : $this->getSettingsControllerService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\WP\\Functions']) ? $this->services['MailPoet\\WP\\Functions'] : ($this->services['MailPoet\\WP\\Functions'] = new \MailPoet\WP\Functions())) && false ?: '_'});
|
1159 |
+
}
|
1160 |
+
|
1161 |
+
/**
|
1162 |
+
* Gets the public 'MailPoet\Cron\Workers\AuthorizedSendingEmailsCheck' shared autowired service.
|
1163 |
+
*
|
1164 |
+
* @return \MailPoet\Cron\Workers\AuthorizedSendingEmailsCheck
|
1165 |
+
*/
|
1166 |
+
protected function getAuthorizedSendingEmailsCheckService()
|
1167 |
+
{
|
1168 |
+
return $this->services['MailPoet\\Cron\\Workers\\AuthorizedSendingEmailsCheck'] = new \MailPoet\Cron\Workers\AuthorizedSendingEmailsCheck(${($_ = isset($this->services['MailPoet\\Services\\AuthorizedEmailsController']) ? $this->services['MailPoet\\Services\\AuthorizedEmailsController'] : $this->getAuthorizedEmailsControllerService()) && false ?: '_'});
|
1169 |
+
}
|
1170 |
+
|
1171 |
+
/**
|
1172 |
+
* Gets the public 'MailPoet\Cron\Workers\Beamer' shared autowired service.
|
1173 |
+
*
|
1174 |
+
* @return \MailPoet\Cron\Workers\Beamer
|
1175 |
+
*/
|
1176 |
+
protected function getBeamerService()
|
1177 |
+
{
|
1178 |
+
return $this->services['MailPoet\\Cron\\Workers\\Beamer'] = new \MailPoet\Cron\Workers\Beamer(${($_ = isset($this->services['MailPoet\\Settings\\SettingsController']) ? $this->services['MailPoet\\Settings\\SettingsController'] : $this->getSettingsControllerService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\WP\\Functions']) ? $this->services['MailPoet\\WP\\Functions'] : ($this->services['MailPoet\\WP\\Functions'] = new \MailPoet\WP\Functions())) && false ?: '_'});
|
1179 |
+
}
|
1180 |
+
|
1181 |
+
/**
|
1182 |
+
* Gets the public 'MailPoet\Cron\Workers\Bounce' shared autowired service.
|
1183 |
+
*
|
1184 |
+
* @return \MailPoet\Cron\Workers\Bounce
|
1185 |
+
*/
|
1186 |
+
protected function getBounceService()
|
1187 |
+
{
|
1188 |
+
return $this->services['MailPoet\\Cron\\Workers\\Bounce'] = new \MailPoet\Cron\Workers\Bounce(${($_ = isset($this->services['MailPoet\\Settings\\SettingsController']) ? $this->services['MailPoet\\Settings\\SettingsController'] : $this->getSettingsControllerService()) && false ?: '_'});
|
1189 |
+
}
|
1190 |
+
|
1191 |
+
/**
|
1192 |
+
* Gets the public 'MailPoet\Cron\Workers\ExportFilesCleanup' shared autowired service.
|
1193 |
+
*
|
1194 |
+
* @return \MailPoet\Cron\Workers\ExportFilesCleanup
|
1195 |
+
*/
|
1196 |
+
protected function getExportFilesCleanupService()
|
1197 |
+
{
|
1198 |
+
return $this->services['MailPoet\\Cron\\Workers\\ExportFilesCleanup'] = new \MailPoet\Cron\Workers\ExportFilesCleanup();
|
1199 |
+
}
|
1200 |
+
|
1201 |
+
/**
|
1202 |
+
* Gets the public 'MailPoet\Cron\Workers\InactiveSubscribers' shared autowired service.
|
1203 |
+
*
|
1204 |
+
* @return \MailPoet\Cron\Workers\InactiveSubscribers
|
1205 |
+
*/
|
1206 |
+
protected function getInactiveSubscribersService()
|
1207 |
+
{
|
1208 |
+
return $this->services['MailPoet\\Cron\\Workers\\InactiveSubscribers'] = new \MailPoet\Cron\Workers\InactiveSubscribers(${($_ = isset($this->services['MailPoet\\Subscribers\\InactiveSubscribersController']) ? $this->services['MailPoet\\Subscribers\\InactiveSubscribersController'] : $this->getInactiveSubscribersControllerService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Settings\\SettingsController']) ? $this->services['MailPoet\\Settings\\SettingsController'] : $this->getSettingsControllerService()) && false ?: '_'});
|
1209 |
+
}
|
1210 |
+
|
1211 |
+
/**
|
1212 |
+
* Gets the public 'MailPoet\Cron\Workers\KeyCheck\PremiumKeyCheck' shared autowired service.
|
1213 |
+
*
|
1214 |
+
* @return \MailPoet\Cron\Workers\KeyCheck\PremiumKeyCheck
|
1215 |
+
*/
|
1216 |
+
protected function getPremiumKeyCheckService()
|
1217 |
+
{
|
1218 |
+
return $this->services['MailPoet\\Cron\\Workers\\KeyCheck\\PremiumKeyCheck'] = new \MailPoet\Cron\Workers\KeyCheck\PremiumKeyCheck(${($_ = isset($this->services['MailPoet\\Settings\\SettingsController']) ? $this->services['MailPoet\\Settings\\SettingsController'] : $this->getSettingsControllerService()) && false ?: '_'});
|
1219 |
+
}
|
1220 |
+
|
1221 |
+
/**
|
1222 |
+
* Gets the public 'MailPoet\Cron\Workers\KeyCheck\SendingServiceKeyCheck' shared autowired service.
|
1223 |
+
*
|
1224 |
+
* @return \MailPoet\Cron\Workers\KeyCheck\SendingServiceKeyCheck
|
1225 |
+
*/
|
1226 |
+
protected function getSendingServiceKeyCheckService()
|
1227 |
+
{
|
1228 |
+
return $this->services['MailPoet\\Cron\\Workers\\KeyCheck\\SendingServiceKeyCheck'] = new \MailPoet\Cron\Workers\KeyCheck\SendingServiceKeyCheck(${($_ = isset($this->services['MailPoet\\Settings\\SettingsController']) ? $this->services['MailPoet\\Settings\\SettingsController'] : $this->getSettingsControllerService()) && false ?: '_'});
|
1229 |
+
}
|
1230 |
+
|
1231 |
+
/**
|
1232 |
+
* Gets the public 'MailPoet\Cron\Workers\Scheduler' shared autowired service.
|
1233 |
+
*
|
1234 |
+
* @return \MailPoet\Cron\Workers\Scheduler
|
1235 |
+
*/
|
1236 |
+
protected function getSchedulerService()
|
1237 |
+
{
|
1238 |
+
return $this->services['MailPoet\\Cron\\Workers\\Scheduler'] = new \MailPoet\Cron\Workers\Scheduler(${($_ = isset($this->services['MailPoet\\Segments\\SubscribersFinder']) ? $this->services['MailPoet\\Segments\\SubscribersFinder'] : $this->getSubscribersFinderService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Logging\\LoggerFactory']) ? $this->services['MailPoet\\Logging\\LoggerFactory'] : $this->getLoggerFactoryService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Cron\\CronHelper']) ? $this->services['MailPoet\\Cron\\CronHelper'] : $this->getCronHelperService()) && false ?: '_'});
|
1239 |
+
}
|
1240 |
+
|
1241 |
+
/**
|
1242 |
+
* Gets the public 'MailPoet\Cron\Workers\SendingQueue\Migration' shared autowired service.
|
1243 |
+
*
|
1244 |
+
* @return \MailPoet\Cron\Workers\SendingQueue\Migration
|
1245 |
+
*/
|
1246 |
+
protected function getMigrationService()
|
1247 |
+
{
|
1248 |
+
return $this->services['MailPoet\\Cron\\Workers\\SendingQueue\\Migration'] = new \MailPoet\Cron\Workers\SendingQueue\Migration();
|
1249 |
+
}
|
1250 |
+
|
1251 |
/**
|
1252 |
* Gets the public 'MailPoet\Cron\Workers\SendingQueue\SendingErrorHandler' shared autowired service.
|
1253 |
*
|
1258 |
return $this->services['MailPoet\\Cron\\Workers\\SendingQueue\\SendingErrorHandler'] = new \MailPoet\Cron\Workers\SendingQueue\SendingErrorHandler();
|
1259 |
}
|
1260 |
|
1261 |
+
/**
|
1262 |
+
* Gets the public 'MailPoet\Cron\Workers\SendingQueue\SendingQueue' shared autowired service.
|
1263 |
+
*
|
1264 |
+
* @return \MailPoet\Cron\Workers\SendingQueue\SendingQueue
|
1265 |
+
*/
|
1266 |
+
protected function getSendingQueue2Service()
|
1267 |
+
{
|
1268 |
+
return $this->services['MailPoet\\Cron\\Workers\\SendingQueue\\SendingQueue'] = new \MailPoet\Cron\Workers\SendingQueue\SendingQueue(${($_ = isset($this->services['MailPoet\\Cron\\Workers\\SendingQueue\\SendingErrorHandler']) ? $this->services['MailPoet\\Cron\\Workers\\SendingQueue\\SendingErrorHandler'] : ($this->services['MailPoet\\Cron\\Workers\\SendingQueue\\SendingErrorHandler'] = new \MailPoet\Cron\Workers\SendingQueue\SendingErrorHandler())) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Cron\\Workers\\StatsNotifications\\Scheduler']) ? $this->services['MailPoet\\Cron\\Workers\\StatsNotifications\\Scheduler'] : $this->getScheduler2Service()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Logging\\LoggerFactory']) ? $this->services['MailPoet\\Logging\\LoggerFactory'] : $this->getLoggerFactoryService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Newsletter\\NewslettersRepository']) ? $this->services['MailPoet\\Newsletter\\NewslettersRepository'] : $this->getNewslettersRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Cron\\CronHelper']) ? $this->services['MailPoet\\Cron\\CronHelper'] : $this->getCronHelperService()) && false ?: '_'});
|
1269 |
+
}
|
1270 |
+
|
1271 |
+
/**
|
1272 |
+
* Gets the public 'MailPoet\Cron\Workers\StatsNotifications\AutomatedEmails' shared autowired service.
|
1273 |
+
*
|
1274 |
+
* @return \MailPoet\Cron\Workers\StatsNotifications\AutomatedEmails
|
1275 |
+
*/
|
1276 |
+
protected function getAutomatedEmailsService()
|
1277 |
+
{
|
1278 |
+
return $this->services['MailPoet\\Cron\\Workers\\StatsNotifications\\AutomatedEmails'] = new \MailPoet\Cron\Workers\StatsNotifications\AutomatedEmails(${($_ = isset($this->services['MailPoet\\Mailer\\Mailer']) ? $this->services['MailPoet\\Mailer\\Mailer'] : $this->getMailer2Service()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Config\\Renderer']) ? $this->services['MailPoet\\Config\\Renderer'] : $this->getRendererService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Settings\\SettingsController']) ? $this->services['MailPoet\\Settings\\SettingsController'] : $this->getSettingsControllerService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Newsletter\\NewslettersRepository']) ? $this->services['MailPoet\\Newsletter\\NewslettersRepository'] : $this->getNewslettersRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Newsletter\\Statistics\\NewsletterStatisticsRepository']) ? $this->services['MailPoet\\Newsletter\\Statistics\\NewsletterStatisticsRepository'] : $this->getNewsletterStatisticsRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Mailer\\MetaInfo']) ? $this->services['MailPoet\\Mailer\\MetaInfo'] : ($this->services['MailPoet\\Mailer\\MetaInfo'] = new \MailPoet\Mailer\MetaInfo())) && false ?: '_'});
|
1279 |
+
}
|
1280 |
+
|
1281 |
+
/**
|
1282 |
+
* Gets the public 'MailPoet\Cron\Workers\StatsNotifications\Worker' shared autowired service.
|
1283 |
+
*
|
1284 |
+
* @return \MailPoet\Cron\Workers\StatsNotifications\Worker
|
1285 |
+
*/
|
1286 |
+
protected function getWorkerService()
|
1287 |
+
{
|
1288 |
+
return $this->services['MailPoet\\Cron\\Workers\\StatsNotifications\\Worker'] = new \MailPoet\Cron\Workers\StatsNotifications\Worker(${($_ = isset($this->services['MailPoet\\Mailer\\Mailer']) ? $this->services['MailPoet\\Mailer\\Mailer'] : $this->getMailer2Service()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Config\\Renderer']) ? $this->services['MailPoet\\Config\\Renderer'] : $this->getRendererService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Settings\\SettingsController']) ? $this->services['MailPoet\\Settings\\SettingsController'] : $this->getSettingsControllerService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Cron\\CronHelper']) ? $this->services['MailPoet\\Cron\\CronHelper'] : $this->getCronHelperService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Mailer\\MetaInfo']) ? $this->services['MailPoet\\Mailer\\MetaInfo'] : ($this->services['MailPoet\\Mailer\\MetaInfo'] = new \MailPoet\Mailer\MetaInfo())) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Cron\\Workers\\StatsNotifications\\StatsNotificationsRepository']) ? $this->services['MailPoet\\Cron\\Workers\\StatsNotifications\\StatsNotificationsRepository'] : $this->getStatsNotificationsRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Cron\\Workers\\StatsNotifications\\NewsletterLinkRepository']) ? $this->services['MailPoet\\Cron\\Workers\\StatsNotifications\\NewsletterLinkRepository'] : $this->getNewsletterLinkRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Newsletter\\Statistics\\NewsletterStatisticsRepository']) ? $this->services['MailPoet\\Newsletter\\Statistics\\NewsletterStatisticsRepository'] : $this->getNewsletterStatisticsRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoetVendor\\Doctrine\\ORM\\EntityManager']) ? $this->services['MailPoetVendor\\Doctrine\\ORM\\EntityManager'] : $this->getEntityManagerService()) && false ?: '_'});
|
1289 |
+
}
|
1290 |
+
|
1291 |
+
/**
|
1292 |
+
* Gets the public 'MailPoet\Cron\Workers\SubscriberLinkTokens' shared autowired service.
|
1293 |
+
*
|
1294 |
+
* @return \MailPoet\Cron\Workers\SubscriberLinkTokens
|
1295 |
+
*/
|
1296 |
+
protected function getSubscriberLinkTokensService()
|
1297 |
+
{
|
1298 |
+
return $this->services['MailPoet\\Cron\\Workers\\SubscriberLinkTokens'] = new \MailPoet\Cron\Workers\SubscriberLinkTokens();
|
1299 |
+
}
|
1300 |
+
|
1301 |
+
/**
|
1302 |
+
* Gets the public 'MailPoet\Cron\Workers\UnsubscribeTokens' shared autowired service.
|
1303 |
+
*
|
1304 |
+
* @return \MailPoet\Cron\Workers\UnsubscribeTokens
|
1305 |
+
*/
|
1306 |
+
protected function getUnsubscribeTokensService()
|
1307 |
+
{
|
1308 |
+
return $this->services['MailPoet\\Cron\\Workers\\UnsubscribeTokens'] = new \MailPoet\Cron\Workers\UnsubscribeTokens();
|
1309 |
+
}
|
1310 |
+
|
1311 |
+
/**
|
1312 |
+
* Gets the public 'MailPoet\Cron\Workers\WooCommercePastOrders' shared autowired service.
|
1313 |
+
*
|
1314 |
+
* @return \MailPoet\Cron\Workers\WooCommercePastOrders
|
1315 |
+
*/
|
1316 |
+
protected function getWooCommercePastOrdersService()
|
1317 |
+
{
|
1318 |
+
return $this->services['MailPoet\\Cron\\Workers\\WooCommercePastOrders'] = new \MailPoet\Cron\Workers\WooCommercePastOrders(${($_ = isset($this->services['MailPoet\\WooCommerce\\Helper']) ? $this->services['MailPoet\\WooCommerce\\Helper'] : ($this->services['MailPoet\\WooCommerce\\Helper'] = new \MailPoet\WooCommerce\Helper())) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Statistics\\Track\\WooCommercePurchases']) ? $this->services['MailPoet\\Statistics\\Track\\WooCommercePurchases'] : $this->getWooCommercePurchasesService()) && false ?: '_'});
|
1319 |
+
}
|
1320 |
+
|
1321 |
+
/**
|
1322 |
+
* Gets the public 'MailPoet\Cron\Workers\WooCommerceSync' shared autowired service.
|
1323 |
+
*
|
1324 |
+
* @return \MailPoet\Cron\Workers\WooCommerceSync
|
1325 |
+
*/
|
1326 |
+
protected function getWooCommerceSyncService()
|
1327 |
+
{
|
1328 |
+
return $this->services['MailPoet\\Cron\\Workers\\WooCommerceSync'] = new \MailPoet\Cron\Workers\WooCommerceSync(${($_ = isset($this->services['MailPoet\\Segments\\WooCommerce']) ? $this->services['MailPoet\\Segments\\WooCommerce'] : $this->getWooCommerceService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\WooCommerce\\Helper']) ? $this->services['MailPoet\\WooCommerce\\Helper'] : ($this->services['MailPoet\\WooCommerce\\Helper'] = new \MailPoet\WooCommerce\Helper())) && false ?: '_'});
|
1329 |
+
}
|
1330 |
+
|
1331 |
/**
|
1332 |
* Gets the public 'MailPoet\Cron\Workers\WorkersFactory' shared autowired service.
|
1333 |
*
|
1335 |
*/
|
1336 |
protected function getWorkersFactoryService()
|
1337 |
{
|
1338 |
+
return $this->services['MailPoet\\Cron\\Workers\\WorkersFactory'] = new \MailPoet\Cron\Workers\WorkersFactory(${($_ = isset($this->services['MailPoet\\DI\\ContainerWrapper']) ? $this->services['MailPoet\\DI\\ContainerWrapper'] : $this->getContainerWrapperService()) && false ?: '_'});
|
1339 |
}
|
1340 |
|
1341 |
/**
|
1795 |
*
|
1796 |
* @return \MailPoet\Cron\Workers\StatsNotifications\Scheduler
|
1797 |
*/
|
1798 |
+
protected function getScheduler2Service()
|
1799 |
{
|
1800 |
return $this->services['MailPoet\\Cron\\Workers\\StatsNotifications\\Scheduler'] = new \MailPoet\Cron\Workers\StatsNotifications\Scheduler(${($_ = isset($this->services['MailPoet\\Settings\\SettingsController']) ? $this->services['MailPoet\\Settings\\SettingsController'] : $this->getSettingsControllerService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoetVendor\\Doctrine\\ORM\\EntityManager']) ? $this->services['MailPoetVendor\\Doctrine\\ORM\\EntityManager'] : $this->getEntityManagerService()) && false ?: '_'}, ${($_ = isset($this->services['MailPoet\\Cron\\Workers\\StatsNotifications\\StatsNotificationsRepository']) ? $this->services['MailPoet\\Cron\\Workers\\StatsNotifications\\StatsNotificationsRepository'] : $this->getStatsNotificationsRepositoryService()) && false ?: '_'});
|
1801 |
}
|
lang/mailpoet-ar.mo
CHANGED
Binary file
|
lang/mailpoet-bg_BG.mo
CHANGED
Binary file
|
lang/mailpoet-ca.mo
CHANGED
Binary file
|
lang/mailpoet-cs_CZ.mo
CHANGED
Binary file
|
lang/mailpoet-da_DK.mo
CHANGED
Binary file
|
lang/mailpoet-de_DE-formal.mo
CHANGED
Binary file
|
lang/mailpoet-de_DE.mo
CHANGED
Binary file
|
lang/mailpoet-el.mo
CHANGED
Binary file
|
lang/mailpoet-en_GB.mo
CHANGED
Binary file
|
lang/mailpoet-es_ES.mo
CHANGED
Binary file
|
lang/mailpoet-es_MX.mo
CHANGED
Binary file
|
lang/mailpoet-fa_IR.mo
CHANGED
Binary file
|
lang/mailpoet-fr_CA.mo
CHANGED
Binary file
|
lang/mailpoet-fr_FR.mo
CHANGED
Binary file
|
lang/mailpoet-he_IL.mo
CHANGED
Binary file
|
lang/mailpoet-hu_HU.mo
CHANGED
Binary file
|
lang/mailpoet-it_IT.mo
CHANGED
Binary file
|
lang/mailpoet-ja.mo
CHANGED
Binary file
|
lang/mailpoet-nb_NO.mo
CHANGED
Binary file
|
lang/mailpoet-nl_NL.mo
CHANGED
Binary file
|
lang/mailpoet-pl_PL.mo
CHANGED
Binary file
|
lang/mailpoet-pt_BR.mo
CHANGED
Binary file
|
lang/mailpoet-pt_PT.mo
CHANGED
Binary file
|
lang/mailpoet-ro_RO.mo
CHANGED
Binary file
|
lang/mailpoet-ru_RU.mo
CHANGED
Binary file
|
lang/mailpoet-sq.mo
CHANGED
Binary file
|
lang/mailpoet-sr_RS.mo
CHANGED
Binary file
|
lang/mailpoet-sv_SE.mo
CHANGED
Binary file
|
lang/mailpoet-tr_TR.mo
CHANGED
Binary file
|
lang/mailpoet-vi.mo
CHANGED
Binary file
|
lang/mailpoet-zh_CN.mo
CHANGED
Binary file
|
lang/mailpoet.pot
CHANGED
@@ -4,7 +4,7 @@ msgid ""
|
|
4 |
msgstr ""
|
5 |
"Project-Id-Version: \n"
|
6 |
"Report-Msgid-Bugs-To: http://support.mailpoet.com/\n"
|
7 |
-
"POT-Creation-Date: 2019-11-
|
8 |
"MIME-Version: 1.0\n"
|
9 |
"Content-Type: text/plain; charset=utf-8\n"
|
10 |
"Content-Transfer-Encoding: 8bit\n"
|
@@ -155,12 +155,12 @@ msgstr ""
|
|
155 |
msgid "Subscribe!"
|
156 |
msgstr ""
|
157 |
|
158 |
-
#: lib/API/JSON/v1/Forms.php:281 lib/API/JSON/v1/Newsletters.php:
|
159 |
#: lib/API/JSON/v1/Segments.php:142
|
160 |
msgid "Copy of %s"
|
161 |
msgstr ""
|
162 |
|
163 |
-
#: lib/API/JSON/v1/Mailer.php:61 lib/API/JSON/v1/Newsletters.php:
|
164 |
msgid "The email could not be sent: %s"
|
165 |
msgstr ""
|
166 |
|
@@ -170,22 +170,22 @@ msgid "This template does not exist."
|
|
170 |
msgstr ""
|
171 |
|
172 |
#: lib/API/JSON/v1/Newsletters.php:128 lib/API/JSON/v1/Newsletters.php:155
|
173 |
-
#: lib/API/JSON/v1/Newsletters.php:
|
174 |
-
#: lib/API/JSON/v1/Newsletters.php:
|
175 |
-
#: lib/API/JSON/v1/Newsletters.php:
|
176 |
-
#: lib/API/JSON/v1/Newsletters.php:
|
177 |
msgid "This email does not exist."
|
178 |
msgstr ""
|
179 |
|
180 |
-
#: lib/API/JSON/v1/Newsletters.php:
|
181 |
msgid "You need to specify a status."
|
182 |
msgstr ""
|
183 |
|
184 |
-
#: lib/API/JSON/v1/Newsletters.php:
|
185 |
msgid "Newsletter data is missing."
|
186 |
msgstr ""
|
187 |
|
188 |
-
#: lib/API/JSON/v1/Newsletters.php:
|
189 |
msgid "Please specify receiver information."
|
190 |
msgstr ""
|
191 |
|
@@ -217,10 +217,14 @@ msgstr ""
|
|
217 |
msgid "This email has not been sent yet."
|
218 |
msgstr ""
|
219 |
|
220 |
-
#: lib/API/JSON/v1/SendingTaskSubscribers.php:
|
221 |
msgid "Failed sending task not found!"
|
222 |
msgstr ""
|
223 |
|
|
|
|
|
|
|
|
|
224 |
#: lib/API/JSON/v1/Services.php:52
|
225 |
msgid "SPF check has failed."
|
226 |
msgstr ""
|
@@ -1534,15 +1538,15 @@ msgstr ""
|
|
1534 |
msgid "Maximum execution time has been reached."
|
1535 |
msgstr ""
|
1536 |
|
1537 |
-
#: lib/Cron/DaemonHttpRunner.php:
|
1538 |
msgid "Invalid or missing request data."
|
1539 |
msgstr ""
|
1540 |
|
1541 |
-
#: lib/Cron/DaemonHttpRunner.php:
|
1542 |
msgid "Daemon does not exist."
|
1543 |
msgstr ""
|
1544 |
|
1545 |
-
#: lib/Cron/Workers/SendingQueue/Migration.php:
|
1546 |
msgid ""
|
1547 |
"Your sending queue data is being migrated to allow better performance, "
|
1548 |
"sending is paused while the migration is in progress and will resume "
|
@@ -1559,21 +1563,21 @@ msgid ""
|
|
1559 |
"please contact us and report this issue."
|
1560 |
msgstr ""
|
1561 |
|
1562 |
-
#: lib/Cron/Workers/StatsNotifications/AutomatedEmails.php:
|
1563 |
#: views/emails/statsNotificationAutomatedEmails.html:27
|
1564 |
msgid "Your monthly stats are in!"
|
1565 |
msgstr ""
|
1566 |
|
1567 |
-
#: lib/Cron/Workers/StatsNotifications/Worker.php:
|
1568 |
#: lib/Newsletter/Shortcodes/ShortcodesHelper.php:83
|
1569 |
msgid "Unsubscribe link"
|
1570 |
msgstr ""
|
1571 |
|
1572 |
-
#: lib/Cron/Workers/StatsNotifications/Worker.php:
|
1573 |
msgid "Manage subscription link"
|
1574 |
msgstr ""
|
1575 |
|
1576 |
-
#: lib/Cron/Workers/StatsNotifications/Worker.php:
|
1577 |
#: lib/Newsletter/Shortcodes/ShortcodesHelper.php:99
|
1578 |
msgid "View in browser link"
|
1579 |
msgstr ""
|
@@ -1921,7 +1925,7 @@ msgstr ""
|
|
1921 |
msgid "You’ve been successfully subscribed to our newsletter!"
|
1922 |
msgstr ""
|
1923 |
|
1924 |
-
#: lib/Models/Model.php:
|
1925 |
#: views/subscribers/importExport/import/step_data_manipulation.html:14
|
1926 |
msgid "Another record already exists. Please specify a different \"%1$s\"."
|
1927 |
msgstr ""
|
@@ -7251,14 +7255,14 @@ msgctxt "Form label"
|
|
7251 |
msgid "Subscribe!"
|
7252 |
msgstr ""
|
7253 |
|
7254 |
-
#: lib/Cron/Workers/StatsNotifications/Worker.php:
|
7255 |
msgctxt ""
|
7256 |
"title of an automatic email containing statistics (newsletter open rate, "
|
7257 |
"click rate, etc)"
|
7258 |
msgid "Stats for email %s"
|
7259 |
msgstr ""
|
7260 |
|
7261 |
-
#: lib/Cron/Workers/StatsNotifications/Worker.php:
|
7262 |
msgctxt "newsletter open rate, click rate and unsubscribe rate"
|
7263 |
msgid "%1$s%% opens, %2$s%% clicks, %3$s%% unsubscribes in a nutshell."
|
7264 |
msgstr ""
|
4 |
msgstr ""
|
5 |
"Project-Id-Version: \n"
|
6 |
"Report-Msgid-Bugs-To: http://support.mailpoet.com/\n"
|
7 |
+
"POT-Creation-Date: 2019-11-25 16:48:37+00:00\n"
|
8 |
"MIME-Version: 1.0\n"
|
9 |
"Content-Type: text/plain; charset=utf-8\n"
|
10 |
"Content-Transfer-Encoding: 8bit\n"
|
155 |
msgid "Subscribe!"
|
156 |
msgstr ""
|
157 |
|
158 |
+
#: lib/API/JSON/v1/Forms.php:281 lib/API/JSON/v1/Newsletters.php:387
|
159 |
#: lib/API/JSON/v1/Segments.php:142
|
160 |
msgid "Copy of %s"
|
161 |
msgstr ""
|
162 |
|
163 |
+
#: lib/API/JSON/v1/Mailer.php:61 lib/API/JSON/v1/Newsletters.php:493
|
164 |
msgid "The email could not be sent: %s"
|
165 |
msgstr ""
|
166 |
|
170 |
msgstr ""
|
171 |
|
172 |
#: lib/API/JSON/v1/Newsletters.php:128 lib/API/JSON/v1/Newsletters.php:155
|
173 |
+
#: lib/API/JSON/v1/Newsletters.php:296 lib/API/JSON/v1/Newsletters.php:344
|
174 |
+
#: lib/API/JSON/v1/Newsletters.php:363 lib/API/JSON/v1/Newsletters.php:376
|
175 |
+
#: lib/API/JSON/v1/Newsletters.php:405 lib/API/JSON/v1/Newsletters.php:441
|
176 |
+
#: lib/API/JSON/v1/Newsletters.php:512
|
177 |
msgid "This email does not exist."
|
178 |
msgstr ""
|
179 |
|
180 |
+
#: lib/API/JSON/v1/Newsletters.php:287
|
181 |
msgid "You need to specify a status."
|
182 |
msgstr ""
|
183 |
|
184 |
+
#: lib/API/JSON/v1/Newsletters.php:413
|
185 |
msgid "Newsletter data is missing."
|
186 |
msgstr ""
|
187 |
|
188 |
+
#: lib/API/JSON/v1/Newsletters.php:449
|
189 |
msgid "Please specify receiver information."
|
190 |
msgstr ""
|
191 |
|
217 |
msgid "This email has not been sent yet."
|
218 |
msgstr ""
|
219 |
|
220 |
+
#: lib/API/JSON/v1/SendingTaskSubscribers.php:90
|
221 |
msgid "Failed sending task not found!"
|
222 |
msgstr ""
|
223 |
|
224 |
+
#: lib/API/JSON/v1/SendingTaskSubscribers.php:96
|
225 |
+
msgid "Newsletter not found!"
|
226 |
+
msgstr ""
|
227 |
+
|
228 |
#: lib/API/JSON/v1/Services.php:52
|
229 |
msgid "SPF check has failed."
|
230 |
msgstr ""
|
1538 |
msgid "Maximum execution time has been reached."
|
1539 |
msgstr ""
|
1540 |
|
1541 |
+
#: lib/Cron/DaemonHttpRunner.php:57
|
1542 |
msgid "Invalid or missing request data."
|
1543 |
msgstr ""
|
1544 |
|
1545 |
+
#: lib/Cron/DaemonHttpRunner.php:60
|
1546 |
msgid "Daemon does not exist."
|
1547 |
msgstr ""
|
1548 |
|
1549 |
+
#: lib/Cron/Workers/SendingQueue/Migration.php:58
|
1550 |
msgid ""
|
1551 |
"Your sending queue data is being migrated to allow better performance, "
|
1552 |
"sending is paused while the migration is in progress and will resume "
|
1563 |
"please contact us and report this issue."
|
1564 |
msgstr ""
|
1565 |
|
1566 |
+
#: lib/Cron/Workers/StatsNotifications/AutomatedEmails.php:103
|
1567 |
#: views/emails/statsNotificationAutomatedEmails.html:27
|
1568 |
msgid "Your monthly stats are in!"
|
1569 |
msgstr ""
|
1570 |
|
1571 |
+
#: lib/Cron/Workers/StatsNotifications/Worker.php:148
|
1572 |
#: lib/Newsletter/Shortcodes/ShortcodesHelper.php:83
|
1573 |
msgid "Unsubscribe link"
|
1574 |
msgstr ""
|
1575 |
|
1576 |
+
#: lib/Cron/Workers/StatsNotifications/Worker.php:149
|
1577 |
msgid "Manage subscription link"
|
1578 |
msgstr ""
|
1579 |
|
1580 |
+
#: lib/Cron/Workers/StatsNotifications/Worker.php:150
|
1581 |
#: lib/Newsletter/Shortcodes/ShortcodesHelper.php:99
|
1582 |
msgid "View in browser link"
|
1583 |
msgstr ""
|
1925 |
msgid "You’ve been successfully subscribed to our newsletter!"
|
1926 |
msgstr ""
|
1927 |
|
1928 |
+
#: lib/Models/Model.php:234
|
1929 |
#: views/subscribers/importExport/import/step_data_manipulation.html:14
|
1930 |
msgid "Another record already exists. Please specify a different \"%1$s\"."
|
1931 |
msgstr ""
|
7255 |
msgid "Subscribe!"
|
7256 |
msgstr ""
|
7257 |
|
7258 |
+
#: lib/Cron/Workers/StatsNotifications/Worker.php:103
|
7259 |
msgctxt ""
|
7260 |
"title of an automatic email containing statistics (newsletter open rate, "
|
7261 |
"click rate, etc)"
|
7262 |
msgid "Stats for email %s"
|
7263 |
msgstr ""
|
7264 |
|
7265 |
+
#: lib/Cron/Workers/StatsNotifications/Worker.php:119
|
7266 |
msgctxt "newsletter open rate, click rate and unsubscribe rate"
|
7267 |
msgid "%1$s%% opens, %2$s%% clicks, %3$s%% unsubscribes in a nutshell."
|
7268 |
msgstr ""
|
lib/API/JSON/v1/ImportExport.php
CHANGED
@@ -88,15 +88,15 @@ class ImportExport extends APIEndpoint {
|
|
88 |
$task = ScheduledTask::where('type', WooCommerceSync::TASK_TYPE)
|
89 |
->whereRaw('status = ? OR status IS NULL', [ScheduledTask::STATUS_SCHEDULED])
|
90 |
->findOne();
|
91 |
-
if ($task && $task->status === null) {
|
92 |
return $this->successResponse();
|
93 |
}
|
94 |
-
if (
|
95 |
$task = ScheduledTask::create();
|
96 |
$task->type = WooCommerceSync::TASK_TYPE;
|
97 |
$task->status = ScheduledTask::STATUS_SCHEDULED;
|
98 |
}
|
99 |
-
$task->scheduled_at = Carbon::createFromTimestamp(current_time('timestamp'));
|
100 |
$task->save();
|
101 |
return $this->successResponse();
|
102 |
} catch (\Exception $e) {
|
88 |
$task = ScheduledTask::where('type', WooCommerceSync::TASK_TYPE)
|
89 |
->whereRaw('status = ? OR status IS NULL', [ScheduledTask::STATUS_SCHEDULED])
|
90 |
->findOne();
|
91 |
+
if (($task instanceof ScheduledTask) && $task->status === null) {
|
92 |
return $this->successResponse();
|
93 |
}
|
94 |
+
if (!($task instanceof ScheduledTask)) {
|
95 |
$task = ScheduledTask::create();
|
96 |
$task->type = WooCommerceSync::TASK_TYPE;
|
97 |
$task->status = ScheduledTask::STATUS_SCHEDULED;
|
98 |
}
|
99 |
+
$task->scheduled_at = Carbon::createFromTimestamp((int)current_time('timestamp'));
|
100 |
$task->save();
|
101 |
return $this->successResponse();
|
102 |
} catch (\Exception $e) {
|
lib/API/JSON/v1/Newsletters.php
CHANGED
@@ -185,7 +185,8 @@ class Newsletters extends APIEndpoint {
|
|
185 |
|
186 |
$old_newsletter = null;
|
187 |
if (isset($data['id'])) {
|
188 |
-
$
|
|
|
189 |
}
|
190 |
|
191 |
if (!empty($data['body'])) {
|
185 |
|
186 |
$old_newsletter = null;
|
187 |
if (isset($data['id'])) {
|
188 |
+
$fetched = Newsletter::findOne(intval($data['id']));
|
189 |
+
$old_newsletter = $fetched instanceof Newsletter ? $fetched : null;
|
190 |
}
|
191 |
|
192 |
if (!empty($data['body'])) {
|
lib/API/JSON/v1/SendingTaskSubscribers.php
CHANGED
@@ -83,12 +83,22 @@ class SendingTaskSubscribers extends APIEndpoint {
|
|
83 |
->findOne();
|
84 |
$task = ScheduledTask::findOne($task_id);
|
85 |
$sending_queue = SendingQueueModel::where('task_id', $task_id)->findOne();
|
86 |
-
if (
|
|
|
|
|
|
|
|
|
|
|
87 |
return $this->errorResponse([
|
88 |
APIError::NOT_FOUND => __('Failed sending task not found!', 'mailpoet'),
|
89 |
]);
|
90 |
}
|
91 |
$newsletter = Newsletter::findOne($sending_queue->newsletter_id);
|
|
|
|
|
|
|
|
|
|
|
92 |
|
93 |
$task_subscriber->error = '';
|
94 |
$task_subscriber->failed = 0;
|
83 |
->findOne();
|
84 |
$task = ScheduledTask::findOne($task_id);
|
85 |
$sending_queue = SendingQueueModel::where('task_id', $task_id)->findOne();
|
86 |
+
if (
|
87 |
+
!($task instanceof ScheduledTask)
|
88 |
+
|| !($task_subscriber instanceof ScheduledTaskSubscriber)
|
89 |
+
|| !($sending_queue instanceof SendingQueueModel)
|
90 |
+
|| $task_subscriber->failed != 1
|
91 |
+
) {
|
92 |
return $this->errorResponse([
|
93 |
APIError::NOT_FOUND => __('Failed sending task not found!', 'mailpoet'),
|
94 |
]);
|
95 |
}
|
96 |
$newsletter = Newsletter::findOne($sending_queue->newsletter_id);
|
97 |
+
if (!($newsletter instanceof Newsletter)) {
|
98 |
+
return $this->errorResponse([
|
99 |
+
APIError::NOT_FOUND => __('Newsletter not found!', 'mailpoet'),
|
100 |
+
]);
|
101 |
+
}
|
102 |
|
103 |
$task_subscriber->error = '';
|
104 |
$task_subscriber->failed = 0;
|
lib/API/JSON/v1/Settings.php
CHANGED
@@ -107,7 +107,7 @@ class Settings extends APIEndpoint {
|
|
107 |
$task = ScheduledTask::where('type', WooCommerceSync::TASK_TYPE)
|
108 |
->whereRaw('status = ?', [ScheduledTask::STATUS_SCHEDULED])
|
109 |
->findOne();
|
110 |
-
if (
|
111 |
$task = ScheduledTask::create();
|
112 |
$task->type = WooCommerceSync::TASK_TYPE;
|
113 |
$task->status = ScheduledTask::STATUS_SCHEDULED;
|
@@ -121,12 +121,12 @@ class Settings extends APIEndpoint {
|
|
121 |
$task = ScheduledTask::where('type', InactiveSubscribers::TASK_TYPE)
|
122 |
->whereRaw('status = ?', [ScheduledTask::STATUS_SCHEDULED])
|
123 |
->findOne();
|
124 |
-
if (
|
125 |
$task = ScheduledTask::create();
|
126 |
$task->type = InactiveSubscribers::TASK_TYPE;
|
127 |
$task->status = ScheduledTask::STATUS_SCHEDULED;
|
128 |
}
|
129 |
-
$datetime = Carbon::createFromTimestamp(WPFunctions::get()->currentTime('timestamp'));
|
130 |
$task->scheduled_at = $datetime->subMinute();
|
131 |
$task->save();
|
132 |
}
|
107 |
$task = ScheduledTask::where('type', WooCommerceSync::TASK_TYPE)
|
108 |
->whereRaw('status = ?', [ScheduledTask::STATUS_SCHEDULED])
|
109 |
->findOne();
|
110 |
+
if (!($task instanceof ScheduledTask)) {
|
111 |
$task = ScheduledTask::create();
|
112 |
$task->type = WooCommerceSync::TASK_TYPE;
|
113 |
$task->status = ScheduledTask::STATUS_SCHEDULED;
|
121 |
$task = ScheduledTask::where('type', InactiveSubscribers::TASK_TYPE)
|
122 |
->whereRaw('status = ?', [ScheduledTask::STATUS_SCHEDULED])
|
123 |
->findOne();
|
124 |
+
if (!($task instanceof ScheduledTask)) {
|
125 |
$task = ScheduledTask::create();
|
126 |
$task->type = InactiveSubscribers::TASK_TYPE;
|
127 |
$task->status = ScheduledTask::STATUS_SCHEDULED;
|
128 |
}
|
129 |
+
$datetime = Carbon::createFromTimestamp((int)WPFunctions::get()->currentTime('timestamp'));
|
130 |
$task->scheduled_at = $datetime->subMinute();
|
131 |
$task->save();
|
132 |
}
|
lib/AdminPages/Pages/Settings.php
CHANGED
@@ -79,7 +79,7 @@ class Settings {
|
|
79 |
$data = [
|
80 |
'settings' => $settings,
|
81 |
'segments' => Segment::getSegmentsWithSubscriberCount(),
|
82 |
-
'cron_trigger' => CronTrigger::
|
83 |
'total_subscribers' => Subscriber::getTotalSubscribers(),
|
84 |
'premium_plugin_active' => License::getLicense(),
|
85 |
'premium_key_valid' => !empty($premium_key_valid),
|
79 |
$data = [
|
80 |
'settings' => $settings,
|
81 |
'segments' => Segment::getSegmentsWithSubscriberCount(),
|
82 |
+
'cron_trigger' => CronTrigger::METHODS,
|
83 |
'total_subscribers' => Subscriber::getTotalSubscribers(),
|
84 |
'premium_plugin_active' => License::getLicense(),
|
85 |
'premium_key_valid' => !empty($premium_key_valid),
|
lib/Analytics/Reporter.php
CHANGED
@@ -33,7 +33,7 @@ class Reporter {
|
|
33 |
global $wpdb, $wp_version, $woocommerce;
|
34 |
$mta = $this->settings->get('mta', []);
|
35 |
$newsletters = Newsletter::getAnalytics();
|
36 |
-
$isCronTriggerMethodWP = $this->settings->get('cron_trigger.method') === CronTrigger
|
37 |
$checker = new ServicesChecker();
|
38 |
$bounceAddress = $this->settings->get('bounce.address');
|
39 |
$segments = Segment::getAnalytics();
|
33 |
global $wpdb, $wp_version, $woocommerce;
|
34 |
$mta = $this->settings->get('mta', []);
|
35 |
$newsletters = Newsletter::getAnalytics();
|
36 |
+
$isCronTriggerMethodWP = $this->settings->get('cron_trigger.method') === CronTrigger::METHOD_WORDPRESS;
|
37 |
$checker = new ServicesChecker();
|
38 |
$bounceAddress = $this->settings->get('bounce.address');
|
39 |
$segments = Segment::getAnalytics();
|
lib/Config/DeactivationSurvey.php
CHANGED
@@ -27,10 +27,10 @@ class DeactivationSurvey {
|
|
27 |
return false;
|
28 |
}
|
29 |
$screen = WPFunctions::get()->getCurrentScreen();
|
30 |
-
if (
|
31 |
return false;
|
32 |
}
|
33 |
-
return (in_array(
|
34 |
}
|
35 |
|
36 |
public function js() {
|
27 |
return false;
|
28 |
}
|
29 |
$screen = WPFunctions::get()->getCurrentScreen();
|
30 |
+
if (is_null($screen)) {
|
31 |
return false;
|
32 |
}
|
33 |
+
return (in_array($screen->id, ['plugins', 'plugins-network'], true));
|
34 |
}
|
35 |
|
36 |
public function js() {
|
lib/Config/MP2Migrator.php
CHANGED
@@ -715,7 +715,7 @@ class MP2Migrator {
|
|
715 |
*
|
716 |
* @param int $subscriber_id
|
717 |
* @param array $user_list
|
718 |
-
* @return SubscriberSegment
|
719 |
*/
|
720 |
private function importSubscriberSegment($subscriber_id, $user_list) {
|
721 |
$subscriber_segment = null;
|
@@ -946,7 +946,7 @@ class MP2Migrator {
|
|
946 |
* Replace the MP2 shortcodes used in the textarea fields
|
947 |
*
|
948 |
* @param string $text Text
|
949 |
-
* @return string Text
|
950 |
*/
|
951 |
private function replaceMP2Shortcodes($text) {
|
952 |
$text = str_replace('[total_subscribers]', '[mailpoet_subscribers_count]', $text);
|
@@ -990,7 +990,7 @@ class MP2Migrator {
|
|
990 |
$segment_id = $this->segments_mapping[$item_value];
|
991 |
$mp3_value['id'] = $segment_id;
|
992 |
$segment = Segment::findOne($segment_id);
|
993 |
-
if ($segment) {
|
994 |
$mp3_value['name'] = $segment->get('name');
|
995 |
}
|
996 |
} else {
|
@@ -1180,7 +1180,7 @@ class MP2Migrator {
|
|
1180 |
$emails_number /= 8;
|
1181 |
break;
|
1182 |
}
|
1183 |
-
$emails_number = round($emails_number);
|
1184 |
}
|
1185 |
return $emails_number;
|
1186 |
}
|
715 |
*
|
716 |
* @param int $subscriber_id
|
717 |
* @param array $user_list
|
718 |
+
* @return SubscriberSegment|null
|
719 |
*/
|
720 |
private function importSubscriberSegment($subscriber_id, $user_list) {
|
721 |
$subscriber_segment = null;
|
946 |
* Replace the MP2 shortcodes used in the textarea fields
|
947 |
*
|
948 |
* @param string $text Text
|
949 |
+
* @return string|null Text
|
950 |
*/
|
951 |
private function replaceMP2Shortcodes($text) {
|
952 |
$text = str_replace('[total_subscribers]', '[mailpoet_subscribers_count]', $text);
|
990 |
$segment_id = $this->segments_mapping[$item_value];
|
991 |
$mp3_value['id'] = $segment_id;
|
992 |
$segment = Segment::findOne($segment_id);
|
993 |
+
if ($segment instanceof Segment) {
|
994 |
$mp3_value['name'] = $segment->get('name');
|
995 |
}
|
996 |
} else {
|
1180 |
$emails_number /= 8;
|
1181 |
break;
|
1182 |
}
|
1183 |
+
$emails_number = (int)round($emails_number);
|
1184 |
}
|
1185 |
return $emails_number;
|
1186 |
}
|
lib/Cron/CronTrigger.php
CHANGED
@@ -5,42 +5,55 @@ namespace MailPoet\Cron;
|
|
5 |
if (!defined('ABSPATH')) exit;
|
6 |
|
7 |
|
|
|
|
|
8 |
use MailPoet\Settings\SettingsController;
|
9 |
|
10 |
class CronTrigger {
|
11 |
-
/** @var SettingsController */
|
12 |
-
private $settings;
|
13 |
-
|
14 |
const METHOD_LINUX_CRON = 'Linux Cron';
|
15 |
const METHOD_MAILPOET = 'MailPoet';
|
16 |
const METHOD_WORDPRESS = 'WordPress';
|
17 |
|
18 |
-
|
19 |
'mailpoet' => self::METHOD_MAILPOET,
|
20 |
'wordpress' => self::METHOD_WORDPRESS,
|
21 |
'linux_cron' => self::METHOD_LINUX_CRON,
|
22 |
'none' => 'Disabled',
|
23 |
];
|
|
|
24 |
const DEFAULT_METHOD = 'WordPress';
|
25 |
const SETTING_NAME = 'cron_trigger';
|
26 |
|
27 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
28 |
$this->settings = $settings;
|
29 |
}
|
30 |
|
31 |
function init() {
|
32 |
$current_method = $this->settings->get(self::SETTING_NAME . '.method');
|
33 |
try {
|
34 |
-
$
|
35 |
-
|
36 |
-
|
37 |
-
|
|
|
|
|
38 |
} catch (\Exception $e) {
|
39 |
// cron exceptions should not prevent the rest of the site from loading
|
40 |
}
|
41 |
}
|
42 |
-
|
43 |
-
static function getAvailableMethods() {
|
44 |
-
return self::$available_methods;
|
45 |
-
}
|
46 |
}
|
5 |
if (!defined('ABSPATH')) exit;
|
6 |
|
7 |
|
8 |
+
use MailPoet\Cron\Triggers\MailPoet;
|
9 |
+
use MailPoet\Cron\Triggers\WordPress;
|
10 |
use MailPoet\Settings\SettingsController;
|
11 |
|
12 |
class CronTrigger {
|
|
|
|
|
|
|
13 |
const METHOD_LINUX_CRON = 'Linux Cron';
|
14 |
const METHOD_MAILPOET = 'MailPoet';
|
15 |
const METHOD_WORDPRESS = 'WordPress';
|
16 |
|
17 |
+
const METHODS = [
|
18 |
'mailpoet' => self::METHOD_MAILPOET,
|
19 |
'wordpress' => self::METHOD_WORDPRESS,
|
20 |
'linux_cron' => self::METHOD_LINUX_CRON,
|
21 |
'none' => 'Disabled',
|
22 |
];
|
23 |
+
|
24 |
const DEFAULT_METHOD = 'WordPress';
|
25 |
const SETTING_NAME = 'cron_trigger';
|
26 |
|
27 |
+
/** @var MailPoet */
|
28 |
+
private $mailpoet_trigger;
|
29 |
+
|
30 |
+
/** @var WordPress */
|
31 |
+
private $wordpress_trigger;
|
32 |
+
|
33 |
+
/** @var SettingsController */
|
34 |
+
private $settings;
|
35 |
+
|
36 |
+
function __construct(
|
37 |
+
MailPoet $mailpoet_trigger,
|
38 |
+
WordPress $wordpress_trigger,
|
39 |
+
SettingsController $settings
|
40 |
+
) {
|
41 |
+
$this->mailpoet_trigger = $mailpoet_trigger;
|
42 |
+
$this->wordpress_trigger = $wordpress_trigger;
|
43 |
$this->settings = $settings;
|
44 |
}
|
45 |
|
46 |
function init() {
|
47 |
$current_method = $this->settings->get(self::SETTING_NAME . '.method');
|
48 |
try {
|
49 |
+
if ($current_method === self::METHOD_MAILPOET) {
|
50 |
+
return $this->mailpoet_trigger->run();
|
51 |
+
} elseif ($current_method === self::METHOD_WORDPRESS) {
|
52 |
+
return $this->wordpress_trigger->run();
|
53 |
+
}
|
54 |
+
return false;
|
55 |
} catch (\Exception $e) {
|
56 |
// cron exceptions should not prevent the rest of the site from loading
|
57 |
}
|
58 |
}
|
|
|
|
|
|
|
|
|
59 |
}
|
lib/Cron/CronWorkerScheduler.php
ADDED
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace MailPoet\Cron;
|
4 |
+
|
5 |
+
if (!defined('ABSPATH')) exit;
|
6 |
+
|
7 |
+
|
8 |
+
use Carbon\Carbon;
|
9 |
+
use MailPoet\Models\ScheduledTask;
|
10 |
+
use MailPoet\WP\Functions as WPFunctions;
|
11 |
+
|
12 |
+
class CronWorkerScheduler {
|
13 |
+
/** @var WPFunctions */
|
14 |
+
private $wp;
|
15 |
+
|
16 |
+
function __construct(WPFunctions $wp) {
|
17 |
+
$this->wp = $wp;
|
18 |
+
}
|
19 |
+
|
20 |
+
function schedule($task_type, $next_run_date) {
|
21 |
+
$already_scheduled = ScheduledTask::where('type', $task_type)
|
22 |
+
->whereNull('deleted_at')
|
23 |
+
->where('status', ScheduledTask::STATUS_SCHEDULED)
|
24 |
+
->findMany();
|
25 |
+
if ($already_scheduled) {
|
26 |
+
return false;
|
27 |
+
}
|
28 |
+
$task = ScheduledTask::create();
|
29 |
+
$task->type = $task_type;
|
30 |
+
$task->status = ScheduledTask::STATUS_SCHEDULED;
|
31 |
+
$task->priority = ScheduledTask::PRIORITY_LOW;
|
32 |
+
$task->scheduled_at = $next_run_date;
|
33 |
+
$task->save();
|
34 |
+
return $task;
|
35 |
+
}
|
36 |
+
|
37 |
+
function reschedule(ScheduledTask $task, $timeout) {
|
38 |
+
$scheduled_at = Carbon::createFromTimestamp($this->wp->currentTime('timestamp'));
|
39 |
+
$task->scheduled_at = $scheduled_at->addMinutes($timeout);
|
40 |
+
$task->setExpr('updated_at', 'NOW()');
|
41 |
+
$task->status = ScheduledTask::STATUS_SCHEDULED;
|
42 |
+
$task->save();
|
43 |
+
}
|
44 |
+
}
|
lib/Cron/Daemon.php
CHANGED
@@ -29,7 +29,7 @@ class Daemon {
|
|
29 |
$errors = [];
|
30 |
foreach ($this->getWorkers() as $worker) {
|
31 |
try {
|
32 |
-
$worker->process();
|
33 |
} catch (\Exception $e) {
|
34 |
$worker_class_name_parts = explode('\\', get_class($worker));
|
35 |
$errors[] = [
|
@@ -48,21 +48,21 @@ class Daemon {
|
|
48 |
}
|
49 |
|
50 |
private function getWorkers() {
|
51 |
-
yield $this->workers_factory->createMigrationWorker(
|
52 |
-
yield $this->workers_factory->createStatsNotificationsWorker(
|
53 |
-
yield $this->workers_factory->createScheduleWorker(
|
54 |
-
yield $this->workers_factory->createQueueWorker(
|
55 |
-
yield $this->workers_factory->createSendingServiceKeyCheckWorker(
|
56 |
-
yield $this->workers_factory->createPremiumKeyCheckWorker(
|
57 |
-
yield $this->workers_factory->createBounceWorker(
|
58 |
-
yield $this->workers_factory->createExportFilesCleanupWorker(
|
59 |
-
yield $this->workers_factory->createBeamerkWorker(
|
60 |
-
yield $this->workers_factory->createInactiveSubscribersWorker(
|
61 |
-
yield $this->workers_factory->createUnsubscribeTokensWorker(
|
62 |
-
yield $this->workers_factory->createWooCommerceSyncWorker(
|
63 |
-
yield $this->workers_factory->createAuthorizedSendingEmailsCheckWorker(
|
64 |
-
yield $this->workers_factory->createWooCommercePastOrdersWorker(
|
65 |
-
yield $this->workers_factory->createStatsNotificationsWorkerForAutomatedEmails(
|
66 |
-
yield $this->workers_factory->createSubscriberLinkTokensWorker(
|
67 |
}
|
68 |
}
|
29 |
$errors = [];
|
30 |
foreach ($this->getWorkers() as $worker) {
|
31 |
try {
|
32 |
+
$worker->process($this->timer);
|
33 |
} catch (\Exception $e) {
|
34 |
$worker_class_name_parts = explode('\\', get_class($worker));
|
35 |
$errors[] = [
|
48 |
}
|
49 |
|
50 |
private function getWorkers() {
|
51 |
+
yield $this->workers_factory->createMigrationWorker();
|
52 |
+
yield $this->workers_factory->createStatsNotificationsWorker();
|
53 |
+
yield $this->workers_factory->createScheduleWorker();
|
54 |
+
yield $this->workers_factory->createQueueWorker();
|
55 |
+
yield $this->workers_factory->createSendingServiceKeyCheckWorker();
|
56 |
+
yield $this->workers_factory->createPremiumKeyCheckWorker();
|
57 |
+
yield $this->workers_factory->createBounceWorker();
|
58 |
+
yield $this->workers_factory->createExportFilesCleanupWorker();
|
59 |
+
yield $this->workers_factory->createBeamerkWorker();
|
60 |
+
yield $this->workers_factory->createInactiveSubscribersWorker();
|
61 |
+
yield $this->workers_factory->createUnsubscribeTokensWorker();
|
62 |
+
yield $this->workers_factory->createWooCommerceSyncWorker();
|
63 |
+
yield $this->workers_factory->createAuthorizedSendingEmailsCheckWorker();
|
64 |
+
yield $this->workers_factory->createWooCommercePastOrdersWorker();
|
65 |
+
yield $this->workers_factory->createStatsNotificationsWorkerForAutomatedEmails();
|
66 |
+
yield $this->workers_factory->createSubscriberLinkTokensWorker();
|
67 |
}
|
68 |
}
|
lib/Cron/DaemonHttpRunner.php
CHANGED
@@ -26,13 +26,17 @@ class DaemonHttpRunner {
|
|
26 |
|
27 |
const PING_SUCCESS_RESPONSE = 'pong';
|
28 |
|
29 |
-
|
|
|
|
|
|
|
30 |
$this->cron_helper = $cron_helper;
|
31 |
$this->settings_daemon_data = $this->cron_helper->getDaemon();
|
32 |
$this->token = $this->cron_helper->createToken();
|
33 |
$this->timer = microtime(true);
|
34 |
$this->daemon = $daemon;
|
35 |
$this->settings = $settings;
|
|
|
36 |
}
|
37 |
|
38 |
function ping() {
|
@@ -112,16 +116,15 @@ class DaemonHttpRunner {
|
|
112 |
}
|
113 |
|
114 |
function isCronTriggerMethodWordPress() {
|
115 |
-
$
|
116 |
-
return $this->settings->get(CronTrigger::SETTING_NAME . '.method') === $available_methods['wordpress'];
|
117 |
}
|
118 |
|
119 |
function checkWPTriggerExecutionRequirements() {
|
120 |
-
return
|
121 |
}
|
122 |
|
123 |
function stopCron() {
|
124 |
-
return
|
125 |
}
|
126 |
|
127 |
/**
|
26 |
|
27 |
const PING_SUCCESS_RESPONSE = 'pong';
|
28 |
|
29 |
+
/** @var WordPress */
|
30 |
+
private $wordpress_trigger;
|
31 |
+
|
32 |
+
function __construct(Daemon $daemon = null, CronHelper $cron_helper, SettingsController $settings, WordPress $wordpress_trigger) {
|
33 |
$this->cron_helper = $cron_helper;
|
34 |
$this->settings_daemon_data = $this->cron_helper->getDaemon();
|
35 |
$this->token = $this->cron_helper->createToken();
|
36 |
$this->timer = microtime(true);
|
37 |
$this->daemon = $daemon;
|
38 |
$this->settings = $settings;
|
39 |
+
$this->wordpress_trigger = $wordpress_trigger;
|
40 |
}
|
41 |
|
42 |
function ping() {
|
116 |
}
|
117 |
|
118 |
function isCronTriggerMethodWordPress() {
|
119 |
+
return $this->settings->get(CronTrigger::SETTING_NAME . '.method') === CronTrigger::METHOD_WORDPRESS;
|
|
|
120 |
}
|
121 |
|
122 |
function checkWPTriggerExecutionRequirements() {
|
123 |
+
return $this->wordpress_trigger->checkExecutionRequirements();
|
124 |
}
|
125 |
|
126 |
function stopCron() {
|
127 |
+
return $this->wordpress_trigger->stop();
|
128 |
}
|
129 |
|
130 |
/**
|
lib/Cron/Triggers/MailPoet.php
CHANGED
@@ -6,12 +6,17 @@ if (!defined('ABSPATH')) exit;
|
|
6 |
|
7 |
|
8 |
use MailPoet\Cron\Supervisor;
|
9 |
-
use MailPoet\DI\ContainerWrapper;
|
10 |
|
11 |
class MailPoet {
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
}
|
17 |
}
|
6 |
|
7 |
|
8 |
use MailPoet\Cron\Supervisor;
|
|
|
9 |
|
10 |
class MailPoet {
|
11 |
+
/** @var Supervisor */
|
12 |
+
private $supervisor;
|
13 |
+
|
14 |
+
function __construct(Supervisor $supervisor) {
|
15 |
+
$this->supervisor = $supervisor;
|
16 |
+
}
|
17 |
+
|
18 |
+
function run() {
|
19 |
+
$this->supervisor->init();
|
20 |
+
return $this->supervisor->checkDaemon();
|
21 |
}
|
22 |
}
|
lib/Cron/Triggers/WordPress.php
CHANGED
@@ -21,7 +21,6 @@ use MailPoet\Cron\Workers\SubscriberLinkTokens;
|
|
21 |
use MailPoet\Cron\Workers\UnsubscribeTokens;
|
22 |
use MailPoet\Cron\Workers\WooCommercePastOrders;
|
23 |
use MailPoet\Cron\Workers\WooCommerceSync as WooCommerceSyncWorker;
|
24 |
-
use MailPoet\DI\ContainerWrapper;
|
25 |
use MailPoet\Mailer\MailerLog;
|
26 |
use MailPoet\Models\ScheduledTask;
|
27 |
use MailPoet\Services\Bridge;
|
@@ -35,24 +34,47 @@ class WordPress {
|
|
35 |
const RUN_INTERVAL = -1; // seconds
|
36 |
const LAST_RUN_AT_SETTING = 'cron_trigger_wordpress.last_run_at';
|
37 |
|
38 |
-
|
39 |
|
40 |
-
|
41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
return false;
|
43 |
}
|
44 |
-
return (
|
45 |
-
|
46 |
self::stop();
|
47 |
}
|
48 |
|
49 |
-
private
|
50 |
-
$
|
51 |
-
$
|
52 |
-
$run_interval = WPFunctions::get()->applyFilters('mailpoet_cron_trigger_wordpress_run_interval', self::RUN_INTERVAL);
|
53 |
$run_interval_elapsed = (time() - $last_run_at) >= $run_interval;
|
54 |
if ($run_interval_elapsed) {
|
55 |
-
$settings->set(self::LAST_RUN_AT_SETTING, time());
|
56 |
return true;
|
57 |
}
|
58 |
return false;
|
@@ -63,23 +85,22 @@ class WordPress {
|
|
63 |
$settings->set(self::LAST_RUN_AT_SETTING, 0);
|
64 |
}
|
65 |
|
66 |
-
|
67 |
-
|
68 |
|
69 |
// migration
|
70 |
-
$
|
71 |
-
$
|
72 |
-
$migration_due_tasks = self::getTasksCount([
|
73 |
'type' => MigrationWorker::TASK_TYPE,
|
74 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
75 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
76 |
]);
|
77 |
-
$migration_completed_tasks =
|
78 |
'type' => MigrationWorker::TASK_TYPE,
|
79 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST, self::SCHEDULED_IN_THE_FUTURE],
|
80 |
'status' => [ScheduledTask::STATUS_COMPLETED],
|
81 |
]);
|
82 |
-
$migration_future_tasks =
|
83 |
'type' => MigrationWorker::TASK_TYPE,
|
84 |
'scheduled_in' => [self::SCHEDULED_IN_THE_FUTURE],
|
85 |
'status' => [ScheduledTask::STATUS_SCHEDULED],
|
@@ -92,96 +113,96 @@ class WordPress {
|
|
92 |
// sending service
|
93 |
$mp_sending_enabled = Bridge::isMPSendingServiceEnabled();
|
94 |
// bounce sync
|
95 |
-
$bounce_due_tasks =
|
96 |
'type' => BounceWorker::TASK_TYPE,
|
97 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
98 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
99 |
]);
|
100 |
-
$bounce_future_tasks =
|
101 |
'type' => BounceWorker::TASK_TYPE,
|
102 |
'scheduled_in' => [self::SCHEDULED_IN_THE_FUTURE],
|
103 |
'status' => [ScheduledTask::STATUS_SCHEDULED],
|
104 |
]);
|
105 |
// sending service key check
|
106 |
-
$msskeycheck_due_tasks =
|
107 |
'type' => SendingServiceKeyCheckWorker::TASK_TYPE,
|
108 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
109 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
110 |
]);
|
111 |
-
$msskeycheck_future_tasks =
|
112 |
'type' => SendingServiceKeyCheckWorker::TASK_TYPE,
|
113 |
'scheduled_in' => [self::SCHEDULED_IN_THE_FUTURE],
|
114 |
'status' => [ScheduledTask::STATUS_SCHEDULED],
|
115 |
]);
|
116 |
// premium key check
|
117 |
$premium_key_specified = Bridge::isPremiumKeySpecified();
|
118 |
-
$premium_keycheck_due_tasks =
|
119 |
'type' => PremiumKeyCheckWorker::TASK_TYPE,
|
120 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
121 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
122 |
]);
|
123 |
-
$premium_keycheck_future_tasks =
|
124 |
'type' => PremiumKeyCheckWorker::TASK_TYPE,
|
125 |
'scheduled_in' => [self::SCHEDULED_IN_THE_FUTURE],
|
126 |
'status' => [ScheduledTask::STATUS_SCHEDULED],
|
127 |
]);
|
128 |
// stats notifications
|
129 |
-
$stats_notifications_tasks =
|
130 |
'type' => StatsNotificationsWorker::TASK_TYPE,
|
131 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
132 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
133 |
]);
|
134 |
// stats notifications for auto emails
|
135 |
-
$auto_stats_notifications_tasks =
|
136 |
'type' => AutomatedEmails::TASK_TYPE,
|
137 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
138 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
139 |
]);
|
140 |
// inactive subscribers check
|
141 |
-
$inactive_subscribers_tasks =
|
142 |
'type' => InactiveSubscribers::TASK_TYPE,
|
143 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
144 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
145 |
]);
|
146 |
// unsubscribe tokens check
|
147 |
-
$unsubscribe_tokens_tasks =
|
148 |
'type' => UnsubscribeTokens::TASK_TYPE,
|
149 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
150 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
151 |
]);
|
152 |
// subscriber link tokens check
|
153 |
-
$subscriber_link_tokens_tasks =
|
154 |
'type' => SubscriberLinkTokens::TASK_TYPE,
|
155 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
156 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
157 |
]);
|
158 |
// WooCommerce sync
|
159 |
-
$woo_commerce_sync_tasks =
|
160 |
'type' => WooCommerceSyncWorker::TASK_TYPE,
|
161 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
162 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
163 |
]);
|
164 |
// Beamer
|
165 |
-
$beamer_due_checks =
|
166 |
'type' => BeamerWorker::TASK_TYPE,
|
167 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
168 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
169 |
]);
|
170 |
-
$beamer_future_checks =
|
171 |
'type' => BeamerWorker::TASK_TYPE,
|
172 |
'scheduled_in' => [self::SCHEDULED_IN_THE_FUTURE],
|
173 |
'status' => [ScheduledTask::STATUS_SCHEDULED],
|
174 |
]);
|
175 |
|
176 |
// Authorized email addresses check
|
177 |
-
$authorized_email_addresses_tasks =
|
178 |
'type' => AuthorizedSendingEmailsCheck::TASK_TYPE,
|
179 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
180 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
181 |
]);
|
182 |
|
183 |
// WooCommerce past orders revenues sync
|
184 |
-
$woo_commerce_past_orders_tasks =
|
185 |
'type' => WooCommercePastOrders::TASK_TYPE,
|
186 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
187 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
@@ -213,15 +234,14 @@ class WordPress {
|
|
213 |
);
|
214 |
}
|
215 |
|
216 |
-
|
217 |
-
$
|
218 |
-
$cron_daemon = $cron_helper->getDaemon();
|
219 |
if ($cron_daemon) {
|
220 |
-
$cron_helper->deactivateDaemon($cron_daemon);
|
221 |
}
|
222 |
}
|
223 |
|
224 |
-
|
225 |
$query = sprintf(
|
226 |
"select
|
227 |
type,
|
@@ -232,31 +252,31 @@ class WordPress {
|
|
232 |
where deleted_at is null
|
233 |
group by type, status, scheduled_in
|
234 |
",
|
235 |
-
date('Y-m-d H:i:s', $wp->currentTime('timestamp')),
|
236 |
self::SCHEDULED_IN_THE_PAST,
|
237 |
self::SCHEDULED_IN_THE_FUTURE,
|
238 |
ScheduledTask::$_table
|
239 |
);
|
240 |
$rows = ScheduledTask::rawQuery($query)->findMany();
|
241 |
-
|
242 |
foreach ($rows as $r) {
|
243 |
-
if (empty(
|
244 |
-
|
245 |
}
|
246 |
-
if (empty(
|
247 |
-
|
248 |
}
|
249 |
-
|
250 |
}
|
251 |
}
|
252 |
|
253 |
-
|
254 |
$count = 0;
|
255 |
$type = $options['type'];
|
256 |
foreach ($options['scheduled_in'] as $scheduled_in) {
|
257 |
foreach ($options['status'] as $status) {
|
258 |
-
if (! empty(
|
259 |
-
$count +=
|
260 |
}
|
261 |
}
|
262 |
}
|
21 |
use MailPoet\Cron\Workers\UnsubscribeTokens;
|
22 |
use MailPoet\Cron\Workers\WooCommercePastOrders;
|
23 |
use MailPoet\Cron\Workers\WooCommerceSync as WooCommerceSyncWorker;
|
|
|
24 |
use MailPoet\Mailer\MailerLog;
|
25 |
use MailPoet\Models\ScheduledTask;
|
26 |
use MailPoet\Services\Bridge;
|
34 |
const RUN_INTERVAL = -1; // seconds
|
35 |
const LAST_RUN_AT_SETTING = 'cron_trigger_wordpress.last_run_at';
|
36 |
|
37 |
+
private $tasks_counts;
|
38 |
|
39 |
+
/** @var CronHelper */
|
40 |
+
private $cron_helper;
|
41 |
+
|
42 |
+
/** @var MailPoet */
|
43 |
+
private $mailpoet_trigger;
|
44 |
+
|
45 |
+
/** @var SettingsController */
|
46 |
+
private $settings;
|
47 |
+
|
48 |
+
/** @var WPFunctions */
|
49 |
+
private $wp;
|
50 |
+
|
51 |
+
function __construct(
|
52 |
+
CronHelper $cron_helper,
|
53 |
+
MailPoet $mailpoet_trigger,
|
54 |
+
SettingsController $settings,
|
55 |
+
WPFunctions $wp
|
56 |
+
) {
|
57 |
+
$this->mailpoet_trigger = $mailpoet_trigger;
|
58 |
+
$this->settings = $settings;
|
59 |
+
$this->wp = $wp;
|
60 |
+
$this->cron_helper = $cron_helper;
|
61 |
+
}
|
62 |
+
|
63 |
+
function run() {
|
64 |
+
if (!$this->checkRunInterval()) {
|
65 |
return false;
|
66 |
}
|
67 |
+
return ($this->checkExecutionRequirements()) ?
|
68 |
+
$this->mailpoet_trigger->run() :
|
69 |
self::stop();
|
70 |
}
|
71 |
|
72 |
+
private function checkRunInterval() {
|
73 |
+
$last_run_at = (int)$this->settings->get(self::LAST_RUN_AT_SETTING, 0);
|
74 |
+
$run_interval = $this->wp->applyFilters('mailpoet_cron_trigger_wordpress_run_interval', self::RUN_INTERVAL);
|
|
|
75 |
$run_interval_elapsed = (time() - $last_run_at) >= $run_interval;
|
76 |
if ($run_interval_elapsed) {
|
77 |
+
$this->settings->set(self::LAST_RUN_AT_SETTING, time());
|
78 |
return true;
|
79 |
}
|
80 |
return false;
|
85 |
$settings->set(self::LAST_RUN_AT_SETTING, 0);
|
86 |
}
|
87 |
|
88 |
+
function checkExecutionRequirements() {
|
89 |
+
$this->loadTasksCounts();
|
90 |
|
91 |
// migration
|
92 |
+
$migration_disabled = $this->settings->get('cron_trigger.method') === 'none';
|
93 |
+
$migration_due_tasks = $this->getTasksCount([
|
|
|
94 |
'type' => MigrationWorker::TASK_TYPE,
|
95 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
96 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
97 |
]);
|
98 |
+
$migration_completed_tasks = $this->getTasksCount([
|
99 |
'type' => MigrationWorker::TASK_TYPE,
|
100 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST, self::SCHEDULED_IN_THE_FUTURE],
|
101 |
'status' => [ScheduledTask::STATUS_COMPLETED],
|
102 |
]);
|
103 |
+
$migration_future_tasks = $this->getTasksCount([
|
104 |
'type' => MigrationWorker::TASK_TYPE,
|
105 |
'scheduled_in' => [self::SCHEDULED_IN_THE_FUTURE],
|
106 |
'status' => [ScheduledTask::STATUS_SCHEDULED],
|
113 |
// sending service
|
114 |
$mp_sending_enabled = Bridge::isMPSendingServiceEnabled();
|
115 |
// bounce sync
|
116 |
+
$bounce_due_tasks = $this->getTasksCount([
|
117 |
'type' => BounceWorker::TASK_TYPE,
|
118 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
119 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
120 |
]);
|
121 |
+
$bounce_future_tasks = $this->getTasksCount([
|
122 |
'type' => BounceWorker::TASK_TYPE,
|
123 |
'scheduled_in' => [self::SCHEDULED_IN_THE_FUTURE],
|
124 |
'status' => [ScheduledTask::STATUS_SCHEDULED],
|
125 |
]);
|
126 |
// sending service key check
|
127 |
+
$msskeycheck_due_tasks = $this->getTasksCount([
|
128 |
'type' => SendingServiceKeyCheckWorker::TASK_TYPE,
|
129 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
130 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
131 |
]);
|
132 |
+
$msskeycheck_future_tasks = $this->getTasksCount([
|
133 |
'type' => SendingServiceKeyCheckWorker::TASK_TYPE,
|
134 |
'scheduled_in' => [self::SCHEDULED_IN_THE_FUTURE],
|
135 |
'status' => [ScheduledTask::STATUS_SCHEDULED],
|
136 |
]);
|
137 |
// premium key check
|
138 |
$premium_key_specified = Bridge::isPremiumKeySpecified();
|
139 |
+
$premium_keycheck_due_tasks = $this->getTasksCount([
|
140 |
'type' => PremiumKeyCheckWorker::TASK_TYPE,
|
141 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
142 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
143 |
]);
|
144 |
+
$premium_keycheck_future_tasks = $this->getTasksCount([
|
145 |
'type' => PremiumKeyCheckWorker::TASK_TYPE,
|
146 |
'scheduled_in' => [self::SCHEDULED_IN_THE_FUTURE],
|
147 |
'status' => [ScheduledTask::STATUS_SCHEDULED],
|
148 |
]);
|
149 |
// stats notifications
|
150 |
+
$stats_notifications_tasks = $this->getTasksCount([
|
151 |
'type' => StatsNotificationsWorker::TASK_TYPE,
|
152 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
153 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
154 |
]);
|
155 |
// stats notifications for auto emails
|
156 |
+
$auto_stats_notifications_tasks = $this->getTasksCount([
|
157 |
'type' => AutomatedEmails::TASK_TYPE,
|
158 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
159 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
160 |
]);
|
161 |
// inactive subscribers check
|
162 |
+
$inactive_subscribers_tasks = $this->getTasksCount([
|
163 |
'type' => InactiveSubscribers::TASK_TYPE,
|
164 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
165 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
166 |
]);
|
167 |
// unsubscribe tokens check
|
168 |
+
$unsubscribe_tokens_tasks = $this->getTasksCount([
|
169 |
'type' => UnsubscribeTokens::TASK_TYPE,
|
170 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
171 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
172 |
]);
|
173 |
// subscriber link tokens check
|
174 |
+
$subscriber_link_tokens_tasks = $this->getTasksCount([
|
175 |
'type' => SubscriberLinkTokens::TASK_TYPE,
|
176 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
177 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
178 |
]);
|
179 |
// WooCommerce sync
|
180 |
+
$woo_commerce_sync_tasks = $this->getTasksCount([
|
181 |
'type' => WooCommerceSyncWorker::TASK_TYPE,
|
182 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
183 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
184 |
]);
|
185 |
// Beamer
|
186 |
+
$beamer_due_checks = $this->getTasksCount([
|
187 |
'type' => BeamerWorker::TASK_TYPE,
|
188 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
189 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
190 |
]);
|
191 |
+
$beamer_future_checks = $this->getTasksCount([
|
192 |
'type' => BeamerWorker::TASK_TYPE,
|
193 |
'scheduled_in' => [self::SCHEDULED_IN_THE_FUTURE],
|
194 |
'status' => [ScheduledTask::STATUS_SCHEDULED],
|
195 |
]);
|
196 |
|
197 |
// Authorized email addresses check
|
198 |
+
$authorized_email_addresses_tasks = $this->getTasksCount([
|
199 |
'type' => AuthorizedSendingEmailsCheck::TASK_TYPE,
|
200 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
201 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
202 |
]);
|
203 |
|
204 |
// WooCommerce past orders revenues sync
|
205 |
+
$woo_commerce_past_orders_tasks = $this->getTasksCount([
|
206 |
'type' => WooCommercePastOrders::TASK_TYPE,
|
207 |
'scheduled_in' => [self::SCHEDULED_IN_THE_PAST],
|
208 |
'status' => ['null', ScheduledTask::STATUS_SCHEDULED],
|
234 |
);
|
235 |
}
|
236 |
|
237 |
+
function stop() {
|
238 |
+
$cron_daemon = $this->cron_helper->getDaemon();
|
|
|
239 |
if ($cron_daemon) {
|
240 |
+
$this->cron_helper->deactivateDaemon($cron_daemon);
|
241 |
}
|
242 |
}
|
243 |
|
244 |
+
private function loadTasksCounts() {
|
245 |
$query = sprintf(
|
246 |
"select
|
247 |
type,
|
252 |
where deleted_at is null
|
253 |
group by type, status, scheduled_in
|
254 |
",
|
255 |
+
date('Y-m-d H:i:s', $this->wp->currentTime('timestamp')),
|
256 |
self::SCHEDULED_IN_THE_PAST,
|
257 |
self::SCHEDULED_IN_THE_FUTURE,
|
258 |
ScheduledTask::$_table
|
259 |
);
|
260 |
$rows = ScheduledTask::rawQuery($query)->findMany();
|
261 |
+
$this->tasks_counts = [];
|
262 |
foreach ($rows as $r) {
|
263 |
+
if (empty($this->tasks_counts[$r->type])) {
|
264 |
+
$this->tasks_counts[$r->type] = [];
|
265 |
}
|
266 |
+
if (empty($this->tasks_counts[$r->type][$r->scheduled_in])) {
|
267 |
+
$this->tasks_counts[$r->type][$r->scheduled_in] = [];
|
268 |
}
|
269 |
+
$this->tasks_counts[$r->type][$r->scheduled_in][$r->status ?: 'null'] = $r->count;
|
270 |
}
|
271 |
}
|
272 |
|
273 |
+
private function getTasksCount(array $options) {
|
274 |
$count = 0;
|
275 |
$type = $options['type'];
|
276 |
foreach ($options['scheduled_in'] as $scheduled_in) {
|
277 |
foreach ($options['status'] as $status) {
|
278 |
+
if (! empty($this->tasks_counts[$type][$scheduled_in][$status])) {
|
279 |
+
$count += $this->tasks_counts[$type][$scheduled_in][$status];
|
280 |
}
|
281 |
}
|
282 |
}
|
lib/Cron/Workers/AuthorizedSendingEmailsCheck.php
CHANGED
@@ -16,16 +16,16 @@ class AuthorizedSendingEmailsCheck extends SimpleWorker {
|
|
16 |
/** @var AuthorizedEmailsController */
|
17 |
private $authorized_emails_controller;
|
18 |
|
19 |
-
function __construct(AuthorizedEmailsController $authorized_emails_controller
|
20 |
$this->authorized_emails_controller = $authorized_emails_controller;
|
21 |
-
parent::__construct(
|
22 |
}
|
23 |
|
24 |
function checkProcessingRequirements() {
|
25 |
return Bridge::isMPSendingServiceEnabled();
|
26 |
}
|
27 |
|
28 |
-
function processTaskStrategy(ScheduledTask $task) {
|
29 |
$this->authorized_emails_controller->checkAuthorizedEmailAddresses();
|
30 |
return true;
|
31 |
}
|
16 |
/** @var AuthorizedEmailsController */
|
17 |
private $authorized_emails_controller;
|
18 |
|
19 |
+
function __construct(AuthorizedEmailsController $authorized_emails_controller) {
|
20 |
$this->authorized_emails_controller = $authorized_emails_controller;
|
21 |
+
parent::__construct();
|
22 |
}
|
23 |
|
24 |
function checkProcessingRequirements() {
|
25 |
return Bridge::isMPSendingServiceEnabled();
|
26 |
}
|
27 |
|
28 |
+
function processTaskStrategy(ScheduledTask $task, $timer) {
|
29 |
$this->authorized_emails_controller->checkAuthorizedEmailAddresses();
|
30 |
return true;
|
31 |
}
|
lib/Cron/Workers/Beamer.php
CHANGED
@@ -21,13 +21,13 @@ class Beamer extends SimpleWorker {
|
|
21 |
/** @var WPFunctions */
|
22 |
private $wp;
|
23 |
|
24 |
-
function __construct(SettingsController $settings, WPFunctions $wp
|
25 |
-
parent::__construct(
|
26 |
$this->settings = $settings;
|
27 |
$this->wp = $wp;
|
28 |
}
|
29 |
|
30 |
-
function processTaskStrategy(ScheduledTask $task) {
|
31 |
return $this->setLastAnnouncementDate();
|
32 |
}
|
33 |
|
@@ -45,7 +45,7 @@ class Beamer extends SimpleWorker {
|
|
45 |
return true;
|
46 |
}
|
47 |
|
48 |
-
|
49 |
$wp = new WPFunctions;
|
50 |
$date = Carbon::createFromTimestamp($wp->currentTime('timestamp'));
|
51 |
return $date->hour(11)->minute(00)->second(00)->addDay();
|
21 |
/** @var WPFunctions */
|
22 |
private $wp;
|
23 |
|
24 |
+
function __construct(SettingsController $settings, WPFunctions $wp) {
|
25 |
+
parent::__construct();
|
26 |
$this->settings = $settings;
|
27 |
$this->wp = $wp;
|
28 |
}
|
29 |
|
30 |
+
function processTaskStrategy(ScheduledTask $task, $timer) {
|
31 |
return $this->setLastAnnouncementDate();
|
32 |
}
|
33 |
|
45 |
return true;
|
46 |
}
|
47 |
|
48 |
+
function getNextRunDate() {
|
49 |
$wp = new WPFunctions;
|
50 |
$date = Carbon::createFromTimestamp($wp->currentTime('timestamp'));
|
51 |
return $date->hour(11)->minute(00)->second(00)->addDay();
|
lib/Cron/Workers/Bounce.php
CHANGED
@@ -32,9 +32,9 @@ class Bounce extends SimpleWorker {
|
|
32 |
/** @var SettingsController */
|
33 |
private $settings;
|
34 |
|
35 |
-
function __construct(SettingsController $settings
|
36 |
$this->settings = $settings;
|
37 |
-
parent::__construct(
|
38 |
}
|
39 |
|
40 |
function init() {
|
@@ -47,30 +47,29 @@ class Bounce extends SimpleWorker {
|
|
47 |
return Bridge::isMPSendingServiceEnabled();
|
48 |
}
|
49 |
|
50 |
-
function
|
51 |
BounceTask::prepareSubscribers($task);
|
52 |
|
53 |
if (!ScheduledTaskSubscriber::getUnprocessedCount($task->id)) {
|
54 |
-
$task->
|
55 |
return false;
|
56 |
}
|
57 |
-
|
58 |
-
return parent::prepareTask($task);
|
59 |
}
|
60 |
|
61 |
-
function
|
62 |
$subscriber_batches = new BatchIterator($task->id, self::BATCH_SIZE);
|
63 |
|
64 |
if (count($subscriber_batches) === 0) {
|
65 |
-
$task->
|
66 |
-
return
|
67 |
}
|
68 |
|
69 |
$task_subscribers = new TaskSubscribers($task);
|
70 |
|
71 |
foreach ($subscriber_batches as $subscribers_to_process_ids) {
|
72 |
// abort if execution limit is reached
|
73 |
-
$this->cron_helper->enforceExecutionLimit($
|
74 |
|
75 |
$subscriber_emails = Subscriber::select('email')
|
76 |
->whereIn('id', $subscribers_to_process_ids)
|
32 |
/** @var SettingsController */
|
33 |
private $settings;
|
34 |
|
35 |
+
function __construct(SettingsController $settings) {
|
36 |
$this->settings = $settings;
|
37 |
+
parent::__construct();
|
38 |
}
|
39 |
|
40 |
function init() {
|
47 |
return Bridge::isMPSendingServiceEnabled();
|
48 |
}
|
49 |
|
50 |
+
function prepareTaskStrategy(ScheduledTask $task, $timer) {
|
51 |
BounceTask::prepareSubscribers($task);
|
52 |
|
53 |
if (!ScheduledTaskSubscriber::getUnprocessedCount($task->id)) {
|
54 |
+
ScheduledTaskSubscriber::where('task_id', $task->id)->deleteMany();
|
55 |
return false;
|
56 |
}
|
57 |
+
return true;
|
|
|
58 |
}
|
59 |
|
60 |
+
function processTaskStrategy(ScheduledTask $task, $timer) {
|
61 |
$subscriber_batches = new BatchIterator($task->id, self::BATCH_SIZE);
|
62 |
|
63 |
if (count($subscriber_batches) === 0) {
|
64 |
+
ScheduledTaskSubscriber::where('task_id', $task->id)->deleteMany();
|
65 |
+
return true; // mark completed
|
66 |
}
|
67 |
|
68 |
$task_subscribers = new TaskSubscribers($task);
|
69 |
|
70 |
foreach ($subscriber_batches as $subscribers_to_process_ids) {
|
71 |
// abort if execution limit is reached
|
72 |
+
$this->cron_helper->enforceExecutionLimit($timer);
|
73 |
|
74 |
$subscriber_emails = Subscriber::select('email')
|
75 |
->whereIn('id', $subscribers_to_process_ids)
|
lib/Cron/Workers/ExportFilesCleanup.php
CHANGED
@@ -13,9 +13,12 @@ class ExportFilesCleanup extends SimpleWorker {
|
|
13 |
const TASK_TYPE = 'export_files_cleanup';
|
14 |
const DELETE_FILES_AFTER_X_DAYS = 1;
|
15 |
|
16 |
-
function processTaskStrategy(ScheduledTask $task) {
|
17 |
$iterator = new \GlobIterator(Export::getExportPath() . '/' . Export::getFilePrefix() . '*.*');
|
18 |
foreach ($iterator as $file) {
|
|
|
|
|
|
|
19 |
$name = $file->getPathname();
|
20 |
$created = $file->getMTime();
|
21 |
$now = new Carbon();
|
13 |
const TASK_TYPE = 'export_files_cleanup';
|
14 |
const DELETE_FILES_AFTER_X_DAYS = 1;
|
15 |
|
16 |
+
function processTaskStrategy(ScheduledTask $task, $timer) {
|
17 |
$iterator = new \GlobIterator(Export::getExportPath() . '/' . Export::getFilePrefix() . '*.*');
|
18 |
foreach ($iterator as $file) {
|
19 |
+
if (is_string($file)) {
|
20 |
+
continue;
|
21 |
+
}
|
22 |
$name = $file->getPathname();
|
23 |
$created = $file->getMTime();
|
24 |
$now = new Carbon();
|
lib/Cron/Workers/InactiveSubscribers.php
CHANGED
@@ -24,26 +24,25 @@ class InactiveSubscribers extends SimpleWorker {
|
|
24 |
|
25 |
function __construct(
|
26 |
InactiveSubscribersController $inactive_subscribers_controller,
|
27 |
-
SettingsController $settings
|
28 |
-
$timer = false
|
29 |
) {
|
30 |
$this->inactive_subscribers_controller = $inactive_subscribers_controller;
|
31 |
$this->settings = $settings;
|
32 |
-
parent::__construct(
|
33 |
}
|
34 |
|
35 |
|
36 |
-
function processTaskStrategy(ScheduledTask $task) {
|
37 |
$tracking_enabled = (bool)$this->settings->get('tracking.enabled');
|
38 |
if (!$tracking_enabled) {
|
39 |
-
|
40 |
return true;
|
41 |
}
|
42 |
$days_to_inactive = (int)$this->settings->get('deactivate_subscriber_after_inactive_days');
|
43 |
// Activate all inactive subscribers in case the feature is turned off
|
44 |
if ($days_to_inactive === 0) {
|
45 |
$this->inactive_subscribers_controller->reactivateInactiveSubscribers();
|
46 |
-
|
47 |
return true;
|
48 |
}
|
49 |
// Handle activation/deactivation within interval
|
@@ -58,12 +57,12 @@ class InactiveSubscribers extends SimpleWorker {
|
|
58 |
$last_subscriber_id += self::BATCH_SIZE;
|
59 |
$task->meta = ['last_subscriber_id' => $last_subscriber_id];
|
60 |
$task->save();
|
61 |
-
$this->cron_helper->enforceExecutionLimit($
|
62 |
};
|
63 |
while ($this->inactive_subscribers_controller->markActiveSubscribers($days_to_inactive, self::BATCH_SIZE) === self::BATCH_SIZE) {
|
64 |
-
$this->cron_helper->enforceExecutionLimit($
|
65 |
};
|
66 |
-
|
67 |
return true;
|
68 |
}
|
69 |
}
|
24 |
|
25 |
function __construct(
|
26 |
InactiveSubscribersController $inactive_subscribers_controller,
|
27 |
+
SettingsController $settings
|
|
|
28 |
) {
|
29 |
$this->inactive_subscribers_controller = $inactive_subscribers_controller;
|
30 |
$this->settings = $settings;
|
31 |
+
parent::__construct();
|
32 |
}
|
33 |
|
34 |
|
35 |
+
function processTaskStrategy(ScheduledTask $task, $timer) {
|
36 |
$tracking_enabled = (bool)$this->settings->get('tracking.enabled');
|
37 |
if (!$tracking_enabled) {
|
38 |
+
$this->schedule();
|
39 |
return true;
|
40 |
}
|
41 |
$days_to_inactive = (int)$this->settings->get('deactivate_subscriber_after_inactive_days');
|
42 |
// Activate all inactive subscribers in case the feature is turned off
|
43 |
if ($days_to_inactive === 0) {
|
44 |
$this->inactive_subscribers_controller->reactivateInactiveSubscribers();
|
45 |
+
$this->schedule();
|
46 |
return true;
|
47 |
}
|
48 |
// Handle activation/deactivation within interval
|
57 |
$last_subscriber_id += self::BATCH_SIZE;
|
58 |
$task->meta = ['last_subscriber_id' => $last_subscriber_id];
|
59 |
$task->save();
|
60 |
+
$this->cron_helper->enforceExecutionLimit($timer);
|
61 |
};
|
62 |
while ($this->inactive_subscribers_controller->markActiveSubscribers($days_to_inactive, self::BATCH_SIZE) === self::BATCH_SIZE) {
|
63 |
+
$this->cron_helper->enforceExecutionLimit($timer);
|
64 |
};
|
65 |
+
$this->schedule();
|
66 |
return true;
|
67 |
}
|
68 |
}
|
lib/Cron/Workers/KeyCheck/KeyCheckWorker.php
CHANGED
@@ -18,7 +18,7 @@ abstract class KeyCheckWorker extends SimpleWorker {
|
|
18 |
}
|
19 |
}
|
20 |
|
21 |
-
function processTaskStrategy(ScheduledTask $task) {
|
22 |
try {
|
23 |
$result = $this->checkKey();
|
24 |
} catch (\Exception $e) {
|
18 |
}
|
19 |
}
|
20 |
|
21 |
+
function processTaskStrategy(ScheduledTask $task, $timer) {
|
22 |
try {
|
23 |
$result = $this->checkKey();
|
24 |
} catch (\Exception $e) {
|
lib/Cron/Workers/KeyCheck/PremiumKeyCheck.php
CHANGED
@@ -14,9 +14,9 @@ class PremiumKeyCheck extends KeyCheckWorker {
|
|
14 |
/** @var SettingsController */
|
15 |
private $settings;
|
16 |
|
17 |
-
function __construct(SettingsController $settings
|
18 |
$this->settings = $settings;
|
19 |
-
parent::__construct(
|
20 |
}
|
21 |
|
22 |
|
14 |
/** @var SettingsController */
|
15 |
private $settings;
|
16 |
|
17 |
+
function __construct(SettingsController $settings) {
|
18 |
$this->settings = $settings;
|
19 |
+
parent::__construct();
|
20 |
}
|
21 |
|
22 |
|
lib/Cron/Workers/KeyCheck/SendingServiceKeyCheck.php
CHANGED
@@ -15,9 +15,9 @@ class SendingServiceKeyCheck extends KeyCheckWorker {
|
|
15 |
/** @var SettingsController */
|
16 |
private $settings;
|
17 |
|
18 |
-
function __construct(SettingsController $settings
|
19 |
$this->settings = $settings;
|
20 |
-
parent::__construct(
|
21 |
}
|
22 |
|
23 |
function checkProcessingRequirements() {
|
15 |
/** @var SettingsController */
|
16 |
private $settings;
|
17 |
|
18 |
+
function __construct(SettingsController $settings) {
|
19 |
$this->settings = $settings;
|
20 |
+
parent::__construct();
|
21 |
}
|
22 |
|
23 |
function checkProcessingRequirements() {
|
lib/Cron/Workers/Scheduler.php
CHANGED
@@ -23,8 +23,6 @@ use MailPoetVendor\Monolog\Logger;
|
|
23 |
class Scheduler {
|
24 |
const TASK_BATCH_SIZE = 5;
|
25 |
|
26 |
-
public $timer;
|
27 |
-
|
28 |
/** @var SubscribersFinder */
|
29 |
private $subscribers_finder;
|
30 |
|
@@ -37,18 +35,19 @@ class Scheduler {
|
|
37 |
function __construct(
|
38 |
SubscribersFinder $subscribers_finder,
|
39 |
LoggerFactory $logger_factory,
|
40 |
-
CronHelper $cron_helper
|
41 |
-
$timer = false
|
42 |
) {
|
43 |
-
$this->timer = ($timer) ? $timer : microtime(true);
|
44 |
-
// abort if execution limit is reached
|
45 |
$this->cron_helper = $cron_helper;
|
46 |
-
$this->cron_helper->enforceExecutionLimit($this->timer);
|
47 |
$this->subscribers_finder = $subscribers_finder;
|
48 |
$this->logger_factory = $logger_factory;
|
49 |
}
|
50 |
|
51 |
-
function process() {
|
|
|
|
|
|
|
|
|
|
|
52 |
$scheduled_queues = self::getScheduledQueues();
|
53 |
if (!count($scheduled_queues)) return false;
|
54 |
$this->updateTasks($scheduled_queues);
|
@@ -67,7 +66,7 @@ class Scheduler {
|
|
67 |
} elseif ($newsletter->type === Newsletter::TYPE_AUTOMATIC) {
|
68 |
$this->processScheduledAutomaticEmail($newsletter, $queue);
|
69 |
}
|
70 |
-
$this->cron_helper->enforceExecutionLimit($
|
71 |
}
|
72 |
}
|
73 |
|
@@ -251,7 +250,7 @@ class Scheduler {
|
|
251 |
}
|
252 |
|
253 |
private function reScheduleBounceTask() {
|
254 |
-
$bounce_tasks = Bounce::
|
255 |
if (count($bounce_tasks)) {
|
256 |
$bounce_task = reset($bounce_tasks);
|
257 |
if (Carbon::createFromTimestamp(current_time('timestamp'))->addHour(42)->lessThan($bounce_task->scheduled_at)) {
|
23 |
class Scheduler {
|
24 |
const TASK_BATCH_SIZE = 5;
|
25 |
|
|
|
|
|
26 |
/** @var SubscribersFinder */
|
27 |
private $subscribers_finder;
|
28 |
|
35 |
function __construct(
|
36 |
SubscribersFinder $subscribers_finder,
|
37 |
LoggerFactory $logger_factory,
|
38 |
+
CronHelper $cron_helper
|
|
|
39 |
) {
|
|
|
|
|
40 |
$this->cron_helper = $cron_helper;
|
|
|
41 |
$this->subscribers_finder = $subscribers_finder;
|
42 |
$this->logger_factory = $logger_factory;
|
43 |
}
|
44 |
|
45 |
+
function process($timer = false) {
|
46 |
+
$timer = $timer ?: microtime(true);
|
47 |
+
|
48 |
+
// abort if execution limit is reached
|
49 |
+
$this->cron_helper->enforceExecutionLimit($timer);
|
50 |
+
|
51 |
$scheduled_queues = self::getScheduledQueues();
|
52 |
if (!count($scheduled_queues)) return false;
|
53 |
$this->updateTasks($scheduled_queues);
|
66 |
} elseif ($newsletter->type === Newsletter::TYPE_AUTOMATIC) {
|
67 |
$this->processScheduledAutomaticEmail($newsletter, $queue);
|
68 |
}
|
69 |
+
$this->cron_helper->enforceExecutionLimit($timer);
|
70 |
}
|
71 |
}
|
72 |
|
250 |
}
|
251 |
|
252 |
private function reScheduleBounceTask() {
|
253 |
+
$bounce_tasks = ScheduledTask::findFutureScheduledByType(Bounce::TASK_TYPE);
|
254 |
if (count($bounce_tasks)) {
|
255 |
$bounce_task = reset($bounce_tasks);
|
256 |
if (Carbon::createFromTimestamp(current_time('timestamp'))->addHour(42)->lessThan($bounce_task->scheduled_at)) {
|
lib/Cron/Workers/SendingQueue/Migration.php
CHANGED
@@ -11,7 +11,7 @@ use MailPoet\Cron\Workers\SimpleWorker;
|
|
11 |
use MailPoet\Mailer\MailerLog;
|
12 |
use MailPoet\Models\ScheduledTask;
|
13 |
use MailPoet\Models\ScheduledTaskSubscriber;
|
14 |
-
use MailPoet\Models\SendingQueue;
|
15 |
use MailPoet\WP\Functions as WPFunctions;
|
16 |
|
17 |
class Migration extends SimpleWorker {
|
@@ -20,12 +20,12 @@ class Migration extends SimpleWorker {
|
|
20 |
|
21 |
function checkProcessingRequirements() {
|
22 |
// if migration was completed, don't run it again
|
23 |
-
$completed_tasks =
|
24 |
return empty($completed_tasks);
|
25 |
}
|
26 |
|
27 |
-
function
|
28 |
-
$unmigrated_columns =
|
29 |
$unmigrated_queues_count = 0;
|
30 |
$unmigrated_queue_subscribers = [];
|
31 |
|
@@ -46,8 +46,7 @@ class Migration extends SimpleWorker {
|
|
46 |
|
47 |
// pause sending while the migration is in process
|
48 |
$this->pauseSending();
|
49 |
-
|
50 |
-
return parent::prepareTask($task);
|
51 |
}
|
52 |
|
53 |
function pauseSending() {
|
@@ -77,24 +76,21 @@ class Migration extends SimpleWorker {
|
|
77 |
}
|
78 |
}
|
79 |
|
80 |
-
function
|
81 |
-
$this->migrateSendingQueues();
|
82 |
-
$this->migrateSubscribers();
|
83 |
-
|
84 |
-
$this->complete($task);
|
85 |
$this->resumeSending();
|
86 |
-
|
87 |
return true;
|
88 |
}
|
89 |
|
90 |
-
|
91 |
global $wpdb;
|
92 |
-
$existing_columns = $wpdb->get_col('DESC ' .
|
93 |
return in_array('type', $existing_columns);
|
94 |
}
|
95 |
|
96 |
function getUnmigratedQueues() {
|
97 |
-
return
|
98 |
->whereNull('type');
|
99 |
}
|
100 |
|
@@ -115,7 +111,7 @@ class Migration extends SimpleWorker {
|
|
115 |
/*
|
116 |
* Migrate all sending queues without converting subscriber data
|
117 |
*/
|
118 |
-
function migrateSendingQueues() {
|
119 |
global $wpdb;
|
120 |
|
121 |
$queues = $this->getUnmigratedQueues()
|
@@ -135,7 +131,7 @@ class Migration extends SimpleWorker {
|
|
135 |
if (!empty($queues)) {
|
136 |
foreach (array_chunk($queues, self::BATCH_SIZE) as $queue_batch) {
|
137 |
// abort if execution limit is reached
|
138 |
-
$this->cron_helper->enforceExecutionLimit($
|
139 |
|
140 |
foreach ($queue_batch as $queue) {
|
141 |
// create a new scheduled task of type "sending"
|
@@ -165,7 +161,7 @@ class Migration extends SimpleWorker {
|
|
165 |
/*
|
166 |
* Migrate subscribers for in-progress sending tasks from the `subscribers` field to a separate table
|
167 |
*/
|
168 |
-
function migrateSubscribers() {
|
169 |
global $wpdb;
|
170 |
|
171 |
// find in-progress queues that have serialized subscribers
|
@@ -184,16 +180,16 @@ class Migration extends SimpleWorker {
|
|
184 |
if (!empty($task_ids)) {
|
185 |
foreach ($task_ids as $task_id) {
|
186 |
// abort if execution limit is reached
|
187 |
-
$this->cron_helper->enforceExecutionLimit($
|
188 |
|
189 |
-
$this->migrateTaskSubscribers($task_id);
|
190 |
}
|
191 |
}
|
192 |
|
193 |
return true;
|
194 |
}
|
195 |
|
196 |
-
function migrateTaskSubscribers($task_id) {
|
197 |
global $wpdb;
|
198 |
|
199 |
$migrated_unprocessed_count = ScheduledTaskSubscriber::getUnprocessedCount($task_id);
|
@@ -219,7 +215,7 @@ class Migration extends SimpleWorker {
|
|
219 |
$subscribers_to_migrate = array_slice($subscribers['to_process'], $migrated_unprocessed_count);
|
220 |
foreach ($subscribers_to_migrate as $sub_id) {
|
221 |
// abort if execution limit is reached
|
222 |
-
$this->cron_helper->enforceExecutionLimit($
|
223 |
|
224 |
ScheduledTaskSubscriber::createOrUpdate([
|
225 |
'task_id' => $task_id,
|
@@ -233,7 +229,7 @@ class Migration extends SimpleWorker {
|
|
233 |
$subscribers_to_migrate = array_slice($subscribers['processed'], $migrated_processed_count);
|
234 |
foreach ($subscribers_to_migrate as $sub_id) {
|
235 |
// abort if execution limit is reached
|
236 |
-
$this->cron_helper->enforceExecutionLimit($
|
237 |
|
238 |
ScheduledTaskSubscriber::createOrUpdate([
|
239 |
'task_id' => $task_id,
|
@@ -246,7 +242,7 @@ class Migration extends SimpleWorker {
|
|
246 |
return true;
|
247 |
}
|
248 |
|
249 |
-
|
250 |
if (is_null($wp)) {
|
251 |
$wp = new WPFunctions();
|
252 |
}
|
11 |
use MailPoet\Mailer\MailerLog;
|
12 |
use MailPoet\Models\ScheduledTask;
|
13 |
use MailPoet\Models\ScheduledTaskSubscriber;
|
14 |
+
use MailPoet\Models\SendingQueue as SendingQueueModel;
|
15 |
use MailPoet\WP\Functions as WPFunctions;
|
16 |
|
17 |
class Migration extends SimpleWorker {
|
20 |
|
21 |
function checkProcessingRequirements() {
|
22 |
// if migration was completed, don't run it again
|
23 |
+
$completed_tasks = $this->getCompletedTasks();
|
24 |
return empty($completed_tasks);
|
25 |
}
|
26 |
|
27 |
+
function prepareTaskStrategy(ScheduledTask $task, $timer) {
|
28 |
+
$unmigrated_columns = $this->checkUnmigratedColumnsExist();
|
29 |
$unmigrated_queues_count = 0;
|
30 |
$unmigrated_queue_subscribers = [];
|
31 |
|
46 |
|
47 |
// pause sending while the migration is in process
|
48 |
$this->pauseSending();
|
49 |
+
return true;
|
|
|
50 |
}
|
51 |
|
52 |
function pauseSending() {
|
76 |
}
|
77 |
}
|
78 |
|
79 |
+
function processTaskStrategy(ScheduledTask $task, $timer) {
|
80 |
+
$this->migrateSendingQueues($timer);
|
81 |
+
$this->migrateSubscribers($timer);
|
|
|
|
|
82 |
$this->resumeSending();
|
|
|
83 |
return true;
|
84 |
}
|
85 |
|
86 |
+
private function checkUnmigratedColumnsExist() {
|
87 |
global $wpdb;
|
88 |
+
$existing_columns = $wpdb->get_col('DESC ' . SendingQueueModel::$_table);
|
89 |
return in_array('type', $existing_columns);
|
90 |
}
|
91 |
|
92 |
function getUnmigratedQueues() {
|
93 |
+
return SendingQueueModel::where('task_id', 0)
|
94 |
->whereNull('type');
|
95 |
}
|
96 |
|
111 |
/*
|
112 |
* Migrate all sending queues without converting subscriber data
|
113 |
*/
|
114 |
+
function migrateSendingQueues($timer) {
|
115 |
global $wpdb;
|
116 |
|
117 |
$queues = $this->getUnmigratedQueues()
|
131 |
if (!empty($queues)) {
|
132 |
foreach (array_chunk($queues, self::BATCH_SIZE) as $queue_batch) {
|
133 |
// abort if execution limit is reached
|
134 |
+
$this->cron_helper->enforceExecutionLimit($timer);
|
135 |
|
136 |
foreach ($queue_batch as $queue) {
|
137 |
// create a new scheduled task of type "sending"
|
161 |
/*
|
162 |
* Migrate subscribers for in-progress sending tasks from the `subscribers` field to a separate table
|
163 |
*/
|
164 |
+
function migrateSubscribers($timer) {
|
165 |
global $wpdb;
|
166 |
|
167 |
// find in-progress queues that have serialized subscribers
|
180 |
if (!empty($task_ids)) {
|
181 |
foreach ($task_ids as $task_id) {
|
182 |
// abort if execution limit is reached
|
183 |
+
$this->cron_helper->enforceExecutionLimit($timer);
|
184 |
|
185 |
+
$this->migrateTaskSubscribers($task_id, $timer);
|
186 |
}
|
187 |
}
|
188 |
|
189 |
return true;
|
190 |
}
|
191 |
|
192 |
+
function migrateTaskSubscribers($task_id, $timer) {
|
193 |
global $wpdb;
|
194 |
|
195 |
$migrated_unprocessed_count = ScheduledTaskSubscriber::getUnprocessedCount($task_id);
|
215 |
$subscribers_to_migrate = array_slice($subscribers['to_process'], $migrated_unprocessed_count);
|
216 |
foreach ($subscribers_to_migrate as $sub_id) {
|
217 |
// abort if execution limit is reached
|
218 |
+
$this->cron_helper->enforceExecutionLimit($timer);
|
219 |
|
220 |
ScheduledTaskSubscriber::createOrUpdate([
|
221 |
'task_id' => $task_id,
|
229 |
$subscribers_to_migrate = array_slice($subscribers['processed'], $migrated_processed_count);
|
230 |
foreach ($subscribers_to_migrate as $sub_id) {
|
231 |
// abort if execution limit is reached
|
232 |
+
$this->cron_helper->enforceExecutionLimit($timer);
|
233 |
|
234 |
ScheduledTaskSubscriber::createOrUpdate([
|
235 |
'task_id' => $task_id,
|
242 |
return true;
|
243 |
}
|
244 |
|
245 |
+
function getNextRunDate($wp = null) {
|
246 |
if (is_null($wp)) {
|
247 |
$wp = new WPFunctions();
|
248 |
}
|
lib/Cron/Workers/SendingQueue/SendingQueue.php
CHANGED
@@ -28,7 +28,6 @@ use function MailPoet\Util\array_column;
|
|
28 |
class SendingQueue {
|
29 |
public $mailer_task;
|
30 |
public $newsletter_task;
|
31 |
-
public $timer;
|
32 |
public $batch_size;
|
33 |
const BATCH_SIZE = 20;
|
34 |
const TASK_BATCH_SIZE = 5;
|
@@ -57,7 +56,6 @@ class SendingQueue {
|
|
57 |
LoggerFactory $logger_factory,
|
58 |
NewslettersRepository $newsletters_repository,
|
59 |
CronHelper $cron_helper,
|
60 |
-
$timer = false,
|
61 |
$mailer_task = false,
|
62 |
$newsletter_task = false
|
63 |
) {
|
@@ -65,7 +63,6 @@ class SendingQueue {
|
|
65 |
$this->stats_notifications_scheduler = $stats_notifications_scheduler;
|
66 |
$this->mailer_task = ($mailer_task) ? $mailer_task : new MailerTask();
|
67 |
$this->newsletter_task = ($newsletter_task) ? $newsletter_task : new NewsletterTask();
|
68 |
-
$this->timer = ($timer) ? $timer : microtime(true);
|
69 |
$this->mailerMetaInfo = new MetaInfo;
|
70 |
$wp = new WPFunctions;
|
71 |
$this->batch_size = $wp->applyFilters('mailpoet_cron_worker_sending_queue_batch_size', self::BATCH_SIZE);
|
@@ -74,8 +71,9 @@ class SendingQueue {
|
|
74 |
$this->cron_helper = $cron_helper;
|
75 |
}
|
76 |
|
77 |
-
function process() {
|
78 |
-
$
|
|
|
79 |
foreach (self::getRunningQueues() as $queue) {
|
80 |
if (!$queue instanceof SendingTask) continue;
|
81 |
ScheduledTaskModel::touchAllByIds([$queue->task_id]);
|
@@ -150,7 +148,8 @@ class SendingQueue {
|
|
150 |
$queue = $this->processQueue(
|
151 |
$queue,
|
152 |
$_newsletter,
|
153 |
-
$found_subscribers
|
|
|
154 |
);
|
155 |
$this->logger_factory->getLogger(LoggerFactory::TOPIC_NEWSLETTERS)->addInfo(
|
156 |
'after queue chunk processing',
|
@@ -164,12 +163,12 @@ class SendingQueue {
|
|
164 |
$this->newsletter_task->markNewsletterAsSent($newsletter, $queue);
|
165 |
$this->stats_notifications_scheduler->schedule($this->newsletters_repository->findOneById($newsletter->id));
|
166 |
}
|
167 |
-
$this->enforceSendingAndExecutionLimits();
|
168 |
}
|
169 |
}
|
170 |
}
|
171 |
|
172 |
-
function processQueue($queue, $newsletter, $subscribers) {
|
173 |
// determine if processing is done in bulk or individually
|
174 |
$processing_method = $this->mailer_task->getProcessingMethod();
|
175 |
$prepared_newsletters = [];
|
@@ -207,6 +206,7 @@ class SendingQueue {
|
|
207 |
$prepared_newsletters[0],
|
208 |
$prepared_subscribers[0],
|
209 |
$statistics[0],
|
|
|
210 |
['unsubscribe_url' => $unsubscribe_urls[0], 'meta' => $metas[0]]
|
211 |
);
|
212 |
$prepared_newsletters = [];
|
@@ -223,6 +223,7 @@ class SendingQueue {
|
|
223 |
$prepared_newsletters,
|
224 |
$prepared_subscribers,
|
225 |
$statistics,
|
|
|
226 |
['unsubscribe_url' => $unsubscribe_urls, 'meta' => $metas]
|
227 |
);
|
228 |
}
|
@@ -231,7 +232,7 @@ class SendingQueue {
|
|
231 |
|
232 |
function sendNewsletter(
|
233 |
SendingTask $sending_task, $prepared_subscriber_id, $prepared_newsletter,
|
234 |
-
$prepared_subscriber, $statistics, $extra_params = []
|
235 |
) {
|
236 |
// send newsletter
|
237 |
$send_result = $this->mailer_task->send(
|
@@ -244,13 +245,14 @@ class SendingQueue {
|
|
244 |
$send_result,
|
245 |
[$prepared_subscriber],
|
246 |
[$prepared_subscriber_id],
|
247 |
-
[$statistics]
|
|
|
248 |
);
|
249 |
}
|
250 |
|
251 |
function sendNewsletters(
|
252 |
SendingTask $sending_task, $prepared_subscribers_ids, $prepared_newsletters,
|
253 |
-
$prepared_subscribers, $statistics, $extra_params = []
|
254 |
) {
|
255 |
// send newsletters
|
256 |
$send_result = $this->mailer_task->sendBulk(
|
@@ -263,7 +265,8 @@ class SendingQueue {
|
|
263 |
$send_result,
|
264 |
$prepared_subscribers,
|
265 |
$prepared_subscribers_ids,
|
266 |
-
$statistics
|
|
|
267 |
);
|
268 |
}
|
269 |
|
@@ -272,7 +275,8 @@ class SendingQueue {
|
|
272 |
$send_result,
|
273 |
array $prepared_subscribers,
|
274 |
array $prepared_subscribers_ids,
|
275 |
-
array $statistics
|
|
|
276 |
) {
|
277 |
// log error message and schedule retry/pause sending
|
278 |
if ($send_result['response'] === false) {
|
@@ -295,14 +299,14 @@ class SendingQueue {
|
|
295 |
$this->mailer_task->updateSentCount();
|
296 |
// enforce execution limits if queue is still being processed
|
297 |
if ($sending_task->status !== ScheduledTaskModel::STATUS_COMPLETED) {
|
298 |
-
$this->enforceSendingAndExecutionLimits();
|
299 |
}
|
300 |
return $sending_task;
|
301 |
}
|
302 |
|
303 |
-
function enforceSendingAndExecutionLimits() {
|
304 |
// abort if execution limit is reached
|
305 |
-
$this->cron_helper->enforceExecutionLimit($
|
306 |
// abort if sending limit has been reached
|
307 |
MailerLog::enforceExecutionRequirements();
|
308 |
}
|
28 |
class SendingQueue {
|
29 |
public $mailer_task;
|
30 |
public $newsletter_task;
|
|
|
31 |
public $batch_size;
|
32 |
const BATCH_SIZE = 20;
|
33 |
const TASK_BATCH_SIZE = 5;
|
56 |
LoggerFactory $logger_factory,
|
57 |
NewslettersRepository $newsletters_repository,
|
58 |
CronHelper $cron_helper,
|
|
|
59 |
$mailer_task = false,
|
60 |
$newsletter_task = false
|
61 |
) {
|
63 |
$this->stats_notifications_scheduler = $stats_notifications_scheduler;
|
64 |
$this->mailer_task = ($mailer_task) ? $mailer_task : new MailerTask();
|
65 |
$this->newsletter_task = ($newsletter_task) ? $newsletter_task : new NewsletterTask();
|
|
|
66 |
$this->mailerMetaInfo = new MetaInfo;
|
67 |
$wp = new WPFunctions;
|
68 |
$this->batch_size = $wp->applyFilters('mailpoet_cron_worker_sending_queue_batch_size', self::BATCH_SIZE);
|
71 |
$this->cron_helper = $cron_helper;
|
72 |
}
|
73 |
|
74 |
+
function process($timer = false) {
|
75 |
+
$timer = $timer ?: microtime(true);
|
76 |
+
$this->enforceSendingAndExecutionLimits($timer);
|
77 |
foreach (self::getRunningQueues() as $queue) {
|
78 |
if (!$queue instanceof SendingTask) continue;
|
79 |
ScheduledTaskModel::touchAllByIds([$queue->task_id]);
|
148 |
$queue = $this->processQueue(
|
149 |
$queue,
|
150 |
$_newsletter,
|
151 |
+
$found_subscribers,
|
152 |
+
$timer
|
153 |
);
|
154 |
$this->logger_factory->getLogger(LoggerFactory::TOPIC_NEWSLETTERS)->addInfo(
|
155 |
'after queue chunk processing',
|
163 |
$this->newsletter_task->markNewsletterAsSent($newsletter, $queue);
|
164 |
$this->stats_notifications_scheduler->schedule($this->newsletters_repository->findOneById($newsletter->id));
|
165 |
}
|
166 |
+
$this->enforceSendingAndExecutionLimits($timer);
|
167 |
}
|
168 |
}
|
169 |
}
|
170 |
|
171 |
+
function processQueue($queue, $newsletter, $subscribers, $timer) {
|
172 |
// determine if processing is done in bulk or individually
|
173 |
$processing_method = $this->mailer_task->getProcessingMethod();
|
174 |
$prepared_newsletters = [];
|
206 |
$prepared_newsletters[0],
|
207 |
$prepared_subscribers[0],
|
208 |
$statistics[0],
|
209 |
+
$timer,
|
210 |
['unsubscribe_url' => $unsubscribe_urls[0], 'meta' => $metas[0]]
|
211 |
);
|
212 |
$prepared_newsletters = [];
|
223 |
$prepared_newsletters,
|
224 |
$prepared_subscribers,
|
225 |
$statistics,
|
226 |
+
$timer,
|
227 |
['unsubscribe_url' => $unsubscribe_urls, 'meta' => $metas]
|
228 |
);
|
229 |
}
|
232 |
|
233 |
function sendNewsletter(
|
234 |
SendingTask $sending_task, $prepared_subscriber_id, $prepared_newsletter,
|
235 |
+
$prepared_subscriber, $statistics, $timer, $extra_params = []
|
236 |
) {
|
237 |
// send newsletter
|
238 |
$send_result = $this->mailer_task->send(
|
245 |
$send_result,
|
246 |
[$prepared_subscriber],
|
247 |
[$prepared_subscriber_id],
|
248 |
+
[$statistics],
|
249 |
+
$timer
|
250 |
);
|
251 |
}
|
252 |
|
253 |
function sendNewsletters(
|
254 |
SendingTask $sending_task, $prepared_subscribers_ids, $prepared_newsletters,
|
255 |
+
$prepared_subscribers, $statistics, $timer, $extra_params = []
|
256 |
) {
|
257 |
// send newsletters
|
258 |
$send_result = $this->mailer_task->sendBulk(
|
265 |
$send_result,
|
266 |
$prepared_subscribers,
|
267 |
$prepared_subscribers_ids,
|
268 |
+
$statistics,
|
269 |
+
$timer
|
270 |
);
|
271 |
}
|
272 |
|
275 |
$send_result,
|
276 |
array $prepared_subscribers,
|
277 |
array $prepared_subscribers_ids,
|
278 |
+
array $statistics,
|
279 |
+
$timer
|
280 |
) {
|
281 |
// log error message and schedule retry/pause sending
|
282 |
if ($send_result['response'] === false) {
|
299 |
$this->mailer_task->updateSentCount();
|
300 |
// enforce execution limits if queue is still being processed
|
301 |
if ($sending_task->status !== ScheduledTaskModel::STATUS_COMPLETED) {
|
302 |
+
$this->enforceSendingAndExecutionLimits($timer);
|
303 |
}
|
304 |
return $sending_task;
|
305 |
}
|
306 |
|
307 |
+
function enforceSendingAndExecutionLimits($timer) {
|
308 |
// abort if execution limit is reached
|
309 |
+
$this->cron_helper->enforceExecutionLimit($timer);
|
310 |
// abort if sending limit has been reached
|
311 |
MailerLog::enforceExecutionRequirements();
|
312 |
}
|
lib/Cron/Workers/SimpleWorker.php
CHANGED
@@ -7,12 +7,12 @@ if (!defined('ABSPATH')) exit;
|
|
7 |
|
8 |
use Carbon\Carbon;
|
9 |
use MailPoet\Cron\CronHelper;
|
|
|
10 |
use MailPoet\DI\ContainerWrapper;
|
11 |
use MailPoet\Models\ScheduledTask;
|
12 |
use MailPoet\WP\Functions as WPFunctions;
|
13 |
|
14 |
abstract class SimpleWorker {
|
15 |
-
public $timer;
|
16 |
private $wp;
|
17 |
const TASK_TYPE = null;
|
18 |
const TASK_BATCH_SIZE = 5;
|
@@ -25,15 +25,17 @@ abstract class SimpleWorker {
|
|
25 |
/** @var CronHelper */
|
26 |
protected $cron_helper;
|
27 |
|
28 |
-
|
|
|
|
|
|
|
29 |
if (static::TASK_TYPE === null) {
|
30 |
throw new \Exception('Constant TASK_TYPE is not defined on subclass ' . get_class($this));
|
31 |
}
|
32 |
-
|
33 |
-
// abort if execution limit is reached
|
34 |
-
$this->cron_helper = ContainerWrapper::getInstance()->get(CronHelper::class);
|
35 |
-
$this->cron_helper->enforceExecutionLimit($this->timer);
|
36 |
$this->wp = new WPFunctions();
|
|
|
|
|
37 |
}
|
38 |
|
39 |
function checkProcessingRequirements() {
|
@@ -43,19 +45,27 @@ abstract class SimpleWorker {
|
|
43 |
function init() {
|
44 |
}
|
45 |
|
46 |
-
function process() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
if (!$this->checkProcessingRequirements()) {
|
|
|
|
|
|
|
48 |
return false;
|
49 |
}
|
50 |
|
51 |
$this->init();
|
52 |
|
53 |
-
$scheduled_tasks = self::getScheduledTasks();
|
54 |
-
$running_tasks = self::getRunningTasks();
|
55 |
|
56 |
if (!$scheduled_tasks && !$running_tasks) {
|
57 |
if (static::AUTOMATIC_SCHEDULING) {
|
58 |
-
|
59 |
}
|
60 |
return false;
|
61 |
}
|
@@ -63,10 +73,10 @@ abstract class SimpleWorker {
|
|
63 |
$task = null;
|
64 |
try {
|
65 |
foreach ($scheduled_tasks as $i => $task) {
|
66 |
-
$this->prepareTask($task);
|
67 |
}
|
68 |
foreach ($running_tasks as $i => $task) {
|
69 |
-
$this->processTask($task);
|
70 |
}
|
71 |
} catch (\Exception $e) {
|
72 |
if ($task && $e->getCode() !== CronHelper::DAEMON_EXECUTION_LIMIT_REACHED) {
|
@@ -78,36 +88,24 @@ abstract class SimpleWorker {
|
|
78 |
return true;
|
79 |
}
|
80 |
|
81 |
-
|
82 |
-
$
|
83 |
-
->whereNull('deleted_at')
|
84 |
-
->where('status', ScheduledTask::STATUS_SCHEDULED)
|
85 |
-
->findMany();
|
86 |
-
if ($already_scheduled) {
|
87 |
-
return false;
|
88 |
-
}
|
89 |
-
$task = ScheduledTask::create();
|
90 |
-
$task->type = static::TASK_TYPE;
|
91 |
-
$task->status = ScheduledTask::STATUS_SCHEDULED;
|
92 |
-
$task->priority = ScheduledTask::PRIORITY_LOW;
|
93 |
-
$task->scheduled_at = static::getNextRunDate();
|
94 |
-
$task->save();
|
95 |
-
return $task;
|
96 |
}
|
97 |
|
98 |
-
function prepareTask(ScheduledTask $task) {
|
99 |
-
$task->status = null;
|
100 |
-
$task->save();
|
101 |
-
|
102 |
// abort if execution limit is reached
|
103 |
-
$this->cron_helper->enforceExecutionLimit($
|
104 |
|
105 |
-
|
|
|
|
|
|
|
|
|
106 |
}
|
107 |
|
108 |
-
function processTask(ScheduledTask $task) {
|
109 |
// abort if execution limit is reached
|
110 |
-
$this->cron_helper->enforceExecutionLimit($
|
111 |
|
112 |
if (!static::SUPPORT_MULTIPLE_INSTANCES) {
|
113 |
if ($this->rescheduleOutdated($task)) {
|
@@ -121,7 +119,7 @@ abstract class SimpleWorker {
|
|
121 |
$this->startProgress($task);
|
122 |
|
123 |
try {
|
124 |
-
$completed = $this->processTaskStrategy($task);
|
125 |
} catch (\Exception $e) {
|
126 |
$this->stopProgress($task);
|
127 |
throw $e;
|
@@ -136,7 +134,11 @@ abstract class SimpleWorker {
|
|
136 |
return (bool)$completed;
|
137 |
}
|
138 |
|
139 |
-
function
|
|
|
|
|
|
|
|
|
140 |
return true;
|
141 |
}
|
142 |
|
@@ -147,11 +149,7 @@ abstract class SimpleWorker {
|
|
147 |
}
|
148 |
|
149 |
function reschedule(ScheduledTask $task, $timeout) {
|
150 |
-
$
|
151 |
-
$task->scheduled_at = $scheduled_at->addMinutes($timeout);
|
152 |
-
$task->setExpr('updated_at', 'NOW()');
|
153 |
-
$task->status = ScheduledTask::STATUS_SCHEDULED;
|
154 |
-
$task->save();
|
155 |
}
|
156 |
|
157 |
private function isInProgress(ScheduledTask $task) {
|
@@ -186,7 +184,7 @@ abstract class SimpleWorker {
|
|
186 |
return false;
|
187 |
}
|
188 |
|
189 |
-
|
190 |
$wp = new WPFunctions();
|
191 |
$date = Carbon::createFromTimestamp($wp->currentTime('timestamp'));
|
192 |
// Random day of the next week
|
@@ -195,42 +193,15 @@ abstract class SimpleWorker {
|
|
195 |
return $date;
|
196 |
}
|
197 |
|
198 |
-
|
199 |
-
|
200 |
-
* @return ScheduledTask[]
|
201 |
-
*/
|
202 |
-
static function getScheduledTasks($future = false) {
|
203 |
-
$dateWhere = ($future) ? 'whereGt' : 'whereLte';
|
204 |
-
$wp = new WPFunctions();
|
205 |
-
return ScheduledTask::where('type', static::TASK_TYPE)
|
206 |
-
->$dateWhere('scheduled_at', Carbon::createFromTimestamp($wp->currentTime('timestamp')))
|
207 |
-
->whereNull('deleted_at')
|
208 |
-
->where('status', ScheduledTask::STATUS_SCHEDULED)
|
209 |
-
->limit(self::TASK_BATCH_SIZE)
|
210 |
-
->findMany();
|
211 |
}
|
212 |
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
->limit(self::TASK_BATCH_SIZE)
|
220 |
-
->findMany();
|
221 |
-
}
|
222 |
-
|
223 |
-
static function getDueTasks() {
|
224 |
-
$scheduled_tasks = self::getScheduledTasks();
|
225 |
-
$running_tasks = self::getRunningTasks();
|
226 |
-
return array_merge((array)$scheduled_tasks, (array)$running_tasks);
|
227 |
-
}
|
228 |
-
|
229 |
-
static function getCompletedTasks() {
|
230 |
-
return ScheduledTask::where('type', static::TASK_TYPE)
|
231 |
-
->whereNull('deleted_at')
|
232 |
-
->where('status', ScheduledTask::STATUS_COMPLETED)
|
233 |
-
->limit(self::TASK_BATCH_SIZE)
|
234 |
-
->findMany();
|
235 |
}
|
236 |
}
|
7 |
|
8 |
use Carbon\Carbon;
|
9 |
use MailPoet\Cron\CronHelper;
|
10 |
+
use MailPoet\Cron\CronWorkerScheduler;
|
11 |
use MailPoet\DI\ContainerWrapper;
|
12 |
use MailPoet\Models\ScheduledTask;
|
13 |
use MailPoet\WP\Functions as WPFunctions;
|
14 |
|
15 |
abstract class SimpleWorker {
|
|
|
16 |
private $wp;
|
17 |
const TASK_TYPE = null;
|
18 |
const TASK_BATCH_SIZE = 5;
|
25 |
/** @var CronHelper */
|
26 |
protected $cron_helper;
|
27 |
|
28 |
+
/** @var CronWorkerScheduler */
|
29 |
+
protected $cron_worker_scheduler;
|
30 |
+
|
31 |
+
function __construct() {
|
32 |
if (static::TASK_TYPE === null) {
|
33 |
throw new \Exception('Constant TASK_TYPE is not defined on subclass ' . get_class($this));
|
34 |
}
|
35 |
+
|
|
|
|
|
|
|
36 |
$this->wp = new WPFunctions();
|
37 |
+
$this->cron_helper = ContainerWrapper::getInstance()->get(CronHelper::class);
|
38 |
+
$this->cron_worker_scheduler = ContainerWrapper::getInstance()->get(CronWorkerScheduler::class);
|
39 |
}
|
40 |
|
41 |
function checkProcessingRequirements() {
|
45 |
function init() {
|
46 |
}
|
47 |
|
48 |
+
function process($timer = false) {
|
49 |
+
$timer = $timer ?: microtime(true);
|
50 |
+
|
51 |
+
// abort if execution limit is reached
|
52 |
+
$this->cron_helper->enforceExecutionLimit($timer);
|
53 |
+
$scheduled_tasks = $this->getDueTasks();
|
54 |
+
$running_tasks = $this->getRunningTasks();
|
55 |
+
|
56 |
if (!$this->checkProcessingRequirements()) {
|
57 |
+
foreach (array_merge($scheduled_tasks, $running_tasks) as $task) {
|
58 |
+
$task->delete();
|
59 |
+
}
|
60 |
return false;
|
61 |
}
|
62 |
|
63 |
$this->init();
|
64 |
|
|
|
|
|
65 |
|
66 |
if (!$scheduled_tasks && !$running_tasks) {
|
67 |
if (static::AUTOMATIC_SCHEDULING) {
|
68 |
+
$this->schedule();
|
69 |
}
|
70 |
return false;
|
71 |
}
|
73 |
$task = null;
|
74 |
try {
|
75 |
foreach ($scheduled_tasks as $i => $task) {
|
76 |
+
$this->prepareTask($task, $timer);
|
77 |
}
|
78 |
foreach ($running_tasks as $i => $task) {
|
79 |
+
$this->processTask($task, $timer);
|
80 |
}
|
81 |
} catch (\Exception $e) {
|
82 |
if ($task && $e->getCode() !== CronHelper::DAEMON_EXECUTION_LIMIT_REACHED) {
|
88 |
return true;
|
89 |
}
|
90 |
|
91 |
+
function schedule() {
|
92 |
+
$this->cron_worker_scheduler->schedule(static::TASK_TYPE, static::getNextRunDate());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
93 |
}
|
94 |
|
95 |
+
function prepareTask(ScheduledTask $task, $timer) {
|
|
|
|
|
|
|
96 |
// abort if execution limit is reached
|
97 |
+
$this->cron_helper->enforceExecutionLimit($timer);
|
98 |
|
99 |
+
$prepare_completed = $this->prepareTaskStrategy($task, $timer);
|
100 |
+
if ($prepare_completed) {
|
101 |
+
$task->status = null;
|
102 |
+
$task->save();
|
103 |
+
}
|
104 |
}
|
105 |
|
106 |
+
function processTask(ScheduledTask $task, $timer) {
|
107 |
// abort if execution limit is reached
|
108 |
+
$this->cron_helper->enforceExecutionLimit($timer);
|
109 |
|
110 |
if (!static::SUPPORT_MULTIPLE_INSTANCES) {
|
111 |
if ($this->rescheduleOutdated($task)) {
|
119 |
$this->startProgress($task);
|
120 |
|
121 |
try {
|
122 |
+
$completed = $this->processTaskStrategy($task, $timer);
|
123 |
} catch (\Exception $e) {
|
124 |
$this->stopProgress($task);
|
125 |
throw $e;
|
134 |
return (bool)$completed;
|
135 |
}
|
136 |
|
137 |
+
function prepareTaskStrategy(ScheduledTask $task, $timer) {
|
138 |
+
return true;
|
139 |
+
}
|
140 |
+
|
141 |
+
function processTaskStrategy(ScheduledTask $task, $timer) {
|
142 |
return true;
|
143 |
}
|
144 |
|
149 |
}
|
150 |
|
151 |
function reschedule(ScheduledTask $task, $timeout) {
|
152 |
+
$this->cron_worker_scheduler->reschedule($task, $timeout);
|
|
|
|
|
|
|
|
|
153 |
}
|
154 |
|
155 |
private function isInProgress(ScheduledTask $task) {
|
184 |
return false;
|
185 |
}
|
186 |
|
187 |
+
function getNextRunDate() {
|
188 |
$wp = new WPFunctions();
|
189 |
$date = Carbon::createFromTimestamp($wp->currentTime('timestamp'));
|
190 |
// Random day of the next week
|
193 |
return $date;
|
194 |
}
|
195 |
|
196 |
+
function getDueTasks() {
|
197 |
+
return ScheduledTask::findDueByType(static::TASK_TYPE, self::TASK_BATCH_SIZE);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
198 |
}
|
199 |
|
200 |
+
function getRunningTasks() {
|
201 |
+
return ScheduledTask::findRunningByType(static::TASK_TYPE, self::TASK_BATCH_SIZE);
|
202 |
+
}
|
203 |
+
|
204 |
+
function getCompletedTasks() {
|
205 |
+
return ScheduledTask::findCompletedByType(static::TASK_TYPE, self::TASK_BATCH_SIZE);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
206 |
}
|
207 |
}
|
lib/Cron/Workers/StatsNotifications/AutomatedEmails.php
CHANGED
@@ -34,9 +34,6 @@ class AutomatedEmails extends SimpleWorker {
|
|
34 |
/** @var MetaInfo */
|
35 |
private $mailerMetaInfo;
|
36 |
|
37 |
-
/** @var float */
|
38 |
-
public $timer;
|
39 |
-
|
40 |
/** @var NewslettersRepository */
|
41 |
private $repository;
|
42 |
|
@@ -49,15 +46,13 @@ class AutomatedEmails extends SimpleWorker {
|
|
49 |
SettingsController $settings,
|
50 |
NewslettersRepository $repository,
|
51 |
NewsletterStatisticsRepository $newsletter_statistics_repository,
|
52 |
-
MetaInfo $mailerMetaInfo
|
53 |
-
$timer = false
|
54 |
) {
|
55 |
-
parent::__construct(
|
56 |
$this->mailer = $mailer;
|
57 |
$this->settings = $settings;
|
58 |
$this->renderer = $renderer;
|
59 |
$this->mailerMetaInfo = $mailerMetaInfo;
|
60 |
-
$this->timer = $timer ?: microtime(true);
|
61 |
$this->repository = $repository;
|
62 |
$this->newsletter_statistics_repository = $newsletter_statistics_repository;
|
63 |
}
|
@@ -82,7 +77,7 @@ class AutomatedEmails extends SimpleWorker {
|
|
82 |
return (bool)$settings['automated'];
|
83 |
}
|
84 |
|
85 |
-
function processTaskStrategy(ScheduledTask $task) {
|
86 |
try {
|
87 |
$settings = $this->settings->get(Worker::SETTINGS_KEY);
|
88 |
$newsletters = $this->getNewsletters();
|
@@ -155,7 +150,7 @@ class AutomatedEmails extends SimpleWorker {
|
|
155 |
return $context;
|
156 |
}
|
157 |
|
158 |
-
|
159 |
$wp = new WPFunctions;
|
160 |
$date = Carbon::createFromTimestamp($wp->currentTime('timestamp'));
|
161 |
return $date->endOfMonth()->next(Carbon::MONDAY)->midDay();
|
34 |
/** @var MetaInfo */
|
35 |
private $mailerMetaInfo;
|
36 |
|
|
|
|
|
|
|
37 |
/** @var NewslettersRepository */
|
38 |
private $repository;
|
39 |
|
46 |
SettingsController $settings,
|
47 |
NewslettersRepository $repository,
|
48 |
NewsletterStatisticsRepository $newsletter_statistics_repository,
|
49 |
+
MetaInfo $mailerMetaInfo
|
|
|
50 |
) {
|
51 |
+
parent::__construct();
|
52 |
$this->mailer = $mailer;
|
53 |
$this->settings = $settings;
|
54 |
$this->renderer = $renderer;
|
55 |
$this->mailerMetaInfo = $mailerMetaInfo;
|
|
|
56 |
$this->repository = $repository;
|
57 |
$this->newsletter_statistics_repository = $newsletter_statistics_repository;
|
58 |
}
|
77 |
return (bool)$settings['automated'];
|
78 |
}
|
79 |
|
80 |
+
function processTaskStrategy(ScheduledTask $task, $timer) {
|
81 |
try {
|
82 |
$settings = $this->settings->get(Worker::SETTINGS_KEY);
|
83 |
$newsletters = $this->getNewsletters();
|
150 |
return $context;
|
151 |
}
|
152 |
|
153 |
+
function getNextRunDate() {
|
154 |
$wp = new WPFunctions;
|
155 |
$date = Carbon::createFromTimestamp($wp->currentTime('timestamp'));
|
156 |
return $date->endOfMonth()->next(Carbon::MONDAY)->midDay();
|
lib/Cron/Workers/StatsNotifications/Worker.php
CHANGED
@@ -27,9 +27,6 @@ class Worker {
|
|
27 |
const TASK_TYPE = 'stats_notification';
|
28 |
const SETTINGS_KEY = 'stats_notifications';
|
29 |
|
30 |
-
/** @var float */
|
31 |
-
public $timer;
|
32 |
-
|
33 |
/** @var Renderer */
|
34 |
private $renderer;
|
35 |
|
@@ -66,10 +63,8 @@ class Worker {
|
|
66 |
StatsNotificationsRepository $repository,
|
67 |
NewsletterLinkRepository $newsletter_link_repository,
|
68 |
NewsletterStatisticsRepository $newsletter_statistics_repository,
|
69 |
-
EntityManager $entity_manager
|
70 |
-
$timer = false
|
71 |
) {
|
72 |
-
$this->timer = $timer ?: microtime(true);
|
73 |
$this->renderer = $renderer;
|
74 |
$this->mailer = $mailer;
|
75 |
$this->settings = $settings;
|
@@ -82,7 +77,8 @@ class Worker {
|
|
82 |
}
|
83 |
|
84 |
/** @throws \Exception */
|
85 |
-
function process() {
|
|
|
86 |
$settings = $this->settings->get(self::SETTINGS_KEY);
|
87 |
foreach ($this->repository->findScheduled(Sending::RESULT_BATCH_SIZE) as $stats_notification_entity) {
|
88 |
try {
|
@@ -97,13 +93,13 @@ class Worker {
|
|
97 |
} finally {
|
98 |
$this->markTaskAsFinished($stats_notification_entity->getTask());
|
99 |
}
|
100 |
-
$this->cron_helper->enforceExecutionLimit($
|
101 |
}
|
102 |
}
|
103 |
|
104 |
private function constructNewsletter(StatsNotificationEntity $stats_notification_entity) {
|
105 |
$newsletter = $stats_notification_entity->getNewsletter();
|
106 |
-
$link = $this->newsletter_link_repository->findTopLinkForNewsletter($newsletter->getId());
|
107 |
$context = $this->prepareContext($newsletter, $link);
|
108 |
$subject = $newsletter->getLatestQueue()->getNewsletterRenderedSubject();
|
109 |
return [
|
27 |
const TASK_TYPE = 'stats_notification';
|
28 |
const SETTINGS_KEY = 'stats_notifications';
|
29 |
|
|
|
|
|
|
|
30 |
/** @var Renderer */
|
31 |
private $renderer;
|
32 |
|
63 |
StatsNotificationsRepository $repository,
|
64 |
NewsletterLinkRepository $newsletter_link_repository,
|
65 |
NewsletterStatisticsRepository $newsletter_statistics_repository,
|
66 |
+
EntityManager $entity_manager
|
|
|
67 |
) {
|
|
|
68 |
$this->renderer = $renderer;
|
69 |
$this->mailer = $mailer;
|
70 |
$this->settings = $settings;
|
77 |
}
|
78 |
|
79 |
/** @throws \Exception */
|
80 |
+
function process($timer = false) {
|
81 |
+
$timer = $timer ?: microtime(true);
|
82 |
$settings = $this->settings->get(self::SETTINGS_KEY);
|
83 |
foreach ($this->repository->findScheduled(Sending::RESULT_BATCH_SIZE) as $stats_notification_entity) {
|
84 |
try {
|
93 |
} finally {
|
94 |
$this->markTaskAsFinished($stats_notification_entity->getTask());
|
95 |
}
|
96 |
+
$this->cron_helper->enforceExecutionLimit($timer);
|
97 |
}
|
98 |
}
|
99 |
|
100 |
private function constructNewsletter(StatsNotificationEntity $stats_notification_entity) {
|
101 |
$newsletter = $stats_notification_entity->getNewsletter();
|
102 |
+
$link = $this->newsletter_link_repository->findTopLinkForNewsletter((int)$newsletter->getId());
|
103 |
$context = $this->prepareContext($newsletter, $link);
|
104 |
$subject = $newsletter->getLatestQueue()->getNewsletterRenderedSubject();
|
105 |
return [
|
lib/Cron/Workers/SubscriberLinkTokens.php
CHANGED
@@ -17,7 +17,7 @@ class SubscriberLinkTokens extends SimpleWorker {
|
|
17 |
const BATCH_SIZE = 10000;
|
18 |
const AUTOMATIC_SCHEDULING = false;
|
19 |
|
20 |
-
function processTaskStrategy(ScheduledTask $task) {
|
21 |
$count = Subscriber::whereNull('link_token')->count();
|
22 |
if ($count) {
|
23 |
$auth_key = defined('AUTH_KEY') ? AUTH_KEY : '';
|
@@ -25,12 +25,12 @@ class SubscriberLinkTokens extends SimpleWorker {
|
|
25 |
sprintf('UPDATE %s SET link_token = SUBSTRING(MD5(CONCAT(?, email)), 1, ?) WHERE link_token IS NULL LIMIT ?', Subscriber::$_table),
|
26 |
[$auth_key, Subscriber::OBSOLETE_LINK_TOKEN_LENGTH, self::BATCH_SIZE]
|
27 |
);
|
28 |
-
|
29 |
}
|
30 |
return true;
|
31 |
}
|
32 |
|
33 |
-
|
34 |
$wp = new WPFunctions();
|
35 |
return Carbon::createFromTimestamp($wp->currentTime('timestamp'));
|
36 |
}
|
17 |
const BATCH_SIZE = 10000;
|
18 |
const AUTOMATIC_SCHEDULING = false;
|
19 |
|
20 |
+
function processTaskStrategy(ScheduledTask $task, $timer) {
|
21 |
$count = Subscriber::whereNull('link_token')->count();
|
22 |
if ($count) {
|
23 |
$auth_key = defined('AUTH_KEY') ? AUTH_KEY : '';
|
25 |
sprintf('UPDATE %s SET link_token = SUBSTRING(MD5(CONCAT(?, email)), 1, ?) WHERE link_token IS NULL LIMIT ?', Subscriber::$_table),
|
26 |
[$auth_key, Subscriber::OBSOLETE_LINK_TOKEN_LENGTH, self::BATCH_SIZE]
|
27 |
);
|
28 |
+
$this->schedule();
|
29 |
}
|
30 |
return true;
|
31 |
}
|
32 |
|
33 |
+
function getNextRunDate() {
|
34 |
$wp = new WPFunctions();
|
35 |
return Carbon::createFromTimestamp($wp->currentTime('timestamp'));
|
36 |
}
|
lib/Cron/Workers/UnsubscribeTokens.php
CHANGED
@@ -18,16 +18,16 @@ class UnsubscribeTokens extends SimpleWorker {
|
|
18 |
const BATCH_SIZE = 1000;
|
19 |
const AUTOMATIC_SCHEDULING = false;
|
20 |
|
21 |
-
function processTaskStrategy(ScheduledTask $task) {
|
22 |
$meta = $task->getMeta();
|
23 |
do {
|
24 |
-
$this->cron_helper->enforceExecutionLimit($
|
25 |
$subscribers_count = $this->addTokens(Subscriber::class, $meta['last_subscriber_id']);
|
26 |
$task->meta = $meta;
|
27 |
$task->save();
|
28 |
} while ($subscribers_count === self::BATCH_SIZE);
|
29 |
do {
|
30 |
-
$this->cron_helper->enforceExecutionLimit($
|
31 |
$newsletters_count = $this->addTokens(Newsletter::class, $meta['last_newsletter_id']);
|
32 |
$task->meta = $meta;
|
33 |
$task->save();
|
@@ -52,7 +52,7 @@ class UnsubscribeTokens extends SimpleWorker {
|
|
52 |
return count($instances);
|
53 |
}
|
54 |
|
55 |
-
|
56 |
$wp = new WPFunctions;
|
57 |
return Carbon::createFromTimestamp($wp->currentTime('timestamp'));
|
58 |
}
|
18 |
const BATCH_SIZE = 1000;
|
19 |
const AUTOMATIC_SCHEDULING = false;
|
20 |
|
21 |
+
function processTaskStrategy(ScheduledTask $task, $timer) {
|
22 |
$meta = $task->getMeta();
|
23 |
do {
|
24 |
+
$this->cron_helper->enforceExecutionLimit($timer);
|
25 |
$subscribers_count = $this->addTokens(Subscriber::class, $meta['last_subscriber_id']);
|
26 |
$task->meta = $meta;
|
27 |
$task->save();
|
28 |
} while ($subscribers_count === self::BATCH_SIZE);
|
29 |
do {
|
30 |
+
$this->cron_helper->enforceExecutionLimit($timer);
|
31 |
$newsletters_count = $this->addTokens(Newsletter::class, $meta['last_newsletter_id']);
|
32 |
$task->meta = $meta;
|
33 |
$task->save();
|
52 |
return count($instances);
|
53 |
}
|
54 |
|
55 |
+
function getNextRunDate() {
|
56 |
$wp = new WPFunctions;
|
57 |
return Carbon::createFromTimestamp($wp->currentTime('timestamp'));
|
58 |
}
|
lib/Cron/Workers/WooCommercePastOrders.php
CHANGED
@@ -25,21 +25,20 @@ class WooCommercePastOrders extends SimpleWorker {
|
|
25 |
|
26 |
function __construct(
|
27 |
WCHelper $woocommerce_helper,
|
28 |
-
WooCommercePurchases $woocommerce_purchases
|
29 |
-
$timer = false
|
30 |
) {
|
31 |
$this->woocommerce_helper = $woocommerce_helper;
|
32 |
$this->woocommerce_purchases = $woocommerce_purchases;
|
33 |
-
parent::__construct(
|
34 |
}
|
35 |
|
36 |
function checkProcessingRequirements() {
|
37 |
-
return $this->woocommerce_helper->isWooCommerceActive() && empty(
|
38 |
}
|
39 |
|
40 |
-
function processTaskStrategy(ScheduledTask $task) {
|
41 |
$oldest_click = StatisticsClicks::orderByAsc('created_at')->limit(1)->findOne();
|
42 |
-
if (!$oldest_click) {
|
43 |
return true;
|
44 |
}
|
45 |
|
@@ -74,7 +73,7 @@ class WooCommercePastOrders extends SimpleWorker {
|
|
74 |
return false;
|
75 |
}
|
76 |
|
77 |
-
|
78 |
return Carbon::createFromTimestamp(WPFunctions::get()->currentTime('timestamp')); // schedule immediately
|
79 |
}
|
80 |
}
|
25 |
|
26 |
function __construct(
|
27 |
WCHelper $woocommerce_helper,
|
28 |
+
WooCommercePurchases $woocommerce_purchases
|
|
|
29 |
) {
|
30 |
$this->woocommerce_helper = $woocommerce_helper;
|
31 |
$this->woocommerce_purchases = $woocommerce_purchases;
|
32 |
+
parent::__construct();
|
33 |
}
|
34 |
|
35 |
function checkProcessingRequirements() {
|
36 |
+
return $this->woocommerce_helper->isWooCommerceActive() && empty($this->getCompletedTasks()); // run only once
|
37 |
}
|
38 |
|
39 |
+
function processTaskStrategy(ScheduledTask $task, $timer) {
|
40 |
$oldest_click = StatisticsClicks::orderByAsc('created_at')->limit(1)->findOne();
|
41 |
+
if (!$oldest_click instanceof StatisticsClicks) {
|
42 |
return true;
|
43 |
}
|
44 |
|
73 |
return false;
|
74 |
}
|
75 |
|
76 |
+
function getNextRunDate() {
|
77 |
return Carbon::createFromTimestamp(WPFunctions::get()->currentTime('timestamp')); // schedule immediately
|
78 |
}
|
79 |
}
|
lib/Cron/Workers/WooCommerceSync.php
CHANGED
@@ -21,22 +21,18 @@ class WooCommerceSync extends SimpleWorker {
|
|
21 |
/** @var WooCommerceHelper */
|
22 |
private $woocommerce_helper;
|
23 |
|
24 |
-
function __construct(WooCommerceSegment $woocommerce_segment, WooCommerceHelper $woocommerce_helper
|
25 |
$this->woocommerce_segment = $woocommerce_segment;
|
26 |
$this->woocommerce_helper = $woocommerce_helper;
|
27 |
-
parent::__construct(
|
28 |
}
|
29 |
|
30 |
function checkProcessingRequirements() {
|
31 |
return $this->woocommerce_helper->isWooCommerceActive();
|
32 |
}
|
33 |
|
34 |
-
function processTaskStrategy(ScheduledTask $task) {
|
35 |
$this->woocommerce_segment->synchronizeCustomers();
|
36 |
return true;
|
37 |
}
|
38 |
-
|
39 |
-
function complete(ScheduledTask $task) {
|
40 |
-
return parent::complete($task);
|
41 |
-
}
|
42 |
}
|
21 |
/** @var WooCommerceHelper */
|
22 |
private $woocommerce_helper;
|
23 |
|
24 |
+
function __construct(WooCommerceSegment $woocommerce_segment, WooCommerceHelper $woocommerce_helper) {
|
25 |
$this->woocommerce_segment = $woocommerce_segment;
|
26 |
$this->woocommerce_helper = $woocommerce_helper;
|
27 |
+
parent::__construct();
|
28 |
}
|
29 |
|
30 |
function checkProcessingRequirements() {
|
31 |
return $this->woocommerce_helper->isWooCommerceActive();
|
32 |
}
|
33 |
|
34 |
+
function processTaskStrategy(ScheduledTask $task, $timer) {
|
35 |
$this->woocommerce_segment->synchronizeCustomers();
|
36 |
return true;
|
37 |
}
|
|
|
|
|
|
|
|
|
38 |
}
|
lib/Cron/Workers/WorkersFactory.php
CHANGED
@@ -5,242 +5,102 @@ namespace MailPoet\Cron\Workers;
|
|
5 |
if (!defined('ABSPATH')) exit;
|
6 |
|
7 |
|
8 |
-
use MailPoet\Config\Renderer;
|
9 |
-
use MailPoet\Cron\CronHelper;
|
10 |
use MailPoet\Cron\Workers\Bounce as BounceWorker;
|
11 |
use MailPoet\Cron\Workers\KeyCheck\PremiumKeyCheck as PremiumKeyCheckWorker;
|
12 |
use MailPoet\Cron\Workers\KeyCheck\SendingServiceKeyCheck as SendingServiceKeyCheckWorker;
|
13 |
use MailPoet\Cron\Workers\Scheduler as SchedulerWorker;
|
14 |
use MailPoet\Cron\Workers\SendingQueue\Migration as MigrationWorker;
|
15 |
-
use MailPoet\Cron\Workers\SendingQueue\SendingErrorHandler;
|
16 |
use MailPoet\Cron\Workers\SendingQueue\SendingQueue as SendingQueueWorker;
|
17 |
use MailPoet\Cron\Workers\StatsNotifications\AutomatedEmails as StatsNotificationsWorkerForAutomatedEmails;
|
18 |
-
use MailPoet\Cron\Workers\StatsNotifications\NewsletterLinkRepository;
|
19 |
-
use MailPoet\Cron\Workers\StatsNotifications\Scheduler as StatsNotificationScheduler;
|
20 |
-
use MailPoet\Cron\Workers\StatsNotifications\StatsNotificationsRepository;
|
21 |
use MailPoet\Cron\Workers\StatsNotifications\Worker as StatsNotificationsWorker;
|
22 |
use MailPoet\Cron\Workers\WooCommerceSync as WooCommerceSyncWorker;
|
23 |
-
use MailPoet\
|
24 |
-
use MailPoet\Mailer\Mailer;
|
25 |
-
use MailPoet\Mailer\MetaInfo;
|
26 |
-
use MailPoet\Newsletter\NewslettersRepository;
|
27 |
-
use MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository;
|
28 |
-
use MailPoet\Segments\SubscribersFinder;
|
29 |
-
use MailPoet\Segments\WooCommerce as WooCommerceSegment;
|
30 |
-
use MailPoet\Services\AuthorizedEmailsController;
|
31 |
-
use MailPoet\Settings\SettingsController;
|
32 |
-
use MailPoet\Statistics\Track\WooCommercePurchases;
|
33 |
-
use MailPoet\Subscribers\InactiveSubscribersController;
|
34 |
-
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
|
35 |
-
use MailPoet\WP\Functions as WPFunctions;
|
36 |
-
use MailPoetVendor\Doctrine\ORM\EntityManager;
|
37 |
|
38 |
class WorkersFactory {
|
|
|
|
|
39 |
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
/** @var StatsNotificationScheduler */
|
44 |
-
private $statsNotificationsScheduler;
|
45 |
-
|
46 |
-
/** @var Mailer */
|
47 |
-
private $mailer;
|
48 |
-
|
49 |
-
/** @var SettingsController */
|
50 |
-
private $settings;
|
51 |
-
|
52 |
-
/** @var CronHelper */
|
53 |
-
private $cron_helper;
|
54 |
-
|
55 |
-
/** @var WooCommerceSegment */
|
56 |
-
private $woocommerce_segment;
|
57 |
-
|
58 |
-
/** @var InactiveSubscribersController */
|
59 |
-
private $inactive_subscribers_controller;
|
60 |
-
|
61 |
-
/** @var WooCommerceHelper */
|
62 |
-
private $woocommerce_helper;
|
63 |
-
|
64 |
-
/** @var WooCommercePurchases */
|
65 |
-
private $woocommerce_purchases;
|
66 |
-
|
67 |
-
/** @var AuthorizedEmailsController */
|
68 |
-
private $authorized_emails_controller;
|
69 |
-
|
70 |
-
/** @var Renderer */
|
71 |
-
private $renderer;
|
72 |
-
|
73 |
-
/** @var SubscribersFinder */
|
74 |
-
private $subscribers_finder;
|
75 |
-
|
76 |
-
/** @var MetaInfo */
|
77 |
-
private $mailerMetaInfo;
|
78 |
-
|
79 |
-
/** @var LoggerFactory */
|
80 |
-
private $logger_factory;
|
81 |
-
|
82 |
-
/** @var StatsNotificationsRepository */
|
83 |
-
private $stats_notifications_repository;
|
84 |
-
|
85 |
-
/** @var EntityManager */
|
86 |
-
private $entity_manager;
|
87 |
-
|
88 |
-
/**
|
89 |
-
* @var NewslettersRepository
|
90 |
-
*/
|
91 |
-
private $newsletters_repository;
|
92 |
-
|
93 |
-
/** @var NewsletterLinkRepository */
|
94 |
-
private $newsletter_link_repository;
|
95 |
-
|
96 |
-
/** @var NewsletterStatisticsRepository */
|
97 |
-
private $newsletter_statistics_repository;
|
98 |
-
|
99 |
-
public function __construct(
|
100 |
-
SendingErrorHandler $sending_error_handler,
|
101 |
-
StatsNotificationScheduler $statsNotificationsScheduler,
|
102 |
-
Mailer $mailer,
|
103 |
-
Renderer $renderer,
|
104 |
-
SettingsController $settings,
|
105 |
-
CronHelper $cron_helper,
|
106 |
-
WooCommerceSegment $woocommerce_segment,
|
107 |
-
InactiveSubscribersController $inactive_subscribers_controller,
|
108 |
-
WooCommerceHelper $woocommerce_helper,
|
109 |
-
WooCommercePurchases $woocommerce_purchases,
|
110 |
-
AuthorizedEmailsController $authorized_emails_controller,
|
111 |
-
SubscribersFinder $subscribers_finder,
|
112 |
-
MetaInfo $mailerMetaInfo,
|
113 |
-
LoggerFactory $logger_factory,
|
114 |
-
StatsNotificationsRepository $stats_notifications_repository,
|
115 |
-
NewslettersRepository $newsletters_repository,
|
116 |
-
NewsletterLinkRepository $newsletter_link_repository,
|
117 |
-
NewsletterStatisticsRepository $newsletter_statistics_repository,
|
118 |
-
EntityManager $entity_manager
|
119 |
-
) {
|
120 |
-
$this->sending_error_handler = $sending_error_handler;
|
121 |
-
$this->statsNotificationsScheduler = $statsNotificationsScheduler;
|
122 |
-
$this->mailer = $mailer;
|
123 |
-
$this->renderer = $renderer;
|
124 |
-
$this->settings = $settings;
|
125 |
-
$this->cron_helper = $cron_helper;
|
126 |
-
$this->woocommerce_segment = $woocommerce_segment;
|
127 |
-
$this->inactive_subscribers_controller = $inactive_subscribers_controller;
|
128 |
-
$this->woocommerce_helper = $woocommerce_helper;
|
129 |
-
$this->woocommerce_purchases = $woocommerce_purchases;
|
130 |
-
$this->authorized_emails_controller = $authorized_emails_controller;
|
131 |
-
$this->subscribers_finder = $subscribers_finder;
|
132 |
-
$this->mailerMetaInfo = $mailerMetaInfo;
|
133 |
-
$this->logger_factory = $logger_factory;
|
134 |
-
$this->stats_notifications_repository = $stats_notifications_repository;
|
135 |
-
$this->entity_manager = $entity_manager;
|
136 |
-
$this->newsletters_repository = $newsletters_repository;
|
137 |
-
$this->newsletter_link_repository = $newsletter_link_repository;
|
138 |
-
$this->newsletter_statistics_repository = $newsletter_statistics_repository;
|
139 |
}
|
140 |
|
141 |
/** @return SchedulerWorker */
|
142 |
-
function createScheduleWorker(
|
143 |
-
return
|
144 |
}
|
145 |
|
146 |
/** @return SendingQueueWorker */
|
147 |
-
function createQueueWorker(
|
148 |
-
return
|
149 |
-
$this->sending_error_handler,
|
150 |
-
$this->statsNotificationsScheduler,
|
151 |
-
$this->logger_factory,
|
152 |
-
$this->newsletters_repository,
|
153 |
-
$this->cron_helper,
|
154 |
-
$timer
|
155 |
-
);
|
156 |
}
|
157 |
|
158 |
/** @return StatsNotificationsWorker */
|
159 |
-
function createStatsNotificationsWorker(
|
160 |
-
return
|
161 |
-
$this->mailer,
|
162 |
-
$this->renderer,
|
163 |
-
$this->settings,
|
164 |
-
$this->cron_helper,
|
165 |
-
$this->mailerMetaInfo,
|
166 |
-
$this->stats_notifications_repository,
|
167 |
-
$this->newsletter_link_repository,
|
168 |
-
$this->newsletter_statistics_repository,
|
169 |
-
$this->entity_manager,
|
170 |
-
$timer
|
171 |
-
);
|
172 |
}
|
173 |
|
174 |
/** @return StatsNotificationsWorkerForAutomatedEmails */
|
175 |
-
function createStatsNotificationsWorkerForAutomatedEmails(
|
176 |
-
return
|
177 |
-
$this->mailer,
|
178 |
-
$this->renderer,
|
179 |
-
$this->settings,
|
180 |
-
$this->newsletters_repository,
|
181 |
-
$this->newsletter_statistics_repository,
|
182 |
-
$this->mailerMetaInfo,
|
183 |
-
$timer
|
184 |
-
);
|
185 |
}
|
186 |
|
187 |
/** @return SendingServiceKeyCheckWorker */
|
188 |
-
function createSendingServiceKeyCheckWorker(
|
189 |
-
return
|
190 |
}
|
191 |
|
192 |
/** @return PremiumKeyCheckWorker */
|
193 |
-
function createPremiumKeyCheckWorker(
|
194 |
-
return
|
195 |
}
|
196 |
|
197 |
/** @return BounceWorker */
|
198 |
-
function createBounceWorker(
|
199 |
-
return
|
200 |
}
|
201 |
|
202 |
/** @return MigrationWorker */
|
203 |
-
function createMigrationWorker(
|
204 |
-
return
|
205 |
}
|
206 |
|
207 |
/** @return WooCommerceSyncWorker */
|
208 |
-
function createWooCommerceSyncWorker(
|
209 |
-
return
|
210 |
}
|
211 |
|
212 |
/** @return ExportFilesCleanup */
|
213 |
-
function createExportFilesCleanupWorker(
|
214 |
-
return
|
215 |
}
|
216 |
|
217 |
/** @return Beamer */
|
218 |
-
function createBeamerkWorker(
|
219 |
-
return
|
220 |
}
|
221 |
|
222 |
/** @return InactiveSubscribers */
|
223 |
-
function createInactiveSubscribersWorker(
|
224 |
-
return
|
225 |
}
|
226 |
|
227 |
-
|
228 |
-
function createUnsubscribeTokensWorker(
|
229 |
-
return
|
230 |
}
|
231 |
|
232 |
-
|
233 |
-
function createSubscriberLinkTokensWorker(
|
234 |
-
return
|
235 |
}
|
236 |
|
237 |
/** @return AuthorizedSendingEmailsCheck */
|
238 |
-
function createAuthorizedSendingEmailsCheckWorker(
|
239 |
-
return
|
240 |
}
|
241 |
|
242 |
/** @return WooCommercePastOrders */
|
243 |
-
function createWooCommercePastOrdersWorker(
|
244 |
-
return
|
245 |
}
|
246 |
}
|
5 |
if (!defined('ABSPATH')) exit;
|
6 |
|
7 |
|
|
|
|
|
8 |
use MailPoet\Cron\Workers\Bounce as BounceWorker;
|
9 |
use MailPoet\Cron\Workers\KeyCheck\PremiumKeyCheck as PremiumKeyCheckWorker;
|
10 |
use MailPoet\Cron\Workers\KeyCheck\SendingServiceKeyCheck as SendingServiceKeyCheckWorker;
|
11 |
use MailPoet\Cron\Workers\Scheduler as SchedulerWorker;
|
12 |
use MailPoet\Cron\Workers\SendingQueue\Migration as MigrationWorker;
|
|
|
13 |
use MailPoet\Cron\Workers\SendingQueue\SendingQueue as SendingQueueWorker;
|
14 |
use MailPoet\Cron\Workers\StatsNotifications\AutomatedEmails as StatsNotificationsWorkerForAutomatedEmails;
|
|
|
|
|
|
|
15 |
use MailPoet\Cron\Workers\StatsNotifications\Worker as StatsNotificationsWorker;
|
16 |
use MailPoet\Cron\Workers\WooCommerceSync as WooCommerceSyncWorker;
|
17 |
+
use MailPoet\DI\ContainerWrapper;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
|
19 |
class WorkersFactory {
|
20 |
+
/** @var ContainerWrapper */
|
21 |
+
private $container;
|
22 |
|
23 |
+
public function __construct(ContainerWrapper $container) {
|
24 |
+
$this->container = $container;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
}
|
26 |
|
27 |
/** @return SchedulerWorker */
|
28 |
+
function createScheduleWorker() {
|
29 |
+
return $this->container->get(SchedulerWorker::class);
|
30 |
}
|
31 |
|
32 |
/** @return SendingQueueWorker */
|
33 |
+
function createQueueWorker() {
|
34 |
+
return $this->container->get(SendingQueueWorker::class);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
}
|
36 |
|
37 |
/** @return StatsNotificationsWorker */
|
38 |
+
function createStatsNotificationsWorker() {
|
39 |
+
return $this->container->get(StatsNotificationsWorker::class);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
}
|
41 |
|
42 |
/** @return StatsNotificationsWorkerForAutomatedEmails */
|
43 |
+
function createStatsNotificationsWorkerForAutomatedEmails() {
|
44 |
+
return $this->container->get(StatsNotificationsWorkerForAutomatedEmails::class);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
}
|
46 |
|
47 |
/** @return SendingServiceKeyCheckWorker */
|
48 |
+
function createSendingServiceKeyCheckWorker() {
|
49 |
+
return $this->container->get(SendingServiceKeyCheckWorker::class);
|
50 |
}
|
51 |
|
52 |
/** @return PremiumKeyCheckWorker */
|
53 |
+
function createPremiumKeyCheckWorker() {
|
54 |
+
return $this->container->get(PremiumKeyCheckWorker::class);
|
55 |
}
|
56 |
|
57 |
/** @return BounceWorker */
|
58 |
+
function createBounceWorker() {
|
59 |
+
return $this->container->get(BounceWorker::class);
|
60 |
}
|
61 |
|
62 |
/** @return MigrationWorker */
|
63 |
+
function createMigrationWorker() {
|
64 |
+
return $this->container->get(MigrationWorker::class);
|
65 |
}
|
66 |
|
67 |
/** @return WooCommerceSyncWorker */
|
68 |
+
function createWooCommerceSyncWorker() {
|
69 |
+
return $this->container->get(WooCommerceSyncWorker::class);
|
70 |
}
|
71 |
|
72 |
/** @return ExportFilesCleanup */
|
73 |
+
function createExportFilesCleanupWorker() {
|
74 |
+
return $this->container->get(ExportFilesCleanup::class);
|
75 |
}
|
76 |
|
77 |
/** @return Beamer */
|
78 |
+
function createBeamerkWorker() {
|
79 |
+
return $this->container->get(Beamer::class);
|
80 |
}
|
81 |
|
82 |
/** @return InactiveSubscribers */
|
83 |
+
function createInactiveSubscribersWorker() {
|
84 |
+
return $this->container->get(InactiveSubscribers::class);
|
85 |
}
|
86 |
|
87 |
+
/** @return UnsubscribeTokens */
|
88 |
+
function createUnsubscribeTokensWorker() {
|
89 |
+
return $this->container->get(UnsubscribeTokens::class);
|
90 |
}
|
91 |
|
92 |
+
/** @return SubscriberLinkTokens */
|
93 |
+
function createSubscriberLinkTokensWorker() {
|
94 |
+
return $this->container->get(SubscriberLinkTokens::class);
|
95 |
}
|
96 |
|
97 |
/** @return AuthorizedSendingEmailsCheck */
|
98 |
+
function createAuthorizedSendingEmailsCheckWorker() {
|
99 |
+
return $this->container->get(AuthorizedSendingEmailsCheck::class);
|
100 |
}
|
101 |
|
102 |
/** @return WooCommercePastOrders */
|
103 |
+
function createWooCommercePastOrdersWorker() {
|
104 |
+
return $this->container->get(WooCommercePastOrders::class);
|
105 |
}
|
106 |
}
|
lib/DI/ContainerConfigurator.php
CHANGED
@@ -131,14 +131,34 @@ class ContainerConfigurator implements IContainerConfigurator {
|
|
131 |
// Cron
|
132 |
$container->autowire(\MailPoet\Cron\CronHelper::class)->setPublic(true);
|
133 |
$container->autowire(\MailPoet\Cron\CronTrigger::class)->setPublic(true);
|
|
|
134 |
$container->autowire(\MailPoet\Cron\Daemon::class)->setPublic(true);
|
135 |
$container->autowire(\MailPoet\Cron\DaemonHttpRunner::class)->setPublic(true);
|
136 |
$container->autowire(\MailPoet\Cron\Supervisor::class)->setPublic(true);
|
|
|
|
|
137 |
$container->autowire(\MailPoet\Cron\Workers\WorkersFactory::class)->setPublic(true);
|
138 |
$container->autowire(\MailPoet\Cron\Workers\SendingQueue\SendingErrorHandler::class)->setPublic(true);
|
139 |
$container->autowire(\MailPoet\Cron\Workers\StatsNotifications\Scheduler::class);
|
140 |
$container->autowire(\MailPoet\Cron\Workers\StatsNotifications\StatsNotificationsRepository::class);
|
141 |
$container->autowire(\MailPoet\Cron\Workers\StatsNotifications\NewsletterLinkRepository::class);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
142 |
// Custom field
|
143 |
$container->autowire(\MailPoet\CustomFields\ApiDataSanitizer::class);
|
144 |
// Features
|
131 |
// Cron
|
132 |
$container->autowire(\MailPoet\Cron\CronHelper::class)->setPublic(true);
|
133 |
$container->autowire(\MailPoet\Cron\CronTrigger::class)->setPublic(true);
|
134 |
+
$container->autowire(\MailPoet\Cron\CronWorkerScheduler::class)->setPublic(true);
|
135 |
$container->autowire(\MailPoet\Cron\Daemon::class)->setPublic(true);
|
136 |
$container->autowire(\MailPoet\Cron\DaemonHttpRunner::class)->setPublic(true);
|
137 |
$container->autowire(\MailPoet\Cron\Supervisor::class)->setPublic(true);
|
138 |
+
$container->autowire(\MailPoet\Cron\Triggers\MailPoet::class)->setPublic(true);
|
139 |
+
$container->autowire(\MailPoet\Cron\Triggers\WordPress::class)->setPublic(true);
|
140 |
$container->autowire(\MailPoet\Cron\Workers\WorkersFactory::class)->setPublic(true);
|
141 |
$container->autowire(\MailPoet\Cron\Workers\SendingQueue\SendingErrorHandler::class)->setPublic(true);
|
142 |
$container->autowire(\MailPoet\Cron\Workers\StatsNotifications\Scheduler::class);
|
143 |
$container->autowire(\MailPoet\Cron\Workers\StatsNotifications\StatsNotificationsRepository::class);
|
144 |
$container->autowire(\MailPoet\Cron\Workers\StatsNotifications\NewsletterLinkRepository::class);
|
145 |
+
// Cron workers
|
146 |
+
$container->autowire(\MailPoet\Cron\Workers\Scheduler::class)->setPublic(true);
|
147 |
+
$container->autowire(\MailPoet\Cron\Workers\SendingQueue\SendingQueue::class)->setPublic(true);
|
148 |
+
$container->autowire(\MailPoet\Cron\Workers\StatsNotifications\Worker::class)->setPublic(true);
|
149 |
+
$container->autowire(\MailPoet\Cron\Workers\StatsNotifications\AutomatedEmails::class)->setPublic(true);
|
150 |
+
$container->autowire(\MailPoet\Cron\Workers\KeyCheck\SendingServiceKeyCheck::class)->setPublic(true);
|
151 |
+
$container->autowire(\MailPoet\Cron\Workers\KeyCheck\PremiumKeyCheck::class)->setPublic(true);
|
152 |
+
$container->autowire(\MailPoet\Cron\Workers\Bounce::class)->setPublic(true);
|
153 |
+
$container->autowire(\MailPoet\Cron\Workers\SendingQueue\Migration::class)->setPublic(true);
|
154 |
+
$container->autowire(\MailPoet\Cron\Workers\WooCommerceSync::class)->setPublic(true);
|
155 |
+
$container->autowire(\MailPoet\Cron\Workers\ExportFilesCleanup::class)->setPublic(true);
|
156 |
+
$container->autowire(\MailPoet\Cron\Workers\Beamer::class)->setPublic(true);
|
157 |
+
$container->autowire(\MailPoet\Cron\Workers\InactiveSubscribers::class)->setPublic(true);
|
158 |
+
$container->autowire(\MailPoet\Cron\Workers\UnsubscribeTokens::class)->setPublic(true);
|
159 |
+
$container->autowire(\MailPoet\Cron\Workers\SubscriberLinkTokens::class)->setPublic(true);
|
160 |
+
$container->autowire(\MailPoet\Cron\Workers\AuthorizedSendingEmailsCheck::class)->setPublic(true);
|
161 |
+
$container->autowire(\MailPoet\Cron\Workers\WooCommercePastOrders::class)->setPublic(true);
|
162 |
// Custom field
|
163 |
$container->autowire(\MailPoet\CustomFields\ApiDataSanitizer::class);
|
164 |
// Features
|
lib/Doctrine/EntityTraits/AutoincrementedIdTrait.php
CHANGED
@@ -16,7 +16,7 @@ trait AutoincrementedIdTrait {
|
|
16 |
*/
|
17 |
private $id;
|
18 |
|
19 |
-
/** @return int */
|
20 |
public function getId() {
|
21 |
return $this->id;
|
22 |
}
|
16 |
*/
|
17 |
private $id;
|
18 |
|
19 |
+
/** @return int|null */
|
20 |
public function getId() {
|
21 |
return $this->id;
|
22 |
}
|
lib/Models/Model.php
CHANGED
@@ -141,10 +141,14 @@ class Model extends \Sudzy\ValidModel {
|
|
141 |
}
|
142 |
|
143 |
/**
|
144 |
-
* @return
|
145 |
*/
|
146 |
static function create() {
|
147 |
-
|
|
|
|
|
|
|
|
|
148 |
}
|
149 |
|
150 |
/**
|
141 |
}
|
142 |
|
143 |
/**
|
144 |
+
* @return static
|
145 |
*/
|
146 |
static function create() {
|
147 |
+
$created = parent::create();
|
148 |
+
if (is_bool($created)) {
|
149 |
+
throw new \Exception('ORM is not initialised');
|
150 |
+
}
|
151 |
+
return $created;
|
152 |
}
|
153 |
|
154 |
/**
|
lib/Models/Newsletter.php
CHANGED
@@ -778,7 +778,7 @@ class Newsletter extends Model {
|
|
778 |
foreach ($data['filter'] as $key => $value) {
|
779 |
if ($key === 'segment') {
|
780 |
$segment = Segment::findOne($value);
|
781 |
-
if ($segment
|
782 |
$orm = $segment->newsletters();
|
783 |
}
|
784 |
}
|
@@ -1152,7 +1152,7 @@ class Newsletter extends Model {
|
|
1152 |
|
1153 |
static function findOneWithOptions($id) {
|
1154 |
$newsletter = self::findOne($id);
|
1155 |
-
if (
|
1156 |
return false;
|
1157 |
}
|
1158 |
return self::filter('filterWithOptions', $newsletter->type)->findOne($id);
|
778 |
foreach ($data['filter'] as $key => $value) {
|
779 |
if ($key === 'segment') {
|
780 |
$segment = Segment::findOne($value);
|
781 |
+
if ($segment instanceof Segment) {
|
782 |
$orm = $segment->newsletters();
|
783 |
}
|
784 |
}
|
1152 |
|
1153 |
static function findOneWithOptions($id) {
|
1154 |
$newsletter = self::findOne($id);
|
1155 |
+
if (!$newsletter instanceof self) {
|
1156 |
return false;
|
1157 |
}
|
1158 |
return self::filter('filterWithOptions', $newsletter->type)->findOne($id);
|
lib/Models/ScheduledTask.php
CHANGED
@@ -163,4 +163,44 @@ class ScheduledTask extends Model {
|
|
163 |
->whereNull('tasks.deleted_at')
|
164 |
->findOne() ?: null;
|
165 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
166 |
}
|
163 |
->whereNull('tasks.deleted_at')
|
164 |
->findOne() ?: null;
|
165 |
}
|
166 |
+
|
167 |
+
static function findDueByType($type, $limit = null) {
|
168 |
+
return self::findByTypeAndStatus($type, ScheduledTask::STATUS_SCHEDULED, $limit);
|
169 |
+
}
|
170 |
+
|
171 |
+
static function findRunningByType($type, $limit = null) {
|
172 |
+
return self::findByTypeAndStatus($type, null, $limit);
|
173 |
+
}
|
174 |
+
|
175 |
+
static function findFutureScheduledByType($type, $limit = null) {
|
176 |
+
return self::findByTypeAndStatus($type, ScheduledTask::STATUS_SCHEDULED, $limit, true);
|
177 |
+
}
|
178 |
+
|
179 |
+
static function findCompletedByType($type, $limit = null) {
|
180 |
+
return self::findByTypeAndStatus($type, ScheduledTask::STATUS_COMPLETED, $limit);
|
181 |
+
}
|
182 |
+
|
183 |
+
private static function findByTypeAndStatus($type, $status, $limit = null, $future = false) {
|
184 |
+
$query = ScheduledTask::where('type', $type)
|
185 |
+
->whereNull('deleted_at');
|
186 |
+
|
187 |
+
$now = Carbon::createFromTimestamp(WPFunctions::get()->currentTime('timestamp'));
|
188 |
+
if ($future) {
|
189 |
+
$query->whereGt('scheduled_at', $now);
|
190 |
+
} else {
|
191 |
+
$query->whereLte('scheduled_at', $now);
|
192 |
+
}
|
193 |
+
|
194 |
+
if ($status === null) {
|
195 |
+
$query->whereNull('status');
|
196 |
+
} else {
|
197 |
+
$query->where('status', $status);
|
198 |
+
}
|
199 |
+
|
200 |
+
if ($limit !== null) {
|
201 |
+
$query->limit($limit);
|
202 |
+
}
|
203 |
+
|
204 |
+
return $query->findMany();
|
205 |
+
}
|
206 |
}
|
lib/Models/StatisticsClicks.php
CHANGED
@@ -23,7 +23,7 @@ class StatisticsClicks extends Model {
|
|
23 |
->where('newsletter_id', $newsletter_id)
|
24 |
->where('queue_id', $queue_id)
|
25 |
->findOne();
|
26 |
-
if (!$statistics) {
|
27 |
$statistics = self::create();
|
28 |
$statistics->link_id = $link_id;
|
29 |
$statistics->subscriber_id = $subscriber_id;
|
23 |
->where('newsletter_id', $newsletter_id)
|
24 |
->where('queue_id', $queue_id)
|
25 |
->findOne();
|
26 |
+
if (!$statistics instanceof self) {
|
27 |
$statistics = self::create();
|
28 |
$statistics->link_id = $link_id;
|
29 |
$statistics->subscriber_id = $subscriber_id;
|
lib/Models/StatisticsWooCommercePurchases.php
CHANGED
@@ -28,12 +28,12 @@ class StatisticsWooCommercePurchases extends Model {
|
|
28 |
->where('newsletter_id', $click->newsletter_id)
|
29 |
->findOne();
|
30 |
|
31 |
-
if (!$statistics) {
|
32 |
$statistics = self::create();
|
33 |
$statistics->newsletter_id = $click->newsletter_id;
|
34 |
$statistics->subscriber_id = $click->subscriber_id;
|
35 |
$statistics->queue_id = $click->queue_id;
|
36 |
-
$statistics->click_id = $click->id;
|
37 |
$statistics->order_id = $order->get_id();
|
38 |
}
|
39 |
|
28 |
->where('newsletter_id', $click->newsletter_id)
|
29 |
->findOne();
|
30 |
|
31 |
+
if (!$statistics instanceof self) {
|
32 |
$statistics = self::create();
|
33 |
$statistics->newsletter_id = $click->newsletter_id;
|
34 |
$statistics->subscriber_id = $click->subscriber_id;
|
35 |
$statistics->queue_id = $click->queue_id;
|
36 |
+
$statistics->click_id = (int)$click->id;
|
37 |
$statistics->order_id = $order->get_id();
|
38 |
}
|
39 |
|
lib/Newsletter/Scheduler/PostNotificationScheduler.php
CHANGED
@@ -132,14 +132,19 @@ class PostNotificationScheduler {
|
|
132 |
$schedule = '* * * * *';
|
133 |
break;
|
134 |
}
|
|
|
135 |
$option_field = NewsletterOptionField::where('name', 'schedule')->findOne();
|
136 |
-
$
|
137 |
-
|
138 |
-
|
139 |
-
|
|
|
|
|
|
|
|
|
140 |
$relation = NewsletterOption::create();
|
141 |
$relation->newsletter_id = $newsletter->id;
|
142 |
-
$relation->option_field_id = $option_field->id;
|
143 |
}
|
144 |
$relation->value = $schedule;
|
145 |
$relation->save();
|
132 |
$schedule = '* * * * *';
|
133 |
break;
|
134 |
}
|
135 |
+
$relation = null;
|
136 |
$option_field = NewsletterOptionField::where('name', 'schedule')->findOne();
|
137 |
+
if ($option_field instanceof NewsletterOptionField) {
|
138 |
+
$relation = NewsletterOption::where('newsletter_id', $newsletter->id)
|
139 |
+
->where('option_field_id', $option_field->id)
|
140 |
+
->findOne();
|
141 |
+
} else {
|
142 |
+
throw new \Exception('NewsletterOptionField for schedule doesn’t exist.');
|
143 |
+
}
|
144 |
+
if (!$relation instanceof NewsletterOption) {
|
145 |
$relation = NewsletterOption::create();
|
146 |
$relation->newsletter_id = $newsletter->id;
|
147 |
+
$relation->option_field_id = (int)$option_field->id;
|
148 |
}
|
149 |
$relation->value = $schedule;
|
150 |
$relation->save();
|
lib/Newsletter/Shortcodes/Categories/Subscriber.php
CHANGED
@@ -18,7 +18,9 @@ class Subscriber {
|
|
18 |
$newsletter,
|
19 |
$subscriber
|
20 |
) {
|
21 |
-
if ($subscriber !== false && !
|
|
|
|
|
22 |
$default_value = ($shortcode_details['action_argument'] === 'default') ?
|
23 |
$shortcode_details['action_argument_value'] :
|
24 |
'';
|
@@ -46,7 +48,7 @@ class Subscriber {
|
|
46 |
::where('subscriber_id', $subscriber->id)
|
47 |
->where('custom_field_id', $custom_field[1])
|
48 |
->findOne();
|
49 |
-
return ($custom_field) ? $custom_field->value : false;
|
50 |
}
|
51 |
return false;
|
52 |
}
|
18 |
$newsletter,
|
19 |
$subscriber
|
20 |
) {
|
21 |
+
if ($subscriber !== false && !($subscriber instanceof SubscriberModel)) {
|
22 |
+
return $shortcode_details['shortcode'];
|
23 |
+
}
|
24 |
$default_value = ($shortcode_details['action_argument'] === 'default') ?
|
25 |
$shortcode_details['action_argument_value'] :
|
26 |
'';
|
48 |
::where('subscriber_id', $subscriber->id)
|
49 |
->where('custom_field_id', $custom_field[1])
|
50 |
->findOne();
|
51 |
+
return ($custom_field instanceof SubscriberCustomField) ? $custom_field->value : false;
|
52 |
}
|
53 |
return false;
|
54 |
}
|
lib/Router/Endpoints/Track.php
CHANGED
@@ -61,7 +61,7 @@ class Track {
|
|
61 |
return false;
|
62 |
}
|
63 |
$data->queue = SendingQueue::findOne($data->queue_id);
|
64 |
-
if ($data->queue) {
|
65 |
$data->queue = SendingTask::createFromQueue($data->queue);
|
66 |
}
|
67 |
$data->subscriber = Subscriber::findOne($data->subscriber_id) ?: null;
|
61 |
return false;
|
62 |
}
|
63 |
$data->queue = SendingQueue::findOne($data->queue_id);
|
64 |
+
if ($data->queue instanceof SendingQueue) {
|
65 |
$data->queue = SendingTask::createFromQueue($data->queue);
|
66 |
}
|
67 |
$data->subscriber = Subscriber::findOne($data->subscriber_id) ?: null;
|
lib/Router/Endpoints/ViewInBrowser.php
CHANGED
@@ -108,7 +108,7 @@ class ViewInBrowser {
|
|
108 |
) return false;
|
109 |
|
110 |
// if queue and subscriber exist, subscriber must have received the newsletter
|
111 |
-
if ($data->queue &&
|
112 |
$data->subscriber &&
|
113 |
!$data->queue->isSubscriberProcessed($data->subscriber->id)
|
114 |
) return false;
|
108 |
) return false;
|
109 |
|
110 |
// if queue and subscriber exist, subscriber must have received the newsletter
|
111 |
+
if ($data->queue instanceof SendingQueue &&
|
112 |
$data->subscriber &&
|
113 |
!$data->queue->isSubscriberProcessed($data->subscriber->id)
|
114 |
) return false;
|
lib/Services/Bridge.php
CHANGED
@@ -86,14 +86,26 @@ class Bridge {
|
|
86 |
}
|
87 |
}
|
88 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
function getAuthorizedEmailAddresses() {
|
90 |
-
$this
|
91 |
-
|
|
|
92 |
}
|
93 |
|
94 |
function checkMSSKey($api_key) {
|
95 |
-
$this
|
96 |
-
|
|
|
97 |
return $this->processKeyCheckResult($result);
|
98 |
}
|
99 |
|
@@ -118,8 +130,9 @@ class Bridge {
|
|
118 |
}
|
119 |
|
120 |
function checkPremiumKey($key) {
|
121 |
-
$this
|
122 |
-
|
|
|
123 |
return $this->processKeyCheckResult($result);
|
124 |
}
|
125 |
|
@@ -180,9 +193,15 @@ class Bridge {
|
|
180 |
}
|
181 |
|
182 |
function updateSubscriberCount($result) {
|
183 |
-
if (
|
184 |
-
|
185 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
186 |
) {
|
187 |
return $this->api->updateSubscriberCount(Subscriber::getTotalSubscribers());
|
188 |
}
|
86 |
}
|
87 |
}
|
88 |
|
89 |
+
/**
|
90 |
+
* @param string $key
|
91 |
+
* @return API
|
92 |
+
*/
|
93 |
+
private function getApi($key) {
|
94 |
+
$this->initApi($key);
|
95 |
+
assert($this->api instanceof API);
|
96 |
+
return $this->api;
|
97 |
+
}
|
98 |
+
|
99 |
function getAuthorizedEmailAddresses() {
|
100 |
+
return $this
|
101 |
+
->getApi($this->settings->get(self::API_KEY_SETTING_NAME))
|
102 |
+
->getAuthorizedEmailAddresses();
|
103 |
}
|
104 |
|
105 |
function checkMSSKey($api_key) {
|
106 |
+
$result = $this
|
107 |
+
->getApi($api_key)
|
108 |
+
->checkMSSKey();
|
109 |
return $this->processKeyCheckResult($result);
|
110 |
}
|
111 |
|
130 |
}
|
131 |
|
132 |
function checkPremiumKey($key) {
|
133 |
+
$result = $this
|
134 |
+
->getApi($key)
|
135 |
+
->checkPremiumKey();
|
136 |
return $this->processKeyCheckResult($result);
|
137 |
}
|
138 |
|
193 |
}
|
194 |
|
195 |
function updateSubscriberCount($result) {
|
196 |
+
if (
|
197 |
+
(
|
198 |
+
!empty($result['state'])
|
199 |
+
&& (
|
200 |
+
$result['state'] === self::KEY_VALID
|
201 |
+
|| $result['state'] === self::KEY_EXPIRING
|
202 |
+
)
|
203 |
+
)
|
204 |
+
&& ($this->api instanceof API)
|
205 |
) {
|
206 |
return $this->api->updateSubscriberCount(Subscriber::getTotalSubscribers());
|
207 |
}
|
lib/Settings/UserFlagsController.php
CHANGED
@@ -12,7 +12,7 @@ class UserFlagsController {
|
|
12 |
|
13 |
/** @var array|null */
|
14 |
private $data = null;
|
15 |
-
|
16 |
/** @var array */
|
17 |
private $defaults;
|
18 |
|
@@ -37,7 +37,11 @@ class UserFlagsController {
|
|
37 |
|
38 |
function getAll() {
|
39 |
$this->ensureLoaded();
|
40 |
-
|
|
|
|
|
|
|
|
|
41 |
}
|
42 |
|
43 |
function set($name, $value) {
|
12 |
|
13 |
/** @var array|null */
|
14 |
private $data = null;
|
15 |
+
|
16 |
/** @var array */
|
17 |
private $defaults;
|
18 |
|
37 |
|
38 |
function getAll() {
|
39 |
$this->ensureLoaded();
|
40 |
+
$data = $this->data;
|
41 |
+
if (!is_array($data)) {
|
42 |
+
$data = [];
|
43 |
+
}
|
44 |
+
return array_merge($this->defaults, $data);
|
45 |
}
|
46 |
|
47 |
function set($name, $value) {
|
lib/Statistics/GATracking.php
CHANGED
@@ -57,7 +57,7 @@ class GATracking {
|
|
57 |
foreach ($extracted_links as $extracted_link) {
|
58 |
if ($extracted_link['type'] !== NewsletterLinks::LINK_TYPE_URL) {
|
59 |
continue;
|
60 |
-
} elseif (strpos(parse_url($extracted_link['link'], PHP_URL_HOST), $internal_host) === false) {
|
61 |
// Process only internal links (i.e. pointing to current site)
|
62 |
continue;
|
63 |
}
|
57 |
foreach ($extracted_links as $extracted_link) {
|
58 |
if ($extracted_link['type'] !== NewsletterLinks::LINK_TYPE_URL) {
|
59 |
continue;
|
60 |
+
} elseif (strpos((string)parse_url($extracted_link['link'], PHP_URL_HOST), $internal_host) === false) {
|
61 |
// Process only internal links (i.e. pointing to current site)
|
62 |
continue;
|
63 |
}
|
lib/Statistics/Track/WooCommercePurchases.php
CHANGED
@@ -33,7 +33,11 @@ class WooCommercePurchases {
|
|
33 |
}
|
34 |
|
35 |
// limit clicks to 'USE_CLICKS_SINCE_DAYS_AGO' range before order has been created
|
36 |
-
$
|
|
|
|
|
|
|
|
|
37 |
$from->modify(-self::USE_CLICKS_SINCE_DAYS_AGO . ' days');
|
38 |
$to = $order->get_date_created();
|
39 |
|
@@ -74,7 +78,7 @@ class WooCommercePurchases {
|
|
74 |
}
|
75 |
|
76 |
$click = StatisticsClicks::findOne($cookie_data['statistics_clicks']);
|
77 |
-
if (!$click) {
|
78 |
return null;
|
79 |
}
|
80 |
|
33 |
}
|
34 |
|
35 |
// limit clicks to 'USE_CLICKS_SINCE_DAYS_AGO' range before order has been created
|
36 |
+
$from_date = $order->get_date_created();
|
37 |
+
if (is_null($from_date)) {
|
38 |
+
return;
|
39 |
+
}
|
40 |
+
$from = clone $from_date;
|
41 |
$from->modify(-self::USE_CLICKS_SINCE_DAYS_AGO . ' days');
|
42 |
$to = $order->get_date_created();
|
43 |
|
78 |
}
|
79 |
|
80 |
$click = StatisticsClicks::findOne($cookie_data['statistics_clicks']);
|
81 |
+
if (!$click instanceof StatisticsClicks) {
|
82 |
return null;
|
83 |
}
|
84 |
|
lib/Subscribers/ImportExport/Export/DynamicSubscribersGetter.php
CHANGED
@@ -43,7 +43,11 @@ class DynamicSubscribersGetter extends SubscribersGetter {
|
|
43 |
return [];
|
44 |
}
|
45 |
|
46 |
-
$
|
|
|
|
|
|
|
|
|
47 |
|
48 |
foreach ($filters as $filter) {
|
49 |
$subscribers = $filter->toSql($subscribers);
|
43 |
return [];
|
44 |
}
|
45 |
|
46 |
+
$segment = Segment::findOne($segment_id);
|
47 |
+
if (!$segment instanceof Segment) {
|
48 |
+
return [];
|
49 |
+
}
|
50 |
+
$name = $segment->name;
|
51 |
|
52 |
foreach ($filters as $filter) {
|
53 |
$subscribers = $filter->toSql($subscribers);
|
lib/Subscribers/ImportExport/Import/Import.php
CHANGED
@@ -156,6 +156,9 @@ class Import {
|
|
156 |
// if this is a custom column
|
157 |
if (in_array($column, $this->subscribers_custom_fields)) {
|
158 |
$custom_field = CustomField::findOne($column);
|
|
|
|
|
|
|
159 |
// validate date type
|
160 |
if ($custom_field->type === 'date') {
|
161 |
$validation_rule = 'datetime';
|
156 |
// if this is a custom column
|
157 |
if (in_array($column, $this->subscribers_custom_fields)) {
|
158 |
$custom_field = CustomField::findOne($column);
|
159 |
+
if (!$custom_field instanceof CustomField) {
|
160 |
+
continue;
|
161 |
+
}
|
162 |
// validate date type
|
163 |
if ($custom_field->type === 'date') {
|
164 |
$validation_rule = 'datetime';
|
lib/Tasks/Sending.php
CHANGED
@@ -47,11 +47,12 @@ class Sending {
|
|
47 |
];
|
48 |
|
49 |
private function __construct(ScheduledTask $task = null, SendingQueue $queue = null) {
|
50 |
-
if (
|
51 |
$task = ScheduledTask::create();
|
52 |
$task->type = self::TASK_TYPE;
|
53 |
$task->save();
|
54 |
-
|
|
|
55 |
$queue = SendingQueue::create();
|
56 |
$queue->newsletter_id = 0;
|
57 |
$queue->task_id = $task->id;
|
@@ -108,7 +109,7 @@ class Sending {
|
|
108 |
$queue = SendingQueue::where('newsletter_id', $newsletter_id)
|
109 |
->orderByDesc('updated_at')
|
110 |
->findOne();
|
111 |
-
if (!$queue) {
|
112 |
return false;
|
113 |
}
|
114 |
|
47 |
];
|
48 |
|
49 |
private function __construct(ScheduledTask $task = null, SendingQueue $queue = null) {
|
50 |
+
if (!$task instanceof ScheduledTask) {
|
51 |
$task = ScheduledTask::create();
|
52 |
$task->type = self::TASK_TYPE;
|
53 |
$task->save();
|
54 |
+
}
|
55 |
+
if (!$queue instanceof SendingQueue) {
|
56 |
$queue = SendingQueue::create();
|
57 |
$queue->newsletter_id = 0;
|
58 |
$queue->task_id = $task->id;
|
109 |
$queue = SendingQueue::where('newsletter_id', $newsletter_id)
|
110 |
->orderByDesc('updated_at')
|
111 |
->findOne();
|
112 |
+
if (!$queue instanceof SendingQueue) {
|
113 |
return false;
|
114 |
}
|
115 |
|
lib/Tasks/State.php
CHANGED
@@ -7,6 +7,7 @@ if (!defined('ABSPATH')) exit;
|
|
7 |
|
8 |
use Carbon\Carbon;
|
9 |
use MailPoet\Cron\Workers\Scheduler;
|
|
|
10 |
use MailPoet\Models\ScheduledTask;
|
11 |
use MailPoet\Models\SendingQueue;
|
12 |
use MailPoet\Newsletter\Url as NewsletterUrl;
|
@@ -84,10 +85,10 @@ class State
|
|
84 |
'id' => (int)$task->id,
|
85 |
'type' => $task->type,
|
86 |
'priority' => (int)$task->priority,
|
87 |
-
'updated_at' => Carbon::createFromTimeString($task->updated_at)->timestamp,
|
88 |
'scheduled_at' => $task->scheduled_at ? Carbon::createFromTimeString($task->scheduled_at)->timestamp : null,
|
89 |
'status' => $task->status,
|
90 |
-
'newsletter' => $queue && $newsletter ? [
|
91 |
'newsletter_id' => (int)$queue->newsletter_id,
|
92 |
'queue_id' => (int)$queue->id,
|
93 |
'subject' => $queue->newsletter_rendered_subject ?: $newsletter->subject,
|
7 |
|
8 |
use Carbon\Carbon;
|
9 |
use MailPoet\Cron\Workers\Scheduler;
|
10 |
+
use MailPoet\Models\Newsletter;
|
11 |
use MailPoet\Models\ScheduledTask;
|
12 |
use MailPoet\Models\SendingQueue;
|
13 |
use MailPoet\Newsletter\Url as NewsletterUrl;
|
85 |
'id' => (int)$task->id,
|
86 |
'type' => $task->type,
|
87 |
'priority' => (int)$task->priority,
|
88 |
+
'updated_at' => Carbon::createFromTimeString((string)$task->updated_at)->timestamp,
|
89 |
'scheduled_at' => $task->scheduled_at ? Carbon::createFromTimeString($task->scheduled_at)->timestamp : null,
|
90 |
'status' => $task->status,
|
91 |
+
'newsletter' => (($queue instanceof SendingQueue) && ($newsletter instanceof Newsletter)) ? [
|
92 |
'newsletter_id' => (int)$queue->newsletter_id,
|
93 |
'queue_id' => (int)$queue->id,
|
94 |
'subject' => $queue->newsletter_rendered_subject ?: $newsletter->subject,
|
lib/Util/Helpers.php
CHANGED
@@ -37,6 +37,9 @@ class Helpers {
|
|
37 |
static function getMaxPostSize($bytes = false) {
|
38 |
$maxPostSize = ini_get('post_max_size');
|
39 |
if (!$bytes) return $maxPostSize;
|
|
|
|
|
|
|
40 |
switch (substr($maxPostSize, -1)) {
|
41 |
case 'M':
|
42 |
case 'm':
|
37 |
static function getMaxPostSize($bytes = false) {
|
38 |
$maxPostSize = ini_get('post_max_size');
|
39 |
if (!$bytes) return $maxPostSize;
|
40 |
+
if ($maxPostSize === false) {
|
41 |
+
return 0;
|
42 |
+
}
|
43 |
switch (substr($maxPostSize, -1)) {
|
44 |
case 'M':
|
45 |
case 'm':
|
lib/Util/Security.php
CHANGED
@@ -24,7 +24,15 @@ class Security {
|
|
24 |
*/
|
25 |
static function generateRandomString($length = 5) {
|
26 |
$length = max(5, (int)$length);
|
27 |
-
$string = base_convert(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
28 |
return substr($string, 0, $length);
|
29 |
}
|
30 |
|
24 |
*/
|
25 |
static function generateRandomString($length = 5) {
|
26 |
$length = max(5, (int)$length);
|
27 |
+
$string = base_convert(
|
28 |
+
bin2hex(
|
29 |
+
random_bytes( // phpcs:ignore
|
30 |
+
(int)ceil(3 * $length / 4)
|
31 |
+
)
|
32 |
+
),
|
33 |
+
16,
|
34 |
+
36
|
35 |
+
);
|
36 |
return substr($string, 0, $length);
|
37 |
}
|
38 |
|
lib/Util/Sudzy/ValidModel.php
CHANGED
@@ -5,7 +5,7 @@ if (!defined('ABSPATH')) exit;
|
|
5 |
|
6 |
|
7 |
/**
|
8 |
-
* @method static
|
9 |
*/
|
10 |
abstract class ValidModel extends \Model {
|
11 |
protected $_validator = null; // Reference to Sudzy validator object
|
5 |
|
6 |
|
7 |
/**
|
8 |
+
* @method static static|bool create($data=null)
|
9 |
*/
|
10 |
abstract class ValidModel extends \Model {
|
11 |
protected $_validator = null; // Reference to Sudzy validator object
|
lib/Util/pQuery/pQuery.php
CHANGED
@@ -9,6 +9,12 @@ if (!defined('ABSPATH')) exit;
|
|
9 |
class pQuery extends \pQuery {
|
10 |
public static function parseStr($html) {
|
11 |
$parser = new Html5Parser($html);
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
return $parser->root;
|
13 |
}
|
14 |
}
|
9 |
class pQuery extends \pQuery {
|
10 |
public static function parseStr($html) {
|
11 |
$parser = new Html5Parser($html);
|
12 |
+
|
13 |
+
if (!$parser->root instanceof \pQuery\DomNode) {
|
14 |
+
// this condition shouldn't happen it is here only for PHPStan
|
15 |
+
throw new \Exception('Renderer is not configured correctly');
|
16 |
+
}
|
17 |
+
|
18 |
return $parser->root;
|
19 |
}
|
20 |
}
|
lib/WP/Functions.php
CHANGED
@@ -86,6 +86,10 @@ class Functions {
|
|
86 |
}
|
87 |
|
88 |
function addMenuPage($page_title, $menu_title, $capability, $menu_slug, callable $function = null, $icon_url = '', $position = null) {
|
|
|
|
|
|
|
|
|
89 |
return add_menu_page($page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position);
|
90 |
}
|
91 |
|
@@ -101,7 +105,7 @@ class Functions {
|
|
101 |
return add_shortcode($tag, $callback);
|
102 |
}
|
103 |
|
104 |
-
function addSubmenuPage($parent_slug, $page_title, $menu_title, $capability, $menu_slug, callable $function
|
105 |
return add_submenu_page($parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function);
|
106 |
}
|
107 |
|
@@ -259,7 +263,7 @@ class Functions {
|
|
259 |
}
|
260 |
|
261 |
/**
|
262 |
-
* @param int|
|
263 |
*/
|
264 |
function getTheAuthorMeta($field = '', $user_id = false) {
|
265 |
return get_the_author_meta($field, $user_id);
|
@@ -325,8 +329,8 @@ class Functions {
|
|
325 |
}
|
326 |
|
327 |
/**
|
328 |
-
* @param string|
|
329 |
-
* @param string|
|
330 |
*/
|
331 |
function loadPluginTextdomain($domain, $deprecated = false, $plugin_rel_path = false) {
|
332 |
return load_plugin_textdomain($domain, $deprecated, $plugin_rel_path);
|
86 |
}
|
87 |
|
88 |
function addMenuPage($page_title, $menu_title, $capability, $menu_slug, callable $function = null, $icon_url = '', $position = null) {
|
89 |
+
if (is_null($function)) {
|
90 |
+
$function = function () {
|
91 |
+
};
|
92 |
+
}
|
93 |
return add_menu_page($page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position);
|
94 |
}
|
95 |
|
105 |
return add_shortcode($tag, $callback);
|
106 |
}
|
107 |
|
108 |
+
function addSubmenuPage($parent_slug, $page_title, $menu_title, $capability, $menu_slug, callable $function) {
|
109 |
return add_submenu_page($parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function);
|
110 |
}
|
111 |
|
263 |
}
|
264 |
|
265 |
/**
|
266 |
+
* @param int|false $user_id
|
267 |
*/
|
268 |
function getTheAuthorMeta($field = '', $user_id = false) {
|
269 |
return get_the_author_meta($field, $user_id);
|
329 |
}
|
330 |
|
331 |
/**
|
332 |
+
* @param string|false $deprecated
|
333 |
+
* @param string|false $plugin_rel_path
|
334 |
*/
|
335 |
function loadPluginTextdomain($domain, $deprecated = false, $plugin_rel_path = false) {
|
336 |
return load_plugin_textdomain($domain, $deprecated, $plugin_rel_path);
|
mailpoet.php
CHANGED
@@ -5,7 +5,7 @@ if (!defined('ABSPATH')) exit;
|
|
5 |
|
6 |
/*
|
7 |
* Plugin Name: MailPoet 3 (New)
|
8 |
-
* Version: 3.40.
|
9 |
* Plugin URI: http://www.mailpoet.com
|
10 |
* Description: Create and send newsletters, post notifications and welcome emails from your WordPress.
|
11 |
* Author: MailPoet
|
@@ -19,7 +19,7 @@ if (!defined('ABSPATH')) exit;
|
|
19 |
*/
|
20 |
|
21 |
$mailpoet_plugin = [
|
22 |
-
'version' => '3.40.
|
23 |
'filename' => __FILE__,
|
24 |
'path' => dirname(__FILE__),
|
25 |
'autoloader' => dirname(__FILE__) . '/vendor/autoload.php',
|
5 |
|
6 |
/*
|
7 |
* Plugin Name: MailPoet 3 (New)
|
8 |
+
* Version: 3.40.1
|
9 |
* Plugin URI: http://www.mailpoet.com
|
10 |
* Description: Create and send newsletters, post notifications and welcome emails from your WordPress.
|
11 |
* Author: MailPoet
|
19 |
*/
|
20 |
|
21 |
$mailpoet_plugin = [
|
22 |
+
'version' => '3.40.1',
|
23 |
'filename' => __FILE__,
|
24 |
'path' => dirname(__FILE__),
|
25 |
'autoloader' => dirname(__FILE__) . '/vendor/autoload.php',
|
readme.txt
CHANGED
@@ -3,7 +3,7 @@ Contributors: mailpoet, wysija
|
|
3 |
Tags: email, email marketing, post notification, woocommerce emails, email automation, newsletter, newsletter builder, newsletter subscribers
|
4 |
Requires at least: 4.7
|
5 |
Tested up to: 5.2
|
6 |
-
Stable tag: 3.40.
|
7 |
Requires PHP: 5.6
|
8 |
License: GPLv3
|
9 |
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
@@ -159,6 +159,9 @@ Check our [Knowledge Base](https://kb.mailpoet.com) or contact us through our [s
|
|
159 |
|
160 |
== Changelog ==
|
161 |
|
|
|
|
|
|
|
162 |
= 3.40.0 - 2019-11-18 =
|
163 |
* Improved: newsletter editor performance;
|
164 |
* Fix: broken translation string.
|
3 |
Tags: email, email marketing, post notification, woocommerce emails, email automation, newsletter, newsletter builder, newsletter subscribers
|
4 |
Requires at least: 4.7
|
5 |
Tested up to: 5.2
|
6 |
+
Stable tag: 3.40.1
|
7 |
Requires PHP: 5.6
|
8 |
License: GPLv3
|
9 |
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
159 |
|
160 |
== Changelog ==
|
161 |
|
162 |
+
= 3.40.1 - 2019-11-25 =
|
163 |
+
* Improved: minor changes and fixes.
|
164 |
+
|
165 |
= 3.40.0 - 2019-11-18 =
|
166 |
* Improved: newsletter editor performance;
|
167 |
* Fix: broken translation string.
|
vendor-prefixed/autoload.php
CHANGED
@@ -7,4 +7,4 @@ if (!defined('ABSPATH')) exit;
|
|
7 |
|
8 |
// autoload.php @generated by Composer
|
9 |
require_once __DIR__ . '/composer/autoload_real.php';
|
10 |
-
return \MailPoetVendor\
|
7 |
|
8 |
// autoload.php @generated by Composer
|
9 |
require_once __DIR__ . '/composer/autoload_real.php';
|
10 |
+
return \MailPoetVendor\ComposerAutoloaderInit0abe538ed3a9e3511c442b8bbd1a7759::getLoader();
|
vendor/autoload.php
CHANGED
@@ -7,4 +7,4 @@ if (!defined('ABSPATH')) exit;
|
|
7 |
|
8 |
require_once __DIR__ . '/composer/autoload_real.php';
|
9 |
|
10 |
-
return
|
7 |
|
8 |
require_once __DIR__ . '/composer/autoload_real.php';
|
9 |
|
10 |
+
return ComposerAutoloaderInitea8c7349f3cbaa890380efd17f034967::getLoader();
|
vendor/composer/autoload_real.php
CHANGED
@@ -5,7 +5,7 @@ if (!defined('ABSPATH')) exit;
|
|
5 |
|
6 |
// autoload_real.php @generated by Composer
|
7 |
|
8 |
-
class
|
9 |
{
|
10 |
private static $loader;
|
11 |
|
@@ -22,15 +22,15 @@ class ComposerAutoloaderInitd342b8f04dbb1722fcae2893ad583c45
|
|
22 |
return self::$loader;
|
23 |
}
|
24 |
|
25 |
-
spl_autoload_register(array('
|
26 |
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
27 |
-
spl_autoload_unregister(array('
|
28 |
|
29 |
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
30 |
if ($useStaticLoader) {
|
31 |
require_once __DIR__ . '/autoload_static.php';
|
32 |
|
33 |
-
call_user_func(\Composer\Autoload\
|
34 |
} else {
|
35 |
$map = require __DIR__ . '/autoload_namespaces.php';
|
36 |
foreach ($map as $namespace => $path) {
|
@@ -51,19 +51,19 @@ class ComposerAutoloaderInitd342b8f04dbb1722fcae2893ad583c45
|
|
51 |
$loader->register(true);
|
52 |
|
53 |
if ($useStaticLoader) {
|
54 |
-
$includeFiles = Composer\Autoload\
|
55 |
} else {
|
56 |
$includeFiles = require __DIR__ . '/autoload_files.php';
|
57 |
}
|
58 |
foreach ($includeFiles as $fileIdentifier => $file) {
|
59 |
-
|
60 |
}
|
61 |
|
62 |
return $loader;
|
63 |
}
|
64 |
}
|
65 |
|
66 |
-
function
|
67 |
{
|
68 |
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
69 |
require $file;
|
5 |
|
6 |
// autoload_real.php @generated by Composer
|
7 |
|
8 |
+
class ComposerAutoloaderInitea8c7349f3cbaa890380efd17f034967
|
9 |
{
|
10 |
private static $loader;
|
11 |
|
22 |
return self::$loader;
|
23 |
}
|
24 |
|
25 |
+
spl_autoload_register(array('ComposerAutoloaderInitea8c7349f3cbaa890380efd17f034967', 'loadClassLoader'), true, true);
|
26 |
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
27 |
+
spl_autoload_unregister(array('ComposerAutoloaderInitea8c7349f3cbaa890380efd17f034967', 'loadClassLoader'));
|
28 |
|
29 |
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
30 |
if ($useStaticLoader) {
|
31 |
require_once __DIR__ . '/autoload_static.php';
|
32 |
|
33 |
+
call_user_func(\Composer\Autoload\ComposerStaticInitea8c7349f3cbaa890380efd17f034967::getInitializer($loader));
|
34 |
} else {
|
35 |
$map = require __DIR__ . '/autoload_namespaces.php';
|
36 |
foreach ($map as $namespace => $path) {
|
51 |
$loader->register(true);
|
52 |
|
53 |
if ($useStaticLoader) {
|
54 |
+
$includeFiles = Composer\Autoload\ComposerStaticInitea8c7349f3cbaa890380efd17f034967::$files;
|
55 |
} else {
|
56 |
$includeFiles = require __DIR__ . '/autoload_files.php';
|
57 |
}
|
58 |
foreach ($includeFiles as $fileIdentifier => $file) {
|
59 |
+
composerRequireea8c7349f3cbaa890380efd17f034967($fileIdentifier, $file);
|
60 |
}
|
61 |
|
62 |
return $loader;
|
63 |
}
|
64 |
}
|
65 |
|
66 |
+
function composerRequireea8c7349f3cbaa890380efd17f034967($fileIdentifier, $file)
|
67 |
{
|
68 |
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
69 |
require $file;
|
vendor/composer/autoload_static.php
CHANGED
@@ -7,7 +7,7 @@ namespace Composer\Autoload;
|
|
7 |
if (!defined('ABSPATH')) exit;
|
8 |
|
9 |
|
10 |
-
class
|
11 |
{
|
12 |
public static $files = array (
|
13 |
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
|
@@ -1661,10 +1661,10 @@ class ComposerStaticInitd342b8f04dbb1722fcae2893ad583c45
|
|
1661 |
public static function getInitializer(ClassLoader $loader)
|
1662 |
{
|
1663 |
return \Closure::bind(function () use ($loader) {
|
1664 |
-
$loader->prefixLengthsPsr4 =
|
1665 |
-
$loader->prefixDirsPsr4 =
|
1666 |
-
$loader->fallbackDirsPsr4 =
|
1667 |
-
$loader->classMap =
|
1668 |
|
1669 |
}, null, ClassLoader::class);
|
1670 |
}
|
7 |
if (!defined('ABSPATH')) exit;
|
8 |
|
9 |
|
10 |
+
class ComposerStaticInitea8c7349f3cbaa890380efd17f034967
|
11 |
{
|
12 |
public static $files = array (
|
13 |
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
|
1661 |
public static function getInitializer(ClassLoader $loader)
|
1662 |
{
|
1663 |
return \Closure::bind(function () use ($loader) {
|
1664 |
+
$loader->prefixLengthsPsr4 = ComposerStaticInitea8c7349f3cbaa890380efd17f034967::$prefixLengthsPsr4;
|
1665 |
+
$loader->prefixDirsPsr4 = ComposerStaticInitea8c7349f3cbaa890380efd17f034967::$prefixDirsPsr4;
|
1666 |
+
$loader->fallbackDirsPsr4 = ComposerStaticInitea8c7349f3cbaa890380efd17f034967::$fallbackDirsPsr4;
|
1667 |
+
$loader->classMap = ComposerStaticInitea8c7349f3cbaa890380efd17f034967::$classMap;
|
1668 |
|
1669 |
}, null, ClassLoader::class);
|
1670 |
}
|