Merge pull request #392 from mailpoet/shortcodes_update
Updates shortcodes logic
This commit is contained in:
@@ -77,7 +77,7 @@ class SendingQueue {
|
||||
} else {
|
||||
$newsletter['body'] = json_decode($queue->newsletter_rendered_body);
|
||||
}
|
||||
return $newsletter['body'];
|
||||
return (array) $newsletter['body'];
|
||||
}
|
||||
|
||||
function processBulkSubscribers($mailer, $newsletter, $subscribers, $queue) {
|
||||
@@ -125,6 +125,9 @@ class SendingQueue {
|
||||
foreach($subscribers as $subscriber) {
|
||||
$this->checkSendingLimit();
|
||||
$processed_newsletter = $this->processNewsletter($newsletter, $subscriber);
|
||||
if (!$queue->newsletter_rendered_subject) {
|
||||
$queue->newsletter_rendered_subject = $processed_newsletter['subject'];
|
||||
}
|
||||
$transformed_subscriber = $mailer->transformSubscriber($subscriber);
|
||||
$result = $this->sendNewsletter(
|
||||
$mailer,
|
||||
@@ -132,7 +135,7 @@ class SendingQueue {
|
||||
$transformed_subscriber
|
||||
);
|
||||
if(!$result) {
|
||||
$queue->subscribers->failed[] = $subscriber['id'];;
|
||||
$queue->subscribers->failed[] = $subscriber['id'];
|
||||
} else {
|
||||
$queue->subscribers->processed[] = $subscriber['id'];
|
||||
$newsletter_statistics = array(
|
||||
@@ -160,13 +163,17 @@ class SendingQueue {
|
||||
|
||||
function processNewsletter($newsletter, $subscriber = false) {
|
||||
$divider = '***MailPoet***';
|
||||
$data_for_shortcodes =
|
||||
array_merge(array($newsletter['subject']), $newsletter['body']);
|
||||
$body = implode($divider, $data_for_shortcodes);
|
||||
$shortcodes = new Shortcodes(
|
||||
implode($divider, $newsletter['body']),
|
||||
$newsletter,
|
||||
$subscriber
|
||||
);
|
||||
list($newsletter['body']['html'], $newsletter['body']['text']) =
|
||||
explode($divider, $shortcodes->replace());
|
||||
list($newsletter['subject'],
|
||||
$newsletter['body']['html'],
|
||||
$newsletter['body']['text']
|
||||
) = explode($divider, $shortcodes->replace($body));
|
||||
return $newsletter;
|
||||
}
|
||||
|
||||
|
@@ -169,6 +169,6 @@ class PostTransformer {
|
||||
|
||||
$alignment = (in_array($this->args['titleAlignment'], array('left', 'right', 'center'))) ? $this->args['titleAlignment'] : 'left';
|
||||
|
||||
return '<' . $tag . ' style="text-align: ' . $alignment . '">' . $title . '</' . $tag . '>';
|
||||
return '<' . $tag . ' data-post-id="' . $post->ID . '" style="text-align: ' . $alignment . '">' . $title . '</' . $tag . '>';
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,8 @@
|
||||
<?php
|
||||
namespace MailPoet\Newsletter\Shortcodes\Categories;
|
||||
|
||||
use MailPoet\Models\SendingQueue;
|
||||
|
||||
class Newsletter {
|
||||
/*
|
||||
{
|
||||
@@ -28,7 +30,9 @@ class Newsletter {
|
||||
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)) {
|
||||
$newsletter = $newsletter->asArray();
|
||||
}
|
||||
@@ -38,8 +42,7 @@ class Newsletter {
|
||||
break;
|
||||
|
||||
case 'total':
|
||||
$posts = wp_count_posts();
|
||||
return $posts->publish;
|
||||
return substr_count($text, 'data-post-id');
|
||||
break;
|
||||
|
||||
case 'post_title':
|
||||
@@ -48,8 +51,10 @@ class Newsletter {
|
||||
break;
|
||||
|
||||
case 'number':
|
||||
// TODO: implement
|
||||
return 1;
|
||||
if ($newsletter['type'] !== 'notification') return false;
|
||||
$sent_newsletters = (int)
|
||||
SendingQueue::where('newsletter_id', $newsletter['id'])->count();
|
||||
return ++$sent_newsletters;
|
||||
break;
|
||||
|
||||
case 'view_in_browser':
|
||||
|
@@ -2,52 +2,51 @@
|
||||
namespace MailPoet\Newsletter\Shortcodes;
|
||||
|
||||
class Shortcodes {
|
||||
public $rendered_newsletter;
|
||||
public $newsletter;
|
||||
public $subscriber;
|
||||
|
||||
function __construct(
|
||||
$rendered_newsletter,
|
||||
$newsletter = false,
|
||||
$subscriber = false
|
||||
) {
|
||||
$this->rendered_newsletter = $rendered_newsletter;
|
||||
$this->newsletter = $newsletter;
|
||||
$this->subscriber = $subscriber;
|
||||
}
|
||||
|
||||
function extract() {
|
||||
preg_match_all('/\[(?:\w+):.*?\]/', $this->rendered_newsletter, $shortcodes);
|
||||
function extract($text) {
|
||||
preg_match_all('/\[(?:\w+):.*?\]/', $text, $shortcodes);
|
||||
return array_unique($shortcodes[0]);
|
||||
}
|
||||
|
||||
function process($shortcodes) {
|
||||
function process($shortcodes, $text) {
|
||||
$processed_shortcodes = array_map(
|
||||
function ($shortcode) {
|
||||
function($shortcode) use($text) {
|
||||
preg_match(
|
||||
'/\[(?P<type>\w+):(?P<action>\w+)(?:.*?default:(?P<default>.*?))?\]/',
|
||||
$shortcode,
|
||||
$shortcode_details
|
||||
);
|
||||
|
||||
$shortcode_class =
|
||||
__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;
|
||||
return $shortcode_class::process(
|
||||
$shortcode_details['action'],
|
||||
isset($shortcode_details['default'])
|
||||
? $shortcode_details['default'] : false,
|
||||
$shortcode_action,
|
||||
$shortcode_default_value,
|
||||
$this->newsletter,
|
||||
$this->subscriber
|
||||
$this->subscriber,
|
||||
$text
|
||||
);
|
||||
}, $shortcodes);
|
||||
return $processed_shortcodes;
|
||||
}
|
||||
|
||||
function replace() {
|
||||
$shortcodes = $this->extract($this->rendered_newsletter);
|
||||
$processed_shortcodes = $this->process($shortcodes);
|
||||
function replace($text) {
|
||||
$shortcodes = $this->extract($text);
|
||||
$processed_shortcodes = $this->process($shortcodes, $text);
|
||||
$shortcodes = array_intersect_key($shortcodes, $processed_shortcodes);
|
||||
return str_replace($shortcodes, $processed_shortcodes, $this->rendered_newsletter);
|
||||
return str_replace($shortcodes, $processed_shortcodes, $text);
|
||||
}
|
||||
}
|
@@ -15,6 +15,7 @@ use MailPoet\Models\NewsletterOption;
|
||||
use MailPoet\Newsletter\Renderer\Renderer;
|
||||
use MailPoet\Models\SendingQueue;
|
||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
||||
use MailPoet\Util\Helpers;
|
||||
|
||||
if(!defined('ABSPATH')) exit;
|
||||
|
||||
@@ -33,7 +34,7 @@ class Newsletters {
|
||||
$newsletter['segments'] = array_map(function($segment) {
|
||||
return $segment['id'];
|
||||
}, $segments);
|
||||
$newsletter['options'] = $options;
|
||||
$newsletter['options'] = Helpers::arrayColumn($options, 'value', 'name');
|
||||
return $newsletter;
|
||||
}
|
||||
}
|
||||
@@ -139,11 +140,8 @@ class Newsletters {
|
||||
}
|
||||
$renderer = new Renderer($data);
|
||||
$rendered_newsletter = $renderer->render();
|
||||
$shortcodes = new \MailPoet\Newsletter\Shortcodes\Shortcodes(
|
||||
$rendered_newsletter['html'],
|
||||
$data
|
||||
);
|
||||
$rendered_newsletter = $shortcodes->replace();
|
||||
$shortcodes = new \MailPoet\Newsletter\Shortcodes\Shortcodes($data);
|
||||
$rendered_newsletter = $shortcodes->replace($rendered_newsletter['html']);
|
||||
return array('rendered_body' => $rendered_newsletter);
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
<?php
|
||||
|
||||
use MailPoet\Models\SendingQueue;
|
||||
use MailPoet\Models\Subscriber;
|
||||
use MailPoet\Config\Populator;
|
||||
use MailPoet\Subscription\Url as SubscriptionUrl;
|
||||
@@ -14,7 +15,11 @@ class ShortcodesTest extends MailPoetTest {
|
||||
$populator->up();
|
||||
$this->wp_user = $this->_createWPUser();
|
||||
$this->subscriber = $this->_createSubscriber();
|
||||
$this->newsletter['subject'] = 'some subject';
|
||||
$this->newsletter = array(
|
||||
'subject' => 'some subject',
|
||||
'type' => 'notification',
|
||||
'id' => 1
|
||||
);
|
||||
$this->rendered_newsletter = '
|
||||
Hello [user:displayname | default:member].
|
||||
Your first name is [user:firstname | default:First Name].
|
||||
@@ -22,7 +27,10 @@ class ShortcodesTest extends MailPoetTest {
|
||||
Thank you for subscribing with [user:email].
|
||||
We already have [user:count] users.
|
||||
|
||||
There are [newsletter:total] posts on this blog.
|
||||
<h1 data-post-id="1">some post</h1>
|
||||
<h1 data-post-id="2">another post</h1>
|
||||
|
||||
There are [newsletter:total] posts in this newsletter.
|
||||
You are reading [newsletter:subject].
|
||||
The latest post on this blog is called [newsletter:post_title].
|
||||
The issue number of this newsletter is [newsletter:number].
|
||||
@@ -38,24 +46,35 @@ class ShortcodesTest extends MailPoetTest {
|
||||
Manage your subscription here: [subscription:manage_url].
|
||||
View this newsletter in browser: [newsletter:view_in_browser_url].';
|
||||
$this->shortcodes_object = new MailPoet\Newsletter\Shortcodes\Shortcodes(
|
||||
$this->rendered_newsletter,
|
||||
$this->newsletter,
|
||||
$this->subscriber
|
||||
);
|
||||
}
|
||||
|
||||
function testItCanProcessShortcodes() {
|
||||
$shortcodes = $this->shortcodes_object->extract();
|
||||
function testItCanExtractShortcodes() {
|
||||
$shortcodes = $this->shortcodes_object->extract($this->rendered_newsletter);
|
||||
expect(count($shortcodes))->equals(18);
|
||||
}
|
||||
|
||||
function testItCanProcessShortcodes() {
|
||||
$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 = (isset($wp_latest_post)) ?
|
||||
$wp_latest_post[0]['post_title'] :
|
||||
false;
|
||||
|
||||
$queue = SendingQueue::create();
|
||||
$queue->newsletter_id = $this->newsletter['id'];
|
||||
$queue->save();
|
||||
$issue_number = 2;
|
||||
|
||||
$number_of_posts = 2;
|
||||
|
||||
$date = new \DateTime('now');
|
||||
$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);
|
||||
$manage_url = SubscriptionUrl::getManageUrl($this->subscriber);
|
||||
@@ -68,10 +87,13 @@ class ShortcodesTest extends MailPoetTest {
|
||||
Thank you for subscribing with {$this->subscriber->email}.
|
||||
We already have {$subscriber_count} users.
|
||||
|
||||
There are {$wp_post_count->publish} posts on this blog.
|
||||
<h1 data-post-id=\"1\">some post</h1>
|
||||
<h1 data-post-id=\"2\">another post</h1>
|
||||
|
||||
There are {$number_of_posts} posts in this newsletter.
|
||||
You are reading {$this->newsletter['subject']}.
|
||||
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')}.
|
||||
Ordinal date: {$date->format('dS')}.
|
||||
|
Reference in New Issue
Block a user