Select Git revision
Plugin_Info.php
EmailSender.php 4.18 KiB
<?php
namespace WPDesk\Library\WPEmail;
use WPDesk\Library\WPEmail\Abstracts\EmailInterface;
use WPDesk\Library\WPEmail\Parser\HTMLDecorator;
use WPDesk\View\Renderer\Renderer;
use WPDesk\View\Renderer\SimplePhpRenderer;
use WPDesk\View\Resolver\ChainResolver;
use WPDesk\View\Resolver\DirResolver;
use WPDesk\View\Resolver\WPThemeResolver;
class EmailSender {
/**
* @var EmailInterface[]
*/
private $emails = [];
/**
* @var string
*/
private $from = 'wordpress@wordpress.org';
/**
* @var string
*/
private $from_name = 'WordPress';
/**
* @var Renderer
*/
private $renderer;
/**
* @param $from
* @param $from_name
*/
public function __construct() {
$this->init_renderer();
}
public function init_renderer() {
$resolver = new ChainResolver();
$resolver->appendResolver( new DirResolver( __DIR__ ) );
$this->renderer = new SimplePhpRenderer( $resolver );
}
public function set_renderer( Renderer $renderer ) {
$this->renderer = $renderer;
}
public function add_email( EmailInterface $email ) {
$this->emails[ $email->get_id() ] = $email;
}
public function get_emails(): array {
return $this->emails;
}
public function set_from( string $from ) {
$this->from = $from;
}
/**
* WordPress callback for setting the from email
*
* @param string $email
*
* @return string
*/
public function from( $email ): string {
if ( ! empty( $this->from ) && is_email( $this->from ) ) {
$email = $this->from;
}
return $email;
}
public function set_from_name( string $from_name ) {
$this->from_name = $from_name;
}
/**
* WordPress callback for setting the from name
*
* @param string $name
*
* @return string
*/
public function from_name( $name ) {
if ( ! empty( $this->from_name ) ) {
$name = html_entity_decode( sanitize_text_field( $this->from_name ) );
}
return $name;
}
/**
* Add filters before fire wp_mail.
*
* @return void
*/
private function before_wp_mail() {
add_filter( 'wp_mail_from', array( $this, 'from' ) );
add_filter( 'wp_mail_from_name', array( $this, 'from_name' ) );
}
public function send( array $placeholders = [] ) {
foreach ( $this->get_emails() as $email ) {
$template = $this->get_template( $email, $placeholders );
if ( $email->get_is_enable() ) {
$this->before_wp_mail();
wp_mail(
$email->get_recipients(), $email->get_subject(), $this->css_inline( $template ), $email->get_headers(), $email->get_attachments()
);
$this->after_wp_mail();
}
}
}
public function get_template( EmailInterface $email, $placeholders = [] ): string {
$content = $this->replace_placeholders( $email->get_content(), $placeholders );
$output = $this->renderer->render( 'html/email-header', [] );
$output .= $this->renderer->render( 'html/' . $email->get_id(), [ 'content' => $content ] );
$output .= $this->renderer->render( 'html/email-footer', [] );
return $output;
}
/**
* @param string $content
* @param array $placeholders
*
* @return array|string|string[]
*/
private function replace_placeholders( string $content, array $placeholders = [] ): string {
return str_replace( array_keys( $placeholders ), array_values( $placeholders ), $content );
}
/**
* @param string $content
*
* @return mixed|string
*/
private function css_inline( string $content ): string {
$styles = $this->renderer->render( 'html/styles', [] );
$body = HTMLDecorator::style_inline( $content, $styles );
}
/**
* Remove filters after fire wp_mail.
*
* @return void
*/
private function after_wp_mail() {
remove_filter( 'wp_mail_from', array( $this, 'from' ) );
remove_filter( 'wp_mail_from_name', array( $this, 'from_name' ) );
}
}