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 / PageRenderer.php
mailpoet / lib / AdminPages Last commit date
Pages 1 week ago AssetsController.php 2 weeks ago PageRenderer.php 2 months ago index.php 3 years ago
PageRenderer.php
255 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\AdminPages;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\AdminPages\Pages\WelcomeWizard;
9 use MailPoet\Cache\TransientCache;
10 use MailPoet\Config\Installer;
11 use MailPoet\Config\Menu;
12 use MailPoet\Config\Renderer;
13 use MailPoet\Config\ServicesChecker;
14 use MailPoet\Cron\Workers\SubscribersCountCacheRecalculation;
15 use MailPoet\Entities\SegmentEntity;
16 use MailPoet\Entities\TagEntity;
17 use MailPoet\Features\FeaturesController;
18 use MailPoet\Referrals\ReferralDetector;
19 use MailPoet\Segments\SegmentsRepository;
20 use MailPoet\Services\Bridge;
21 use MailPoet\Settings\SettingsController;
22 use MailPoet\Settings\TrackingConfig;
23 use MailPoet\Settings\UserFlagsController;
24 use MailPoet\Tags\TagRepository;
25 use MailPoet\Tracy\DIPanel\DIPanel;
26 use MailPoet\Util\Installation;
27 use MailPoet\Util\License\Features\CapabilitiesManager;
28 use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
29 use MailPoet\Util\License\License;
30 use MailPoet\WooCommerce;
31 use MailPoet\WP\Functions as WPFunctions;
32 use MailPoet\WP\Notice as WPNotice;
33 use MailPoetVendor\Carbon\Carbon;
34 use Tracy\Debugger;
35
36 class PageRenderer {
37 /** @var Bridge */
38 private $bridge;
39
40 /** @var Renderer */
41 private $renderer;
42
43 /** @var ServicesChecker */
44 private $servicesChecker;
45
46 /** @var FeaturesController */
47 private $featuresController;
48
49 /** @var Installation */
50 private $installation;
51
52 /** @var SettingsController */
53 private $settings;
54
55 /** @var UserFlagsController */
56 private $userFlags;
57
58 /** @var SegmentsRepository */
59 private $segmentRepository;
60
61 private $tagRepository;
62
63 /** @var SubscribersCountCacheRecalculation */
64 private $subscribersCountCacheRecalculation;
65
66 /** @var SubscribersFeature */
67 private $subscribersFeature;
68
69 /** @var TrackingConfig */
70 private $trackingConfig;
71
72 /** @var TransientCache */
73 private $transientCache;
74
75 /** @var WPFunctions */
76 private $wp;
77
78 /*** @var AssetsController */
79 private $assetsController;
80
81 /** @var WooCommerce\Helper */
82 private $wooCommerceHelper;
83
84 /** @var WooCommerce\WooCommerceSubscriptions\Helper */
85 private $wooCommerceSubscriptionsHelper;
86
87 private WooCommerce\WooCommerceBookings\Helper $wooCommerceBookingsHelper;
88
89 private CapabilitiesManager $capabilitiesManager;
90
91 public function __construct(
92 Bridge $bridge,
93 Renderer $renderer,
94 ServicesChecker $servicesChecker,
95 FeaturesController $featuresController,
96 Installation $installation,
97 SettingsController $settings,
98 UserFlagsController $userFlags,
99 SegmentsRepository $segmentRepository,
100 TagRepository $tagRepository,
101 SubscribersCountCacheRecalculation $subscribersCountCacheRecalculation,
102 SubscribersFeature $subscribersFeature,
103 TrackingConfig $trackingConfig,
104 TransientCache $transientCache,
105 WPFunctions $wp,
106 AssetsController $assetsController,
107 WooCommerce\Helper $wooCommerceHelper,
108 WooCommerce\WooCommerceSubscriptions\Helper $wooCommerceSubscriptionsHelper,
109 WooCommerce\WooCommerceBookings\Helper $wooCommerceBookingsHelper,
110 CapabilitiesManager $capabilitiesManager
111 ) {
112 $this->bridge = $bridge;
113 $this->renderer = $renderer;
114 $this->servicesChecker = $servicesChecker;
115 $this->featuresController = $featuresController;
116 $this->installation = $installation;
117 $this->settings = $settings;
118 $this->userFlags = $userFlags;
119 $this->segmentRepository = $segmentRepository;
120 $this->tagRepository = $tagRepository;
121 $this->subscribersCountCacheRecalculation = $subscribersCountCacheRecalculation;
122 $this->subscribersFeature = $subscribersFeature;
123 $this->trackingConfig = $trackingConfig;
124 $this->transientCache = $transientCache;
125 $this->wp = $wp;
126 $this->assetsController = $assetsController;
127 $this->wooCommerceHelper = $wooCommerceHelper;
128 $this->wooCommerceSubscriptionsHelper = $wooCommerceSubscriptionsHelper;
129 $this->wooCommerceBookingsHelper = $wooCommerceBookingsHelper;
130 $this->capabilitiesManager = $capabilitiesManager;
131 }
132
133 /**
134 * Set common data for template and display template
135 * @param string $template
136 * @param array $data
137 */
138 public function displayPage($template, array $data = []) {
139 $installer = new Installer(Installer::PREMIUM_PLUGIN_SLUG);
140 $premiumDownloadUrl = $this->subscribersFeature->hasValidPremiumKey()
141 ? $installer->generatePluginDownloadUrl()
142 : null;
143
144 $wpSegment = $this->segmentRepository->getWPUsersSegment();
145 $wpSegmentState = ($wpSegment instanceof SegmentEntity) && $wpSegment->getDeletedAt() === null ?
146 SegmentEntity::SEGMENT_ENABLED : SegmentEntity::SEGMENT_DISABLED;
147 $installedAtDiff = (new \DateTime($this->settings->get('installed_at')))->diff(new \DateTime());
148 $subscriberCount = $this->subscribersFeature->getSubscribersCount();
149 $subscribersCacheCreatedAt = Carbon::now();
150 if ($this->subscribersFeature->isSubscribersCountEnoughForCache($subscriberCount)) {
151 $subscribersCacheCreatedAt = $this->transientCache->getOldestCreatedAt(TransientCache::SUBSCRIBERS_STATISTICS_COUNT_KEY) ?: Carbon::now();
152 }
153
154 $defaults = [
155 'current_page' => sanitize_text_field(wp_unslash(is_string($_GET['page'] ?? null) ? $_GET['page'] : '')),
156 'site_name' => $this->wp->wpSpecialcharsDecode($this->wp->getOption('blogname'), ENT_QUOTES),
157 'main_page' => Menu::MAIN_PAGE_SLUG,
158 'site_url' => $this->wp->siteUrl(),
159 'site_address' => $this->wp->wpParseUrl($this->wp->homeUrl(), PHP_URL_HOST),
160 'feature_flags' => $this->featuresController->getAllFlags(),
161 'referral_id' => $this->settings->get(ReferralDetector::REFERRAL_SETTING_NAME),
162 'mailpoet_api_key_state' => $this->settings->get('mta.mailpoet_api_key_state'),
163 'mta_method' => $this->settings->get('mta.method'),
164 'premium_key_state' => $this->settings->get('premium.premium_key_state'),
165 'wp_segment_state' => $wpSegmentState,
166 'tracking_config' => $this->trackingConfig->getConfig(),
167 'is_new_user' => $this->installation->isNewInstallation(),
168 'installed_days_ago' => (int)$installedAtDiff->format('%a'),
169 'deactivate_subscriber_after_inactive_days' => $this->settings->get('deactivate_subscriber_after_inactive_days'),
170 'send_transactional_emails' => (bool)$this->settings->get('send_transactional_emails'),
171 'transactional_emails_opt_in_notice_dismissed' => (bool)$this->userFlags->get('transactional_emails_opt_in_notice_dismissed'),
172 'track_wizard_loaded_via_woocommerce' => (bool)$this->settings->get(WelcomeWizard::TRACK_LOADDED_VIA_WOOCOMMERCE_SETTING_NAME),
173 'track_wizard_loaded_via_woocommerce_marketing_dashboard' => (bool)$this->settings->get(WelcomeWizard::TRACK_LOADDED_VIA_WOOCOMMERCE_MARKETING_DASHBOARD_SETTING_NAME),
174 // @phpstan-ignore-next-line function.alreadyNarrowedType -- is_callable() detects functions disabled at runtime via disable_functions
175 'mail_function_enabled' => function_exists('mail') && is_callable('mail'),
176 'admin_plugins_url' => WPFunctions::get()->adminUrl('plugins.php'),
177
178 // Premium & plan upgrade info
179 'current_wp_user_email' => $this->wp->wpGetCurrentUser()->user_email,
180 'link_premium' => $this->wp->getSiteUrl(null, '/wp-admin/admin.php?page=mailpoet-upgrade'),
181 'premium_plugin_installed' => Installer::isPluginInstalled(Installer::PREMIUM_PLUGIN_SLUG),
182 'premium_plugin_active' => $this->servicesChecker->isPremiumPluginActive(),
183 'premium_plugin_download_url' => $premiumDownloadUrl,
184 'premium_plugin_activation_url' => $installer->generatePluginActivationUrl(Installer::PREMIUM_PLUGIN_PATH),
185 'has_valid_api_key' => $this->subscribersFeature->hasValidApiKey(),
186 'has_valid_premium_key' => $this->subscribersFeature->hasValidPremiumKey(),
187 'has_premium_support' => $this->subscribersFeature->hasPremiumSupport(),
188 'has_mss_key_specified' => Bridge::isMSSKeySpecified(),
189 'mss_key_invalid' => $this->servicesChecker->isMailPoetAPIKeyValid() === false,
190 'mss_key_valid' => $this->subscribersFeature->hasValidMssKey(),
191 'mss_key_pending_approval' => $this->servicesChecker->isMailPoetAPIKeyPendingApproval(),
192 'mss_active' => $this->bridge->isMailpoetSendingServiceEnabled(),
193 'plugin_partial_key' => $this->servicesChecker->generatePartialApiKey(),
194 'subscriber_count' => $subscriberCount,
195 'subscribers_counts_cache_created_at' => $subscribersCacheCreatedAt->format('Y-m-d\TH:i:sO'),
196 'subscribers_limit' => $this->subscribersFeature->getSubscribersLimit(),
197 'subscribers_limit_reached' => $this->subscribersFeature->check(),
198 'email_volume_limit' => $this->subscribersFeature->getEmailVolumeLimit(),
199 'email_volume_limit_reached' => $this->subscribersFeature->checkEmailVolumeLimitIsReached(),
200 'capabilities' => $this->capabilitiesManager->getCapabilities(),
201 'tier' => $this->capabilitiesManager->getTier(),
202 'urls' => [
203 'automationListing' => admin_url('admin.php?page=mailpoet-automation'),
204 'automationEditor' => admin_url('admin.php?page=mailpoet-automation-editor'),
205 'automationTemplates' => admin_url('admin.php?page=mailpoet-automation-templates'),
206 'automationAnalytics' => admin_url('admin.php?page=mailpoet-automation-analytics'),
207 ],
208 'woocommerce_store_config' => $this->wooCommerceHelper->isWooCommerceActive() ? $this->wooCommerceHelper->getWoocommerceStoreConfig() : null,
209 'tags' => array_map(function (TagEntity $tag): array {
210 return [
211 'id' => $tag->getId(),
212 'name' => $tag->getName(),
213 ];
214 }, $this->tagRepository->findAll()),
215 'display_chatbot_widget' => $this->displayChatBotWidget(),
216 'is_woocommerce_subscriptions_active' => $this->wooCommerceSubscriptionsHelper->isWooCommerceSubscriptionsActive(),
217 'is_woocommerce_bookings_active' => $this->wooCommerceBookingsHelper->isWooCommerceBookingsActive(),
218 'cron_trigger_method' => $this->settings->get('cron_trigger.method'),
219 ];
220
221 if (!$defaults['premium_plugin_active']) {
222 $defaults['free_premium_subscribers_limit'] = License::FREE_PREMIUM_SUBSCRIBERS_LIMIT;
223 }
224
225 try {
226 if (
227 class_exists(Debugger::class)
228 && class_exists(DIPanel::class)
229 ) {
230 DIPanel::init();
231 }
232 if ($this->wp->isAdmin() && $this->subscribersCountCacheRecalculation->shouldBeScheduled()) {
233 $this->subscribersCountCacheRecalculation->schedule();
234 }
235
236 // If the page didn't enqueue any assets, this will act as a fallback.
237 // If some assets were enqueued, this won't change the queue ordering.
238 $this->assetsController->setupAdminPagesDependencies();
239 $this->wp->doAction('mailpoet_styles_admin_after');
240
241 // We are in control of the template and the data can be considered safe at this point
242 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
243 echo $this->renderer->render($template, $data + $defaults);
244 } catch (\Exception $e) {
245 $notice = new WPNotice(WPNotice::TYPE_ERROR, $e->getMessage());
246 $notice->displayWPNotice();
247 }
248 }
249
250 public function displayChatBotWidget(): bool {
251 $display = $this->wp->applyFilters('mailpoet_display_docsbot_widget', $this->settings->get('3rd_party_libs.enabled') === '1');
252 return (bool)$display;
253 }
254 }
255