PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
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 5 months ago Automation.php 2 years ago AutomationAnalytics.php 2 months ago AutomationEditor.php 2 months ago AutomationFlowEmbed.php 5 months ago AutomationPreviewEmbed.php 2 months ago AutomationTemplates.php 2 years ago CustomFields.php 2 months ago DynamicSegments.php 2 months ago ExperimentalFeatures.php 3 years ago FormEditor.php 1 week ago Forms.php 2 months ago Help.php 2 months ago Homepage.php 2 years ago Landingpage.php 2 years ago Logs.php 1 month ago NewsletterEditor.php 2 months ago Newsletters.php 2 months ago Settings.php 5 months ago StaticSegments.php 2 months ago Subscribers.php 1 week ago SubscribersExport.php 3 years ago SubscribersImport.php 2 months ago Tags.php 2 months ago Upgrade.php 1 year ago WelcomeWizard.php 2 months ago WooCommerceSetup.php 2 months ago index.php 3 years ago
Help.php
172 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']['tasksStatusCounts'] = $this->scheduledTasksRepository->getCountsPerStatus();
87
88 $scheduledTasks = $this->scheduledTasksRepository->getLatestTasks(SendingQueue::TASK_TYPE);
89 $systemStatusData['queueStatus']['latestTasks'] = array_map(fn($task) => $this->buildTaskData($task), $scheduledTasks);
90
91 $this->pageRenderer->displayPage(
92 'help.html',
93 [
94 'systemInfoData' => $systemInfoData,
95 'systemStatusData' => $systemStatusData,
96 'actionSchedulerData' => $this->getActionSchedulerData(),
97 ]
98 );
99 }
100
101 private function getActionSchedulerData(): ?array {
102 if (!class_exists(\ActionScheduler_Store::class)) {
103 return null;
104 }
105 $actionSchedulerData = [];
106 $actionSchedulerData['version'] = \ActionScheduler_Versions::instance()->latest_version();
107 $actionSchedulerData['storage'] = str_replace('ActionScheduler_', '', get_class(\ActionScheduler_Store::instance()));
108 $actionSchedulerData['latestTrigger'] = $this->getLatestActionSchedulerActionDate(DaemonTrigger::NAME);
109 $actionSchedulerData['latestCompletedTrigger'] = $this->getLatestActionSchedulerActionDate(DaemonTrigger::NAME, 'complete');
110 $actionSchedulerData['latestCompletedRun'] = $this->getLatestActionSchedulerActionDate(DaemonRun::NAME, 'complete');
111 return $actionSchedulerData;
112 }
113
114 private function getLatestActionSchedulerActionDate(string $hook, ?string $status = null): ?string {
115 $query = [
116 'per_page' => 1,
117 'order' => 'DESC',
118 'hook' => $hook,
119 ];
120 if ($status) {
121 $query['status'] = $status;
122 }
123 $store = \ActionScheduler_Store::instance();
124 $action = $store->query_actions($query);
125 if (!empty($action)) {
126 $dateObject = $store->get_date($action[0]);
127 return $dateObject->format('Y-m-d H:i:s');
128 }
129 return null;
130 }
131
132 public function buildTaskData(ScheduledTaskEntity $task): array {
133 $queue = $newsletter = $subscriber = null;
134 if ($task->getType() === SendingQueue::TASK_TYPE) {
135 $queue = $this->sendingQueuesRepository->findOneBy(['task' => $task]);
136 $newsletter = $queue ? $queue->getNewsletter() : null;
137 $subscribers = $task->getSubscribers();
138 // We only show subscriber's email for 1:1 emails (e.g. automations) and not bulk campaigns
139 if ($subscribers->count() === 1) {
140 $subscriber = $subscribers->first() ? $subscribers->first()->getSubscriber() : null;
141 }
142 }
143
144 return [
145 'id' => $task->getId(),
146 'type' => $task->getType(),
147 'priority' => $task->getPriority(),
148 'updatedAt' => $task->getUpdatedAt() ?
149 $task->getUpdatedAt()->format(DateTime::DEFAULT_DATE_TIME_FORMAT) : null,
150 'scheduledAt' => $task->getScheduledAt() ?
151 $task->getScheduledAt()->format(DateTime::DEFAULT_DATE_TIME_FORMAT)
152 : null,
153 'cancelledAt' => $task->getCancelledAt() ?
154 $task->getCancelledAt()->format(DateTime::DEFAULT_DATE_TIME_FORMAT)
155 : null,
156 'status' => $task->getStatus(),
157 'newsletter' => $queue && $newsletter ? [
158 'newsletterId' => $newsletter->getId(),
159 'queueId' => $queue->getId(),
160 'subject' => $queue->getNewsletterRenderedSubject() ?: $newsletter->getSubject(),
161 'previewUrl' => $this->newsletterUrl->getViewInBrowserUrl($newsletter, null, $queue),
162 ] : [
163 'newsletterId' => null,
164 'queueId' => null,
165 'subject' => null,
166 'previewUrl' => null,
167 ],
168 'subscriberEmail' => $subscriber ? $subscriber->getEmail() : null,
169 ];
170 }
171 }
172