geno/wp-content/plugins/mailpoet/lib/Config/Shortcodes.php
2024-02-01 11:54:18 +00:00

279 lines
8.6 KiB
PHP

<?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
namespace MailPoet\Config;
if (!defined('ABSPATH')) exit;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Form\Widget;
use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Newsletter\Shortcodes\Categories\Date;
use MailPoet\Newsletter\Shortcodes\Categories\Link;
use MailPoet\Newsletter\Shortcodes\Categories\Newsletter;
use MailPoet\Newsletter\Shortcodes\Categories\Site;
use MailPoet\Newsletter\Shortcodes\Categories\Subscriber as SubscriberCategory;
use MailPoet\Newsletter\Shortcodes\Shortcodes as NewsletterShortcodes;
use MailPoet\Newsletter\Url as NewsletterUrl;
use MailPoet\Segments\SegmentSubscribersRepository;
use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\Subscription\Pages;
use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Carbon\CarbonImmutable;
class Shortcodes {
/** @var Pages */
private $subscriptionPages;
/** @var WPFunctions */
private $wp;
/** @var SegmentSubscribersRepository */
private $segmentSubscribersRepository;
/** @var SubscribersRepository */
private $subscribersRepository;
/** @var NewsletterUrl */
private $newsletterUrl;
/** @var NewslettersRepository */
private $newslettersRepository;
/** @var Date */
private $dateCategory;
/** @var Link */
private $linkCategory;
/** @var Newsletter */
private $newsletterCategory;
/** @var SubscriberCategory */
private $subscriberCategory;
/** @var Site */
private $siteCategory;
public function __construct(
Pages $subscriptionPages,
WPFunctions $wp,
SegmentSubscribersRepository $segmentSubscribersRepository,
SubscribersRepository $subscribersRepository,
NewsletterUrl $newsletterUrl,
NewslettersRepository $newslettersRepository,
Date $dateCategory,
Link $linkCategory,
Newsletter $newsletterCategory,
SubscriberCategory $subscriberCategory,
Site $siteCategory
) {
$this->subscriptionPages = $subscriptionPages;
$this->wp = $wp;
$this->segmentSubscribersRepository = $segmentSubscribersRepository;
$this->subscribersRepository = $subscribersRepository;
$this->newsletterUrl = $newsletterUrl;
$this->newslettersRepository = $newslettersRepository;
$this->dateCategory = $dateCategory;
$this->linkCategory = $linkCategory;
$this->newsletterCategory = $newsletterCategory;
$this->subscriberCategory = $subscriberCategory;
$this->siteCategory = $siteCategory;
}
public function init() {
// form widget shortcode
$this->wp->addShortcode('mailpoet_form', [$this, 'formWidget']);
// subscribers count shortcode
$this->wp->addShortcode('mailpoet_subscribers_count', [
$this, 'getSubscribersCount',
]);
$this->wp->addShortcode('wysija_subscribers_count', [
$this, 'getSubscribersCount',
]);
// archives page
$this->wp->addShortcode('mailpoet_archive', [
$this, 'getArchive',
]);
$this->wp->addFilter('mailpoet_archive_email_processed_date', [
$this, 'renderArchiveDate',
], 2);
$this->wp->addFilter('mailpoet_archive_email_subject_line', [
$this, 'renderArchiveSubject',
], 2, 3);
// initialize subscription pages data
$this->subscriptionPages->init();
// initialize subscription management shortcodes
$this->subscriptionPages->initShortcodes();
}
public function formWidget($params = []) {
// IMPORTANT: fixes conflict with MagicMember
$this->wp->removeShortcode('user_list');
if (isset($params['id']) && (int)$params['id'] > 0) {
$formWidget = new Widget();
return $formWidget->widget([
'form' => (int)$params['id'],
'form_type' => 'shortcode',
]);
}
}
public function getSubscribersCount($params) {
if (!empty($params['segments'])) {
$segmentIds = array_map(function($segmentId) {
return (int)trim($segmentId);
}, explode(',', $params['segments']));
}
if (empty($segmentIds)) {
return $this->wp->numberFormatI18n(
$this->subscribersRepository->countBy(['status' => SubscriberEntity::STATUS_SUBSCRIBED, 'deletedAt' => null])
);
} else {
return $this->wp->numberFormatI18n(
$this->segmentSubscribersRepository->getSubscribersCountBySegmentIds($segmentIds, SubscriberEntity::STATUS_SUBSCRIBED)
);
}
}
public function getArchive($params = '') {
$html = '';
$parsedParams = $this->getParsedArchiveParams($params);
$newsletters = $this->newslettersRepository->getArchives($parsedParams);
$subscriber = $this->subscribersRepository->getCurrentWPUser();
if (empty($newsletters)) {
return $this->wp->applyFilters(
'mailpoet_archive_no_newsletters',
__('Oops! There are no newsletters to display.', 'mailpoet')
);
} else {
$title = $this->wp->applyFilters('mailpoet_archive_title', '');
if (!empty($title)) {
$html .= '<h3 class="mailpoet_archive_title">' . $title . '</h3>';
}
$html .= '<ul class="mailpoet_archive">';
foreach ($newsletters as $newsletter) {
$queue = $newsletter->getLatestQueue();
$html .= '<li>' .
'<span class="mailpoet_archive_date">' .
$this->wp->applyFilters('mailpoet_archive_email_processed_date', $newsletter) .
'</span>
<span class="mailpoet_archive_subject">' .
$this->wp->applyFilters('mailpoet_archive_email_subject_line', $newsletter, $subscriber, $queue) .
'</span>
</li>';
}
$html .= '</ul>';
}
return $html;
}
public function getParsedArchiveParams($params): array {
$parsedParams = [
'startDate' => null,
'endDate' => null,
'segmentIds' => [],
'subjectContains' => '',
'limit' => null,
];
if (!is_array($params)) {
return $parsedParams;
}
if (!empty($params['segments'])) {
$parsedParams['segmentIds'] = array_map(function($segmentId) {
return (int)trim($segmentId);
}, explode(',', $params['segments']));
}
if ($params['start_date'] ?? null) {
try {
$parsedParams['startDate'] = new CarbonImmutable(trim($params['start_date']));
} catch (\Throwable $throwable) {
// Don't error out if invalid date
}
}
if ($params['end_date'] ?? null) {
try {
$parsedParams['endDate'] = new CarbonImmutable(trim($params['end_date']));
} catch (\Throwable $throwable) {
// Don't error out if invalid date
}
}
$lastDays = $params['in_the_last_days'] ?? null;
if ($lastDays && intval(($lastDays) > 0)) {
$parsedParams['endDate'] = null;
$parsedParams['startDate'] = CarbonImmutable::now()->subDays(intval($lastDays))->startOfDay();
}
if ($params['subject_contains'] ?? null) {
$parsedParams['subjectContains'] = trim($params['subject_contains']);
}
$limit = $params['limit'] ?? null;
if ($limit && intval($limit) > 0) {
$parsedParams['limit'] = intval($limit);
}
return $parsedParams;
}
public function renderArchiveDate(NewsletterEntity $newsletter) {
$timestamp = null;
$processedAt = $newsletter->getProcessedAt();
if (!is_null($processedAt)) {
$timestamp = $processedAt->getTimestamp();
}
return $this->wp->dateI18n(
$this->wp->getOption('date_format'),
$timestamp
);
}
public function renderArchiveSubject(NewsletterEntity $newsletter, ?SubscriberEntity $subscriber, ?SendingQueueEntity $queue) {
if (is_null($subscriber)) {
$subscriber = new SubscriberEntity();
}
$previewUrl = $this->newsletterUrl->getViewInBrowserUrl($newsletter, $subscriber, $queue);
/**
* An ugly workaround to make sure state is not shared via NewsletterShortcodes service
* This should be replaced with injected service when state is removed from this service
* (i.e. after https://mailpoet.atlassian.net/browse/MAILPOET-4087 is done and merged to master)
*/
$shortcodeProcessor = new NewsletterShortcodes(
$this->dateCategory,
$this->linkCategory,
$this->newsletterCategory,
$this->subscriberCategory,
$this->siteCategory,
$this->wp
);
$shortcodeProcessor->setNewsletter($newsletter);
$shortcodeProcessor->setSubscriber($subscriber);
$shortcodeProcessor->setQueue($queue);
return '<a href="' . esc_attr($previewUrl) . '" target="_blank" title="'
. esc_attr(__('Preview in a new tab', 'mailpoet')) . '">'
. esc_attr((string)$shortcodeProcessor->replace($queue ? $queue->getNewsletterRenderedSubject() : '')) .
'</a>';
}
}