You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

874 lines
25 KiB

<?php
use WPML\FP\Obj;
class WCML_Emails {
const PRIORITY_AFTER_STATUS_CHANGE_EMAIL = 11;
const PRIORITY_BEFORE_EMAIL_SET_LANGUAGE = 9;
/** @var int|false $order_id */
private $order_id = false;
/** @var string|false $locale */
private $locale = false;
/** @var string|false $admin_language */
private $admin_language = false;
/** @var null|string $rest_language */
private $rest_language;
/** @var WCML_WC_Strings */
private $wcmlStrings;
/** @var SitePress */
private $sitepress;
/** @var WooCommerce $woocommerce */
private $woocommerce;
/** @var wpdb */
private $wpdb;
public function __construct( WCML_WC_Strings $wcmlStrings, SitePress $sitepress, WooCommerce $woocommerce, wpdb $wpdb ) {
$this->wcmlStrings = $wcmlStrings;
$this->sitepress = $sitepress;
$this->woocommerce = $woocommerce;
$this->wpdb = $wpdb;
}
public function add_hooks() {
// Wrappers for email's header.
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
add_action(
'woocommerce_order_status_completed_notification',
[
$this,
'email_heading_completed',
],
self::PRIORITY_BEFORE_EMAIL_SET_LANGUAGE
);
add_action( 'woocommerce_order_status_changed', [ $this, 'comments_language' ], 10 );
$this->add_hooks_to_restore_language_for_admin_notes();
}
add_action( 'woocommerce_new_customer_note_notification', [ $this, 'email_heading_note' ], self::PRIORITY_BEFORE_EMAIL_SET_LANGUAGE );
add_action( 'wp_ajax_woocommerce_mark_order_status', [ $this, 'email_refresh_in_ajax' ], self::PRIORITY_BEFORE_EMAIL_SET_LANGUAGE );
foreach ( [ 'pending', 'failed', 'cancelled', 'on-hold' ] as $state ) {
add_action(
'woocommerce_order_status_' . $state . '_to_processing_notification',
[
$this,
'email_heading_processing',
],
self::PRIORITY_BEFORE_EMAIL_SET_LANGUAGE
);
add_action(
'woocommerce_order_status_' . $state . '_to_processing_notification',
[
$this,
'refresh_email_lang',
],
self::PRIORITY_BEFORE_EMAIL_SET_LANGUAGE
);
}
foreach ( [ 'pending', 'failed', 'cancelled' ] as $state ) {
add_action(
'woocommerce_order_status_' . $state . '_to_on-hold_notification',
[
$this,
'email_heading_on_hold',
],
self::PRIORITY_BEFORE_EMAIL_SET_LANGUAGE
);
}
// Wrappers for email's body.
add_action( 'woocommerce_before_resend_order_emails', [ $this, 'email_header' ] );
add_action( 'woocommerce_after_resend_order_email', [ $this, 'email_footer' ] );
// Filter string language before for emails.
add_filter( 'icl_current_string_language', [ $this, 'icl_current_string_language' ], 10, 2 );
// Change order status.
add_action( 'woocommerce_order_status_completed', [ $this, 'refresh_email_lang_complete' ], self::PRIORITY_BEFORE_EMAIL_SET_LANGUAGE );
add_action(
'woocommerce_order_status_pending_to_on-hold_notification',
[
$this,
'refresh_email_lang',
],
self::PRIORITY_BEFORE_EMAIL_SET_LANGUAGE
);
add_action( 'woocommerce_new_customer_note', [ $this, 'refresh_email_lang' ], self::PRIORITY_BEFORE_EMAIL_SET_LANGUAGE );
foreach ( [ 'pending', 'failed' ] as $from_state ) {
foreach ( [ 'processing', 'completed', 'on-hold' ] as $to_state ) {
add_action(
'woocommerce_order_status_' . $from_state . '_to_' . $to_state . '_notification',
[
$this,
'new_order_admin_email',
],
self::PRIORITY_BEFORE_EMAIL_SET_LANGUAGE
);
}
}
add_action( 'woocommerce_before_resend_order_emails', [ $this, 'backend_new_order_admin_email' ], self::PRIORITY_BEFORE_EMAIL_SET_LANGUAGE );
add_filter( 'plugin_locale', [ $this, 'set_locale_for_emails' ], 10, 2 );
add_filter( 'woocommerce_countries', [ $this, 'translate_woocommerce_countries' ] );
add_filter(
'woocommerce_allow_send_queued_transactional_email',
[
$this,
'send_queued_transactional_email',
],
10,
3
);
add_action( 'woocommerce_order_partially_refunded_notification', [ $this, 'refresh_email_lang' ], self::PRIORITY_BEFORE_EMAIL_SET_LANGUAGE );
add_action( 'woocommerce_order_fully_refunded_notification', [ $this, 'refresh_email_lang' ], self::PRIORITY_BEFORE_EMAIL_SET_LANGUAGE );
add_filter( 'woocommerce_email_get_option', [ $this, 'filter_emails_strings' ], 10, 4 );
add_filter( 'woocommerce_email_setup_locale', '__return_false' );
add_filter( 'woocommerce_email_restore_locale', '__return_false' );
add_filter( 'woocommerce_email_heading_new_order', [ $this, 'new_order_email_heading' ] );
add_filter( 'woocommerce_email_subject_new_order', [ $this, 'new_order_email_subject' ] );
add_filter(
'woocommerce_email_heading_customer_on_hold_order',
[
$this,
'customer_on_hold_order_heading',
]
);
add_filter(
'woocommerce_email_subject_customer_on_hold_order',
[
$this,
'customer_on_hold_order_subject',
]
);
add_filter(
'woocommerce_email_heading_customer_processing_order',
[
$this,
'customer_processing_order_heading',
]
);
add_filter(
'woocommerce_email_subject_customer_processing_order',
[
$this,
'customer_processing_order_subject',
]
);
add_action( 'woocommerce_low_stock_notification', [ $this, 'low_stock_admin_notification' ], self::PRIORITY_BEFORE_EMAIL_SET_LANGUAGE );
add_action( 'woocommerce_no_stock_notification', [ $this, 'no_stock_admin_notification' ], self::PRIORITY_BEFORE_EMAIL_SET_LANGUAGE );
add_filter( 'woocommerce_rest_pre_insert_shop_order_object', [ $this, 'set_rest_language' ], 10, 2 );
}
private function add_hooks_to_restore_language_for_admin_notes() {
wpml_collect( [
'pending',
'processing',
'on-hold',
'completed',
'cancelled',
'refunded',
'failed',
] )->each( function ( $status ) {
add_action( 'woocommerce_order_status_' . $status, [ $this, 'comments_language' ], self::PRIORITY_AFTER_STATUS_CHANGE_EMAIL );
} );
}
public function email_refresh_in_ajax() {
if ( ! current_user_can( 'edit_shop_orders' ) ) {
return;
}
if ( ! check_admin_referer( 'woocommerce-mark-order-status' ) ) {
return;
}
/* phpcs:disable WordPress.Security.NonceVerification.Recommended */
if ( isset( $_GET['order_id'] ) ) {
$this->refresh_email_lang( (int) $_GET['order_id'] );
if ( isset( $_GET['status'] ) && 'completed' === $_GET['status'] ) {
$this->email_heading_completed( (int) $_GET['order_id'], true );
}
return true;
}
/* phpcs:enable WordPress.Security.NonceVerification.Recommended */
}
public function refresh_email_lang_complete( $order_id ) {
$this->order_id = $order_id;
$this->refresh_email_lang( $order_id );
$this->email_heading_completed( $order_id, true );
}
/**
* Translate WooCommerce emails.
*
* @param array|object $order
*/
public function email_header( $order ) {
if ( is_array( $order ) ) {
$order = $order['order_id'];
} elseif ( is_object( $order ) ) {
$order = method_exists( 'WC_Order', 'get_id' ) ? $order->get_id() : $order->id;
}
$this->refresh_email_lang( $order );
}
public function refresh_email_lang( $order_id ) {
$language = $this->get_order_language( $order_id );
if ( ! empty( $language ) ) {
$this->change_email_language( $language );
}
$this->force_translating_admin_options_in_backend();
}
/**
* Run before preparing the email to get admin options in the correct language.
*/
private function force_translating_admin_options_in_backend() {
do_action(
'wpml_st_force_translate_admin_options',
[
'woocommerce_checkout_privacy_policy_text',
'woocommerce_email_footer_text',
'woocommerce_email_from_address',
'woocommerce_email_from_name',
'woocommerce_price_decimal_sep',
'woocommerce_price_thousand_sep',
'woocommerce_registration_privacy_policy_text',
]
);
}
/**
* @param array|int $order_id
*
* @return null|string
*/
public function get_order_language( $order_id ) {
if ( is_array( $order_id ) ) {
if ( isset( $order_id['order_id'] ) ) {
$order_id = $order_id['order_id'];
} else {
return null;
}
}
$language = WCML_Orders::getLanguage( $order_id );
if ( ! $language ) {
$language = $this->rest_language;
}
return $language;
}
/**
* After email translation switch language to default.
*/
public function email_footer() {
$this->sitepress->switch_lang( $this->sitepress->get_default_language() );
}
public function comments_language() {
if ( is_admin() && false !== $this->admin_language ) {
$this->change_email_language( $this->admin_language );
} else {
$this->change_email_language( $this->wcmlStrings->get_domain_language( 'woocommerce' ) );
}
}
public function email_heading_completed( $order_id, $no_checking = false ) {
/** @var WC_Email_Customer_Completed_Order */
$email = $this->getEmailObject( 'WC_Email_Customer_Completed_Order', $no_checking );
if ( $email ) {
$translate = $this->getTranslatorFor(
'admin_texts_woocommerce_customer_completed_order_settings',
'[woocommerce_customer_completed_order_settings]',
WCML_Orders::getLanguage( $order_id ),
$email
);
$email->heading = $translate( 'heading' );
$email->subject = $translate( 'subject' );
$email->heading_downloadable = $translate( 'heading_downloadable' );
$email->subject_downloadable = $translate( 'subject_downloadable' );
$original_enabled_state = $email->enabled;
$email->enabled = 'no';
$email->trigger( $order_id );
$email->enabled = $original_enabled_state;
}
}
public function email_heading_processing( $order_id ) {
$this->translate_email_headings( $order_id, 'WC_Email_Customer_Processing_Order', 'woocommerce_customer_processing_order_settings' );
}
public function customer_processing_order_heading( $heading ) {
return $this->get_translated_order_strings( 'heading', $heading, 'WC_Email_Customer_Processing_Order' );
}
public function customer_processing_order_subject( $subject ) {
return $this->get_translated_order_strings( 'subject', $subject, 'WC_Email_Customer_Processing_Order' );
}
public function email_heading_on_hold( $order_id ) {
$this->translate_email_headings( $order_id, 'WC_Email_Customer_On_Hold_Order', 'woocommerce_customer_on_hold_order_settings' );
}
/**
* @param int|string $order_id
* @param string $class_name
* @param string $string_name
*/
private function translate_email_headings( $order_id, $class_name, $string_name ) {
$email = $this->getEmailObject( $class_name );
if ( $email ) {
$translate = $this->getTranslatorFor(
'admin_texts_' . $string_name,
'[' . $string_name . ']',
WCML_Orders::getLanguage( $order_id ),
$email
);
$email->heading = $translate( 'heading' );
$email->subject = $translate( 'subject' );
$original_enabled_state = $email->enabled;
$email->enabled = 'no';
/* @phpstan-ignore-next-line */
$email->trigger( $order_id );
$email->enabled = $original_enabled_state;
}
}
public function customer_on_hold_order_heading( $heading ) {
return $this->get_translated_order_strings( 'heading', $heading, 'WC_Email_Customer_On_Hold_Order' );
}
public function customer_on_hold_order_subject( $subject ) {
return $this->get_translated_order_strings( 'subject', $subject, 'WC_Email_Customer_On_Hold_Order' );
}
public function email_heading_note( $args ) {
/** @var WC_Email_Customer_Note */
$email = $this->getEmailObject( 'WC_Email_Customer_Note' );
if ( $email ) {
$translate = $this->getTranslatorFor(
'admin_texts_woocommerce_customer_note_settings',
'[woocommerce_customer_note_settings]',
null,
$email
);
$email->heading = $translate( 'heading' );
$email->subject = $translate( 'subject' );
$original_enabled_state = $email->enabled;
$email->enabled = 'no';
$email->trigger( $args );
$email->enabled = $original_enabled_state;
}
}
/**
* @param string $value
* @param WC_Email $email
* @param string $old_value
* @param string $key
*
* @return mixed
*/
public function filter_emails_strings( $value, $email, $old_value, $key ) {
$translated_value = false;
$emailStrings = wpml_collect( [
'subject',
'subject_downloadable',
'subject_partial',
'subject_full',
'subject_paid',
'heading',
'heading_paid',
'heading_downloadable',
'heading_partial',
'heading_full',
'additional_content',
] );
if (
isset( $email->object ) &&
$emailStrings->contains( $key )
) {
$isAdminEmail = wpml_collect([
'new_order',
'cancelled_order',
'failed_order',
])->contains( $email->id );
$translated_value = $this->get_email_translated_string( $key, $email, $isAdminEmail, $value );
}
return $translated_value ?: $value;
}
/**
* @param string $key
* @param WC_Email $email
* @param bool $isAdminEmail
* @param string|null $originalValue
* @param string $originalDomain
*
* @return string
*/
public function get_email_translated_string( $key, $email, $isAdminEmail, $originalValue = null, $originalDomain = 'woocommerce' ) {
list( $context, $name ) = $this->get_email_context_and_name( $email );
$orderId = $this->get_order_id_from_email_object( $email );
$language = $isAdminEmail
? $this->get_admin_language_by_email( $email->recipient, $orderId )
: WCML_Orders::getLanguage( $orderId );
return $this->getStringTranslation( $context, $name . $key, $language, $originalValue, $originalDomain );
}
/**
* @param WC_Email $emailObject
*
* @return array
*/
public function get_email_context_and_name( $emailObject ) {
$emailId = $emailObject->id;
if ( $emailObject instanceof WC_Email_Customer_Refunded_Order ) {
$emailId = 'customer_refunded_order';
}
$context = 'admin_texts_woocommerce_' . $emailId . '_settings';
$name = '[woocommerce_' . $emailId . '_settings]';
return [ $context, $name ];
}
/**
* @param WC_Email $email
*
* @return bool|string|int
*/
private function get_order_id_from_email_object( $email ) {
if ( is_callable( [ $email->object, 'get_id' ] ) ) {
return $email->object->get_id();
}
if ( is_array( $email->object ) && isset( $email->object['ID'] ) ) {
return $email->object['ID'];
}
return false;
}
public function new_order_admin_email( $order_id ) {
/** @var WC_Email_New_Order */
$email = $this->getEmailObject( 'WC_Email_New_Order', true );
if ( $email ) {
$recipients = explode( ',', $email->get_recipient() );
$allowResendForAllRecipients = function() use ( $recipients ) {
static $numberOfAllowedResend;
if ( null === $numberOfAllowedResend ) {
$numberOfAllowedResend = count( $recipients );
} else {
$numberOfAllowedResend--;
}
return (bool) $numberOfAllowedResend;
};
add_filter( 'woocommerce_new_order_email_allows_resend', $allowResendForAllRecipients, 20 );
foreach ( $recipients as $recipient ) {
$admin_language = $this->get_admin_language_by_email( $recipient, $order_id );
$this->change_email_language( $admin_language );
$translate = $this->getTranslatorFor(
'admin_texts_woocommerce_new_order_settings',
'[woocommerce_new_order_settings]',
$admin_language ?: WCML_Orders::getLanguage( $order_id ),
$email
);
$email->heading = $translate( 'heading' );
$email->subject = $translate( 'subject' );
$email->recipient = $recipient;
$email->trigger( $order_id );
}
add_filter(
'woocommerce_email_enabled_new_order',
self::getPreventDuplicatedNewOrderEmail( $order_id ),
PHP_INT_MAX,
2
);
$this->refresh_email_lang( $order_id );
}
}
/**
* @param int $processedOrderId
*
* @return Closure ( bool, \WC_Order ) -> bool
*/
public static function getPreventDuplicatedNewOrderEmail( $processedOrderId ) {
return function( $isEmailEnabled, $order ) use ( $processedOrderId ) {
return $order->get_id() === $processedOrderId ? false : $isEmailEnabled;
};
}
/**
* @param string $recipient
* @param integer|bool $order_id
*
* @return string
*/
private function get_admin_language_by_email( $recipient, $order_id = false ) {
$user = get_user_by( 'email', $recipient );
if ( $user ) {
$language = $this->sitepress->get_user_admin_language( $user->ID, true );
} else {
$language = $this->sitepress->get_default_language();
}
/**
* @deprecated since 4.12.0, use `wcml_get_admin_language_by_email` instead.
*/
$language = apply_filters( 'wcml_new_order_admin_email_language', $language, $recipient, $order_id );
/**
* Filter admin email language for recipient
*
* @since 4.12.0
*
* @param string $admin_language Admin language
* @param string $recipient Admin email
* @param int $order_id Order ID
*/
return apply_filters( 'wcml_get_admin_language_by_email', $language, $recipient, $order_id );
}
public function new_order_email_heading( $heading ) {
return $this->get_translated_order_strings( 'heading', $heading, 'WC_Email_New_Order' );
}
public function new_order_email_subject( $subject ) {
return $this->get_translated_order_strings( 'subject', $subject, 'WC_Email_New_Order' );
}
/**
* @param string $type
* @param string $order_string
* @param string $class_name
*
* @return string
*/
private function get_translated_order_strings( $type, $order_string, $class_name ) {
$email = $this->getEmailObject( $class_name );
if ( 'heading' === $type ) {
$translated_string = $email->heading;
} elseif ( 'subject' === $type ) {
$translated_string = $email->subject;
} else {
return $order_string;
}
return $translated_string ? $email->format_string( $translated_string ) : $order_string;
}
public function backend_new_order_admin_email( $order_id ) {
if ( isset( $_POST['wc_order_action'] ) && in_array(
$_POST['wc_order_action'],
[
'send_email_new_order',
'send_order_details_admin',
]
) ) {
$this->new_order_admin_email( $order_id );
}
}
public function change_email_language( $lang ) {
if ( ! $this->admin_language ) {
$this->admin_language = $this->sitepress->get_user_admin_language( get_current_user_id(), true );
}
$this->sitepress->switch_lang( $lang, true );
$this->locale = $this->sitepress->get_locale( $lang );
}
/**
* @deprecated since WCML 4.12, use `getStringTranslation` instead.
*
* @param string $context
* @param string $name
* @param false $order_id
* @param null $language_code
*
* @return string|false
*/
public function wcml_get_translated_email_string( $context, $name, $order_id = false, $language_code = null ) {
if ( $order_id && ! $language_code ) {
$order_language = WCML_Orders::getLanguage( $order_id );
if ( $order_language ) {
$language_code = $order_language;
}
}
return $this->wcmlStrings->get_translated_string_by_name_and_context( $context, $name, $language_code );
}
/**
* First we try to get the string translation from admin string.
* If falsy, we try to translate the string with the default gettext.
*
* @param string $domain
* @param string $name
* @param string|null $lang
* @param string|null $originalValue
* @param string $originalDomain
*
* @return string
*/
public function getStringTranslation( $domain, $name, $lang = null, $originalValue = null, $originalDomain = 'woocommerce' ) {
return $this->wcmlStrings->get_translated_string_by_name_and_context( $domain, $name, $lang ) ?: $this->getStringTranslationWithGettext( $originalValue, $originalDomain, $lang );
}
/**
* @param string $value
* @param string $domain
* @param string $lang
*
* @return string
*/
private function getStringTranslationWithGettext( $value, $domain, $lang ) {
if ( $value && $lang ) {
$switchLang = new WPML_Temporary_Switch_Language( $this->sitepress, $lang );
$translation = __( $value, $domain );
$switchLang->restore_lang();
return $translation;
}
return $value;
}
public function icl_current_string_language( $current_language, $name ) {
$order_id = false;
/* phpcs:disable WordPress.Security.NonceVerification */
if ( isset( $_POST['action'] ) && 'editpost' === $_POST['action'] && isset( $_POST['post_type'] ) && 'shop_order' === $_POST['post_type'] && isset( $_POST['wc_order_action'] ) && 'send_email_new_order' !== $_POST['wc_order_action'] ) {
$order_id = filter_input( INPUT_POST, 'post_ID', FILTER_SANITIZE_NUMBER_INT );
} elseif ( isset( $_POST['action'] ) && 'woocommerce_add_order_note' === $_POST['action'] && isset( $_POST['note_type'] ) && 'customer' === $_POST['note_type'] ) {
$order_id = filter_input( INPUT_POST, 'post_id', FILTER_SANITIZE_NUMBER_INT );
} elseif ( isset( $_GET['action'] ) && isset( $_GET['order_id'] ) && ( 'woocommerce_mark_order_complete' === $_GET['action'] || 'woocommerce_mark_order_status' === $_GET['action'] ) ) {
$order_id = filter_input( INPUT_GET, 'order_id', FILTER_SANITIZE_NUMBER_INT );
} elseif ( WCML\COT\Helper::isOrderEditAdminScreen() ) {
$order_id = filter_input( INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT );
} elseif ( isset( $_GET['action'] ) && 'mark_completed' === $_GET['action'] && $this->order_id ) {
$order_id = $this->order_id;
} elseif ( isset( $_POST['action'] ) && 'woocommerce_refund_line_items' === $_POST['action'] ) {
$order_id = filter_input( INPUT_POST, 'order_id', FILTER_SANITIZE_NUMBER_INT );
} elseif ( empty( $_POST ) && isset( $_GET['page'] ) && 'wc-settings' === $_GET['page'] && isset( $_GET['tab'] ) && 'email' === $_GET['tab'] && '[woocommerce' === substr( $name, 0, 12 ) ) {
$email_string = explode( ']', str_replace( '[', '', $name ) );
$email_option = get_option( $email_string[0], true );
$context = 'admin_texts_' . $email_string[0];
$current_language = $this->wcmlStrings->get_string_language( $email_option[ $email_string[1] ], $context, $name );
} elseif ( $this->order_id ) {
$order_id = $this->order_id;
}
/* phpcs:enable WordPress.Security.NonceVerification */
$order_id = apply_filters( 'wcml_send_email_order_id', $order_id );
if ( $order_id ) {
$order_language = WCML_Orders::getLanguage( $order_id );
if ( $order_language ) {
$current_language = $order_language;
} else {
$current_language = $this->sitepress->get_current_language();
}
}
return apply_filters( 'wcml_email_language', $current_language, $order_id );
}
/**
* Set correct locale code for emails.
*
* @param string $locale
* @param string $domain
*
* @return string
*/
public function set_locale_for_emails( $locale, $domain ) {
if ( 'woocommerce' === $domain && $this->locale ) {
$locale = $this->locale;
}
return $locale;
}
public function translate_woocommerce_countries( $countries ) {
/* phpcs:disable WordPress.Security.NonceVerification.Missing */
if ( isset( $_POST['wc_order_action'] ) && 'send_email_new_order' !== $_POST['wc_order_action'] && isset( $_POST['post_ID'] ) ) {
$current_language = $this->sitepress->get_current_language();
$this->refresh_email_lang( (int) $_POST['post_ID'] );
$countries = include WC()->plugin_path() . '/i18n/countries.php';
$this->change_email_language( $current_language );
}
/* phpcs:enable WordPress.Security.NonceVerification.Missing */
return $countries;
}
public function send_queued_transactional_email( $allow, $filter, $args ) {
$this->order_id = $args[0];
return $allow;
}
/**
* @param string $emailClass
* @param bool $ignoreClassExists
*
* @return WC_Email|null
*/
private function getEmailObject( $emailClass, $ignoreClassExists = false ) {
$wcEmails = $this->woocommerce->mailer();
if (
( $ignoreClassExists || class_exists( $emailClass ) )
&& isset( $wcEmails->emails[ $emailClass ] )
) {
return $wcEmails->emails[ $emailClass ];
}
return null;
}
/**
* @param string $domain
* @param string $namePrefix
* @param string|null $languageCode
* @param WC_Email $email
*
* @return Closure
*/
private function getTranslatorFor( $domain, $namePrefix, $languageCode, $email ) {
return function( $field ) use ( $domain, $namePrefix, $languageCode, $email ) {
return $this->getStringTranslation( $domain, $namePrefix . $field, $languageCode, Obj::prop( $field, $email ) );
};
}
/**
* @param WC_Product $product
*/
public function low_stock_admin_notification( $product ) {
$this->admin_notification( $product, 'woocommerce_low_stock_notification', 'low_stock' );
}
/**
* @param WC_Product $product
*/
public function no_stock_admin_notification( $product ) {
$this->admin_notification( $product, 'woocommerce_no_stock_notification', 'no_stock' );
}
/**
* @param WC_Product $product
* @param string $action
* @param string $method
*/
private function admin_notification( $product, $action, $method ) {
$wcEmails = $this->woocommerce->mailer();
remove_action( $action, [ $wcEmails, $method ] );
if ( method_exists( $wcEmails, $method ) ) {
$admin_language = $this->get_admin_language_by_email( get_option( 'woocommerce_stock_email_recipient' ) );
$product_id_in_admin_language = wpml_object_id_filter(
$product->get_id(),
'product',
true,
$admin_language
);
$this->sitepress->switch_lang( $admin_language );
$wcEmails->$method( wc_get_product( $product_id_in_admin_language ) );
$this->sitepress->switch_lang();
}
}
/**
* @param WC_Data $order Object object.
* @param WP_REST_Request $request Request object.
*
* @return WC_Data
*/
public function set_rest_language( $order, $request ) {
$this->rest_language = isset( $request['lang'] ) ? $request['lang'] : null;
return $order;
}
}