File "Newsletter.php"
Full Path: /home/warrior1/public_html/wp-content/plugins/mailpoet/lib/Newsletter/Shortcodes/Categories/Newsletter.php
File size: 3.16 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace MailPoet\Newsletter\Shortcodes\Categories;
if (!defined('ABSPATH')) exit;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\WP\Functions as WPFunctions;
use MailPoet\WP\Posts as WPPosts;
class Newsletter implements CategoryInterface {
/** @var NewslettersRepository */
private $newslettersRepository;
public function __construct(
NewslettersRepository $newslettersRepository
) {
$this->newslettersRepository = $newslettersRepository;
}
public function process(
array $shortcodeDetails,
NewsletterEntity $newsletter = null,
SubscriberEntity $subscriber = null,
SendingQueueEntity $queue = null,
string $content = '',
bool $wpUserPreview = false
): ?string {
switch ($shortcodeDetails['action']) {
case 'subject':
return ($newsletter instanceof NewsletterEntity) ? $newsletter->getSubject() : null;
case 'total':
return (string)substr_count($content, 'data-post-id');
case 'post_title':
preg_match_all('/data-post-id="(\d+)"/ism', $content, $posts);
$postIds = array_unique($posts[1]);
$latestPost = (!empty($postIds)) ? $this->getLatestWPPost($postIds) : null;
return ($latestPost) ? $latestPost['post_title'] : null;
case 'number':
if (!($newsletter instanceof NewsletterEntity)) return null;
if ($newsletter->getType() !== NewsletterEntity::TYPE_NOTIFICATION_HISTORY) {
return null;
}
$sentNewsletters = $this->newslettersRepository->countBy([
'parent' => $newsletter->getParent(),
'status' => NewsletterEntity::STATUS_SENT,
]);
return (string)++$sentNewsletters;
default:
return null;
}
}
public function ensureConsistentQueryType(\WP_Query $query) {
// Queries with taxonomies are autodetected as 'is_archive=true' and 'is_home=false'
// while queries without them end up being 'is_archive=false' and 'is_home=true'.
// This is to fix that by always enforcing constistent behavior.
$query->is_archive = true; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
$query->is_home = false; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
}
private function getLatestWPPost($postIds) {
// set low priority to execute 'ensureConstistentQueryType' before any other filter
$filterPriority = defined('PHP_INT_MIN') ? constant('PHP_INT_MIN') : ~PHP_INT_MAX;
WPFunctions::get()->addAction('pre_get_posts', [$this, 'ensureConsistentQueryType'], $filterPriority);
$posts = new \WP_Query(
[
'post_type' => WPPosts::getTypes(),
'post__in' => $postIds,
'posts_per_page' => 1,
'ignore_sticky_posts' => true,
'orderby' => 'post_date',
'order' => 'DESC',
]
);
WPFunctions::get()->removeAction('pre_get_posts', [$this, 'ensureConsistentQueryType'], $filterPriority);
return (!empty($posts->posts[0])) && ($posts->posts[0] instanceof \WP_Post) ?
$posts->posts[0]->to_array() :
false;
}
}