PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / trunk
MailPoet – Newsletters, Email Marketing, and Automation vtrunk
5.37.0 5.36.1 5.36.0 5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / AdminPages / Pages / Help.php
mailpoet / lib / AdminPages / Pages Last commit date
AbstractAutomationEmbed.php 6 months ago Automation.php 2 years ago AutomationAnalytics.php 3 months ago AutomationEditor.php 3 months ago AutomationFlowEmbed.php 7 months ago AutomationPreviewEmbed.php 3 months ago AutomationTemplates.php 2 years ago CustomFields.php 3 months ago DynamicSegments.php 3 months ago ExperimentalFeatures.php 3 years ago FormEditor.php 23 hours ago Forms.php 3 months ago Help.php 23 hours ago Homepage.php 2 years ago Landingpage.php 2 years ago Logs.php 2 months ago NewsletterEditor.php 23 hours ago Newsletters.php 3 months ago Settings.php 6 months ago StaticSegments.php 3 months ago Subscribers.php 1 week ago SubscribersExport.php 3 years ago SubscribersImport.php 3 months ago Tags.php 4 months ago Upgrade.php 1 year ago WelcomeWizard.php 3 months ago WooCommerceSetup.php 3 months ago index.php 3 years ago
Help.php
173 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\AdminPages\Pages;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\AdminPages\PageRenderer;
9 use MailPoet\Cron\ActionScheduler\Actions\DaemonRun;
10 use MailPoet\Cron\ActionScheduler\Actions\DaemonTrigger;
11 use MailPoet\Cron\CronHelper;
12 use MailPoet\Cron\Workers\SendingQueue\SendingQueue;
13 use MailPoet\Entities\ScheduledTaskEntity;
14 use MailPoet\Mailer\MailerLog;
15 use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
16 use MailPoet\Newsletter\Sending\SendingQueuesRepository;
17 use MailPoet\Newsletter\Url as NewsletterURL;
18 use MailPoet\Router\Endpoints\CronDaemon;
19 use MailPoet\Services\Bridge;
20 use MailPoet\SystemReport\SystemReportCollector;
21 use MailPoet\WP\DateTime;
22 use MailPoet\WP\Functions as WPFunctions;
23
24 class Help {
25 private PageRenderer $pageRenderer;
26 private CronHelper $cronHelper;
27 private SystemReportCollector $systemReportCollector;
28 private Bridge $bridge;
29 private ScheduledTasksRepository $scheduledTasksRepository;
30 private SendingQueuesRepository $sendingQueuesRepository;
31 private NewsletterURL $newsletterUrl;
32
33 public function __construct(
34 PageRenderer $pageRenderer,
35 CronHelper $cronHelper,
36 SystemReportCollector $systemReportCollector,
37 Bridge $bridge,
38 ScheduledTasksRepository $scheduledTasksRepository,
39 SendingQueuesRepository $sendingQueuesRepository,
40 NewsletterURL $newsletterUrl
41 ) {
42 $this->pageRenderer = $pageRenderer;
43 $this->cronHelper = $cronHelper;
44 $this->systemReportCollector = $systemReportCollector;
45 $this->bridge = $bridge;
46 $this->scheduledTasksRepository = $scheduledTasksRepository;
47 $this->sendingQueuesRepository = $sendingQueuesRepository;
48 $this->newsletterUrl = $newsletterUrl;
49 }
50
51 public function render() {
52 /**
53 * Filter the system info.
54 *
55 * @param array<string, string> $systemInfoData The system info data array.
56 */
57 $systemInfoData = WPFunctions::get()->applyFilters('mailpoet_system_info_data', $this->systemReportCollector->getData(true));
58
59 try {
60 $cronPingUrl = $this->cronHelper->getCronUrl(CronDaemon::ACTION_PING);
61 $cronPingResponse = $this->systemReportCollector->getCronPingResponse();
62 } catch (\Exception $e) {
63 $cronPingResponse = __('Can‘t generate cron URL.', 'mailpoet') . ' (' . $e->getMessage() . ')';
64 $cronPingUrl = $cronPingResponse;
65 }
66
67 $mailerLog = MailerLog::getMailerLog();
68 $mailerLog['sent'] = MailerLog::sentSince();
69 $bridgePingResponse = $this->systemReportCollector->getBridgePingResponse();
70 $systemStatusData = [
71 'cron' => [
72 'url' => $cronPingUrl,
73 'isReachable' => $this->cronHelper->validatePingResponse($cronPingResponse),
74 'pingResponse' => $cronPingResponse,
75 ],
76 'mss' => [
77 'enabled' => $this->bridge->isMailpoetSendingServiceEnabled(),
78 'isReachable' => $this->bridge->validateBridgePingResponse($bridgePingResponse),
79 ],
80 'cronStatus' => $this->cronHelper->getDaemon(),
81 'queueStatus' => $mailerLog,
82 'activePlugins' => $this->systemReportCollector->getActivePluginsData(),
83 ];
84
85 $systemStatusData['cronStatus']['accessible'] = $this->cronHelper->isDaemonAccessible();
86 $systemStatusData['queueStatus']['sendingLimitReached'] = MailerLog::isSendingLimitReached();
87 $systemStatusData['queueStatus']['tasksStatusCounts'] = $this->scheduledTasksRepository->getCountsPerStatus();
88
89 $scheduledTasks = $this->scheduledTasksRepository->getLatestTasks(SendingQueue::TASK_TYPE);
90 $systemStatusData['queueStatus']['latestTasks'] = array_map(fn($task) => $this->buildTaskData($task), $scheduledTasks);
91
92 $this->pageRenderer->displayPage(
93 'help.html',
94 [
95 'systemInfoData' => $systemInfoData,
96 'systemStatusData' => $systemStatusData,
97 'actionSchedulerData' => $this->getActionSchedulerData(),
98 ]
99 );
100 }
101
102 private function getActionSchedulerData(): ?array {
103 if (!class_exists(\ActionScheduler_Store::class)) {
104 return null;
105 }
106 $actionSchedulerData = [];
107 $actionSchedulerData['version'] = \ActionScheduler_Versions::instance()->latest_version();
108 $actionSchedulerData['storage'] = str_replace('ActionScheduler_', '', get_class(\ActionScheduler_Store::instance()));
109 $actionSchedulerData['latestTrigger'] = $this->getLatestActionSchedulerActionDate(DaemonTrigger::NAME);
110 $actionSchedulerData['latestCompletedTrigger'] = $this->getLatestActionSchedulerActionDate(DaemonTrigger::NAME, 'complete');
111 $actionSchedulerData['latestCompletedRun'] = $this->getLatestActionSchedulerActionDate(DaemonRun::NAME, 'complete');
112 return $actionSchedulerData;
113 }
114
115 private function getLatestActionSchedulerActionDate(string $hook, ?string $status = null): ?string {
116 $query = [
117 'per_page' => 1,
118 'order' => 'DESC',
119 'hook' => $hook,
120 ];
121 if ($status) {
122 $query['status'] = $status;
123 }
124 $store = \ActionScheduler_Store::instance();
125 $action = $store->query_actions($query);
126 if (!empty($action)) {
127 $dateObject = $store->get_date($action[0]);
128 return $dateObject->format('Y-m-d H:i:s');
129 }
130 return null;
131 }
132
133 public function buildTaskData(ScheduledTaskEntity $task): array {
134 $queue = $newsletter = $subscriber = null;
135 if ($task->getType() === SendingQueue::TASK_TYPE) {
136 $queue = $this->sendingQueuesRepository->findOneBy(['task' => $task]);
137 $newsletter = $queue ? $queue->getNewsletter() : null;
138 $subscribers = $task->getSubscribers();
139 // We only show subscriber's email for 1:1 emails (e.g. automations) and not bulk campaigns
140 if ($subscribers->count() === 1) {
141 $subscriber = $subscribers->first() ? $subscribers->first()->getSubscriber() : null;
142 }
143 }
144
145 return [
146 'id' => $task->getId(),
147 'type' => $task->getType(),
148 'priority' => $task->getPriority(),
149 'updatedAt' => $task->getUpdatedAt() ?
150 $task->getUpdatedAt()->format(DateTime::DEFAULT_DATE_TIME_FORMAT) : null,
151 'scheduledAt' => $task->getScheduledAt() ?
152 $task->getScheduledAt()->format(DateTime::DEFAULT_DATE_TIME_FORMAT)
153 : null,
154 'cancelledAt' => $task->getCancelledAt() ?
155 $task->getCancelledAt()->format(DateTime::DEFAULT_DATE_TIME_FORMAT)
156 : null,
157 'status' => $task->getStatus(),
158 'newsletter' => $queue && $newsletter ? [
159 'newsletterId' => $newsletter->getId(),
160 'queueId' => $queue->getId(),
161 'subject' => $queue->getNewsletterRenderedSubject() ?: $newsletter->getSubject(),
162 'previewUrl' => $this->newsletterUrl->getViewInBrowserUrl($newsletter, null, $queue),
163 ] : [
164 'newsletterId' => null,
165 'queueId' => null,
166 'subject' => null,
167 'previewUrl' => null,
168 ],
169 'subscriberEmail' => $subscriber ? $subscriber->getEmail() : null,
170 ];
171 }
172 }
173