Eigene Mails mit „WooCommerce Look“

Vielleicht standet ihr bereits vor dem Problem: Der Kunde fragt: Wir haben hier eine bestimmte Aktion, dort möchten wir eine E-Mail an alle Kunden verschicken. Der Entwickler denkt „Kein Problem, wp_mail und die Sache ist erledigt.“.

Dann kommt die Realität. Natürlich möchte der Kunde kleine Plain-Mail an seine Kunden versenden. Die Mail sollte natürlich so aussehen, wie eben auch die anderen E-Mails an den Kunden aussehen.

Ihr hättet nun die Möglichkeit eine eigene E-Mail auf Basis der WooCommerce API zu entwickeln, aber eigentlich ist das Budget ohnehin schon knapp bemessen und eventuell ist der Trigger auch nicht so klar. Es ist eben nicht „Wenn Status X, dann Sende E-Mail Y.

Ich stand in einem Kundenprojekt genau vor diesem Problem und möchte euch einen kurzen Weg zeigen, wie ihr Die wp_mail Funktion mit dem Design der WooCommerce E-Mails kombiniert. Meine Ausgangslage war dieses Gist von tameemsafi


// Define a constant to use with html emails
define("HTML_EMAIL_HEADERS", array('Content-Type: text/html; charset=UTF-8'));

// @email - Email address of the reciever
// @subject - Subject of the email
// @heading - Heading to place inside of the woocommerce template
// @message - Body content (can be HTML)

function send_email_woocommerce_style($email, $subject, $heading, $message) {

  // Get woocommerce mailer from instance
  $mailer = WC()->mailer();

  // Wrap message using woocommerce html email template
  $wrapped_message = $mailer->wrap_message($heading, $message);
  // Create new WC_Email instance

  $wc_email = new WC_Email;

  // Style the wrapped message with woocommerce inline styles
  $html_message = $wc_email->style_inline($wrapped_message);

  // Send the email using wordpress mail function
  wp_mail( $email, $subject, $html_message, HTML_EMAIL_HEADERS );
}

Damit könnt ihr eine E-Mail über wp_mail im WooCommerce-Style versenden. In meinem Fall habe ich einen Custom Post Type „Mails“ registriert und den Kunden dort seine E-Mail Inhalte eintragen lassen. Ich habe eine Methode (Funktion innerhalb einer Klasse) entwickelt die sich diese 3 Beiträge holt:

	public function getMailContent( $type ) {

		if ( $type == 'survey' ) {
			/* survey */
			$survey_content = apply_filters( 'the_content', get_post_field( 'post_content', 4066 ) );
			$survey_title   = apply_filters( 'the_content', get_post_field( 'post_title', 4066 ) );

			return array( 'title' => $survey_title, 'content' => $survey_content );

		} elseif ( $type == 'flight' ) {

			/* flight */
			$flight_content = apply_filters( 'the_content', get_post_field( 'post_content', 4065 ) );
			$flight_title   = apply_filters( 'the_content', get_post_field( 'post_title', 4065 ) );

			return array( 'title' => $flight_title, 'content' => $flight_content );
		} elseif ( $type == 'countdown' ) {

			/* countdown */
			$countdown_content = apply_filters( 'the_content', get_post_field( 'post_content', 4067 ) );
			$countdown_title   = apply_filters( 'the_content', get_post_field( 'post_title', 4067 ) );

			return array( 'title' => $countdown_title, 'content' => $countdown_content );
		}
	}

Nun musste ich diese Methode nur noch aktiv nutzen, um eine E-Mail mit dem gespeicherten Inhalt zu versenden. Ich erspare euch nun den kompletten Aufbau meiner Methode zum Triggern. Hierbei ging es um zeitbasierte Einträge, welche mittels eines Cronjobs täglich überprüft werden und wenn das entsprechende Datum eingetreten ist, wird folgender Teil ausgeführt:

$headers = array( 'Content-Type: text/html; charset=UTF-8' );
$content = $this->getMailContent( 'survey' );

$to                      = $recipient['mail'];
$subject                 = $content['title'];
$body                    = $content['content'];
					
$mailer          = WC()->mailer();
$wrapped_message = $mailer->wrap_message( $subject, $content );
$wc_email        = new WC_Email;
$html_message = $wc_email->style_inline( $wrapped_message );

wp_mail( $to, $subject, $html_message, $headers );

Ich denke mit diesen Informationen solltet ihr in der Lage sein, selbst E-Mails im WooCommerce-Look für eure Kunden zu erstellen.  Bei Bedarf stelle ich auch gern meine komplette Klasse zur Verfügung, welche ein ausführliches Beispiel (Kunden holen, E-Mail-Content holen, Cron-Job starten und Datum überprüfen und je nachdem E-Mail versenden) zur Verfügung. Meldet euch dazu einfach kurzfristig in den Kommentaren.