- Fixes incorrect newsletter issue number display

- Updates newsletter 'last post title' logic
- Updates shortcode extraction regex to allow limiting extraction of only
  specific categories
- Updates unit tests
- Closes #380
This commit is contained in:
Vlad
2016-04-21 19:14:06 -04:00
parent e4a5438512
commit dd8f58e35e
4 changed files with 38 additions and 15 deletions

View File

@ -25,7 +25,7 @@ class Links {
. ')\\1#'; . ')\\1#';
preg_match_all($regex, $text, $links); preg_match_all($regex, $text, $links);
$shortcodes = new Shortcodes();; $shortcodes = new Shortcodes();;
$shortcodes = $shortcodes->extract($text); $shortcodes = $shortcodes->extract($text, $limit = array('subscription'));
return array_merge( return array_merge(
array_unique($links[2]), array_unique($links[2]),
$shortcodes $shortcodes

View File

@ -3,6 +3,8 @@ namespace MailPoet\Newsletter\Shortcodes\Categories;
use MailPoet\Models\SendingQueue; use MailPoet\Models\SendingQueue;
require_once( ABSPATH . "wp-includes/pluggable.php" );
class Newsletter { class Newsletter {
/* /*
{ {
@ -46,14 +48,18 @@ class Newsletter {
break; break;
case 'post_title': case 'post_title':
$post = wp_get_recent_posts(array('numberposts' => 1)); preg_match_all('/data-post-id="(\w+)"/ism', $text, $posts);
return (isset($post[0])) ? $post[0]['post_title'] : false; $post_ids = array_unique($posts[1]);
$latest_post = self::getLatestWPPost($post_ids);
return ($latest_post) ? $latest_post['post_title'] : false;
break; break;
case 'number': case 'number':
if ($newsletter['type'] !== 'notification') return false; if ($newsletter['type'] !== 'notification') return false;
$sent_newsletters = (int) $sent_newsletters =
SendingQueue::where('newsletter_id', $newsletter['id'])->count(); SendingQueue::where('newsletter_id', $newsletter['id'])
->where('status', 'completed')
->count();
return ++$sent_newsletters; return ++$sent_newsletters;
break; break;
@ -70,4 +76,18 @@ class Newsletter {
break; break;
} }
} }
private static function getLatestWPPost($post_ids) {
$posts = new \WP_Query(
array(
'post__in' => $post_ids,
'posts_per_page' => 1,
'orderby' => 'post_date',
'order' => 'DESC'
)
);
return (count($posts)) ?
$posts->posts[0]->to_array() :
false;
}
} }

View File

@ -13,8 +13,13 @@ class Shortcodes {
$this->subscriber = $subscriber; $this->subscriber = $subscriber;
} }
function extract($text) { function extract($text, $limit = false) {
preg_match_all('/\[(?:\w+):.*?\]/ism', $text, $shortcodes); $limit = (is_array($limit)) ? implode('|', $limit) : false;
$regex = sprintf(
'/\[%s:.*?\]/ism',
($limit) ? '(?:' . $limit . ')' : '(?:\w+)'
);
preg_match_all($regex, $text, $shortcodes);
return array_unique($shortcodes[0]); return array_unique($shortcodes[0]);
} }

View File

@ -18,8 +18,10 @@ class ShortcodesTest extends MailPoetTest {
$this->newsletter = array( $this->newsletter = array(
'subject' => 'some subject', 'subject' => 'some subject',
'type' => 'notification', 'type' => 'notification',
'id' => 1 'id' => 2
); );
$post = get_post(1);
$this->latest_post_title = $post->post_title;
$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].
@ -32,7 +34,7 @@ class ShortcodesTest extends MailPoetTest {
There are [newsletter:total] posts in this newsletter. 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 in this newsletter is called [newsletter:post_title].
The issue number of this newsletter is [newsletter:number]. The issue number of this newsletter is [newsletter:number].
Date: [date:d]. Date: [date:d].
@ -58,15 +60,11 @@ class ShortcodesTest extends MailPoetTest {
function testItCanProcessShortcodes() { function testItCanProcessShortcodes() {
$wp_user = get_userdata($this->wp_user); $wp_user = get_userdata($this->wp_user);
$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 = SendingQueue::create();
$queue->newsletter_id = $this->newsletter['id']; $queue->newsletter_id = $this->newsletter['id'];
$queue->save(); $queue->save();
$issue_number = 2; $issue_number = 1;
$number_of_posts = 2; $number_of_posts = 2;
@ -92,7 +90,7 @@ class ShortcodesTest extends MailPoetTest {
There are {$number_of_posts} posts in this newsletter. 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 in this newsletter is called {$this->latest_post_title}.
The issue number of this newsletter is {$issue_number}. The issue number of this newsletter is {$issue_number}.
Date: {$date->format('d')}. Date: {$date->format('d')}.