PluginProbe
YayMail – WooCommerce Email Customizer / trunk
YayMail – WooCommerce Email Customizer vtrunk
4.4.4 4.4.3 4.4.2 4.4.1 trunk 1.9.6 2.1.4 2.1.5 3.2.2 3.2.6 3.2.7.1 3.2.8.1 3.2.9 3.3 3.3.1 3.3.4 3.3.5 3.3.6 3.3.7 3.3.8 3.3.9 3.4 3.4.1 3.4.2 3.4.3 All 55 releases
yaymail / src / Emails / EmailsLoader.php

EmailsLoader.php in YayMail – WooCommerce Email Customizer trunk, at src/Emails/EmailsLoader.php

152 lines 5.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace YayMail\Emails;
4
5 use YayMail\Utils\Helpers;
6 use YayMail\Utils\SingletonTrait;
7 use YayMail\Utils\TemplateHelpers;
8 use YayMail\YayMailEmails;
9 use YayMail\YayMailTemplate;
10
11 /**
12 * EmailsLoader Class
13 *
14 * @method static EmailsLoader get_instance()
15 */
16 class EmailsLoader {
17
18 use SingletonTrait;
19
20 private function __construct() {
21 $this->init_hooks();
22 $this->load_emails();
23 }
24
25 private function init_hooks() {
26 add_action( 'yaymail_before_email_content', [ $this, 'before_email_content' ], 10, 1 );
27 add_action( 'yaymail_after_email_content', [ $this, 'after_email_content' ], 10, 1 );
28
29 /**
30 * Email references hooks
31 */
32 add_filter( 'safe_style_css', [ $this, 'filter_safe_style_css' ], 10, 1 );
33 add_filter( 'woocommerce_email_styles', [ $this, 'inject_custom_css' ] );
34 }
35
36 private function load_emails() {
37
38 $yaymail_emails = YayMailEmails::get_instance();
39
40 if ( yaymail_is_wc_installed() ) {
41 $yaymail_emails->register( \YayMail\Emails\NewOrder::get_instance() );
42 $yaymail_emails->register( \YayMail\Emails\CancelledOrder::get_instance() );
43 $yaymail_emails->register( \YayMail\Emails\CustomerCancelledOrder::get_instance() );
44 $yaymail_emails->register( \YayMail\Emails\FailedOrder::get_instance() );
45 $yaymail_emails->register( \YayMail\Emails\CustomerFailedOrder::get_instance() );
46 $yaymail_emails->register( \YayMail\Emails\CustomerOnHoldOrder::get_instance() );
47 $yaymail_emails->register( \YayMail\Emails\CustomerProcessingOrder::get_instance() );
48 $yaymail_emails->register( \YayMail\Emails\CustomerCompletedOrder::get_instance() );
49 $yaymail_emails->register( \YayMail\Emails\CustomerRefundedOrder::get_instance() );
50 $yaymail_emails->register( \YayMail\Emails\CustomerInvoice::get_instance() );
51 $yaymail_emails->register( \YayMail\Emails\CustomerNote::get_instance() );
52 $yaymail_emails->register( \YayMail\Emails\CustomerResetPassword::get_instance() );
53 $yaymail_emails->register( \YayMail\Emails\CustomerNewAccount::get_instance() );
54 /**
55 * POS emails, WC 9.9.3
56 *
57 * @since 4.0.6
58 */
59
60 $yaymail_emails->register( \YayMail\Emails\CustomerPOSCompletedOrder::get_instance() );
61 $yaymail_emails->register( \YayMail\Emails\CustomerPOSRefundedOrder::get_instance() );
62 }//end if
63
64 $yaymail_emails->register( \YayMail\Emails\GlobalHeaderFooter::get_instance() );
65
66 do_action( 'yaymail_register_emails', $yaymail_emails );
67
68 $this->register_subject_shortcode_filters( $yaymail_emails );
69 }
70
71 /**
72 * Wire one woocommerce_email_subject_{id} filter per registered YayMail email so
73 * YayMail shortcodes typed into the subject resolve at send time.
74 *
75 * @param YayMailEmails $yaymail_emails Registered emails collection.
76 */
77 private function register_subject_shortcode_filters( $yaymail_emails ) {
78 foreach ( $yaymail_emails->get_emails() as $email ) {
79 $email_id = $email->get_id();
80 if ( empty( $email_id ) ) {
81 continue;
82 }
83
84 add_filter(
85 'woocommerce_email_subject_' . $email_id,
86 function( $subject, $object = null ) use ( $email_id ) {
87 return self::render_subject_shortcodes( $subject, $object, $email_id );
88 },
89 10,
90 2
91 );
92 }
93 }
94
95 /**
96 * Resolve YayMail shortcodes in a subject, but only when the email's YayMail
97 * template is active. Uses real order context only - never the sample-data
98 * fallback - so a real outgoing subject never leaks placeholder values.
99 *
100 * @param string $subject Subject after WooCommerce format_string().
101 * @param mixed $object Email object; a WC_Order for order emails.
102 * @param string $email_id WooCommerce email id (also the YayMail template name).
103 * @return string
104 */
105 public static function render_subject_shortcodes( $subject, $object, $email_id ) {
106 if ( ! is_string( $subject ) || false === strpos( $subject, '[' ) ) {
107 return $subject;
108 }
109
110 $template = new YayMailTemplate( $email_id );
111 if ( ! $template->is_enabled() ) {
112 return $subject;
113 }
114
115 $order = ( $object instanceof \WC_Order ) ? $object : null;
116 $executor_data = [
117 'template' => $template,
118 'render_data' => $order ? [ 'order' => $order ] : [],
119 'settings' => yaymail_settings(),
120 // Real send: resolve to actual values, never editor placeholder tokens.
121 'is_placeholder' => false,
122 ];
123
124 return TemplateHelpers::process_email_subject( $subject, $template, $executor_data );
125 }
126
127 public function before_email_content( $template ) {
128 include Helpers::get_plugin_path() . 'templates/emails/before-email-content.php';
129 }
130
131 public function after_email_content( $template ) {
132 include Helpers::get_plugin_path() . 'templates/emails/after-email-content.php';
133 }
134
135 public function filter_safe_style_css( $default_array ) {
136 $additional_allowed_css_attributes = [ 'display', 'background-repeat', 'word-wrap' ];
137 return array_merge( $default_array, $additional_allowed_css_attributes );
138 }
139
140 public function inject_custom_css( $css = '' ) {
141 $css .= '.yaymail-element table { border-spacing: 0; }';
142 $yaymail_settings = yaymail_settings();
143 if ( ! boolval( $yaymail_settings['enable_custom_css'] ?? false ) ) {
144 return $css;
145 }
146 $custom_css = isset( $yaymail_settings['custom_css'] ) ? $yaymail_settings['custom_css'] : '';
147 $css .= $custom_css;
148 $css = apply_filters( 'yaymail_email_styles', $css );
149 return $css;
150 }
151 }
152