2012-09-17 00:53:17 +00:00
< ? php
2015-05-21 04:52:38 +00:00
2015-02-13 16:54:12 +00:00
if ( ! defined ( 'ABSPATH' ) ) {
exit ;
}
2017-02-16 11:46:01 +00:00
if ( class_exists ( 'WC_Email' , false ) ) {
2015-02-13 16:54:12 +00:00
return ;
}
/**
2015-11-03 14:57:39 +00:00
* Email Class
*
* WooCommerce Email Class which is extended by specific email template classes to add emails to WooCommerce
*
* @ class WC_Email
* @ version 2.5 . 0
* @ package WooCommerce / Classes / Emails
* @ author WooThemes
* @ extends WC_Settings_API
2015-02-13 16:54:12 +00:00
*/
2014-09-23 16:20:28 +00:00
class WC_Email extends WC_Settings_API {
2012-09-17 00:53:17 +00:00
2014-12-03 03:30:28 +00:00
/**
* Email method ID .
* @ var String
*/
2014-08-31 05:49:58 +00:00
public $id ;
2012-09-17 00:53:17 +00:00
2014-12-03 03:30:28 +00:00
/**
* Email method title .
* @ var string
*/
2014-08-31 05:49:58 +00:00
public $title ;
2012-09-17 00:53:17 +00:00
2014-12-03 03:30:28 +00:00
/**
* 'yes' if the method is enabled .
2015-11-03 15:40:10 +00:00
* @ var string yes , no
2014-12-03 03:30:28 +00:00
*/
2014-08-31 05:49:58 +00:00
public $enabled ;
2012-09-17 00:53:17 +00:00
2014-12-03 03:30:28 +00:00
/**
* Description for the email .
* @ var string
*/
2014-08-31 05:49:58 +00:00
public $description ;
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
2017-06-02 17:25:05 +00:00
* Default heading .
*
* Supported for backwards compatibility but we recommend overloading the
* get_default_x methods instead so localication can be done when needed .
*
2014-12-03 03:30:28 +00:00
* @ var string
*/
2017-06-02 17:25:05 +00:00
public $heading = '' ;
2012-09-17 00:53:17 +00:00
2014-12-03 03:30:28 +00:00
/**
2017-06-02 17:25:05 +00:00
* Default subject .
*
* Supported for backwards compatibility but we recommend overloading the
* get_default_x methods instead so localication can be done when needed .
*
2014-12-03 03:30:28 +00:00
* @ var string
*/
2017-06-02 17:25:05 +00:00
public $subject = '' ;
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
2017-06-02 17:25:05 +00:00
* Plain text template path .
2014-12-03 03:30:28 +00:00
* @ var string
*/
2017-06-02 17:25:05 +00:00
public $template_plain ;
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
2017-06-02 17:25:05 +00:00
* HTML template path .
2014-12-03 03:30:28 +00:00
* @ var string
*/
2017-06-02 17:25:05 +00:00
public $template_html ;
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
2017-06-02 17:25:05 +00:00
* Template path .
2014-12-03 03:30:28 +00:00
* @ var string
*/
2017-06-02 17:25:05 +00:00
public $template_base ;
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
2017-06-02 17:25:05 +00:00
* Recipients for the email .
2014-12-03 03:30:28 +00:00
* @ var string
*/
2017-06-02 17:25:05 +00:00
public $recipient ;
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
* Object this email is for , for example a customer , product , or email .
2016-06-07 10:22:36 +00:00
* @ var object | bool
2014-12-03 03:30:28 +00:00
*/
2014-08-31 05:49:58 +00:00
public $object ;
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
* Strings to find in subjects / headings .
* @ var array
*/
2015-11-03 14:57:39 +00:00
public $find = array ();
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
* Strings to replace in subjects / headings .
* @ var array
*/
2015-11-03 14:57:39 +00:00
public $replace = array ();
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
* Mime boundary ( for multipart emails ) .
* @ var string
*/
2014-08-31 05:49:58 +00:00
public $mime_boundary ;
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
* Mime boundary header ( for multipart emails ) .
* @ var string
*/
2014-08-31 05:49:58 +00:00
public $mime_boundary_header ;
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
* True when email is being sent .
* @ var bool
*/
2014-08-31 05:49:58 +00:00
public $sending ;
2012-12-13 09:52:20 +00:00
2015-11-03 15:40:10 +00:00
/**
* True when the email notification is sent manually only .
* @ var bool
*/
protected $manual = false ;
2015-11-02 16:27:00 +00:00
/**
* True when the email notification is sent to customers .
* @ var bool
*/
protected $customer_email = false ;
2012-09-17 00:53:17 +00:00
/**
2014-08-31 05:49:58 +00:00
* List of preg * regular expression patterns to search for ,
2015-11-03 14:57:39 +00:00
* used in conjunction with $plain_replace .
2014-08-31 05:49:58 +00:00
* https :// raw . github . com / ushahidi / wp - silcc / master / class . html2text . inc
2015-11-03 14:57:39 +00:00
* @ var array $plain_search
* @ see $plain_replace
2014-08-31 05:49:58 +00:00
*/
public $plain_search = array (
" / \r / " , // Non-legal carriage return
'/&(nbsp|#160);/i' , // Non-breaking space
'/&(quot|rdquo|ldquo|#8220|#8221|#147|#148);/i' , // Double quotes
'/&(apos|rsquo|lsquo|#8216|#8217);/i' , // Single quotes
'/>/i' , // Greater-than
'/</i' , // Less-than
'/&/i' , // Ampersand
'/&/i' , // Ampersand
'/&/i' , // Ampersand
'/&(copy|#169);/i' , // Copyright
'/&(trade|#8482|#153);/i' , // Trademark
'/&(reg|#174);/i' , // Registered
'/&(mdash|#151|#8212);/i' , // mdash
'/&(ndash|minus|#8211|#8722);/i' , // ndash
'/&(bull|#149|#8226);/i' , // Bullet
'/&(pound|#163);/i' , // Pound sign
'/&(euro|#8364);/i' , // Euro sign
'/$/' , // Dollar sign
2015-04-23 13:55:29 +00:00
'/&[^&\s;]+;/i' , // Unknown/unhandled entities
2016-08-27 02:08:49 +00:00
'/[ ]{2,}/' , // Runs of spaces, post-handling
2014-08-31 05:49:58 +00:00
);
/**
* List of pattern replacements corresponding to patterns searched .
2015-11-03 14:57:39 +00:00
* @ var array $plain_replace
* @ see $plain_search
2014-08-31 05:49:58 +00:00
*/
public $plain_replace = array (
'' , // Non-legal carriage return
' ' , // Non-breaking space
'"' , // Double quotes
" ' " , // Single quotes
'>' , // Greater-than
'<' , // Less-than
'&' , // Ampersand
'&' , // Ampersand
'&' , // Ampersand
'(c)' , // Copyright
'(tm)' , // Trademark
'(R)' , // Registered
'--' , // mdash
'-' , // ndash
'*' , // Bullet
'£' , // Pound sign
'EUR' , // Euro sign. € ?
'$' , // Dollar sign
'' , // Unknown/unhandled entities
2016-08-27 02:08:49 +00:00
' ' , // Runs of spaces, post-handling
2014-08-31 05:49:58 +00:00
);
/**
2015-11-03 13:31:20 +00:00
* Constructor .
2012-09-17 00:53:17 +00:00
*/
2014-08-31 05:49:58 +00:00
public function __construct () {
2012-09-17 00:53:17 +00:00
// Init settings
2013-01-10 15:17:33 +00:00
$this -> init_form_fields ();
2012-09-17 00:53:17 +00:00
$this -> init_settings ();
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
// Save settings hook
2012-12-15 11:53:32 +00:00
add_action ( 'woocommerce_update_options_email_' . $this -> id , array ( $this , 'process_admin_options' ) );
2012-09-17 00:53:17 +00:00
2013-02-27 10:10:36 +00:00
// Default template base if not declared in child constructor
2013-11-24 10:24:12 +00:00
if ( is_null ( $this -> template_base ) ) {
2013-11-25 14:01:32 +00:00
$this -> template_base = WC () -> plugin_path () . '/templates/' ;
2013-11-24 10:24:12 +00:00
}
2013-02-21 09:23:32 +00:00
2012-09-17 00:53:17 +00:00
// Settings
2017-06-14 16:13:43 +00:00
$this -> email_type = $this -> get_option ( 'email_type' );
$this -> enabled = $this -> get_option ( 'enabled' );
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
// Find/replace
2014-05-30 09:42:47 +00:00
$this -> find [ 'blogname' ] = '{blogname}' ;
$this -> find [ 'site-title' ] = '{site_title}' ;
$this -> replace [ 'blogname' ] = $this -> get_blogname ();
$this -> replace [ 'site-title' ] = $this -> get_blogname ();
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
// For multipart messages
2016-02-25 11:14:15 +00:00
add_action ( 'phpmailer_init' , array ( $this , 'handle_multipart' ) );
2012-09-17 00:53:17 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
/**
2016-01-05 18:42:18 +00:00
* Handle multipart mail .
2012-11-27 16:22:47 +00:00
*
2013-11-28 12:54:19 +00:00
* @ param PHPMailer $mailer
* @ return PHPMailer
2012-09-17 00:53:17 +00:00
*/
2016-08-27 04:53:52 +00:00
public function handle_multipart ( $mailer ) {
2015-11-03 14:57:39 +00:00
if ( $this -> sending && 'multipart' === $this -> get_email_type () ) {
2012-12-13 09:52:20 +00:00
$mailer -> AltBody = wordwrap ( preg_replace ( $this -> plain_search , $this -> plain_replace , strip_tags ( $this -> get_content_plain () ) ) );
2015-11-03 14:57:39 +00:00
$this -> sending = false ;
2012-09-17 00:53:17 +00:00
}
return $mailer ;
}
/**
2016-01-05 18:42:18 +00:00
* Format email string .
2012-11-27 16:22:47 +00:00
*
2012-09-17 00:53:17 +00:00
* @ param mixed $string
* @ return string
*/
2014-08-31 05:49:58 +00:00
public function format_string ( $string ) {
2016-09-01 20:50:14 +00:00
return str_replace ( apply_filters ( 'woocommerce_email_format_string_find' , $this -> find , $this ), apply_filters ( 'woocommerce_email_format_string_replace' , $this -> replace , $this ), $string );
2012-09-17 00:53:17 +00:00
}
2014-08-31 05:49:58 +00:00
2017-05-16 01:09:24 +00:00
/**
* Set the locale to the store locale for customer emails to make sure emails are in the store language .
*/
2017-05-15 21:34:37 +00:00
public function setup_locale () {
2017-06-05 13:18:39 +00:00
if ( $this -> is_customer_email () ) {
wc_switch_to_site_locale ();
2017-05-15 21:34:37 +00:00
}
}
2017-05-16 01:09:24 +00:00
/**
* Restore the locale to the default locale . Use after finished with setup_locale .
*/
2017-05-16 13:31:52 +00:00
public function restore_locale () {
2017-06-05 13:18:39 +00:00
if ( $this -> is_customer_email () ) {
wc_restore_locale ();
2017-05-15 21:34:37 +00:00
}
}
2017-06-02 17:25:05 +00:00
/**
* Get email subject .
*
* @ since 3.1 . 0
* @ return string
*/
public function get_default_subject () {
return $this -> subject ;
}
/**
* Get email heading .
*
* @ since 3.1 . 0
* @ return string
*/
public function get_default_heading () {
return $this -> heading ;
}
2012-09-17 00:53:17 +00:00
/**
2016-01-05 18:42:18 +00:00
* Get email subject .
2012-11-27 16:22:47 +00:00
*
2012-09-17 00:53:17 +00:00
* @ return string
*/
2014-08-31 05:49:58 +00:00
public function get_subject () {
2017-06-02 17:44:43 +00:00
return apply_filters ( 'woocommerce_email_subject_' . $this -> id , $this -> format_string ( $this -> get_option ( 'subject' , $this -> get_default_subject () ) ), $this -> object );
2012-09-17 00:53:17 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
/**
2016-01-05 18:42:18 +00:00
* Get email heading .
2012-11-27 16:22:47 +00:00
*
2012-09-17 00:53:17 +00:00
* @ return string
*/
2014-08-31 05:49:58 +00:00
public function get_heading () {
2017-06-02 17:44:43 +00:00
return apply_filters ( 'woocommerce_email_heading_' . $this -> id , $this -> format_string ( $this -> get_option ( 'heading' , $this -> get_default_heading () ) ), $this -> object );
2012-09-17 00:53:17 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
/**
2015-11-02 16:27:00 +00:00
* Get valid recipients .
2012-09-17 00:53:17 +00:00
* @ return string
*/
2014-08-31 05:49:58 +00:00
public function get_recipient () {
2015-11-02 16:27:00 +00:00
$recipient = apply_filters ( 'woocommerce_email_recipient_' . $this -> id , $this -> recipient , $this -> object );
$recipients = array_map ( 'trim' , explode ( ',' , $recipient ) );
$recipients = array_filter ( $recipients , 'is_email' );
2015-11-03 15:40:10 +00:00
return implode ( ', ' , $recipients );
2012-09-17 00:53:17 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
/**
2016-01-05 18:42:18 +00:00
* Get email headers .
2012-11-27 16:22:47 +00:00
*
2012-09-17 00:53:17 +00:00
* @ return string
*/
2014-08-31 05:49:58 +00:00
public function get_headers () {
2016-08-22 06:12:21 +00:00
$header = " Content-Type: " . $this -> get_content_type () . " \r \n " ;
2016-08-27 01:46:45 +00:00
2017-05-08 11:50:39 +00:00
if ( 'new_order' === $this -> id && $this -> object && $this -> object -> get_billing_email () && ( $this -> object -> get_billing_first_name () || $this -> object -> get_billing_last_name () ) ) {
2016-11-08 21:00:57 +00:00
$header .= 'Reply-to: ' . $this -> object -> get_billing_first_name () . ' ' . $this -> object -> get_billing_last_name () . ' <' . $this -> object -> get_billing_email () . " > \r \n " ;
2016-08-15 11:01:12 +00:00
}
2016-11-08 21:00:57 +00:00
2016-08-15 11:01:12 +00:00
return apply_filters ( 'woocommerce_email_headers' , $header , $this -> id , $this -> object );
2012-09-17 00:53:17 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
/**
2016-01-05 18:42:18 +00:00
* Get email attachments .
2012-11-27 16:22:47 +00:00
*
2016-06-06 16:50:18 +00:00
* @ return string
2012-09-17 00:53:17 +00:00
*/
2014-08-31 05:49:58 +00:00
public function get_attachments () {
2014-01-20 15:33:33 +00:00
return apply_filters ( 'woocommerce_email_attachments' , array (), $this -> id , $this -> object );
2012-09-17 00:53:17 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
/**
* get_type function .
2012-11-27 16:22:47 +00:00
*
2012-09-17 00:53:17 +00:00
* @ return string
*/
2014-08-31 05:49:58 +00:00
public function get_email_type () {
2015-02-13 14:54:10 +00:00
return $this -> email_type && class_exists ( 'DOMDocument' ) ? $this -> email_type : 'plain' ;
2012-09-17 00:53:17 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
/**
2016-01-05 18:42:18 +00:00
* Get email content type .
2012-11-27 16:22:47 +00:00
*
2013-11-28 12:54:19 +00:00
* @ return string
2012-09-17 00:53:17 +00:00
*/
2014-08-31 05:49:58 +00:00
public function get_content_type () {
2012-09-17 00:53:17 +00:00
switch ( $this -> get_email_type () ) {
2015-02-10 12:51:44 +00:00
case 'html' :
2012-09-17 00:53:17 +00:00
return 'text/html' ;
2015-02-10 12:51:44 +00:00
case 'multipart' :
2012-09-17 00:53:17 +00:00
return 'multipart/alternative' ;
default :
return 'text/plain' ;
}
}
2012-11-27 16:22:47 +00:00
2015-11-03 14:57:39 +00:00
/**
* Return the email ' s title
* @ return string
*/
public function get_title () {
return apply_filters ( 'woocommerce_email_title' , $this -> title , $this );
}
/**
* Return the email ' s description
* @ return string
*/
public function get_description () {
return apply_filters ( 'woocommerce_email_description' , $this -> description , $this );
}
2013-04-04 16:21:03 +00:00
/**
2013-11-28 17:59:09 +00:00
* Proxy to parent ' s get_option and attempt to localize the result using gettext .
2014-08-31 05:49:58 +00:00
*
2013-11-28 17:59:09 +00:00
* @ param string $key
* @ param mixed $empty_value
* @ return string
*/
2014-08-31 05:49:58 +00:00
public function get_option ( $key , $empty_value = null ) {
2015-02-18 02:28:26 +00:00
$value = parent :: get_option ( $key , $empty_value );
2016-02-05 12:44:43 +00:00
return apply_filters ( 'woocommerce_email_get_option' , $value , $this , $value , $key , $empty_value );
2013-04-04 16:21:03 +00:00
}
2012-09-17 00:53:17 +00:00
/**
* Checks if this email is enabled and will be sent .
* @ return bool
*/
2014-08-31 05:49:58 +00:00
public function is_enabled () {
2015-11-02 12:41:33 +00:00
return apply_filters ( 'woocommerce_email_enabled_' . $this -> id , 'yes' === $this -> enabled , $this -> object );
2012-09-17 00:53:17 +00:00
}
2012-11-27 16:22:47 +00:00
2015-11-03 15:40:10 +00:00
/**
* Checks if this email is manually sent
* @ return bool
*/
public function is_manual () {
return $this -> manual ;
}
2015-11-02 16:27:00 +00:00
/**
* Checks if this email is customer focussed .
* @ return bool
*/
public function is_customer_email () {
return $this -> customer_email ;
}
2012-09-17 00:53:17 +00:00
/**
2016-01-05 18:42:18 +00:00
* Get WordPress blog name .
2012-11-27 16:22:47 +00:00
*
2013-11-27 18:20:31 +00:00
* @ return string
2012-09-17 00:53:17 +00:00
*/
2014-08-31 05:49:58 +00:00
public function get_blogname () {
2012-09-17 00:53:17 +00:00
return wp_specialchars_decode ( get_option ( 'blogname' ), ENT_QUOTES );
}
/**
2016-01-05 18:42:18 +00:00
* Get email content .
2012-11-27 16:22:47 +00:00
*
2012-09-17 00:53:17 +00:00
* @ return string
*/
2014-08-31 05:49:58 +00:00
public function get_content () {
2012-09-17 00:53:17 +00:00
$this -> sending = true ;
2012-11-27 16:22:47 +00:00
2015-11-02 12:41:33 +00:00
if ( 'plain' === $this -> get_email_type () ) {
2012-12-13 09:52:20 +00:00
$email_content = preg_replace ( $this -> plain_search , $this -> plain_replace , strip_tags ( $this -> get_content_plain () ) );
2012-09-17 00:53:17 +00:00
} else {
2014-10-08 21:34:31 +00:00
$email_content = $this -> get_content_html ();
2012-09-17 00:53:17 +00:00
}
2014-01-03 14:12:59 +00:00
return wordwrap ( $email_content , 70 );
2012-09-17 00:53:17 +00:00
}
2012-11-27 16:22:47 +00:00
2012-11-14 17:44:58 +00:00
/**
* Apply inline styles to dynamic content .
2012-11-27 16:22:47 +00:00
*
2014-09-07 23:37:55 +00:00
* @ param string | null $content
2013-11-27 18:20:31 +00:00
* @ return string
2012-11-14 17:44:58 +00:00
*/
2014-08-31 05:49:58 +00:00
public function style_inline ( $content ) {
2014-10-08 21:34:31 +00:00
// make sure we only inline CSS for html emails
2015-02-13 14:54:10 +00:00
if ( in_array ( $this -> get_content_type (), array ( 'text/html' , 'multipart/alternative' ) ) && class_exists ( 'DOMDocument' ) ) {
2014-10-08 21:34:31 +00:00
ob_start ();
wc_get_template ( 'emails/email-styles.php' );
$css = apply_filters ( 'woocommerce_email_styles' , ob_get_clean () );
2012-11-27 16:22:47 +00:00
2015-11-03 14:57:39 +00:00
// apply CSS styles inline for picky email clients
2015-03-08 23:45:05 +00:00
try {
$emogrifier = new Emogrifier ( $content , $css );
2015-11-03 14:57:39 +00:00
$content = $emogrifier -> emogrify ();
2015-03-08 23:45:05 +00:00
} catch ( Exception $e ) {
2016-08-08 12:59:23 +00:00
$logger = wc_get_logger ();
2016-12-21 19:15:19 +00:00
$logger -> error ( $e -> getMessage (), array ( 'source' => 'emogrifier' ) );
2015-03-08 23:45:05 +00:00
}
2013-08-20 22:11:43 +00:00
}
2012-11-14 17:44:58 +00:00
return $content ;
}
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
/**
2015-11-03 14:57:39 +00:00
* Get the email content in plain text format .
2013-11-27 18:20:31 +00:00
* @ return string
2012-09-17 00:53:17 +00:00
*/
2015-11-03 14:57:39 +00:00
public function get_content_plain () { return '' ; }
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
/**
2015-11-03 14:57:39 +00:00
* Get the email content in HTML format .
2013-11-27 18:20:31 +00:00
* @ return string
2012-09-17 00:53:17 +00:00
*/
2015-11-03 14:57:39 +00:00
public function get_content_html () { return '' ; }
2012-09-17 00:53:17 +00:00
/**
2015-11-03 14:57:39 +00:00
* Get the from name for outgoing emails .
2012-09-17 00:53:17 +00:00
* @ return string
*/
2014-08-31 05:49:58 +00:00
public function get_from_name () {
2015-11-20 18:00:37 +00:00
$from_name = apply_filters ( 'woocommerce_email_from_name' , get_option ( 'woocommerce_email_from_name' ), $this );
return wp_specialchars_decode ( esc_html ( $from_name ), ENT_QUOTES );
2012-09-17 00:53:17 +00:00
}
/**
2015-11-03 14:57:39 +00:00
* Get the from address for outgoing emails .
2012-09-17 00:53:17 +00:00
* @ return string
*/
2014-08-31 05:49:58 +00:00
public function get_from_address () {
2015-11-20 18:00:37 +00:00
$from_address = apply_filters ( 'woocommerce_email_from_address' , get_option ( 'woocommerce_email_from_address' ), $this );
return sanitize_email ( $from_address );
2012-09-17 00:53:17 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
/**
2015-11-03 14:57:39 +00:00
* Send an email .
2014-09-07 23:37:55 +00:00
* @ param string $to
* @ param string $subject
* @ param string $message
2012-09-17 00:53:17 +00:00
* @ param string $headers
* @ param string $attachments
2015-11-03 14:57:39 +00:00
* @ return bool success
2012-09-17 00:53:17 +00:00
*/
2014-08-31 05:49:58 +00:00
public function send ( $to , $subject , $message , $headers , $attachments ) {
2012-12-15 11:53:32 +00:00
add_filter ( 'wp_mail_from' , array ( $this , 'get_from_address' ) );
add_filter ( 'wp_mail_from_name' , array ( $this , 'get_from_name' ) );
add_filter ( 'wp_mail_content_type' , array ( $this , 'get_content_type' ) );
2012-11-27 16:22:47 +00:00
2014-10-21 15:18:59 +00:00
$message = apply_filters ( 'woocommerce_mail_content' , $this -> style_inline ( $message ) );
$return = wp_mail ( $to , $subject , $message , $headers , $attachments );
2012-09-17 00:53:17 +00:00
2012-12-15 11:53:32 +00:00
remove_filter ( 'wp_mail_from' , array ( $this , 'get_from_address' ) );
remove_filter ( 'wp_mail_from_name' , array ( $this , 'get_from_name' ) );
remove_filter ( 'wp_mail_content_type' , array ( $this , 'get_content_type' ) );
2014-08-31 05:49:58 +00:00
2014-03-23 17:09:01 +00:00
return $return ;
2012-09-17 00:53:17 +00:00
}
2012-11-27 16:22:47 +00:00
2014-08-31 05:49:58 +00:00
/**
* Initialise Settings Form Fields - these are generic email options most will use .
*/
2015-02-13 14:16:58 +00:00
public function init_form_fields () {
2015-11-03 14:57:39 +00:00
$this -> form_fields = array (
'enabled' => array (
'title' => __ ( 'Enable/Disable' , 'woocommerce' ),
'type' => 'checkbox' ,
'label' => __ ( 'Enable this email notification' , 'woocommerce' ),
2016-08-27 01:46:45 +00:00
'default' => 'yes' ,
2012-09-17 00:53:17 +00:00
),
2015-11-03 14:57:39 +00:00
'subject' => array (
2017-06-14 17:01:12 +00:00
'title' => __ ( 'Subject' , 'woocommerce' ),
2015-11-03 14:57:39 +00:00
'type' => 'text' ,
2017-06-14 16:50:17 +00:00
'desc_tip' => true ,
/* translators: %s: list of placeholders */
'description' => sprintf ( __ ( 'Available placeholders: %s' , 'woocommerce' ), '<code>{site_title}</code>' ),
2017-06-14 16:13:43 +00:00
'placeholder' => $this -> get_default_subject (),
2015-11-03 14:57:39 +00:00
'default' => '' ,
2012-09-17 00:53:17 +00:00
),
2015-11-03 14:57:39 +00:00
'heading' => array (
2016-10-12 10:16:30 +00:00
'title' => __ ( 'Email heading' , 'woocommerce' ),
2015-11-03 14:57:39 +00:00
'type' => 'text' ,
2017-06-14 16:50:17 +00:00
'desc_tip' => true ,
/* translators: %s: list of placeholders */
'description' => sprintf ( __ ( 'Available placeholders: %s' , 'woocommerce' ), '<code>{site_title}</code>' ),
2017-06-14 16:13:43 +00:00
'placeholder' => $this -> get_default_heading (),
2015-11-03 14:57:39 +00:00
'default' => '' ,
2012-09-17 00:53:17 +00:00
),
2015-11-03 14:57:39 +00:00
'email_type' => array (
2016-10-12 10:16:30 +00:00
'title' => __ ( 'Email type' , 'woocommerce' ),
2015-11-03 14:57:39 +00:00
'type' => 'select' ,
'description' => __ ( 'Choose which format of email to send.' , 'woocommerce' ),
'default' => 'html' ,
'class' => 'email_type wc-enhanced-select' ,
'options' => $this -> get_email_type_options (),
2016-08-27 01:46:45 +00:00
'desc_tip' => true ,
),
2012-09-17 00:53:17 +00:00
);
2014-08-31 05:49:58 +00:00
}
2012-11-27 16:22:47 +00:00
2015-02-13 14:16:58 +00:00
/**
2015-11-03 14:57:39 +00:00
* Email type options .
2015-02-13 14:16:58 +00:00
* @ return array
*/
public function get_email_type_options () {
2015-11-03 14:57:39 +00:00
$types = array ( 'plain' => __ ( 'Plain text' , 'woocommerce' ) );
2015-02-13 14:16:58 +00:00
2015-02-13 14:54:10 +00:00
if ( class_exists ( 'DOMDocument' ) ) {
2015-11-03 14:57:39 +00:00
$types [ 'html' ] = __ ( 'HTML' , 'woocommerce' );
2015-02-13 14:16:58 +00:00
$types [ 'multipart' ] = __ ( 'Multipart' , 'woocommerce' );
}
return $types ;
}
2012-09-17 00:53:17 +00:00
/**
2015-11-03 14:57:39 +00:00
* Admin Panel Options Processing .
2012-09-17 00:53:17 +00:00
*/
2016-04-20 07:48:29 +00:00
public function process_admin_options () {
2014-08-31 05:49:58 +00:00
// Save regular options
2016-04-20 07:48:29 +00:00
parent :: process_admin_options ();
$post_data = $this -> get_post_data ();
2012-11-27 16:22:47 +00:00
2014-08-31 05:49:58 +00:00
// Save templates
2016-04-20 07:48:29 +00:00
if ( isset ( $post_data [ 'template_html_code' ] ) ) {
2016-03-24 17:26:40 +00:00
$this -> save_template ( $post_data [ 'template_html_code' ], $this -> template_html );
2015-05-29 16:40:53 +00:00
}
2016-04-20 07:48:29 +00:00
if ( isset ( $post_data [ 'template_plain_code' ] ) ) {
2016-03-24 17:26:40 +00:00
$this -> save_template ( $post_data [ 'template_plain_code' ], $this -> template_plain );
2015-05-29 16:40:53 +00:00
}
2015-03-27 15:51:30 +00:00
}
2014-08-31 05:49:58 +00:00
2015-03-27 15:51:30 +00:00
/**
* Get template .
*
* @ param string $type
* @ return string
*/
public function get_template ( $type ) {
2015-11-03 14:57:39 +00:00
$type = basename ( $type );
2012-11-27 16:22:47 +00:00
2015-11-03 14:57:39 +00:00
if ( 'template_html' === $type ) {
2015-03-27 15:51:30 +00:00
return $this -> template_html ;
2015-11-03 14:57:39 +00:00
} elseif ( 'template_plain' === $type ) {
2015-03-27 15:51:30 +00:00
return $this -> template_plain ;
2012-09-17 00:53:17 +00:00
}
2015-03-27 15:51:30 +00:00
return '' ;
}
2012-11-27 16:22:47 +00:00
2015-03-27 15:51:30 +00:00
/**
2015-11-03 13:31:20 +00:00
* Save the email templates .
2015-03-27 15:51:30 +00:00
*
2015-05-29 16:40:53 +00:00
* @ since 2.4 . 0
2015-03-27 15:51:30 +00:00
* @ param string $template_code
* @ param string $template_path
*/
protected function save_template ( $template_code , $template_path ) {
2015-05-21 04:52:38 +00:00
if ( current_user_can ( 'edit_themes' ) && ! empty ( $template_code ) && ! empty ( $template_path ) ) {
2014-08-31 05:49:58 +00:00
$saved = false ;
2015-03-27 15:51:30 +00:00
$file = get_stylesheet_directory () . '/woocommerce/' . $template_path ;
2017-01-06 12:45:26 +00:00
$code = wp_unslash ( $template_code );
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
if ( is_writeable ( $file ) ) {
$f = fopen ( $file , 'w+' );
2014-08-31 05:49:58 +00:00
2016-09-09 00:14:28 +00:00
if ( false !== $f ) {
2014-08-31 05:49:58 +00:00
fwrite ( $f , $code );
fclose ( $f );
$saved = true ;
}
2012-09-17 00:53:17 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
if ( ! $saved ) {
2015-03-27 15:51:30 +00:00
$redirect = add_query_arg ( 'wc_error' , urlencode ( __ ( 'Could not write to template file.' , 'woocommerce' ) ) );
2015-11-03 14:57:39 +00:00
wp_safe_redirect ( $redirect );
2014-08-31 05:49:58 +00:00
exit ;
}
2012-09-17 00:53:17 +00:00
}
2014-08-31 05:49:58 +00:00
}
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
* Get the template file in the current theme .
*
* @ param string $template
*
* @ return string
*/
public function get_theme_template_file ( $template ) {
return get_stylesheet_directory () . '/' . apply_filters ( 'woocommerce_template_directory' , 'woocommerce' , $template ) . '/' . $template ;
}
/**
* Move template action .
*
* @ param string $template_type
*/
protected function move_template_action ( $template_type ) {
if ( $template = $this -> get_template ( $template_type ) ) {
if ( ! empty ( $template ) ) {
2014-08-31 05:49:58 +00:00
2014-12-03 03:30:28 +00:00
$theme_file = $this -> get_theme_template_file ( $template );
2013-10-29 18:16:12 +00:00
2014-12-03 03:30:28 +00:00
if ( wp_mkdir_p ( dirname ( $theme_file ) ) && ! file_exists ( $theme_file ) ) {
2014-11-25 14:59:29 +00:00
2014-12-03 03:30:28 +00:00
// Locate template file
$core_file = $this -> template_base . $template ;
2016-12-28 19:38:51 +00:00
$template_file = apply_filters ( 'woocommerce_locate_core_template' , $core_file , $template , $this -> template_base , $this -> id );
2014-11-25 14:59:29 +00:00
2014-12-03 03:30:28 +00:00
// Copy template file
copy ( $template_file , $theme_file );
/**
2015-11-03 13:31:20 +00:00
* woocommerce_copy_email_template action hook .
2014-12-03 03:30:28 +00:00
*
* @ param string $template_type The copied template type
* @ param string $email The email object
*/
do_action ( 'woocommerce_copy_email_template' , $template_type , $this );
2015-05-05 12:28:03 +00:00
echo '<div class="updated"><p>' . __ ( 'Template file copied to theme.' , 'woocommerce' ) . '</p></div>' ;
2012-09-17 00:53:17 +00:00
}
}
2014-12-03 03:30:28 +00:00
}
}
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
* Delete template action .
*
* @ param string $template_type
*/
protected function delete_template_action ( $template_type ) {
if ( $template = $this -> get_template ( $template_type ) ) {
2014-08-31 05:49:58 +00:00
2014-12-03 03:30:28 +00:00
if ( ! empty ( $template ) ) {
2014-08-31 05:49:58 +00:00
2014-12-03 03:30:28 +00:00
$theme_file = $this -> get_theme_template_file ( $template );
2014-11-25 14:59:29 +00:00
2014-12-03 03:30:28 +00:00
if ( file_exists ( $theme_file ) ) {
unlink ( $theme_file );
2014-11-25 14:59:29 +00:00
2014-12-03 03:30:28 +00:00
/**
2015-11-03 13:31:20 +00:00
* woocommerce_delete_email_template action hook .
2014-12-03 03:30:28 +00:00
*
* @ param string $template The deleted template type
* @ param string $email The email object
*/
do_action ( 'woocommerce_delete_email_template' , $template_type , $this );
2015-05-05 12:28:03 +00:00
echo '<div class="updated"><p>' . __ ( 'Template file deleted from theme.' , 'woocommerce' ) . '</p></div>' ;
2012-09-17 00:53:17 +00:00
}
}
2014-12-03 03:30:28 +00:00
}
}
/**
* Admin actions .
*/
protected function admin_actions () {
// Handle any actions
2015-05-20 16:55:35 +00:00
if (
( ! empty ( $this -> template_html ) || ! empty ( $this -> template_plain ) )
&& ( ! empty ( $_GET [ 'move_template' ] ) || ! empty ( $_GET [ 'delete_template' ] ) )
2015-11-03 14:57:39 +00:00
&& 'GET' === $_SERVER [ 'REQUEST_METHOD' ]
2015-05-20 16:55:35 +00:00
) {
2015-05-21 18:03:40 +00:00
if ( empty ( $_GET [ '_wc_email_nonce' ] ) || ! wp_verify_nonce ( $_GET [ '_wc_email_nonce' ], 'woocommerce_email_template_nonce' ) ) {
2015-05-20 16:55:35 +00:00
wp_die ( __ ( 'Action failed. Please refresh the page and retry.' , 'woocommerce' ) );
}
2015-05-21 04:52:38 +00:00
if ( ! current_user_can ( 'edit_themes' ) ) {
2015-05-20 16:55:35 +00:00
wp_die ( __ ( 'Cheatin’ huh?' , 'woocommerce' ) );
}
2014-12-03 03:30:28 +00:00
if ( ! empty ( $_GET [ 'move_template' ] ) ) {
$this -> move_template_action ( $_GET [ 'move_template' ] );
}
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
if ( ! empty ( $_GET [ 'delete_template' ] ) ) {
$this -> delete_template_action ( $_GET [ 'delete_template' ] );
}
2012-09-17 00:53:17 +00:00
}
2014-12-03 03:30:28 +00:00
}
/**
2015-11-03 13:31:20 +00:00
* Admin Options .
2014-12-03 03:30:28 +00:00
*
2015-03-27 16:11:25 +00:00
* Setup the email settings screen .
* Override this in your email .
2014-12-03 03:30:28 +00:00
*
* @ since 1.0 . 0
*/
public function admin_options () {
2015-03-27 16:10:00 +00:00
// Do admin actions.
2014-12-03 03:30:28 +00:00
$this -> admin_actions ();
2012-09-17 00:53:17 +00:00
?>
2016-10-12 10:16:30 +00:00
< h2 >< ? php echo esc_html ( $this -> get_title () ); ?> <?php wc_back_link( __( 'Return to emails', 'woocommerce' ), admin_url( 'admin.php?page=wc-settings&tab=email' ) ); ?></h2>
2016-02-17 16:02:22 +00:00
2015-11-03 14:57:39 +00:00
< ? php echo wpautop ( wp_kses_post ( $this -> get_description () ) ); ?>
2012-09-17 00:53:17 +00:00
2014-11-25 14:59:29 +00:00
< ? php
2014-12-03 03:30:28 +00:00
/**
2015-11-03 13:31:20 +00:00
* woocommerce_email_settings_before action hook .
2014-12-03 03:30:28 +00:00
* @ param string $email The email object
*/
do_action ( 'woocommerce_email_settings_before' , $this );
2014-11-25 14:59:29 +00:00
?>
2012-09-17 00:53:17 +00:00
< table class = " form-table " >
< ? php $this -> generate_settings_html (); ?>
</ table >
2012-11-27 16:22:47 +00:00
2014-11-25 14:59:29 +00:00
< ? php
2014-12-03 03:30:28 +00:00
/**
2015-11-03 13:31:20 +00:00
* woocommerce_email_settings_after action hook .
2014-12-03 03:30:28 +00:00
* @ param string $email The email object
*/
do_action ( 'woocommerce_email_settings_after' , $this );
2014-11-25 14:59:29 +00:00
?>
2015-05-21 04:52:38 +00:00
< ? php if ( current_user_can ( 'edit_themes' ) && ( ! empty ( $this -> template_html ) || ! empty ( $this -> template_plain ) ) ) { ?>
2012-09-17 00:53:17 +00:00
< div id = " template " >
< ? php
2012-11-27 16:22:47 +00:00
$templates = array (
2014-12-03 03:30:28 +00:00
'template_html' => __ ( 'HTML template' , 'woocommerce' ),
2016-08-27 01:46:45 +00:00
'template_plain' => __ ( 'Plain text template' , 'woocommerce' ),
2012-09-17 00:53:17 +00:00
);
2014-08-31 05:49:58 +00:00
2014-12-03 03:30:28 +00:00
foreach ( $templates as $template_type => $title ) :
$template = $this -> get_template ( $template_type );
2014-08-31 05:49:58 +00:00
2014-12-03 03:30:28 +00:00
if ( empty ( $template ) ) {
2012-09-17 00:53:17 +00:00
continue ;
2013-11-24 10:24:12 +00:00
}
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
$local_file = $this -> get_theme_template_file ( $template );
$core_file = $this -> template_base . $template ;
2016-12-28 19:38:51 +00:00
$template_file = apply_filters ( 'woocommerce_locate_core_template' , $core_file , $template , $this -> template_base , $this -> id );
2014-12-03 03:30:28 +00:00
$template_dir = apply_filters ( 'woocommerce_template_directory' , 'woocommerce' , $template );
2012-09-17 00:53:17 +00:00
?>
2014-12-03 03:30:28 +00:00
< div class = " template <?php echo $template_type ; ?> " >
2012-11-27 16:22:47 +00:00
2012-10-17 12:46:35 +00:00
< h4 >< ? php echo wp_kses_post ( $title ); ?> </h4>
2012-11-27 16:22:47 +00:00
2013-11-24 10:24:12 +00:00
< ? php if ( file_exists ( $local_file ) ) { ?>
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
< p >
< a href = " # " class = " button toggle_editor " ></ a >
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
< ? php if ( is_writable ( $local_file ) ) : ?>
2015-05-21 18:03:40 +00:00
< a href = " <?php echo esc_url( wp_nonce_url( remove_query_arg( array( 'move_template', 'saved' ), add_query_arg( 'delete_template', $template_type ) ), 'woocommerce_email_template_nonce', '_wc_email_nonce' ) ); ?> " class = " delete_template button " >< ? php _e ( 'Delete template file' , 'woocommerce' ); ?> </a>
2012-09-17 00:53:17 +00:00
< ? php endif ; ?>
2016-10-24 23:56:38 +00:00
< ? php printf ( __ ( 'This template has been overridden by your theme and can be found in: %s.' , 'woocommerce' ), '<code>' . trailingslashit ( basename ( get_stylesheet_directory () ) ) . $template_dir . '/' . $template . '</code>' ); ?>
2012-09-17 00:53:17 +00:00
</ p >
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
< div class = " editor " style = " display:none " >
2014-12-03 03:30:28 +00:00
< textarea class = " code " cols = " 25 " rows = " 20 " < ? php if ( ! is_writable ( $local_file ) ) : ?> readonly="readonly" disabled="disabled"<?php else : ?>data-name="<?php echo $template_type . '_code'; ?>"<?php endif; ?>><?php echo file_get_contents( $local_file ); ?></textarea>
2012-09-17 00:53:17 +00:00
</ div >
2012-11-27 16:22:47 +00:00
2013-11-24 10:24:12 +00:00
< ? php } elseif ( file_exists ( $template_file ) ) { ?>
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
< p >
< a href = " # " class = " button toggle_editor " ></ a >
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
< ? php if ( ( is_dir ( get_stylesheet_directory () . '/' . $template_dir . '/emails/' ) && is_writable ( get_stylesheet_directory () . '/' . $template_dir . '/emails/' ) ) || is_writable ( get_stylesheet_directory () ) ) { ?>
2015-05-21 18:03:40 +00:00
< a href = " <?php echo esc_url( wp_nonce_url( remove_query_arg( array( 'delete_template', 'saved' ), add_query_arg( 'move_template', $template_type ) ), 'woocommerce_email_template_nonce', '_wc_email_nonce' ) ); ?> " class = " button " >< ? php _e ( 'Copy file to theme' , 'woocommerce' ); ?> </a>
2013-11-24 10:24:12 +00:00
< ? php } ?>
2012-09-17 00:53:17 +00:00
2016-10-24 23:56:38 +00:00
< ? php printf ( __ ( 'To override and edit this email template copy %1$s to your theme folder: %2$s.' , 'woocommerce' ), '<code>' . plugin_basename ( $template_file ) . '</code>' , '<code>' . trailingslashit ( basename ( get_stylesheet_directory () ) ) . $template_dir . '/' . $template . '</code>' ); ?>
2012-09-17 00:53:17 +00:00
</ p >
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
< div class = " editor " style = " display:none " >
2013-10-26 10:32:38 +00:00
< textarea class = " code " readonly = " readonly " disabled = " disabled " cols = " 25 " rows = " 20 " >< ? php echo file_get_contents ( $template_file ); ?> </textarea>
2012-09-17 00:53:17 +00:00
</ div >
2012-11-27 16:22:47 +00:00
2013-11-24 10:24:12 +00:00
< ? php } else { ?>
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
< p >< ? php _e ( 'File was not found.' , 'woocommerce' ); ?> </p>
2012-11-27 16:22:47 +00:00
2013-11-24 10:24:12 +00:00
< ? php } ?>
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
</ div >
< ? php
endforeach ;
?>
</ div >
< ? php
2014-12-03 03:30:28 +00:00
wc_enqueue_js ( "
2015-08-05 18:57:15 +00:00
jQuery ( 'select.email_type' ) . change ( function () {
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
var val = jQuery ( this ) . val ();
2012-11-27 16:22:47 +00:00
2015-08-05 18:57:15 +00:00
jQuery ( '.template_plain, .template_html' ) . show ();
2012-11-27 16:22:47 +00:00
2015-08-05 18:57:15 +00:00
if ( val != 'multipart' && val != 'html' ) {
2012-09-17 00:53:17 +00:00
jQuery ( '.template_html' ) . hide ();
2015-08-05 18:57:15 +00:00
}
2012-11-27 16:22:47 +00:00
2015-08-05 18:57:15 +00:00
if ( val != 'multipart' && val != 'plain' ) {
2012-09-17 00:53:17 +00:00
jQuery ( '.template_plain' ) . hide ();
2015-08-05 18:57:15 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
}) . change ();
2012-11-27 16:22:47 +00:00
2013-05-06 13:17:04 +00:00
var view = '" . esc_js( __( ' View template ', ' woocommerce ' ) ) . "' ;
var hide = '" . esc_js( __( ' Hide template ', ' woocommerce ' ) ) . "' ;
2012-11-27 16:22:47 +00:00
2015-08-05 18:57:15 +00:00
jQuery ( 'a.toggle_editor' ) . text ( view ) . toggle ( function () {
jQuery ( this ) . text ( hide ) . closest ( ' .template' ) . find ( '.editor' ) . slideToggle ();
2012-09-17 00:53:17 +00:00
return false ;
}, function () {
2015-08-05 18:57:15 +00:00
jQuery ( this ) . text ( view ) . closest ( '.template' ) . find ( '.editor' ) . slideToggle ();
2012-09-17 00:53:17 +00:00
return false ;
} );
2012-11-27 16:22:47 +00:00
2015-08-05 18:57:15 +00:00
jQuery ( 'a.delete_template' ) . click ( function () {
if ( window . confirm ( '" . esc_js( __( ' Are you sure you want to delete this template file ? ', ' woocommerce ' ) ) . "' ) ) {
2012-09-17 00:53:17 +00:00
return true ;
2015-08-05 18:57:15 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-17 00:53:17 +00:00
return false ;
});
2012-11-27 16:22:47 +00:00
2015-08-05 18:57:15 +00:00
jQuery ( '.editor textarea' ) . change ( function () {
var name = jQuery ( this ) . attr ( 'data-name' );
2012-11-27 16:22:47 +00:00
2015-08-05 18:57:15 +00:00
if ( name ) {
jQuery ( this ) . attr ( 'name' , name );
}
2012-09-17 00:53:17 +00:00
});
2014-12-03 03:30:28 +00:00
" );
2012-09-17 00:53:17 +00:00
}
}
2013-02-21 00:39:38 +00:00
}