web-dev-qa-db-fra.com

Utilisation de modèles WordPress pour les emails HTML

Je travaille sur un plugin qui doit envoyer un courrier électronique après la soumission d'un formulaire.

J'utilise wp_mail() pour cela et cela fonctionne bien. Mon problème est que dans mon code, le code HTML est généré par un ensemble de chaînes PHP ajoutées à une variable comme ceci:

$content = $html_headers;
$content .= '<h1>' . the_title($post_id) . '</h1>';
$content .= '<p>' . $post_body . '</p>;

..etc

J'ai actuellement plus de 30 lignes comme ça; et cela me permet enfin de faire:

    //add filter to allow html
    add_filter('wp_mail_content_type', create_function('', 'return "text/html"; '));

    //Send email
    wp_mail( '[email protected]', 'mail tester', $content, 'From: some one <[email protected]>' );

    //remove filter to allow html (avoids some conflict.)
    remove_filter('wp_mail_content_type', create_function('', 'return "text/html"; '));

Je le préférerais si je pouvais référencer un fichier séparé qui utilise des balises de modèle de thème de thème WordPress normales afin de générer le contenu du courrier, de sorte que dans un fichier séparé, j'aurais quelque chose comme ceci:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        (headertags)
    </head>
    <body>
        <h1><?php the_title($post_id); ?></h1>
        <p><?php my_custom_template_body_tag(); ?></p>
    </body>
</html>

mais je ne sais pas comment renvoyer ce contenu à la fonction wp_mail(). J'ai essayé d'utiliser file_get_contents() mais cela ignore simplement le contenu généré par PHP, et j'ai examiné la syntaxe heredoc. Mais je trouve cela assez moche et sujet aux erreurs. Est-ce que j'ai d'autres options? Je l'aime vraiment si je pouvais faire quelque chose comme ça:

$content = parse_and_return_content_of('path/to/template/file', $arg);

Je vous remercie

5
Malibur

Vous devriez utiliser ob_get_contents()

    ob_start();
    include('template/email-header.php');
    printf(__('<p>A very special welcome to you, %1$s. Thank you for joining %2$s!</p>', 'cell-email'), $greetings, get_bloginfo('name'));
    printf(__('<p> Your password is <strong style="color:orange">%s</strong> <br> Please keep it secret and keep it safe! </p>', 'cell-email'), $plaintext_pass);
    printf(__('<p>We hope you enjoy your stay at %s. If you have any problems, questions, opinions, praise, comments, suggestions, please feel free to contact us at any time</p>', 'cell-email'), get_bloginfo('name'));
    include('template/email-footer.php');
    $message = ob_get_contents();
    ob_end_clean();
    wp_mail($user_email, $email_subject, $message);

Et sur le template/email-header.php, vous pouvez utiliser

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta property="og:title" content="<?php echo $email_subject ?>" />
    <title><?php echo $email_subject ?></title>
</head>
<body leftmargin="0" marginwidth="0" topmargin="0" marginheight="0" offset="0" style="width: 100% !important; -webkit-text-size-adjust: none; margin-top: 0; margin-right: 0; margin-bottom: 0; margin-left: 0; padding-top: 0; padding-right: 0; padding-bottom: 0; padding-left: 0; background-color: #FAFAFA;" bgcolor="#FAFAFA">
<!-- the rest of the html here -->
<?php // and php generated content if you prefer ?>
3
ifdion

Vous pourriez faire quelque chose d'un peu plus comme fusionner des champs. De cette façon, vous pouvez garder votre HTML et PHP séparés en utilisant un modèle de courrier électronique avec des espaces réservés et exécuter une chaîne de remplacement sur eux. Quelque chose comme ce qui suit:

HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        (headertags)
    </head>
    <body>
        <h1>[POST.TITLE]</h1>
        <p>[POST.CONTENT]</p>
    </body>
</html>

PHP

$html_email_template_file = 'some/path/mytemplate-example.html';

// assign contents of file to $content var
$content = file_get_contents($html_email_template_file);

$content = str_replace('[POST.TITLE]', $post->post_title, $content);
$content = str_replace('[POST.CONTENT]', $post->post_excerpt, $content);

// send your email here ...
1
Aron