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 ;
}
if ( class_exists ( 'WC_Email' ) ) {
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
/**
* Plain text template path .
* @ var string
*/
2014-08-31 05:49:58 +00:00
public $template_plain ;
2012-09-17 00:53:17 +00:00
2014-12-03 03:30:28 +00:00
/**
* HTML template path .
* @ var string
*/
2014-08-31 05:49:58 +00:00
public $template_html ;
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
* Template path .
* @ var string
*/
2014-08-31 05:49:58 +00:00
public $template_base ;
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
* Recipients for the email .
* @ var string
*/
2014-08-31 05:49:58 +00:00
public $recipient ;
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
* Heading for the email content .
* @ var string
*/
2014-08-31 05:49:58 +00:00
public $heading ;
2012-11-27 16:22:47 +00:00
2014-12-03 03:30:28 +00:00
/**
* Subject for the email .
* @ var string
*/
2014-08-31 05:49:58 +00:00
public $subject ;
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 .
* @ var object
*/
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
2014-08-31 05:49:58 +00:00
'/[ ]{2,}/' // Runs of spaces, post-handling
);
/**
* 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
' ' // Runs of spaces, post-handling
);
/**
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
2014-08-31 05:49:58 +00:00
$this -> heading = $this -> get_option ( 'heading' , $this -> heading );
$this -> subject = $this -> get_option ( 'subject' , $this -> subject );
$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
2012-12-15 11:53:32 +00:00
add_filter ( '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
*/
2014-08-31 05:49:58 +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-02-05 12:44:43 +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
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 () {
2012-09-17 00:53:17 +00:00
return apply_filters ( 'woocommerce_email_subject_' . $this -> id , $this -> format_string ( $this -> subject ), $this -> object );
}
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 () {
2012-09-17 00:53:17 +00:00
return apply_filters ( 'woocommerce_email_heading_' . $this -> id , $this -> format_string ( $this -> heading ), $this -> object );
}
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 () {
2012-09-17 00:53:17 +00:00
return apply_filters ( 'woocommerce_email_headers' , " Content-Type: " . $this -> get_content_type () . " \r \n " , $this -> id , $this -> object );
}
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
*
2014-09-08 15:35:37 +00:00
* @ return string | array
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 ) {
$logger = new WC_Logger ();
$logger -> add ( 'emogrifier' , $e -> getMessage () );
}
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' ),
'default' => 'yes'
2012-09-17 00:53:17 +00:00
),
2015-11-03 14:57:39 +00:00
'subject' => array (
'title' => __ ( 'Email Subject' , 'woocommerce' ),
'type' => 'text' ,
'description' => sprintf ( __ ( 'Defaults to <code>%s</code>' , 'woocommerce' ), $this -> subject ),
'placeholder' => '' ,
'default' => '' ,
'desc_tip' => true
2012-09-17 00:53:17 +00:00
),
2015-11-03 14:57:39 +00:00
'heading' => array (
'title' => __ ( 'Email Heading' , 'woocommerce' ),
'type' => 'text' ,
'description' => sprintf ( __ ( 'Defaults to <code>%s</code>' , 'woocommerce' ), $this -> heading ),
'placeholder' => '' ,
'default' => '' ,
'desc_tip' => true
2012-09-17 00:53:17 +00:00
),
2015-11-03 14:57:39 +00:00
'email_type' => array (
'title' => __ ( 'Email type' , 'woocommerce' ),
'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 (),
'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
*/
2014-08-31 05:49:58 +00:00
public function process_admin_options () {
// Save regular options
parent :: process_admin_options ();
2012-11-27 16:22:47 +00:00
2014-08-31 05:49:58 +00:00
// Save templates
2015-05-29 16:40:53 +00:00
if ( isset ( $_POST [ 'template_html_code' ] ) ) {
$this -> save_template ( $_POST [ 'template_html_code' ], $this -> template_html );
}
if ( isset ( $_POST [ 'template_plain_code' ] ) ) {
$this -> save_template ( $_POST [ 'template_plain_code' ], $this -> template_plain );
}
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 ;
2015-03-27 15:59:25 +00:00
$code = stripslashes ( $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
2015-02-18 17:34:03 +00:00
if ( $f !== false ) {
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 ;
$template_file = apply_filters ( 'woocommerce_locate_core_template' , $core_file , $template , $this -> template_base );
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-02-17 16:02:22 +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>
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' ),
'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 ;
$template_file = apply_filters ( 'woocommerce_locate_core_template' , $core_file , $template , $this -> template_base );
$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 ; ?>
2015-11-03 14:57:39 +00:00
< ? php printf ( __ ( 'This template has been overridden by your theme and can be found in: <code>%s</code>.' , 'woocommerce' ), trailingslashit ( basename ( get_stylesheet_directory () ) ) . $template_dir . '/' . $template ); ?>
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
2015-11-03 14:57:39 +00:00
< ? php printf ( __ ( 'To override and edit this email template copy <code>%s</code> to your theme folder: <code>%s</code>.' , 'woocommerce' ), plugin_basename ( $template_file ) , trailingslashit ( basename ( get_stylesheet_directory () ) ) . $template_dir . '/' . $template ); ?>
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
}