namespace WPForms\Emails\Templates;
use WPForms\Emails\Helpers;
use WPForms\Emails\Styler;
use WPForms\Helpers\Templates;
* Base email template class.
const TEMPLATE_SLUG = 'general';
* Content is plain text type.
* Header/footer/body arguments.
* @param string $message Email message.
public function __construct( $message = '' ) {
$this->set_message( $message );
$this->plain_text = Helpers::is_plain_text_template();
$this->set_initial_args();
* Set initial arguments to use in a template.
public function set_initial_args() {
'title' => \esc_html__( 'WPForms', 'wpforms-lite' ),
if ( ! $this->plain_text ) {
$header_args['header_image'] = $this->get_header_image();
'header' => $header_args,
'body' => [ 'message' => $this->get_message() ],
$args = \apply_filters( 'wpforms_emails_templates_general_set_initial_args', $args, $this );
$this->set_args( $args );
public function get_slug() {
return static::TEMPLATE_SLUG;
* Get the template parent slug.
public function get_parent_slug() {
return self::TEMPLATE_SLUG;
public function get_message() {
return \apply_filters( 'wpforms_emails_templates_general_get_message', $this->message, $this );
public function get_tags() {
return \apply_filters( 'wpforms_emails_templates_general_get_tags', $this->tags, $this );
* Get header/footer/body arguments
* @param string $type Header/footer/body.
public function get_args( $type ) {
if ( ! empty( $type ) ) {
return isset( $this->args[ $type ] ) ? apply_filters( 'wpforms_emails_templates_general_get_args_' . $type, $this->args[ $type ], $this ) : [];
return apply_filters( 'wpforms_emails_templates_general_get_args', $this->args, $this );
* @param string $message Email message.
public function set_message( $message ) {
$message = \apply_filters( 'wpforms_emails_templates_general_set_message', $message, $this );
if ( ! \is_string( $message ) ) {
$this->message = $message;
* @param array $tags Tags to set.
public function set_tags( $tags ) {
$tags = \apply_filters( 'wpforms_emails_templates_general_set_tags', $tags, $this );
if ( ! \is_array( $tags ) ) {
* Set header/footer/body/style arguments to use in a template.
* @param array $args Arguments to set.
* @param bool $merge Merge the arguments with existing once or replace.
public function set_args( $args, $merge = true ) {
$args = \apply_filters( 'wpforms_emails_templates_general_set_args', $args, $this );
if ( empty( $args ) || ! \is_array( $args ) ) {
foreach ( $args as $type => $value ) {
if ( ! \is_array( $value ) ) {
if ( ! isset( $this->args[ $type ] ) || ! \is_array( $this->args[ $type ] ) ) {
$this->args[ $type ] = [];
$this->args[ $type ] = $merge ? \array_merge( $this->args[ $type ], $value ) : $value;
* Process and replace any dynamic tags.
* @param string $content Content to make replacements in.
public function process_tags( $content ) {
$tags = $this->get_tags();
foreach ( $tags as $tag => $value ) {
$content = \str_replace( $tag, $value, $content );
* Conditionally modify email template name.
* @param string $name Base template name.
protected function get_full_template_name( $name ) {
$name = \sanitize_file_name( $name );
if ( $this->plain_text ) {
$template = 'emails/' . $this->get_slug() . '-' . $name;
if ( ! Templates::locate( $template . '.php' ) ) {
$template = 'emails/' . $this->get_parent_slug() . '-' . $name;
return \apply_filters( 'wpforms_emails_templates_general_get_full_template_name', $template, $this );
* Get header image URL from settings.
protected function get_header_image() {
* Additional 'width' key with an integer value can be added to $img array to control image's width in pixels.
* This setting helps to scale an image in some versions of MS Outlook and old email clients.
* Percentage 'width' values have no effect in MS Outlook and will be sanitized as integer by an email template..
* 'url' => \wpforms_setting( 'email-header-image' ),
* To set percentage values for the modern email clients, use $this->set_args() method:
* 'header_image_max_width' => '45%',
* Both pixel and percentage approaches work well with 'wpforms_emails_templates_general_get_header_image' filter or this class extension.
'url' => wpforms_setting( 'email-header-image' ),
'size' => wpforms_setting( 'email-header-image-size', 'medium' ),
return \apply_filters( 'wpforms_emails_templates_general_get_header_image', $img, $this );
* @param string $name Name of the content part.
protected function get_content_part( $name ) {
if ( ! \is_string( $name ) ) {
$html = Templates::get_html(
$this->get_full_template_name( $name ),
$this->get_args( $name ),
return \apply_filters( 'wpforms_emails_templates_general_get_content_part', $html, $name, $this );
* Assemble all content parts in an array.
protected function get_content_parts() {
'header' => $this->get_content_part( 'header' ),
'body' => $this->get_content_part( 'body' ),
'footer' => $this->get_content_part( 'footer' ),
return \apply_filters( 'wpforms_emails_templates_general_get_content_parts', $parts, $this );
* Apply inline styling and save email content.
* @param string $content Content with no styling applied.
protected function save_styled( $content ) {
if ( empty( $content ) ) {
if ( $this->plain_text ) {
$this->content = \wp_strip_all_tags( $content );
'style' => $this->get_full_template_name( 'style' ),
'queries' => $this->get_full_template_name( 'queries' ),
$styler = new Styler( $content, $style_templates, $this->get_args( 'style' ) );
$this->content = \apply_filters( 'wpforms_emails_templates_general_save_styled_content', $styler->get(), $this );
* Build an email including styling.
* @param bool $force Rebuild the content if it was already built and saved.
protected function build( $force = false ) {
if ( $this->content && ! $force ) {
$content = \implode( $this->get_content_parts() );
if ( empty( $content ) ) {
$content = $this->process_tags( $content );
if ( ! $this->plain_text ) {
$content = \make_clickable( $content );
$content = \apply_filters( 'wpforms_emails_templates_general_build_content', $content, $this );
$this->save_styled( $content );
* @param bool $force Rebuild the content if it was already built and saved.
public function get( $force = false ) {