- Updates shortcodes logic

- Implements [newsletter:total] and [newsletter:number] shortcodes
- Implements shortcode replacement in subject line
- Updates unit tests
Issue #380
This commit is contained in:
Vlad
2016-03-19 11:19:22 -04:00
parent 71d8fb0d93
commit 6ec15bec22
6 changed files with 65 additions and 42 deletions

View File

@@ -10,7 +10,6 @@ use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Newsletter\Renderer\Renderer;
use MailPoet\Newsletter\Shortcodes\Shortcodes; use MailPoet\Newsletter\Shortcodes\Shortcodes;
use MailPoet\Util\Helpers; use MailPoet\Util\Helpers;
use MailPoet\Util\Security;
if(!defined('ABSPATH')) exit; if(!defined('ABSPATH')) exit;
@@ -22,13 +21,13 @@ class SendingQueue {
const batch_size = 50; const batch_size = 50;
function __construct($timer = false) { function __construct($timer = false) {
$this->mta_config = $this->getMailerConfig(); /* $this->mta_config = $this->getMailerConfig();
$this->mta_log = $this->getMailerLog(); $this->mta_log = $this->getMailerLog();
$this->processing_method = ($this->mta_config['method'] === 'MailPoet') ? $this->processing_method = ($this->mta_config['method'] === 'MailPoet') ?
'processBulkSubscribers' : 'processBulkSubscribers' :
'processIndividualSubscriber'; 'processIndividualSubscriber';
$this->timer = ($timer) ? $timer : microtime(true); $this->timer = ($timer) ? $timer : microtime(true);
CronHelper::checkExecutionTimer($this->timer); CronHelper::checkExecutionTimer($this->timer);*/
} }
function process() { function process() {
@@ -87,7 +86,7 @@ class SendingQueue {
); );
} else { } else {
$newsletter_statistics = $newsletter_statistics =
array_map(function ($data) use ($newsletter, $subscribers_ids, $queue) { array_map(function($data) use ($newsletter, $subscribers_ids, $queue) {
return array( return array(
$newsletter['id'], $newsletter['id'],
$subscribers_ids[$data], $subscribers_ids[$data],
@@ -147,13 +146,14 @@ class SendingQueue {
function processNewsletter($newsletter, $subscriber = false) { function processNewsletter($newsletter, $subscriber = false) {
$divider = '***MailPoet***'; $divider = '***MailPoet***';
$body = implode($divider, $newsletter['body']);
$shortcodes = new Shortcodes( $shortcodes = new Shortcodes(
implode($divider, $newsletter['body']),
$newsletter, $newsletter,
$subscriber $subscriber
); );
list($newsletter['body']['html'], $newsletter['body']['text']) = list($newsletter['body']['html'], $newsletter['body']['text']) =
explode($divider, $shortcodes->replace()); explode($divider, $shortcodes->replace($body));
$newsletter['subject'] = $shortcodes->replace($newsletter['subject']);
return $newsletter; return $newsletter;
} }

View File

@@ -169,6 +169,6 @@ class PostTransformer {
$alignment = (in_array($this->args['titleAlignment'], array('left', 'right', 'center'))) ? $this->args['titleAlignment'] : 'left'; $alignment = (in_array($this->args['titleAlignment'], array('left', 'right', 'center'))) ? $this->args['titleAlignment'] : 'left';
return '<' . $tag . ' style="text-align: ' . $alignment . '">' . $title . '</' . $tag . '>'; return '<' . $tag . ' class="mailpoet_alc_post" style="text-align: ' . $alignment . '">' . $title . '</' . $tag . '>';
} }
} }

View File

@@ -1,6 +1,8 @@
<?php <?php
namespace MailPoet\Newsletter\Shortcodes\Categories; namespace MailPoet\Newsletter\Shortcodes\Categories;
use MailPoet\Models\SendingQueue;
class Newsletter { class Newsletter {
/* /*
{ {
@@ -28,7 +30,9 @@ class Newsletter {
shortcode: 'newsletter:view_in_browser', shortcode: 'newsletter:view_in_browser',
} }
*/ */
static function process($action, $default_value = false, $newsletter) { static function process($action,
$default_value = false,
$newsletter, $subscriber = false, $text) {
if(is_object($newsletter)) { if(is_object($newsletter)) {
$newsletter = $newsletter->asArray(); $newsletter = $newsletter->asArray();
} }
@@ -38,8 +42,7 @@ class Newsletter {
break; break;
case 'total': case 'total':
$posts = wp_count_posts(); return substr_count($text, 'mailpoet_alc_post');
return $posts->publish;
break; break;
case 'post_title': case 'post_title':
@@ -48,8 +51,10 @@ class Newsletter {
break; break;
case 'number': case 'number':
// TODO: implement if ($newsletter['type'] !== 'notification') return false;
return 1; $sent_newsletters = (int)
SendingQueue::where('newsletter_id', $newsletter['id'])->count();
return ++$sent_newsletters;
break; break;
case 'view_in_browser': case 'view_in_browser':

View File

@@ -2,52 +2,51 @@
namespace MailPoet\Newsletter\Shortcodes; namespace MailPoet\Newsletter\Shortcodes;
class Shortcodes { class Shortcodes {
public $rendered_newsletter;
public $newsletter; public $newsletter;
public $subscriber; public $subscriber;
function __construct( function __construct(
$rendered_newsletter,
$newsletter = false, $newsletter = false,
$subscriber = false $subscriber = false
) { ) {
$this->rendered_newsletter = $rendered_newsletter;
$this->newsletter = $newsletter; $this->newsletter = $newsletter;
$this->subscriber = $subscriber; $this->subscriber = $subscriber;
} }
function extract() { function extract($text) {
preg_match_all('/\[(?:\w+):.*?\]/', $this->rendered_newsletter, $shortcodes); preg_match_all('/\[(?:\w+):.*?\]/', $text, $shortcodes);
return array_unique($shortcodes[0]); return array_unique($shortcodes[0]);
} }
function process($shortcodes) { function process($shortcodes, $text) {
$processed_shortcodes = array_map( $processed_shortcodes = array_map(
function ($shortcode) { function($shortcode) use($text) {
preg_match( preg_match(
'/\[(?P<type>\w+):(?P<action>\w+)(?:.*?default:(?P<default>.*?))?\]/', '/\[(?P<type>\w+):(?P<action>\w+)(?:.*?default:(?P<default>.*?))?\]/',
$shortcode, $shortcode,
$shortcode_details $shortcode_details
); );
$shortcode_class = $shortcode_class =
__NAMESPACE__ . '\\Categories\\' . ucfirst($shortcode_details['type']); __NAMESPACE__ . '\\Categories\\' . ucfirst($shortcode_details['type']);
$shortcode_action = $shortcode_details['action'];
$shortcode_default_value = isset($shortcode_details['default'])
? $shortcode_details['default'] : false;
if(!class_exists($shortcode_class)) return false; if(!class_exists($shortcode_class)) return false;
return $shortcode_class::process( return $shortcode_class::process(
$shortcode_details['action'], $shortcode_action,
isset($shortcode_details['default']) $shortcode_default_value,
? $shortcode_details['default'] : false,
$this->newsletter, $this->newsletter,
$this->subscriber $this->subscriber,
$text
); );
}, $shortcodes); }, $shortcodes);
return $processed_shortcodes; return $processed_shortcodes;
} }
function replace() { function replace($text) {
$shortcodes = $this->extract($this->rendered_newsletter); $shortcodes = $this->extract($text);
$processed_shortcodes = $this->process($shortcodes); $processed_shortcodes = $this->process($shortcodes, $text);
$shortcodes = array_intersect_key($shortcodes, $processed_shortcodes); $shortcodes = array_intersect_key($shortcodes, $processed_shortcodes);
return str_replace($shortcodes, $processed_shortcodes, $this->rendered_newsletter); return str_replace($shortcodes, $processed_shortcodes, $text);
} }
} }

View File

@@ -139,11 +139,8 @@ class Newsletters {
} }
$renderer = new Renderer($data); $renderer = new Renderer($data);
$rendered_newsletter = $renderer->render(); $rendered_newsletter = $renderer->render();
$shortcodes = new \MailPoet\Newsletter\Shortcodes\Shortcodes( $shortcodes = new \MailPoet\Newsletter\Shortcodes\Shortcodes($data);
$rendered_newsletter['html'], $rendered_newsletter = $shortcodes->replace($rendered_newsletter['html']);
$data
);
$rendered_newsletter = $shortcodes->replace();
return array('rendered_body' => $rendered_newsletter); return array('rendered_body' => $rendered_newsletter);
} }

View File

@@ -1,5 +1,6 @@
<?php <?php
use MailPoet\Models\SendingQueue;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Config\Populator; use MailPoet\Config\Populator;
use MailPoet\Subscription\Url as SubscriptionUrl; use MailPoet\Subscription\Url as SubscriptionUrl;
@@ -14,7 +15,11 @@ class ShortcodesTest extends MailPoetTest {
$populator->up(); $populator->up();
$this->wp_user = $this->_createWPUser(); $this->wp_user = $this->_createWPUser();
$this->subscriber = $this->_createSubscriber(); $this->subscriber = $this->_createSubscriber();
$this->newsletter['subject'] = 'some subject'; $this->newsletter = array(
'subject' => 'some subject',
'type' => 'notification',
'id' => 1
);
$this->rendered_newsletter = ' $this->rendered_newsletter = '
Hello [user:displayname | default:member]. Hello [user:displayname | default:member].
Your first name is [user:firstname | default:First Name]. Your first name is [user:firstname | default:First Name].
@@ -22,7 +27,10 @@ class ShortcodesTest extends MailPoetTest {
Thank you for subscribing with [user:email]. Thank you for subscribing with [user:email].
We already have [user:count] users. We already have [user:count] users.
There are [newsletter:total] posts on this blog. <h1 class="mailpoet_alc_post">some post</h1>
<h1 class="mailpoet_alc_post">another post</h1>
There are [newsletter:total] posts in this newsletter.
You are reading [newsletter:subject]. You are reading [newsletter:subject].
The latest post on this blog is called [newsletter:post_title]. The latest post on this blog is called [newsletter:post_title].
The issue number of this newsletter is [newsletter:number]. The issue number of this newsletter is [newsletter:number].
@@ -38,24 +46,35 @@ class ShortcodesTest extends MailPoetTest {
Manage your subscription here: [subscription:manage_url]. Manage your subscription here: [subscription:manage_url].
View this newsletter in browser: [newsletter:view_in_browser_url].'; View this newsletter in browser: [newsletter:view_in_browser_url].';
$this->shortcodes_object = new MailPoet\Newsletter\Shortcodes\Shortcodes( $this->shortcodes_object = new MailPoet\Newsletter\Shortcodes\Shortcodes(
$this->rendered_newsletter,
$this->newsletter, $this->newsletter,
$this->subscriber $this->subscriber
); );
} }
function testItCanProcessShortcodes() { function testItCanExtractShortcodes() {
$shortcodes = $this->shortcodes_object->extract(); $shortcodes = $this->shortcodes_object->extract($this->rendered_newsletter);
expect(count($shortcodes))->equals(18); expect(count($shortcodes))->equals(18);
}
function testItCanProcessShortcodes() {
$wp_user = get_userdata($this->wp_user); $wp_user = get_userdata($this->wp_user);
$wp_post_count = wp_count_posts();
$wp_latest_post = wp_get_recent_posts(array('numberposts' => 1)); $wp_latest_post = wp_get_recent_posts(array('numberposts' => 1));
$wp_latest_post = (isset($wp_latest_post)) ? $wp_latest_post = (isset($wp_latest_post)) ?
$wp_latest_post[0]['post_title'] : $wp_latest_post[0]['post_title'] :
false; false;
$queue = SendingQueue::create();
$queue->newsletter_id = $this->newsletter['id'];
$queue->save();
$issue_number = 2;
$number_of_posts = 2;
$date = new \DateTime('now'); $date = new \DateTime('now');
$subscriber_count = Subscriber::count(); $subscriber_count = Subscriber::count();
$newsletter_with_replaced_shortcodes = $this->shortcodes_object->replace(); $newsletter_with_replaced_shortcodes = $this->shortcodes_object->replace(
$this->rendered_newsletter
);
$unsubscribe_url = SubscriptionUrl::getUnsubscribeUrl($this->subscriber); $unsubscribe_url = SubscriptionUrl::getUnsubscribeUrl($this->subscriber);
$manage_url = SubscriptionUrl::getManageUrl($this->subscriber); $manage_url = SubscriptionUrl::getManageUrl($this->subscriber);
@@ -68,10 +87,13 @@ class ShortcodesTest extends MailPoetTest {
Thank you for subscribing with {$this->subscriber->email}. Thank you for subscribing with {$this->subscriber->email}.
We already have {$subscriber_count} users. We already have {$subscriber_count} users.
There are {$wp_post_count->publish} posts on this blog. <h1 class=\"mailpoet_alc_post\">some post</h1>
<h1 class=\"mailpoet_alc_post\">another post</h1>
There are {$number_of_posts} posts in this newsletter.
You are reading {$this->newsletter['subject']}. You are reading {$this->newsletter['subject']}.
The latest post on this blog is called {$wp_latest_post}. The latest post on this blog is called {$wp_latest_post}.
The issue number of this newsletter is 1. The issue number of this newsletter is {$issue_number}.
Date: {$date->format('d')}. Date: {$date->format('d')}.
Ordinal date: {$date->format('dS')}. Ordinal date: {$date->format('dS')}.