Odeslání e-mailu s kupónem zákazníkovi WooCommerce - Affinite.io CZ

WooCommerce obsahuje několik základních transakčních e-mailů. My si vytvořím vlastní e-mail, v kterém pošleme zákazníkovi jeho kupón.

V minulém návodu jsme si popsali, jak vygenerovat kupón za první nákup.

A dnes návod rozšíříme o e-mail, která zákazníkovi po objednávce pošleme.

Vytvoření vlastního e-mailu

Nejprve si vytvoříme základ e-mailu. Nebudeme pro návod používat plugin, takže si v šabloně, ve složce woocommerce uděláme podsložku emails a v ní podsložku plain.

Složka emails bude obsahovat html e-mail a plain bude obsahovat e-mail v čistém textu.

Do složky emails přidáme soubor first-order-coupon-email.php a do složky plain soubor first-order-coupon-email-plain.php

Soubor first-order-coupon-email.php

$coupon_code = get_post_meta( $order->get_id(), 'generated_coupon', true );
?>

<?php do_action('woocommerce_email_header', $email_heading ); ?>

<h2><?php _e( 'Děkujeme za první nákup!', 'musilda' ); ?></h2>
<h3><?php _e( 'Obdrželi jste slevový kup=on na další nákup', 'musilda' ); ?></h3>
<p><?php _e( 'Pro získání slevy, při dalším nákupu zadete v pokladně nálsedující kód:', 'musilda' ); ?> <?php echo $coupon_code; ?></p>

<?php do_action( 'woocommerce_email_footer' ); 

Soubor first-order-coupon-email-plain.php

$coupon_code = get_post_meta( $order->get_id(), 'generated_coupon', true );

echo "= " . $email_heading . " =\n\n";

echo __( 'Děkujeme za první nákup!', 'musilda' ) . '\n\n';
echo __( 'Obdrželi jste slevový kup=on na další nákup', 'musilda' ) . 'n\n';

echo __( 'Pro získání slevy, při dalším nákupu zadete v pokladně nálsedující kód:', 'musilda' ) . ' ' , $coupon_code . '\n\n';


echo apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) );

Vytvoření třídy vlastního e-mailu

Nyní musíme vytvořit třídu e-mailu. Ta bude rozšiřovat WC_Email a nazveme ji WC_First_Order_Coupon_Email

1. krok

Jako první do třídy přidáme construktor. Ten obsahuje id e-mailu, které budeme potřebovat při jeho registraci, pak náležitosti, jako title a další. Důležité jsou template_html a template_plain, které musí odpovídat umístění souborů ve složce woocommerce.

public function __construct() {

	  	$this->id          = 'wc_first_order_coupon_email';
	  	$this->customer_email = true;
	  	$this->title       = __( 'First order coupon', $this->language_slug );
	  	$this->description = __( 'First order coupon', $this->language_slug );
	  	$this->heading     = __( 'First order coupon', $this->language_slug );
	  	$this->subject     = __( 'First order coupon from {site_title}', $this->language_slug );

	  	$this->template_html  = 'emails/stock-alert-customer-email.php';
	  	$this->template_plain = 'emails/plainsstock-alert-customer-email-plain.php';

	  	parent::__construct();

	}

2. krok

Vytvoříme trigger, což je nejdůležitější metoda, stará se o sestavení a odeslání e-mailu:

public function trigger( $order_id, $order = false ) {

		$this->setup_locale();

		if ( $order_id && ! is_a( $order, 'WC_Order' ) ) {
			$order = wc_get_order( $order_id );
		}

		if ( is_a( $order, 'WC_Order' ) ) {
			$this->object                         = $order;
			$this->recipient                      = $this->object->get_billing_email();
			$this->placeholders['{order_date}']   = wc_format_datetime( $this->object->get_date_created() );
			$this->placeholders['{order_number}'] = $this->object->get_order_number();
		}

		if ( $this->is_enabled() && $this->get_recipient() ) {
			$this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
		}

		$this->restore_locale();

  	}

3. krok

Následují dvě metody pro načtení šablon e-mailu:

/**
  	 * get_content_html function.
  	 *
  	 */
  	public function get_content_html() {
	  	return wc_get_template_html( $this->template_html, array(
			'order'              => $this->object,
			'email_heading'      => $this->get_heading(),
			'sent_to_admin'      => false,
			'plain_text'         => false,
			'email'              => $this,
	  	) );

  	}

	/**
  	 * get_content_plain function.
  	 *
  	 */
 	public function get_content_plain() {
	  	return wc_get_template_html( $this->template_plain, array(
			'order'              => $this->object,
			'email_heading'      => $this->get_heading(),
			'sent_to_admin'      => false,
			'plain_text'         => true,
			'email'              => $this,
	  	) );
  	}  

4. krok

A na závěr si přidáme základní nastavení polí v administraci. Je to jen basic, ale já to používám vždy, protože to pak mohu jednoduše rozšířit:

/**
  	 * Initialise settings form fields.
  	 */
  	public function init_form_fields() {
	  	$this->form_fields = array(
		  	'enabled' => array(
			  	'title'         => __( 'Enable/Disable', $this->language_slug ),
			  	'type'          => 'checkbox',
			  	'label'         => __( 'Enable this email notification', $this->language_slug ),
			  	'default'       => 'yes',
		  	),
		  	'subject' => array(
			  	'title'         => __( 'Subject', 'woocommerce' ),
			  	'type'          => 'text',
			  	'desc_tip'      => true,
			  	'description'   => sprintf( __( 'Available placeholders: %s', $this->language_slug ), '<code>{site_title}, {order_date}, {order_number}</code>' ),
			  	'placeholder'   => $this->get_default_subject(),
			  	'default'       => '',
		  	),
		  	'heading' => array(
			  	'title'         => __( 'Email heading', $this->language_slug ),
			  	'type'          => 'text',
			  	'desc_tip'      => true,
			  	'description'   => sprintf( __( 'Available placeholders: %s', $this->language_slug ), '<code>{site_title}, {order_date}, {order_number}</code>' ),
			  	'placeholder'   => $this->get_default_heading(),
			  	'default'       => '',
		  	),
		  	'email_type' => array(
			  	'title'         => __( 'Email type', $this->language_slug ),
			  	'type'          => 'select',
			  	'description'   => __( 'Choose which format of email to send.', $this->language_slug ),
			  	'default'       => 'html',
			  	'class'         => 'email_type wc-enhanced-select',
			  	'options'       => $this->get_email_type_options(),
			  	'desc_tip'      => true,
		  	),
	  	);
  	} 

Celá třída e-mailu

Celý kód pak vypadá takto:

class WC_First_Order_Coupon_Email extends WC_Email {

	/**
  	 * Unique identifier
  	 *
  	 */
  	protected $language_slug = 'musilda';


	/**
  	 * Set email defaults
  	 *
  	 */
  	public function __construct() {

	  	$this->id          = 'wc_first_order_coupon_email';
	  	$this->customer_email = true;
	  	$this->title       = __( 'First order coupon', $this->language_slug );
	  	$this->description = __( 'First order coupon', $this->language_slug );
	  	$this->heading     = __( 'First order coupon', $this->language_slug );
	  	$this->subject     = __( 'First order coupon from {site_title}', $this->language_slug );

	  	$this->template_html  = 'emails/stock-alert-customer-email.php';
	  	$this->template_plain = 'emails/plainsstock-alert-customer-email-plain.php';

	  	parent::__construct();

	}

	/**
  	 * Determine if the email should actually be sent and setup email merge variables
  	 *
  	 */
  	public function trigger( $order_id, $order = false ) {

		$this->setup_locale();

		if ( $order_id && ! is_a( $order, 'WC_Order' ) ) {
			$order = wc_get_order( $order_id );
		}

		if ( is_a( $order, 'WC_Order' ) ) {
			$this->object                         = $order;
			$this->recipient                      = $this->object->get_billing_email();
			$this->placeholders['{order_date}']   = wc_format_datetime( $this->object->get_date_created() );
			$this->placeholders['{order_number}'] = $this->object->get_order_number();
		}

		if ( $this->is_enabled() && $this->get_recipient() ) {
			$this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
		}

		$this->restore_locale();

  	}

	/**
  	 * get_content_html function.
  	 *
  	 */
  	public function get_content_html() {
	  	return wc_get_template_html( $this->template_html, array(
			'order'              => $this->object,
			'email_heading'      => $this->get_heading(),
			'sent_to_admin'      => false,
			'plain_text'         => false,
			'email'              => $this,
	  	) );

  	}

	/**
  	 * get_content_plain function.
  	 *
  	 */
 	public function get_content_plain() {
	  	return wc_get_template_html( $this->template_plain, array(
			'order'              => $this->object,
			'email_heading'      => $this->get_heading(),
			'sent_to_admin'      => false,
			'plain_text'         => true,
			'email'              => $this,
	  	) );
  	}

  	/**
  	 * Initialise settings form fields.
  	 */
  	public function init_form_fields() {
	  	$this->form_fields = array(
		  	'enabled' => array(
			  	'title'         => __( 'Enable/Disable', $this->language_slug ),
			  	'type'          => 'checkbox',
			  	'label'         => __( 'Enable this email notification', $this->language_slug ),
			  	'default'       => 'yes',
		  	),
		  	'subject' => array(
			  	'title'         => __( 'Subject', 'woocommerce' ),
			  	'type'          => 'text',
			  	'desc_tip'      => true,
			  	'description'   => sprintf( __( 'Available placeholders: %s', $this->language_slug ), '<code>{site_title}, {order_date}, {order_number}</code>' ),
			  	'placeholder'   => $this->get_default_subject(),
			  	'default'       => '',
		  	),
		  	'heading' => array(
			  	'title'         => __( 'Email heading', $this->language_slug ),
			  	'type'          => 'text',
			  	'desc_tip'      => true,
			  	'description'   => sprintf( __( 'Available placeholders: %s', $this->language_slug ), '<code>{site_title}, {order_date}, {order_number}</code>' ),
			  	'placeholder'   => $this->get_default_heading(),
			  	'default'       => '',
		  	),
		  	'email_type' => array(
			  	'title'         => __( 'Email type', $this->language_slug ),
			  	'type'          => 'select',
			  	'description'   => __( 'Choose which format of email to send.', $this->language_slug ),
			  	'default'       => 'html',
			  	'class'         => 'email_type wc-enhanced-select',
			  	'options'       => $this->get_email_type_options(),
			  	'desc_tip'      => true,
		  	),
	  	);
  	}

} // end class

Registrace e-mailu a jeho odeslání

Máme připravenou třídu e-mailu a soubory šablony. Teď musíme e-mail zaregistrovat.

add_filter( 'woocommerce_email_classes', 'add_first_order_coupon_email' );
function add_first_order_coupon_email( $email_classes ) {

    $email_classes['WC_First_Order_Coupon_Email'] = new WC_First_Order_Coupon_Email();

    return $email_classes;

}

Pak již máme náš e-mail viditelný v nastavení WooCommerce:

Odeslání e-mailu

Protože má být kupón generovaný automaticky, použijeme pro jeho odeslání hook woocommerce_checkout_order_processed, který je volán poté co je objednávka vytvořena, je již vygenerován kód kupónu a my můžeme bezpečně poslat e-mail.

add_action( 'woocommerce_checkout_order_processed', 'send_first_order_coupon_email' );
function send_first_order_coupon_email( $order_id ) {

	$coupon_code = get_post_meta( $order_id, 'generated_coupon', true );
	if ( !empty( $coupon_code ) ) {

		WC()->mailer();
		$send = new WC_First_Order_Coupon_Email();
		$mail = $send->trigger( $order_id );

	}

}

Hotovo!

A jsme na konci. Když nyní uděláte objednávku s již nepoužitým e-mailem, složíte oba návody – vygenerování kupónu a ten dnešní, tak zákazník dostane e-mailem vygenerovaný kupón na 10% slevy na další nákup.

E-mail vypadá takto:

Jak vidíte, není to sice tak jednoduché, jako jiné snippety, ale přidat nový e-mail do WooCommerce není vůbec složité a především, takto odeslaný e-mail bude mít stejný vzhled, jako ostatní transakční e-maily.

Automatické vygenerování kupónu na slevu za první nákup ve WooCommerce
Automatické vygenerování kupónu na slevu za první nákup ve WooCommerce
25 Říj, 2021
Jak zablokovat nákup pro problematického zákazníka ve WooCommerce
Jak zablokovat nákup pro problematického zákazníka ve WooCommerce
27 Říj, 2021

Komentáře nejsou povoleny.

Looking for something?