PluginProbe ʕ •ᴥ•ʔ
WPML Multilingual & Multicurrency for WooCommerce / 5.5.7
WPML Multilingual & Multicurrency for WooCommerce v5.5.7
5.5.7 5.3.8 5.3.9 5.4.3 5.4.4 5.4.5 5.5.1 5.5.1.1 5.5.2.2 5.5.2.3 5.5.3 5.5.3.1 5.5.4 5.5.5 5.5.6 trunk 0.9 1.0 1.1 1.2 1.3 1.4 1.5 2.0 2.2 2.3 2.3.1 2.3.2 3.0 3.0.1 3.1 3.2 3.2.1 3.2.2 3.3 3.3.1 3.3.2 3.3.3 3.3.4 3.4 3.4.1 3.4.2 3.4.3 3.5 3.5.1 3.5.2 3.5.3 3.5.4 3.5.5 3.6 3.6.1 3.6.10 3.6.11 3.6.2 3.6.3 3.6.4 3.6.5 3.6.5.1 3.6.6 3.6.7 3.6.8 3.6.9 3.7 3.7.1 3.7.10 3.7.11 3.7.12 3.7.13 3.7.14 3.7.15 3.7.16 3.7.2 3.7.3 3.7.4 3.7.5 3.7.6 3.7.7 3.7.8 3.7.9 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.8.6 3.9.0 3.9.1 3.9.1.1 3.9.2 3.9.3 3.9.4 3.9.5 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.10.0 4.10.1 4.10.2 4.10.3 4.10.4 4.11.2 4.11.3.2 4.11.5 4.11.6 4.12.1 4.12.4 4.12.5 4.12.6 4.2.0 4.2.0.1 4.2.1 4.2.1.1 4.2.10 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6 4.2.7 4.2.7.1 4.2.8 4.2.8.1 4.2.9 4.3.0 4.3.1 4.3.2 4.3.2.1 4.3.3 4.3.4 4.3.5 4.3.6 4.3.7 4.4.0 4.4.1 4.4.2 4.4.2.1 4.5.0 4.6.0 4.6.1 4.6.2 4.6.2.1 4.6.3 4.6.5 4.6.6 4.6.7 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.7.5 4.7.6 4.7.7 4.7.8 4.7.9 4.8.0 4.9.0 4.9.1 5.0.1 5.0.2 5.1.1 5.1.2 5.1.3 5.2.0 5.2.1 5.3.2 5.3.3.1 5.3.4 5.3.5 5.3.6 5.3.7
woocommerce-multilingual / compatibility / WcBookings / Emails.php
woocommerce-multilingual / compatibility / WcBookings Last commit date
Templates 2 weeks ago TranslationEditor 2 weeks ago Calendar.php 1 year ago Emails.php 2 weeks ago Factory.php 2 weeks ago MulticurrencyHooks.php 2 weeks ago Prices.php 2 weeks ago SharedHooks.php 2 weeks ago Slots.php 2 weeks ago class-wcml-accommodation-bookings.php 2 weeks ago class-wcml-bookings.php 2 weeks ago
Emails.php
158 lines
1 <?php
2
3 namespace WCML\Compatibility\WcBookings;
4
5 use WPML\FP\Fns;
6 use WPML\FP\Maybe;
7 use WPML\FP\Obj;
8
9 use function WPML\FP\partial;
10 use function WPML\FP\partialRight;
11
12 class Emails implements \IWPML_Action {
13
14 const DOMAIN = 'woocommerce-bookings';
15
16 const PRIORITY_BEFORE_EMAIL_TRIGGER = 9;
17
18 private $sitepress;
19
20 private $woocommerce_wpml;
21
22 private $woocommerce;
23
24 private $classes;
25
26 private $initialStates = [];
27
28 public function __construct( \SitePress $sitepress, \woocommerce_wpml $woocommerce_wpml, \WooCommerce $woocommerce ) {
29 $this->sitepress = $sitepress;
30 $this->woocommerce_wpml = $woocommerce_wpml;
31 $this->woocommerce = $woocommerce;
32 }
33
34 public function add_hooks() {
35 $this->init();
36
37 add_filter( 'wcml_emails_options_to_translate', [ $this, 'optionsToTranslate' ] );
38 add_filter( 'wcml_emails_text_keys_to_translate', [ $this, 'keysToTranslate' ] );
39 add_filter( 'woocommerce_email_get_option', [ $this, 'translateHeadingAndSubject' ], 20, 4 );
40
41 wpml_collect( [
42 'woocommerce_admin_new_booking_notification' => [ \WC_Email_New_Booking::class ],
43 'woocommerce_booking_pending-confirmation' => [ \WC_Email_Booking_Pending_Confirmation::class ],
44 'woocommerce_booking_confirmed_notification' => [ \WC_Email_Booking_Confirmed::class ],
45 'wc-booking-reminder' => [ \WC_Email_Booking_Reminder::class ],
46 'woocommerce_booking_pending-confirmation_to_cancelled_notification' => [
47 \WC_Email_Booking_Cancelled::class,
48 \WC_Email_Admin_Booking_Cancelled::class,
49 ],
50 'woocommerce_booking_confirmed_to_cancelled_notification' => [
51 \WC_Email_Booking_Cancelled::class,
52 \WC_Email_Admin_Booking_Cancelled::class,
53 ],
54 'woocommerce_booking_paid_to_cancelled_notification' => [
55 \WC_Email_Booking_Cancelled::class,
56 \WC_Email_Admin_Booking_Cancelled::class,
57 ],
58 'woocommerce_booking_unpaid_to_cancelled_notification' => [
59 \WC_Email_Booking_Cancelled::class,
60 \WC_Email_Admin_Booking_Cancelled::class,
61 ],
62 ] )->each( function( $classes, $hook ) {
63 add_action( $hook, $this->handle( $classes ), self::PRIORITY_BEFORE_EMAIL_TRIGGER );
64 } );
65 }
66
67 public function init() {
68 $this->classes = wpml_collect( [
69 \WC_Email_New_Booking::class => true,
70 \WC_Email_Booking_Confirmed::class => false,
71 \WC_Email_Booking_Reminder::class => false,
72 \WC_Email_Booking_Cancelled::class => false,
73 \WC_Email_Admin_Booking_Cancelled::class => true,
74 ] );
75 }
76
77 public function optionsToTranslate( $options ) {
78 $options[] = 'woocommerce_new_booking_settings';
79 $options[] = 'woocommerce_booking_reminder_settings';
80 $options[] = 'woocommerce_booking_confirmed_settings';
81 $options[] = 'woocommerce_booking_cancelled_settings';
82 $options[] = 'woocommerce_admin_booking_cancelled_settings';
83
84 return $options;
85 }
86
87 public function keysToTranslate( $keys ) {
88 $keys[] = 'subject_confirmation';
89 $keys[] = 'heading_confirmation';
90
91 return $keys;
92 }
93
94 public function translateHeadingAndSubject( $value, $object, $oldValue, $key ) {
95 $class = get_class( $object );
96 $keys = [
97 'subject',
98 'subject_confirmation',
99 'heading',
100 'heading_confirmation',
101 ];
102
103 $translatedValue = false;
104
105 if ( in_array( $key, $keys, true ) && $this->classes->has( $class ) ) {
106 $isAdmin = $this->classes->get( $class );
107 $translatedValue = $this->woocommerce_wpml->emails->get_email_translated_string( $key, $object, $isAdmin, $value, self::DOMAIN );
108 }
109
110 return $translatedValue ?: $value;
111 }
112
113 public function handle( $classes ) {
114 return function( $bookingId ) use ( $classes ) {
115 wpml_collect( $classes )
116 ->map( partial( [ $this, 'sendWithoutDuplicates' ], $bookingId ) );
117 };
118 }
119
120 public function sendWithoutDuplicates( $bookingId, $class ) {
121 if ( $this->classes->get( $class ) ) {
122 Maybe::fromNullable( $this->getAdminUserLanguage( $class ) )
123 ->map( [ $this->woocommerce_wpml->emails, 'change_email_language' ] );
124 } else {
125 $this->woocommerce_wpml->emails->refresh_email_lang( $bookingId );
126 }
127
128 $emailObject = $this->getEmailObject( $class );
129 if ( $emailObject ) {
130 if ( ! array_key_exists( $class, $this->initialStates ) ) {
131 $this->initialStates[ $class ] = $emailObject->enabled;
132 } else {
133 $emailObject->enabled = $this->initialStates[ $class ];
134 }
135 if ( method_exists( $emailObject, 'trigger' ) ) {
136 $emailObject->trigger( $bookingId );
137 }
138 $emailObject->enabled = 'no';
139 }
140 }
141
142 private function getAdminUserLanguage( $class ) {
143 return Maybe::fromNullable( $this->getEmailObject( $class ) )
144 ->map( Obj::prop( 'recipient' ) )
145 ->map( partial( 'get_user_by', 'email' ) )
146 ->map( Obj::prop( 'ID' ) )
147 ->map( partialRight( [ $this->sitepress, 'get_user_admin_language' ], true ) )
148 ->getOrElse( null );
149 }
150
151 private function getEmailObject( $emailClass ) {
152 return Maybe::of( $emailClass )
153 ->map( Obj::path( [ 'emails', Fns::__ ], $this->woocommerce->mailer() ) )
154 ->getOrElse( null );
155 }
156
157 }
158