Fix WP Sync
- added missing translations in listings (responsive view)
This commit is contained in:
@@ -119,7 +119,6 @@ define([
|
|||||||
}
|
}
|
||||||
extractTimeStamp() {
|
extractTimeStamp() {
|
||||||
const timeStamp = parseInt(this.props.item[this.props.field.name], 10);
|
const timeStamp = parseInt(this.props.item[this.props.field.name], 10);
|
||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
year: Moment.unix(timeStamp).year(),
|
year: Moment.unix(timeStamp).year(),
|
||||||
// Moment returns the month as [0..11]
|
// Moment returns the month as [0..11]
|
||||||
|
@@ -106,7 +106,6 @@ define(
|
|||||||
item[field.name] = this.state.item[field.name];
|
item[field.name] = this.state.item[field.name];
|
||||||
}
|
}
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
|
|
||||||
// set id if specified
|
// set id if specified
|
||||||
if(this.props.params.id !== undefined) {
|
if(this.props.params.id !== undefined) {
|
||||||
item.id = this.props.params.id;
|
item.id = this.props.params.id;
|
||||||
|
@@ -253,7 +253,7 @@ define(
|
|||||||
var statistics_column =
|
var statistics_column =
|
||||||
(!mailpoet_settings.tracking || !mailpoet_settings.tracking.enabled) ?
|
(!mailpoet_settings.tracking || !mailpoet_settings.tracking.enabled) ?
|
||||||
false :
|
false :
|
||||||
<td className="column {statistics_class}" data-colname="Statistics">
|
<td className="column {statistics_class}" data-colname={ MailPoet.I18n.t('statistics') }>
|
||||||
{ this.renderStatistics(newsletter) }
|
{ this.renderStatistics(newsletter) }
|
||||||
</td>;
|
</td>;
|
||||||
|
|
||||||
@@ -265,17 +265,17 @@ define(
|
|||||||
</strong>
|
</strong>
|
||||||
{ actions }
|
{ actions }
|
||||||
</td>
|
</td>
|
||||||
<td className="column" data-colname="Status">
|
<td className="column" data-colname={ MailPoet.I18n.t('status') }>
|
||||||
{ this.renderStatus(newsletter) }
|
{ this.renderStatus(newsletter) }
|
||||||
</td>
|
</td>
|
||||||
<td className="column" data-colname="Lists">
|
<td className="column" data-colname={ MailPoet.I18n.t('lists') }>
|
||||||
{ segments }
|
{ segments }
|
||||||
</td>
|
</td>
|
||||||
{ statistics_column }
|
{ statistics_column }
|
||||||
<td className="column-date" data-colname="Subscribed on">
|
<td className="column-date" data-colname={ MailPoet.I18n.t('createdOn') }>
|
||||||
<abbr>{ MailPoet.Date.format(newsletter.created_at) }</abbr>
|
<abbr>{ MailPoet.Date.format(newsletter.created_at) }</abbr>
|
||||||
</td>
|
</td>
|
||||||
<td className="column-date" data-colname="Last modified on">
|
<td className="column-date" data-colname={ MailPoet.I18n.t('lastModifiedOn') }>
|
||||||
<abbr>{ MailPoet.Date.format(newsletter.updated_at) }</abbr>
|
<abbr>{ MailPoet.Date.format(newsletter.updated_at) }</abbr>
|
||||||
</td>
|
</td>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -99,7 +99,6 @@ const bulk_actions = [
|
|||||||
const item_actions = [
|
const item_actions = [
|
||||||
{
|
{
|
||||||
name: 'edit',
|
name: 'edit',
|
||||||
label: MailPoet.I18n.t('edit'),
|
|
||||||
link: function(item) {
|
link: function(item) {
|
||||||
return (
|
return (
|
||||||
<Link to={ `/edit/${item.id}` }>{MailPoet.I18n.t('edit')}</Link>
|
<Link to={ `/edit/${item.id}` }>{MailPoet.I18n.t('edit')}</Link>
|
||||||
@@ -111,7 +110,7 @@ const item_actions = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'duplicate_segment',
|
name: 'duplicate_segment',
|
||||||
label: 'Duplicate',
|
label: MailPoet.I18n.t('duplicate'),
|
||||||
onClick: function(item, refresh) {
|
onClick: function(item, refresh) {
|
||||||
return MailPoet.Ajax.post({
|
return MailPoet.Ajax.post({
|
||||||
endpoint: 'segments',
|
endpoint: 'segments',
|
||||||
@@ -130,13 +129,13 @@ const item_actions = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'read_more',
|
name: 'read_more',
|
||||||
label: MailPoet.I18n.t('readMore'),
|
link: function(item) {
|
||||||
className: 'read_more',
|
return (
|
||||||
onClick: function(item, refresh) {
|
<a
|
||||||
// TODO: add URL with KB article
|
href="https://www.mailpoet.com/#TODO"
|
||||||
var url = 'http://example.com',
|
target="_blank"
|
||||||
link = window.open(url, '_blank');
|
>{MailPoet.I18n.t('readMore')}</a>
|
||||||
win.focus();
|
);
|
||||||
},
|
},
|
||||||
display: function(segment) {
|
display: function(segment) {
|
||||||
return (segment.type === 'wp_users');
|
return (segment.type === 'wp_users');
|
||||||
@@ -145,7 +144,6 @@ const item_actions = [
|
|||||||
{
|
{
|
||||||
name: 'synchronize_segment',
|
name: 'synchronize_segment',
|
||||||
label: MailPoet.I18n.t('forceSync'),
|
label: MailPoet.I18n.t('forceSync'),
|
||||||
className: 'update',
|
|
||||||
onClick: function(item, refresh) {
|
onClick: function(item, refresh) {
|
||||||
MailPoet.Modal.loading(true);
|
MailPoet.Modal.loading(true);
|
||||||
MailPoet.Ajax.post({
|
MailPoet.Ajax.post({
|
||||||
@@ -187,32 +185,42 @@ const SegmentList = React.createClass({
|
|||||||
'manage-column',
|
'manage-column',
|
||||||
'column-primary',
|
'column-primary',
|
||||||
'has-row-actions'
|
'has-row-actions'
|
||||||
),
|
);
|
||||||
subscribed = segment.subscribers_count.subscribed || 0,
|
|
||||||
unconfirmed = segment.subscribers_count.unconfirmed || 0,
|
const subscribed = ~~(segment.subscribers_count.subscribed || 0);
|
||||||
unsubscribed = segment.subscribers_count.unsubscribed || 0;
|
const unconfirmed = ~~(segment.subscribers_count.unconfirmed || 0);
|
||||||
|
const unsubscribed = ~~(segment.subscribers_count.unsubscribed || 0);
|
||||||
|
|
||||||
|
let segment_name = (
|
||||||
|
<Link to={ `/edit/${segment.id}` }>{ segment.name }</Link>
|
||||||
|
);
|
||||||
|
|
||||||
|
// the WP users segment is not editable so just display its name
|
||||||
|
if (segment.type === 'wp_users') {
|
||||||
|
segment_name = segment.name;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<td className={ rowClasses }>
|
<td className={ rowClasses }>
|
||||||
<strong>
|
<strong>
|
||||||
<a>{ segment.name }</a>
|
{ segment_name }
|
||||||
</strong>
|
</strong>
|
||||||
{ actions }
|
{ actions }
|
||||||
</td>
|
</td>
|
||||||
<td className="column-date" data-colname="Description">
|
<td className="column-date" data-colname={ MailPoet.I18n.t('description') }>
|
||||||
<abbr>{ segment.description }</abbr>
|
<abbr>{ segment.description }</abbr>
|
||||||
</td>
|
</td>
|
||||||
<td className="column-date" data-colname="Subscribed">
|
<td className="column-date" data-colname={ MailPoet.I18n.t('subscribed') }>
|
||||||
<abbr>{ parseInt(subscribed).toLocaleString() }</abbr>
|
<abbr>{ subscribed }</abbr>
|
||||||
</td>
|
</td>
|
||||||
<td className="column-date" data-colname="Unconfirmed">
|
<td className="column-date" data-colname={ MailPoet.I18n.t('unconfirmed') }>
|
||||||
<abbr>{ parseInt(unconfirmed).toLocaleString() }</abbr>
|
<abbr>{ unconfirmed }</abbr>
|
||||||
</td>
|
</td>
|
||||||
<td className="column-date" data-colname="Unsubscribed">
|
<td className="column-date" data-colname={ MailPoet.I18n.t('unsubscribed') }>
|
||||||
<abbr>{ parseInt(unsubscribed).toLocaleString() }</abbr>
|
<abbr>{ unsubscribed }</abbr>
|
||||||
</td>
|
</td>
|
||||||
<td className="column-date" data-colname="Created on">
|
<td className="column-date" data-colname={ MailPoet.I18n.t('createdOn') }>
|
||||||
<abbr>{ MailPoet.Date.format(segment.created_at) }</abbr>
|
<abbr>{ MailPoet.Date.format(segment.created_at) }</abbr>
|
||||||
</td>
|
</td>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -2,15 +2,20 @@
|
|||||||
namespace MailPoet\Segments;
|
namespace MailPoet\Segments;
|
||||||
use \MailPoet\Models\Subscriber;
|
use \MailPoet\Models\Subscriber;
|
||||||
use \MailPoet\Models\Segment;
|
use \MailPoet\Models\Segment;
|
||||||
|
use \MailPoet\Models\SubscriberSegment;
|
||||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
use MailPoet\Newsletter\Scheduler\Scheduler;
|
||||||
|
|
||||||
class WP {
|
class WP {
|
||||||
static function synchronizeUser($wp_user_id, $old_wp_user_data = false) {
|
static function synchronizeUser($wp_user_id, $old_wp_user_data = false) {
|
||||||
$wp_user = \get_userdata($wp_user_id);
|
$wp_user = \get_userdata($wp_user_id);
|
||||||
$segment = Segment::getWPUsers();
|
$wp_users_segment = Segment::getWPUsers();
|
||||||
if($wp_user === false or $segment === false) return;
|
|
||||||
|
if($wp_user === false or $wp_users_segment === false) return;
|
||||||
|
|
||||||
$subscriber = Subscriber::where('wp_user_id', $wp_user->ID)
|
$subscriber = Subscriber::where('wp_user_id', $wp_user->ID)
|
||||||
->findOne();
|
->findOne();
|
||||||
|
$schedule_welcome_newsletter = false;
|
||||||
|
|
||||||
switch(current_filter()) {
|
switch(current_filter()) {
|
||||||
case 'delete_user':
|
case 'delete_user':
|
||||||
case 'deleted_user':
|
case 'deleted_user':
|
||||||
@@ -36,18 +41,25 @@ class WP {
|
|||||||
'email' => $wp_user->user_email,
|
'email' => $wp_user->user_email,
|
||||||
'first_name' => $first_name,
|
'first_name' => $first_name,
|
||||||
'last_name' => $last_name,
|
'last_name' => $last_name,
|
||||||
'status' => 'subscribed'
|
'status' => Subscriber::STATUS_SUBSCRIBED,
|
||||||
);
|
);
|
||||||
|
|
||||||
if($subscriber !== false) {
|
if($subscriber !== false) {
|
||||||
$data['id'] = $subscriber->id();
|
$data['id'] = $subscriber->id();
|
||||||
|
$data['deleted_at'] = null; // remove the user from the trash
|
||||||
|
unset($data['status']); // don't override status for existing users
|
||||||
}
|
}
|
||||||
|
|
||||||
$subscriber = Subscriber::createOrUpdate($data);
|
$subscriber = Subscriber::createOrUpdate($data);
|
||||||
if($subscriber->getErrors() === false && $subscriber->id > 0) {
|
if($subscriber->getErrors() === false && $subscriber->id > 0) {
|
||||||
if($segment !== false) {
|
// add subscriber to the WP Users segment
|
||||||
$segment->addSubscriber($subscriber->id);
|
SubscriberSegment::addSubscriptions(
|
||||||
}
|
$subscriber,
|
||||||
if(isset($schedule_welcome_newsletter)) {
|
array($wp_users_segment->id)
|
||||||
|
);
|
||||||
|
|
||||||
|
// welcome email
|
||||||
|
if($schedule_welcome_newsletter === true) {
|
||||||
Scheduler::scheduleWPUserWelcomeNotification(
|
Scheduler::scheduleWPUserWelcomeNotification(
|
||||||
$subscriber->id,
|
$subscriber->id,
|
||||||
(array) $wp_user,
|
(array) $wp_user,
|
||||||
@@ -61,34 +73,19 @@ class WP {
|
|||||||
|
|
||||||
static function synchronizeUsers() {
|
static function synchronizeUsers() {
|
||||||
// get wordpress users list
|
// get wordpress users list
|
||||||
$segment = Segment::getWPUsers();
|
$wp_users_segment = Segment::getWPUsers();
|
||||||
|
|
||||||
// count WP users
|
// fetch all wp users id
|
||||||
$users_count = \count_users();
|
$wp_users = \get_users(array(
|
||||||
$linked_subscribers_count = $segment->subscribers()->count();
|
'count_total' => false,
|
||||||
|
'fields' => 'ID'
|
||||||
|
));
|
||||||
|
|
||||||
if($users_count['total_users'] !== $linked_subscribers_count) {
|
// update data for each wp user
|
||||||
$linked_subscribers = Subscriber::select('wp_user_id')
|
foreach($wp_users as $wp_user_id) {
|
||||||
->whereNotNull('wp_user_id')
|
static::synchronizeUser($wp_user_id);
|
||||||
->findArray();
|
|
||||||
|
|
||||||
$exclude_ids = array();
|
|
||||||
if(!empty($linked_subscribers)) {
|
|
||||||
$exclude_ids = array_map(function($subscriber) {
|
|
||||||
return $subscriber['wp_user_id'];
|
|
||||||
}, $linked_subscribers);
|
|
||||||
}
|
|
||||||
|
|
||||||
$users = \get_users(array(
|
|
||||||
'count_total' => false,
|
|
||||||
'fields' => 'ID',
|
|
||||||
'exclude' => $exclude_ids
|
|
||||||
));
|
|
||||||
|
|
||||||
foreach($users as $user) {
|
|
||||||
static::synchronizeUser($user);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -33,12 +33,13 @@
|
|||||||
'multipleSegmentsDeleted': __('%$1d segments were permanently deleted.'),
|
'multipleSegmentsDeleted': __('%$1d segments were permanently deleted.'),
|
||||||
'oneSegmentRestored': __('1 segment has been restored from the trash.'),
|
'oneSegmentRestored': __('1 segment has been restored from the trash.'),
|
||||||
'multipleSegmentsRestored': __('%$1d segments have been restored from the trash.'),
|
'multipleSegmentsRestored': __('%$1d segments have been restored from the trash.'),
|
||||||
|
'duplicate': __('Duplicate'),
|
||||||
'listDuplicated': __('List "%$1s" has been duplicated.'),
|
'listDuplicated': __('List "%$1s" has been duplicated.'),
|
||||||
'update': __('Update'),
|
'update': __('Update'),
|
||||||
'forceSync': __('Force Sync'),
|
'forceSync': __('Force Sync'),
|
||||||
'readMore': __('Read More'),
|
'readMore': __('Read More'),
|
||||||
'listSynchronized': __('List "%$1s" has been synchronized.'),
|
'listSynchronized': __('List "%$1s" has been synchronized.'),
|
||||||
'viewSubscribers': __('View subscribers'),
|
'viewSubscribers': __('View Subscribers'),
|
||||||
'new': __('New'),
|
'new': __('New'),
|
||||||
'edit': __('Edit'),
|
'edit': __('Edit'),
|
||||||
'trash': __('Trash'),
|
'trash': __('Trash'),
|
||||||
|
Reference in New Issue
Block a user