2012-09-17 00:53:17 +00:00
< ? php
/**
* Transactional Emails Controller
*
* WooCommerce Emails Class which handles the sending on transactional emails and email templates . This class loads in available emails .
*
2020-08-05 16:36:24 +00:00
* @ package WooCommerce\Classes\Emails
2018-03-22 17:54:16 +00:00
* @ version 2.3 . 0
*/
2020-01-29 05:21:29 +00:00
use Automattic\Jetpack\Constants ;
2018-03-22 17:54:16 +00:00
defined ( 'ABSPATH' ) || exit ;
/**
* Emails class .
2012-09-17 00:53:17 +00:00
*/
class WC_Emails {
2012-11-27 16:22:47 +00:00
2018-03-22 17:54:16 +00:00
/**
* Array of email notification classes
*
2018-10-02 15:03:17 +00:00
* @ var WC_Email []
2018-03-22 17:54:16 +00:00
*/
public $emails = array ();
2012-11-27 16:22:47 +00:00
2018-03-22 17:54:16 +00:00
/**
* The single instance of the class
*
* @ var WC_Emails
*/
2013-09-12 13:41:02 +00:00
protected static $_instance = null ;
2017-04-06 12:46:07 +00:00
/**
* Background emailer class .
2018-03-22 17:54:16 +00:00
*
* @ var WC_Background_Emailer
2017-04-06 12:46:07 +00:00
*/
2018-03-22 17:54:16 +00:00
protected static $background_emailer = null ;
2017-04-06 12:46:07 +00:00
2013-09-12 13:41:02 +00:00
/**
2015-11-03 13:31:20 +00:00
* Main WC_Emails Instance .
2013-09-12 13:41:02 +00:00
*
2014-06-19 19:43:05 +00:00
* Ensures only one instance of WC_Emails is loaded or can be loaded .
2013-09-12 13:41:02 +00:00
*
* @ since 2.1
* @ static
2014-06-19 19:43:05 +00:00
* @ return WC_Emails Main instance
2013-09-12 13:41:02 +00:00
*/
public static function instance () {
2014-10-20 15:59:02 +00:00
if ( is_null ( self :: $_instance ) ) {
2013-09-12 13:41:02 +00:00
self :: $_instance = new self ();
2014-10-20 15:59:02 +00:00
}
2013-09-12 13:41:02 +00:00
return self :: $_instance ;
}
/**
* Cloning is forbidden .
*
* @ since 2.1
*/
public function __clone () {
2018-02-07 22:01:12 +00:00
wc_doing_it_wrong ( __FUNCTION__ , __ ( 'Cloning is forbidden.' , 'woocommerce' ), '2.1' );
2013-09-12 13:41:02 +00:00
}
/**
* Unserializing instances of this class is forbidden .
*
* @ since 2.1
*/
public function __wakeup () {
2018-02-07 22:01:12 +00:00
wc_doing_it_wrong ( __FUNCTION__ , __ ( 'Unserializing instances of this class is forbidden.' , 'woocommerce' ), '2.1' );
2013-09-12 13:41:02 +00:00
}
2014-11-26 00:02:41 +00:00
/**
2015-11-03 13:31:20 +00:00
* Hook in all transactional emails .
2014-11-26 00:02:41 +00:00
*/
public static function init_transactional_emails () {
2018-03-22 17:54:16 +00:00
$email_actions = apply_filters (
2019-03-04 14:53:19 +00:00
'woocommerce_email_actions' ,
array (
2018-03-22 17:54:16 +00:00
'woocommerce_low_stock' ,
'woocommerce_no_stock' ,
'woocommerce_product_on_backorder' ,
'woocommerce_order_status_pending_to_processing' ,
'woocommerce_order_status_pending_to_completed' ,
'woocommerce_order_status_processing_to_cancelled' ,
'woocommerce_order_status_pending_to_failed' ,
'woocommerce_order_status_pending_to_on-hold' ,
'woocommerce_order_status_failed_to_processing' ,
'woocommerce_order_status_failed_to_completed' ,
'woocommerce_order_status_failed_to_on-hold' ,
2018-08-31 16:31:16 +00:00
'woocommerce_order_status_cancelled_to_processing' ,
'woocommerce_order_status_cancelled_to_completed' ,
'woocommerce_order_status_cancelled_to_on-hold' ,
2018-03-22 17:54:16 +00:00
'woocommerce_order_status_on-hold_to_processing' ,
'woocommerce_order_status_on-hold_to_cancelled' ,
'woocommerce_order_status_on-hold_to_failed' ,
'woocommerce_order_status_completed' ,
'woocommerce_order_fully_refunded' ,
'woocommerce_order_partially_refunded' ,
'woocommerce_new_customer_note' ,
'woocommerce_created_customer' ,
)
);
2014-11-26 00:02:41 +00:00
2017-04-13 13:22:33 +00:00
if ( apply_filters ( 'woocommerce_defer_transactional_emails' , false ) ) {
2017-04-06 12:46:07 +00:00
self :: $background_emailer = new WC_Background_Emailer ();
foreach ( $email_actions as $action ) {
add_action ( $action , array ( __CLASS__ , 'queue_transactional_email' ), 10 , 10 );
}
} else {
foreach ( $email_actions as $action ) {
add_action ( $action , array ( __CLASS__ , 'send_transactional_email' ), 10 , 10 );
}
2014-11-26 00:02:41 +00:00
}
}
2017-02-01 19:08:18 +00:00
/**
2017-04-18 10:35:37 +00:00
* Queues transactional email so it ' s not sent in current request if enabled ,
* otherwise falls back to send now .
2019-11-22 17:58:12 +00:00
*
* @ param mixed ... $args Optional arguments .
2017-02-01 19:08:18 +00:00
*/
2019-11-22 17:58:12 +00:00
public static function queue_transactional_email ( ... $args ) {
2017-04-18 10:35:37 +00:00
if ( is_a ( self :: $background_emailer , 'WC_Background_Emailer' ) ) {
2018-03-22 17:54:16 +00:00
self :: $background_emailer -> push_to_queue (
array (
'filter' => current_filter (),
'args' => func_get_args (),
)
);
2017-04-18 10:35:37 +00:00
} else {
2019-11-22 17:58:12 +00:00
self :: send_transactional_email ( ... $args );
2017-04-18 10:35:37 +00:00
}
2017-02-01 19:08:18 +00:00
}
2014-11-26 00:02:41 +00:00
/**
* Init the mailer instance and call the notifications for the current filter .
2017-02-01 19:08:18 +00:00
*
2017-02-24 20:00:22 +00:00
* @ internal
*
* @ param string $filter Filter name .
2017-02-28 21:16:58 +00:00
* @ param array $args Email args ( default : []) .
2017-02-01 19:08:18 +00:00
*/
2017-02-28 21:16:03 +00:00
public static function send_queued_transactional_email ( $filter = '' , $args = array () ) {
if ( apply_filters ( 'woocommerce_allow_send_queued_transactional_email' , true , $filter , $args ) ) {
2017-02-24 13:16:41 +00:00
self :: instance (); // Init self so emails exist.
2017-04-05 18:50:40 +00:00
// Ensure gateways are loaded in case they need to insert data into the emails.
WC () -> payment_gateways ();
WC () -> shipping ();
2017-02-28 21:16:03 +00:00
do_action_ref_array ( $filter . '_notification' , $args );
2017-02-24 13:16:41 +00:00
}
2017-02-01 19:08:18 +00:00
}
/**
* Init the mailer instance and call the notifications for the current filter .
*
2017-02-24 20:00:22 +00:00
* @ internal
*
* @ param array $args Email args ( default : []) .
2014-11-26 00:02:41 +00:00
*/
2017-02-01 19:08:18 +00:00
public static function send_transactional_email ( $args = array () ) {
2017-04-13 13:22:07 +00:00
try {
$args = func_get_args ();
self :: instance (); // Init self so emails exist.
do_action_ref_array ( current_filter () . '_notification' , $args );
} catch ( Exception $e ) {
2018-05-24 14:37:00 +00:00
$error = 'Transactional email triggered fatal error for callback ' . current_filter ();
$logger = wc_get_logger ();
$logger -> critical (
$error . PHP_EOL ,
array (
'source' => 'transactional-emails' ,
)
);
2020-01-29 05:21:29 +00:00
if ( Constants :: is_true ( 'WP_DEBUG' ) ) {
2018-05-24 14:37:00 +00:00
trigger_error ( $error , E_USER_WARNING ); // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped, WordPress.PHP.DevelopmentFunctions.error_log_trigger_error
2017-04-13 13:22:07 +00:00
}
}
2014-11-26 00:02:41 +00:00
}
2012-09-17 00:53:17 +00:00
/**
* Constructor for the email class hooks in all emails that can be sent .
*/
2014-10-20 15:59:02 +00:00
public function __construct () {
2013-07-26 14:36:28 +00:00
$this -> init ();
2018-03-22 17:54:16 +00:00
// Email Header, Footer and content hooks.
2013-07-26 14:36:28 +00:00
add_action ( 'woocommerce_email_header' , array ( $this , 'email_header' ) );
add_action ( 'woocommerce_email_footer' , array ( $this , 'email_footer' ) );
2017-07-11 13:52:30 +00:00
add_action ( 'woocommerce_email_order_details' , array ( $this , 'order_downloads' ), 10 , 4 );
2015-11-30 15:16:23 +00:00
add_action ( 'woocommerce_email_order_details' , array ( $this , 'order_details' ), 10 , 4 );
2013-07-26 14:36:28 +00:00
add_action ( 'woocommerce_email_order_meta' , array ( $this , 'order_meta' ), 10 , 3 );
2014-10-08 21:47:50 +00:00
add_action ( 'woocommerce_email_customer_details' , array ( $this , 'customer_details' ), 10 , 3 );
2015-05-06 12:10:06 +00:00
add_action ( 'woocommerce_email_customer_details' , array ( $this , 'email_addresses' ), 20 , 3 );
2013-07-26 14:36:28 +00:00
2018-03-22 17:54:16 +00:00
// Hooks for sending emails during store events.
2013-07-26 14:36:28 +00:00
add_action ( 'woocommerce_low_stock_notification' , array ( $this , 'low_stock' ) );
add_action ( 'woocommerce_no_stock_notification' , array ( $this , 'no_stock' ) );
add_action ( 'woocommerce_product_on_backorder_notification' , array ( $this , 'backorder' ) );
add_action ( 'woocommerce_created_customer_notification' , array ( $this , 'customer_new_account' ), 10 , 3 );
2017-11-01 13:10:25 +00:00
// Hook for replacing {site_title} in email-footer.
2019-03-04 14:53:19 +00:00
add_filter ( 'woocommerce_email_footer_text' , array ( $this , 'replace_placeholders' ) );
2017-10-28 02:18:53 +00:00
2018-03-22 17:54:16 +00:00
// Let 3rd parties unhook the above via this hook.
2013-07-26 14:36:28 +00:00
do_action ( 'woocommerce_email' , $this );
}
/**
2015-11-03 13:31:20 +00:00
* Init email classes .
2013-07-26 14:36:28 +00:00
*/
2014-10-20 15:59:02 +00:00
public function init () {
2018-03-22 17:54:16 +00:00
// Include email classes.
include_once dirname ( __FILE__ ) . '/emails/class-wc-email.php' ;
2020-08-26 21:46:44 +00:00
$this -> emails [ 'WC_Email_New_Order' ] = include __DIR__ . '/emails/class-wc-email-new-order.php' ;
$this -> emails [ 'WC_Email_Cancelled_Order' ] = include __DIR__ . '/emails/class-wc-email-cancelled-order.php' ;
$this -> emails [ 'WC_Email_Failed_Order' ] = include __DIR__ . '/emails/class-wc-email-failed-order.php' ;
$this -> emails [ 'WC_Email_Customer_On_Hold_Order' ] = include __DIR__ . '/emails/class-wc-email-customer-on-hold-order.php' ;
$this -> emails [ 'WC_Email_Customer_Processing_Order' ] = include __DIR__ . '/emails/class-wc-email-customer-processing-order.php' ;
$this -> emails [ 'WC_Email_Customer_Completed_Order' ] = include __DIR__ . '/emails/class-wc-email-customer-completed-order.php' ;
$this -> emails [ 'WC_Email_Customer_Refunded_Order' ] = include __DIR__ . '/emails/class-wc-email-customer-refunded-order.php' ;
$this -> emails [ 'WC_Email_Customer_Invoice' ] = include __DIR__ . '/emails/class-wc-email-customer-invoice.php' ;
$this -> emails [ 'WC_Email_Customer_Note' ] = include __DIR__ . '/emails/class-wc-email-customer-note.php' ;
$this -> emails [ 'WC_Email_Customer_Reset_Password' ] = include __DIR__ . '/emails/class-wc-email-customer-reset-password.php' ;
$this -> emails [ 'WC_Email_Customer_New_Account' ] = include __DIR__ . '/emails/class-wc-email-customer-new-account.php' ;
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
$this -> emails = apply_filters ( 'woocommerce_email_classes' , $this -> emails );
}
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
/**
* Return the email classes - used in admin to load settings .
2012-11-27 16:22:47 +00:00
*
2018-10-02 15:03:17 +00:00
* @ return WC_Email []
2012-09-17 00:53:17 +00:00
*/
2014-10-20 15:59:02 +00:00
public function get_emails () {
2012-09-17 00:53:17 +00:00
return $this -> emails ;
}
/**
* Get from name for email .
*
* @ return string
*/
2014-10-20 15:59:02 +00:00
public function get_from_name () {
2015-11-02 09:11:25 +00:00
return wp_specialchars_decode ( get_option ( 'woocommerce_email_from_name' ), ENT_QUOTES );
2012-09-17 00:53:17 +00:00
}
/**
* Get from email address .
*
* @ return string
*/
2014-10-20 15:59:02 +00:00
public function get_from_address () {
2015-11-02 09:11:25 +00:00
return sanitize_email ( get_option ( 'woocommerce_email_from_address' ) );
2012-09-17 00:53:17 +00:00
}
/**
* Get the email header .
*
2018-03-22 17:54:16 +00:00
* @ param mixed $email_heading Heading for the email .
2012-09-17 00:53:17 +00:00
*/
2014-10-20 15:59:02 +00:00
public function email_header ( $email_heading ) {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'emails/email-header.php' , array ( 'email_heading' => $email_heading ) );
2012-09-17 00:53:17 +00:00
}
/**
* Get the email footer .
*/
2014-10-20 15:59:02 +00:00
public function email_footer () {
2013-11-25 12:45:04 +00:00
wc_get_template ( 'emails/email-footer.php' );
2012-09-17 00:53:17 +00:00
}
2019-03-04 14:53:19 +00:00
/**
* Replace placeholder text in strings .
*
2019-05-21 20:47:54 +00:00
* @ since 3.7 . 0
2019-03-04 14:53:19 +00:00
* @ param string $string Email footer text .
* @ return string Email footer text with any replacements done .
*/
public function replace_placeholders ( $string ) {
$domain = wp_parse_url ( home_url (), PHP_URL_HOST );
return str_replace (
array (
'{site_title}' ,
2020-02-11 15:35:40 +00:00
'{site_address}' ,
2020-02-11 09:46:32 +00:00
'{site_url}' ,
2019-05-21 20:47:54 +00:00
'{woocommerce}' ,
2019-03-04 14:53:19 +00:00
'{WooCommerce}' ,
),
array (
$this -> get_blogname (),
$domain ,
2020-02-11 15:35:40 +00:00
$domain ,
2019-03-04 14:53:19 +00:00
'<a href="https://woocommerce.com">WooCommerce</a>' ,
2019-05-21 20:47:54 +00:00
'<a href="https://woocommerce.com">WooCommerce</a>' ,
2019-03-04 14:53:19 +00:00
),
$string
);
}
2017-10-28 02:18:53 +00:00
/**
2017-11-01 13:10:25 +00:00
* Filter callback to replace { site_title } in email footer
*
* @ since 3.3 . 0
2019-07-04 07:36:05 +00:00
* @ deprecated 3.7 . 0
2017-11-01 13:10:25 +00:00
* @ param string $string Email footer text .
2017-10-28 02:18:53 +00:00
* @ return string Email footer text with any replacements done .
*/
public function email_footer_replace_site_title ( $string ) {
2019-07-04 07:36:05 +00:00
wc_deprecated_function ( 'WC_Emails::email_footer_replace_site_title' , '3.7.0' , 'WC_Emails::replace_placeholders' );
return $this -> replace_placeholders ( $string );
2017-10-28 02:18:53 +00:00
}
2012-09-17 00:53:17 +00:00
/**
* Wraps a message in the woocommerce mail template .
*
2017-09-26 16:27:50 +00:00
* @ param string $email_heading Heading text .
* @ param string $message Email message .
* @ param bool $plain_text Set true to send as plain text . Default to false .
2017-05-15 11:50:52 +00:00
*
2012-09-17 00:53:17 +00:00
* @ return string
*/
2014-10-20 15:59:02 +00:00
public function wrap_message ( $email_heading , $message , $plain_text = false ) {
2017-09-26 16:27:50 +00:00
// Buffer.
2012-09-17 00:53:17 +00:00
ob_start ();
2017-09-26 16:27:50 +00:00
do_action ( 'woocommerce_email_header' , $email_heading , null );
2012-09-17 00:53:17 +00:00
2018-03-22 17:54:16 +00:00
echo wpautop ( wptexturize ( $message ) ); // WPCS: XSS ok.
2012-09-17 00:53:17 +00:00
2017-09-26 16:27:50 +00:00
do_action ( 'woocommerce_email_footer' , null );
2012-09-17 00:53:17 +00:00
2017-09-26 16:27:50 +00:00
// Get contents.
2012-09-17 00:53:17 +00:00
$message = ob_get_clean ();
return $message ;
}
/**
* Send the email .
*
2018-03-22 17:54:16 +00:00
* @ param mixed $to Receiver .
* @ param mixed $subject Email subject .
* @ param mixed $message Message .
* @ param string $headers Email headers ( default : " Content-Type: text/html \r \n " ) .
* @ param string $attachments Attachments ( default : " " ) .
2015-07-16 15:56:34 +00:00
* @ return bool
2012-09-17 00:53:17 +00:00
*/
2018-03-22 17:54:16 +00:00
public function send ( $to , $subject , $message , $headers = " Content-Type: text/html \r \n " , $attachments = '' ) {
// Send.
2014-09-23 17:02:00 +00:00
$email = new WC_Email ();
2015-07-16 15:56:34 +00:00
return $email -> send ( $to , $subject , $message , $headers , $attachments );
2012-09-17 00:53:17 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
/**
* Prepare and send the customer invoice email on demand .
2017-05-15 11:50:52 +00:00
*
2018-03-22 17:54:16 +00:00
* @ param int | WC_Order $order Order instance or ID .
2012-09-17 00:53:17 +00:00
*/
2014-10-20 15:59:02 +00:00
public function customer_invoice ( $order ) {
2012-09-17 00:53:17 +00:00
$email = $this -> emails [ 'WC_Email_Customer_Invoice' ];
2017-02-09 22:49:39 +00:00
if ( ! is_object ( $order ) ) {
$order = wc_get_order ( absint ( $order ) );
}
$email -> trigger ( $order -> get_id (), $order );
2012-09-17 00:53:17 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
/**
* Customer new account welcome email .
*
2018-03-22 17:54:16 +00:00
* @ param int $customer_id Customer ID .
* @ param array $new_customer_data New customer data .
* @ param bool $password_generated If password is generated .
2012-09-17 00:53:17 +00:00
*/
2014-10-20 15:59:02 +00:00
public function customer_new_account ( $customer_id , $new_customer_data = array (), $password_generated = false ) {
if ( ! $customer_id ) {
2012-09-17 00:53:17 +00:00
return ;
2014-10-20 15:59:02 +00:00
}
2012-11-27 16:22:47 +00:00
2013-06-04 15:33:05 +00:00
$user_pass = ! empty ( $new_customer_data [ 'user_pass' ] ) ? $new_customer_data [ 'user_pass' ] : '' ;
2012-09-17 00:53:17 +00:00
$email = $this -> emails [ 'WC_Email_Customer_New_Account' ];
2013-06-04 15:33:05 +00:00
$email -> trigger ( $customer_id , $user_pass , $password_generated );
2012-11-27 16:22:47 +00:00
}
2015-11-30 15:16:23 +00:00
/**
* Show the order details table
2017-05-15 11:50:52 +00:00
*
2018-03-22 17:54:16 +00:00
* @ param WC_Order $order Order instance .
* @ param bool $sent_to_admin If should sent to admin .
* @ param bool $plain_text If is plain text email .
* @ param string $email Email address .
2015-11-30 15:16:23 +00:00
*/
public function order_details ( $order , $sent_to_admin = false , $plain_text = false , $email = '' ) {
if ( $plain_text ) {
2018-03-22 17:54:16 +00:00
wc_get_template (
2019-03-04 14:53:19 +00:00
'emails/plain/email-order-details.php' ,
array (
2018-03-22 17:54:16 +00:00
'order' => $order ,
'sent_to_admin' => $sent_to_admin ,
'plain_text' => $plain_text ,
'email' => $email ,
)
);
2015-11-30 15:16:23 +00:00
} else {
2018-03-22 17:54:16 +00:00
wc_get_template (
2019-03-04 14:53:19 +00:00
'emails/email-order-details.php' ,
array (
2018-03-22 17:54:16 +00:00
'order' => $order ,
'sent_to_admin' => $sent_to_admin ,
'plain_text' => $plain_text ,
'email' => $email ,
)
);
2015-11-30 15:16:23 +00:00
}
}
2017-07-11 13:52:30 +00:00
/**
* Show order downloads in a table .
*
* @ since 3.2 . 0
2018-03-22 17:54:16 +00:00
* @ param WC_Order $order Order instance .
* @ param bool $sent_to_admin If should sent to admin .
* @ param bool $plain_text If is plain text email .
* @ param string $email Email address .
2017-07-11 13:52:30 +00:00
*/
public function order_downloads ( $order , $sent_to_admin = false , $plain_text = false , $email = '' ) {
2019-11-01 14:51:30 +00:00
$show_downloads = $order -> has_downloadable_item () && $order -> is_download_permitted () && ! $sent_to_admin && ! is_a ( $email , 'WC_Email_Customer_Refunded_Order' );
2017-07-11 13:52:30 +00:00
if ( ! $show_downloads ) {
return ;
}
$downloads = $order -> get_downloadable_items ();
2018-03-22 17:54:16 +00:00
$columns = apply_filters (
2019-03-04 14:53:19 +00:00
'woocommerce_email_downloads_columns' ,
array (
2018-03-22 17:54:16 +00:00
'download-product' => __ ( 'Product' , 'woocommerce' ),
'download-expires' => __ ( 'Expires' , 'woocommerce' ),
'download-file' => __ ( 'Download' , 'woocommerce' ),
)
);
2017-07-11 13:52:30 +00:00
if ( $plain_text ) {
2018-03-22 17:54:16 +00:00
wc_get_template (
2019-03-04 14:53:19 +00:00
'emails/plain/email-downloads.php' ,
array (
2018-03-22 17:54:16 +00:00
'order' => $order ,
'sent_to_admin' => $sent_to_admin ,
'plain_text' => $plain_text ,
'email' => $email ,
'downloads' => $downloads ,
'columns' => $columns ,
)
);
2017-07-11 13:52:30 +00:00
} else {
2018-03-22 17:54:16 +00:00
wc_get_template (
2019-03-04 14:53:19 +00:00
'emails/email-downloads.php' ,
array (
2018-03-22 17:54:16 +00:00
'order' => $order ,
'sent_to_admin' => $sent_to_admin ,
'plain_text' => $plain_text ,
'email' => $email ,
'downloads' => $downloads ,
'columns' => $columns ,
)
);
2017-07-11 13:52:30 +00:00
}
}
2012-09-17 00:53:17 +00:00
/**
* Add order meta to email templates .
2012-11-27 16:22:47 +00:00
*
2018-03-22 17:54:16 +00:00
* @ param WC_Order $order Order instance .
* @ param bool $sent_to_admin If should sent to admin .
* @ param bool $plain_text If is plain text email .
2012-09-17 00:53:17 +00:00
*/
2014-10-20 15:59:02 +00:00
public function order_meta ( $order , $sent_to_admin = false , $plain_text = false ) {
2016-01-08 12:16:55 +00:00
$fields = apply_filters ( 'woocommerce_email_order_meta_fields' , array (), $sent_to_admin , $order );
2014-11-13 00:53:36 +00:00
/**
2015-11-03 13:31:20 +00:00
* Deprecated woocommerce_email_order_meta_keys filter .
2014-11-13 00:53:36 +00:00
*
* @ since 2.3 . 0
*/
$_fields = apply_filters ( 'woocommerce_email_order_meta_keys' , array (), $sent_to_admin );
if ( $_fields ) {
foreach ( $_fields as $key => $field ) {
if ( is_numeric ( $key ) ) {
2013-08-22 11:25:17 +00:00
$key = $field ;
2014-11-13 00:53:36 +00:00
}
2013-08-22 11:25:17 +00:00
2014-11-13 00:53:36 +00:00
$fields [ $key ] = array (
'label' => wptexturize ( $key ),
2016-08-27 01:46:45 +00:00
'value' => wptexturize ( get_post_meta ( $order -> get_id (), $field , true ) ),
2014-11-13 00:53:36 +00:00
);
2012-09-17 00:53:17 +00:00
}
2014-10-20 15:59:02 +00:00
}
2012-09-17 00:53:17 +00:00
2014-11-13 00:53:36 +00:00
if ( $fields ) {
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
if ( $plain_text ) {
2012-11-27 16:22:47 +00:00
2014-11-13 00:53:36 +00:00
foreach ( $fields as $field ) {
if ( isset ( $field [ 'label' ] ) && isset ( $field [ 'value' ] ) && $field [ 'value' ] ) {
2018-03-22 17:54:16 +00:00
echo $field [ 'label' ] . ': ' . $field [ 'value' ] . " \n " ; // WPCS: XSS ok.
2014-04-15 15:01:20 +00:00
}
}
2012-09-17 00:53:17 +00:00
} else {
2014-11-13 00:53:36 +00:00
foreach ( $fields as $field ) {
if ( isset ( $field [ 'label' ] ) && isset ( $field [ 'value' ] ) && $field [ 'value' ] ) {
2018-03-22 17:54:16 +00:00
echo '<p><strong>' . $field [ 'label' ] . ':</strong> ' . $field [ 'value' ] . '</p>' ; // WPCS: XSS ok.
2014-04-15 15:01:20 +00:00
}
}
2012-09-17 00:53:17 +00:00
}
}
}
2015-11-02 10:41:05 +00:00
/**
* Is customer detail field valid ?
2018-03-22 17:54:16 +00:00
*
* @ param array $field Field data to check if is valid .
2015-11-02 10:41:05 +00:00
* @ return boolean
*/
public function customer_detail_field_is_valid ( $field ) {
return isset ( $field [ 'label' ] ) && ! empty ( $field [ 'value' ] );
}
2014-10-08 21:47:50 +00:00
/**
2017-07-11 13:52:30 +00:00
* Allows developers to add additional customer details to templates .
*
* In versions prior to 3.2 this was used for notes , phone and email but this data has moved .
2014-10-08 21:47:50 +00:00
*
2018-03-22 17:54:16 +00:00
* @ param WC_Order $order Order instance .
* @ param bool $sent_to_admin If should sent to admin .
* @ param bool $plain_text If is plain text email .
2014-10-08 21:47:50 +00:00
*/
2014-11-26 00:02:41 +00:00
public function customer_details ( $order , $sent_to_admin = false , $plain_text = false ) {
2017-02-28 20:35:52 +00:00
if ( ! is_a ( $order , 'WC_Order' ) ) {
2017-02-27 17:08:13 +00:00
return ;
}
2014-10-08 21:47:50 +00:00
2017-07-11 13:52:30 +00:00
$fields = array_filter ( apply_filters ( 'woocommerce_email_customer_details_fields' , array (), $sent_to_admin , $order ), array ( $this , 'customer_detail_field_is_valid' ) );
2014-11-12 19:44:11 +00:00
2017-07-11 13:52:30 +00:00
if ( ! empty ( $fields ) ) {
if ( $plain_text ) {
wc_get_template ( 'emails/plain/email-customer-details.php' , array ( 'fields' => $fields ) );
} else {
wc_get_template ( 'emails/email-customer-details.php' , array ( 'fields' => $fields ) );
}
2014-10-08 21:47:50 +00:00
}
}
/**
* Get the email addresses .
2017-05-15 11:50:52 +00:00
*
2018-03-22 17:54:16 +00:00
* @ param WC_Order $order Order instance .
* @ param bool $sent_to_admin If should sent to admin .
* @ param bool $plain_text If is plain text email .
2014-10-08 21:47:50 +00:00
*/
2014-11-26 00:02:41 +00:00
public function email_addresses ( $order , $sent_to_admin = false , $plain_text = false ) {
2017-02-28 20:35:52 +00:00
if ( ! is_a ( $order , 'WC_Order' ) ) {
2017-02-27 17:08:13 +00:00
return ;
}
2015-02-19 13:57:20 +00:00
if ( $plain_text ) {
2018-03-22 17:54:16 +00:00
wc_get_template (
2019-03-04 14:53:19 +00:00
'emails/plain/email-addresses.php' ,
array (
2018-03-22 17:54:16 +00:00
'order' => $order ,
'sent_to_admin' => $sent_to_admin ,
)
);
2015-02-19 13:57:20 +00:00
} else {
2018-03-22 17:54:16 +00:00
wc_get_template (
2019-03-04 14:53:19 +00:00
'emails/email-addresses.php' ,
array (
2018-03-22 17:54:16 +00:00
'order' => $order ,
'sent_to_admin' => $sent_to_admin ,
)
);
2015-02-19 13:57:20 +00:00
}
2014-11-13 00:33:47 +00:00
}
2014-11-12 23:32:15 +00:00
2014-10-20 15:59:02 +00:00
/**
2015-11-03 13:31:20 +00:00
* Get blog name formatted for emails .
2018-03-22 17:54:16 +00:00
*
2014-10-20 15:59:02 +00:00
* @ return string
*/
private function get_blogname () {
return wp_specialchars_decode ( get_option ( 'blogname' ), ENT_QUOTES );
}
2012-09-17 00:53:17 +00:00
/**
* Low stock notification email .
*
2018-03-22 17:54:16 +00:00
* @ param WC_Product $product Product instance .
2012-09-17 00:53:17 +00:00
*/
2014-10-20 15:59:02 +00:00
public function low_stock ( $product ) {
2017-04-12 17:01:59 +00:00
if ( 'no' === get_option ( 'woocommerce_notify_low_stock' , 'yes' ) ) {
return ;
}
2014-10-20 15:59:02 +00:00
$subject = sprintf ( '[%s] %s' , $this -> get_blogname (), __ ( 'Product low in stock' , 'woocommerce' ) );
2016-10-29 12:57:09 +00:00
$message = sprintf (
2018-03-22 17:54:16 +00:00
/* translators: 1: product name 2: items in stock */
2016-10-29 13:13:46 +00:00
__ ( '%1$s is low in stock. There are %2$d left.' , 'woocommerce' ),
2019-03-04 14:53:19 +00:00
html_entity_decode ( wp_strip_all_tags ( $product -> get_formatted_name () ), ENT_QUOTES , get_bloginfo ( 'charset' ) ),
html_entity_decode ( wp_strip_all_tags ( $product -> get_stock_quantity () ) )
2016-10-29 12:57:09 +00:00
);
2014-10-20 15:59:02 +00:00
wp_mail (
2019-12-24 15:09:50 +00:00
apply_filters ( 'woocommerce_email_recipient_low_stock' , get_option ( 'woocommerce_stock_email_recipient' ), $product , null ),
apply_filters ( 'woocommerce_email_subject_low_stock' , $subject , $product , null ),
2014-10-20 15:59:02 +00:00
apply_filters ( 'woocommerce_email_content_low_stock' , $message , $product ),
2019-12-24 15:09:50 +00:00
apply_filters ( 'woocommerce_email_headers' , '' , 'low_stock' , $product , null ),
apply_filters ( 'woocommerce_email_attachments' , array (), 'low_stock' , $product , null )
2014-10-20 15:59:02 +00:00
);
2012-09-17 00:53:17 +00:00
}
/**
* No stock notification email .
*
2018-03-22 17:54:16 +00:00
* @ param WC_Product $product Product instance .
2012-09-17 00:53:17 +00:00
*/
2014-10-20 15:59:02 +00:00
public function no_stock ( $product ) {
2017-04-12 17:01:59 +00:00
if ( 'no' === get_option ( 'woocommerce_notify_no_stock' , 'yes' ) ) {
return ;
}
2014-10-20 15:59:02 +00:00
$subject = sprintf ( '[%s] %s' , $this -> get_blogname (), __ ( 'Product out of stock' , 'woocommerce' ) );
2016-10-29 12:57:09 +00:00
/* translators: %s: product name */
2019-03-04 14:53:19 +00:00
$message = sprintf ( __ ( '%s is out of stock.' , 'woocommerce' ), html_entity_decode ( wp_strip_all_tags ( $product -> get_formatted_name () ), ENT_QUOTES , get_bloginfo ( 'charset' ) ) );
2014-10-20 15:59:02 +00:00
wp_mail (
2019-12-24 15:09:50 +00:00
apply_filters ( 'woocommerce_email_recipient_no_stock' , get_option ( 'woocommerce_stock_email_recipient' ), $product , null ),
apply_filters ( 'woocommerce_email_subject_no_stock' , $subject , $product , null ),
2014-10-20 15:59:02 +00:00
apply_filters ( 'woocommerce_email_content_no_stock' , $message , $product ),
2019-12-24 15:09:50 +00:00
apply_filters ( 'woocommerce_email_headers' , '' , 'no_stock' , $product , null ),
apply_filters ( 'woocommerce_email_attachments' , array (), 'no_stock' , $product , null )
2014-10-20 15:59:02 +00:00
);
2012-09-17 00:53:17 +00:00
}
/**
* Backorder notification email .
*
2018-03-22 17:54:16 +00:00
* @ param array $args Arguments .
2012-09-17 00:53:17 +00:00
*/
2014-10-20 15:59:02 +00:00
public function backorder ( $args ) {
2018-03-22 17:54:16 +00:00
$args = wp_parse_args (
2019-03-04 14:53:19 +00:00
$args ,
array (
2018-03-22 17:54:16 +00:00
'product' => '' ,
'quantity' => '' ,
'order_id' => '' ,
)
);
2012-09-17 00:53:17 +00:00
2017-11-17 11:38:26 +00:00
$order = wc_get_order ( $args [ 'order_id' ] );
if (
! $args [ 'product' ] ||
! is_object ( $args [ 'product' ] ) ||
! $args [ 'quantity' ] ||
! $order
) {
2014-10-20 15:59:02 +00:00
return ;
}
2012-09-17 00:53:17 +00:00
2016-10-12 10:16:30 +00:00
$subject = sprintf ( '[%s] %s' , $this -> get_blogname (), __ ( 'Product backorder' , 'woocommerce' ) );
2018-03-22 17:54:16 +00:00
/* translators: 1: product quantity 2: product name 3: order number */
2019-03-04 14:53:19 +00:00
$message = sprintf ( __ ( '%1$s units of %2$s have been backordered in order #%3$s.' , 'woocommerce' ), $args [ 'quantity' ], html_entity_decode ( wp_strip_all_tags ( $args [ 'product' ] -> get_formatted_name () ), ENT_QUOTES , get_bloginfo ( 'charset' ) ), $order -> get_order_number () );
2018-03-22 17:54:16 +00:00
2014-10-20 15:59:02 +00:00
wp_mail (
2019-12-24 15:09:50 +00:00
apply_filters ( 'woocommerce_email_recipient_backorder' , get_option ( 'woocommerce_stock_email_recipient' ), $args , null ),
apply_filters ( 'woocommerce_email_subject_backorder' , $subject , $args , null ),
2014-10-20 15:59:02 +00:00
apply_filters ( 'woocommerce_email_content_backorder' , $message , $args ),
2019-12-24 15:09:50 +00:00
apply_filters ( 'woocommerce_email_headers' , '' , 'backorder' , $args , null ),
apply_filters ( 'woocommerce_email_attachments' , array (), 'backorder' , $args , null )
2014-10-20 15:59:02 +00:00
);
2012-09-17 00:53:17 +00:00
}
2016-08-10 22:23:26 +00:00
/**
* Adds Schema . org markup for order in JSON - LD format .
*
2017-03-15 16:36:53 +00:00
* @ deprecated 3.0 . 0
2016-08-14 22:39:01 +00:00
* @ see WC_Structured_Data :: generate_order_data ()
2016-08-11 09:17:14 +00:00
*
2016-08-10 22:23:26 +00:00
* @ since 2.6 . 0
2018-03-22 17:54:16 +00:00
* @ param WC_Order $order Order instance .
* @ param bool $sent_to_admin If should sent to admin .
* @ param bool $plain_text If is plain text email .
2016-08-10 22:23:26 +00:00
*/
public function order_schema_markup ( $order , $sent_to_admin = false , $plain_text = false ) {
2017-03-15 16:36:53 +00:00
wc_deprecated_function ( 'WC_Emails::order_schema_markup' , '3.0' , 'WC_Structured_Data::generate_order_data' );
2016-08-10 22:23:26 +00:00
2016-10-13 21:19:13 +00:00
WC () -> structured_data -> generate_order_data ( $order , $sent_to_admin , $plain_text );
2016-10-13 22:39:27 +00:00
WC () -> structured_data -> output_structured_data ();
2016-08-11 09:17:14 +00:00
}
2013-05-27 14:20:01 +00:00
}