Emails
2 months ago
Integrations
2 months ago
MultichannelMarketing
2 years ago
TransactionalEmails
10 months ago
WooCommerceBookings
1 month ago
WooCommerceSubscriptions
2 months ago
CouponPreProcessor.php
2 months ago
Emails.php
8 months ago
Helper.php
1 month ago
MailPoetTask.php
2 years ago
NonPersistablePreviewData.php
1 month ago
OrderAttributionFields.php
1 month ago
OrderAttributionRevenueReader.php
2 weeks ago
OrderAttributionWriter.php
1 month ago
RandomCouponCodeGenerator.php
2 months ago
Settings.php
1 year ago
SubscriberEngagement.php
3 years ago
Subscription.php
2 months ago
Tracker.php
2 years ago
TransactionalEmailHooks.php
1 year ago
TransactionalEmails.php
1 year ago
WooSystemInfo.php
1 month ago
WooSystemInfoController.php
1 year ago
index.php
3 years ago
TransactionalEmails.php
146 lines
| 1 | <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing |
| 2 | |
| 3 | namespace MailPoet\WooCommerce; |
| 4 | |
| 5 | if (!defined('ABSPATH')) exit; |
| 6 | |
| 7 | |
| 8 | use MailPoet\Config\Env; |
| 9 | use MailPoet\Entities\NewsletterEntity; |
| 10 | use MailPoet\Newsletter\NewslettersRepository; |
| 11 | use MailPoet\Settings\SettingsController; |
| 12 | use MailPoet\WooCommerce\TransactionalEmails\Template; |
| 13 | use MailPoet\WP\Functions as WPFunctions; |
| 14 | |
| 15 | class TransactionalEmails { |
| 16 | const SETTING_EMAIL_ID = 'woocommerce.transactional_email_id'; |
| 17 | |
| 18 | /** @var WPFunctions */ |
| 19 | private $wp; |
| 20 | |
| 21 | /** @var SettingsController */ |
| 22 | private $settings; |
| 23 | |
| 24 | /** @var Template */ |
| 25 | private $template; |
| 26 | |
| 27 | /** @var Helper */ |
| 28 | private $woocommerceHelper; |
| 29 | |
| 30 | /** @var array */ |
| 31 | private $emailHeadings = []; |
| 32 | |
| 33 | /** @var NewslettersRepository */ |
| 34 | private $newslettersRepository; |
| 35 | |
| 36 | public function __construct( |
| 37 | WPFunctions $wp, |
| 38 | SettingsController $settings, |
| 39 | Template $template, |
| 40 | Helper $woocommerceHelper, |
| 41 | NewslettersRepository $newslettersRepository |
| 42 | ) { |
| 43 | $this->wp = $wp; |
| 44 | $this->settings = $settings; |
| 45 | $this->template = $template; |
| 46 | $this->woocommerceHelper = $woocommerceHelper; |
| 47 | $this->newslettersRepository = $newslettersRepository; |
| 48 | } |
| 49 | |
| 50 | public function setupEmailHeadings() { |
| 51 | $this->emailHeadings = [ |
| 52 | 'new_account' => [ |
| 53 | 'option_name' => 'woocommerce_new_order_settings', |
| 54 | 'default' => __('New Order: #{order_number}', 'woocommerce'), |
| 55 | ], |
| 56 | 'processing_order' => [ |
| 57 | 'option_name' => 'woocommerce_customer_processing_order_settings', |
| 58 | 'default' => __('Thank you for your order', 'woocommerce'), |
| 59 | ], |
| 60 | 'completed_order' => [ |
| 61 | 'option_name' => 'woocommerce_customer_completed_order_settings', |
| 62 | 'default' => __('Thanks for shopping with us', 'woocommerce'), |
| 63 | ], |
| 64 | 'customer_note' => [ |
| 65 | 'option_name' => 'woocommerce_customer_note_settings', |
| 66 | 'default' => __('A note has been added to your order', 'woocommerce'), |
| 67 | ], |
| 68 | ]; |
| 69 | } |
| 70 | |
| 71 | public function init() { |
| 72 | $savedEmailId = (bool)$this->settings->get(self::SETTING_EMAIL_ID, false); |
| 73 | if (!$savedEmailId) { |
| 74 | $email = $this->createNewsletter(); |
| 75 | $this->settings->set(self::SETTING_EMAIL_ID, $email->getId()); |
| 76 | } |
| 77 | } |
| 78 | |
| 79 | public function getEmailHeadings() { |
| 80 | if (empty($this->emailHeadings)) { |
| 81 | $this->setupEmailHeadings(); |
| 82 | } |
| 83 | |
| 84 | $values = []; |
| 85 | foreach ($this->emailHeadings as $name => $heading) { |
| 86 | $settings = $this->wp->getOption($heading['option_name']); |
| 87 | if (!$settings) { |
| 88 | $values[$name] = $this->replacePlaceholders($heading['default']); |
| 89 | } else { |
| 90 | $value = !empty($settings['heading']) ? $settings['heading'] : $heading['default']; |
| 91 | $values[$name] = $this->replacePlaceholders($value); |
| 92 | } |
| 93 | } |
| 94 | return $values; |
| 95 | } |
| 96 | |
| 97 | private function createNewsletter() { |
| 98 | $wcEmailSettings = $this->getWCEmailSettings(); |
| 99 | $newsletter = new NewsletterEntity; |
| 100 | $newsletter->setType(NewsletterEntity::TYPE_WC_TRANSACTIONAL_EMAIL); |
| 101 | $newsletter->setSubject('WooCommerce Transactional Email'); |
| 102 | $newsletter->setBody($this->template->create($wcEmailSettings)); |
| 103 | $this->newslettersRepository->persist($newsletter); |
| 104 | $this->newslettersRepository->flush(); |
| 105 | return $newsletter; |
| 106 | } |
| 107 | |
| 108 | private function replacePlaceholders($text) { |
| 109 | $title = $this->wp->wpSpecialcharsDecode($this->wp->getOption('blogname'), ENT_QUOTES); |
| 110 | $address = $this->wp->wpParseUrl($this->wp->homeUrl(), PHP_URL_HOST); |
| 111 | $orderDate = date('Y-m-d'); |
| 112 | return str_replace( |
| 113 | ['{site_title}', '{site_address}', '{order_date}', '{order_number}'], |
| 114 | [$title, $address, $orderDate, '0001'], |
| 115 | $text |
| 116 | ); |
| 117 | } |
| 118 | |
| 119 | public function getWCEmailSettings() { |
| 120 | $wcEmailSettings = [ |
| 121 | 'woocommerce_email_background_color' => '#f7f7f7', |
| 122 | 'woocommerce_email_base_color' => '#333333', |
| 123 | 'woocommerce_email_body_background_color' => '#ffffff', |
| 124 | 'woocommerce_email_footer_text' => _x('Footer text', 'Default footer text for a WooCommerce transactional email', 'mailpoet'), |
| 125 | 'woocommerce_email_header_image' => Env::$assetsUrl . '/img/newsletter_editor/wc-default-logo.png', |
| 126 | 'woocommerce_email_text_color' => '#111111', |
| 127 | ]; |
| 128 | $result = []; |
| 129 | foreach ($wcEmailSettings as $name => $default) { |
| 130 | $value = $this->wp->getOption($name); |
| 131 | $key = preg_replace('/^woocommerce_email_/', '', $name); |
| 132 | $result[$key] = $value ?: $default; |
| 133 | } |
| 134 | $result['base_text_color'] = $this->woocommerceHelper->wcLightOrDark($result['base_color'], '#202020', '#ffffff'); |
| 135 | if ($this->woocommerceHelper->wcHexIsLight($result['body_background_color'])) { |
| 136 | $result['link_color'] = $this->woocommerceHelper->wcHexIsLight($result['base_color']) ? $result['base_text_color'] : $result['base_color']; |
| 137 | } else { |
| 138 | $result['link_color'] = $this->woocommerceHelper->wcHexIsLight($result['base_color']) ? $result['base_color'] : $result['base_text_color']; |
| 139 | } |
| 140 | $result['footer_text'] = $this->replacePlaceholders($result['footer_text']); |
| 141 | // The footer text is placed inside a paragraph in a text block so we keep only tags we allow in the text block in the newsletter editor |
| 142 | $result['footer_text'] = strip_tags($result['footer_text'], '<em><strong><br><a><span><s><del>'); |
| 143 | return $result; |
| 144 | } |
| 145 | } |
| 146 |