web-dev-qa-db-fra.com

Comment appeler wp_mail depuis HTML?

Cela est censé être opérationnel la semaine prochaine environ, mais j’ai beaucoup de difficulté à faire en sorte que le site envoie des courriels à une adresse spécifiée dans une zone de saisie.

Je dois utiliser wp_mail car je dois être capable de transmettre des variables php (email, corps ET pièce jointe) à un email.

J'ai correctement configuré le formulaire, mais après quelques recherches, j'ai découvert qu'utiliser JQuery (AJAX en particulier) était le meilleur/unique moyen de le faire, mais je n'ai aucune idée de la façon dont cela fonctionne.

J'espère que quelqu'un ici pourra m'expliquer cela afin que je puisse le faire fonctionner le plus rapidement possible.

Dans mon shortcode, ceci est ajouté à la page (ignore la fonction de script, tentative infructueuse):

<div class="downloadHolder">
            <h3>Download</h3>
            <p style="margin-bottom: 20px;">Please note: FTB files can only be used if you have Free The Blobs on Android or iOS.</p>
            <a href="<?php echo $intro;?>" download="<?php echo basename($intro) ?>" class="demoBtn">Download for PC</a>
            <!--<a href="#" class="demoBtn">Demo</a>--><br>
            <input type="text" name="emailValue" placeholder="Email Address" class="emailInput" style="text-align: center;">
            <br><span>(We do NOT collect email addresses.)</span><br><br>
            <button onclick="echoSendMail()" class="downloadBtn" style="width: 100% !important;">Email for Mobile</button>
        </div>
        <script>
            function echoHello(){
                alert("<?PHP emailSend(); ?>");
            }
</script>

Et plus tard dans ce même fichier php, j'ai cette fonction ($ intro est l'URL d'un fichier téléchargé (la pièce jointe)):

function emailSend(){
    $to = $_GET['emailValue'];
    $subject = 'Download for'.basename($intro);
    $msg = 'Your download for'.basename($intro).'is attached to this email.';
    $headers = 'From: My Name <[email protected]>' . "\r\n";
    $mail_attachment = array(get_post_meta($post -> ID, $key = 'podcast_file', true));
    wp_mail($to, $subject, $msg, $headers, $mail_attachment);
}
1
K.Briggs

La première façon de faire consiste à utiliser un formulaire utilisant la méthode post, il est légèrement plus facile à comprendre:

<!-- form with AJAX action and iframe target -->
<form method="post" action="<?php echo admin_url('admin-ajax.php'); ?>" target="emailsendframe">
<!-- AJAX action field to trigger function-->
<input type="hidden" name="action" value="download_email_send">
<!-- Post ID field -->
<input type="hidden" name="intro" value="<?php echo basename($intro); ?>">
<input type="hidden" name="postId" value="<?php echo $post->ID; ?>">
<input type="submit" class="downloadBtn" value="Download">
</form>
<!-- iframe for submitting to -->
<iframe name="emailsendframe" id="emailsendframe" src="javascript:void(0);" style="display:none;"></iframe>

Bien sûr, vous pouvez faire la même chose dans une fonction javascript avec get, mais vous auriez besoin d'ajouter une id à l'élément de courrier électronique afin de pouvoir l'ajouter facilement ... (La mise en garde étant que vous avez plusieurs boutons de téléchargement sur le même cette page ne fonctionnera pas, étant donné que id doit être unique, vous devrez ajouter plus de code pour le rendre ainsi.)

<!-- note id attribute is added -->
<input type="text" name="emailValue" id="emailValue" placeholder="Email Address" class="emailInput" style="text-align: center;">
<!-- button can stay as you have it -->
<button onclick="emailsend();" class="downloadBtn">Download</button>
<!-- get method AJAX email send script -->
<script>function emailsend() {
    emailvalue = document.getElementById('emailValue').value;
    email = encodeURIComponent(emailvalue);
    intro = encodeURIComponent('<?php echo basename($intro); ?>');
    downloadurl = '<?php admin_url('admin-ajax.php'); ?>?action=download_email_send&postId=<?php echo $post->ID; ?>&emailValue='+email+'&intro='+intro;
    document.getElementById('emailsendframe').src = downloadurl;
}</script>
<!-- iframe for submitting to -->
<iframe name="emailsendframe" id="emailsendframe" src="javascript:void(0);" style="display:none;"></iframe>

Dans le fichier function.php de votre thème (ou dans un dossier plug-in ou mu-plugins), ajoutez la fonction AJAX correspondante en ajoutant la valeur de la requête action à wp_ajax_ (pour les utilisateurs connectés) et/ou wp_ajax_nopriv_ (utilisateurs anonymes). actions dans WordPress:

// AJAX trigger for download_email_send action
add_action('wp_ajax_download_email_send','download_email_send');
add_action('wp_ajax_nopriv_download_email_send','download_email_send');

// note $_REQUEST will work with $_POST or $_GET methods
function download_email_send() {
    $to = $_REQUEST['emailValue'];

    // preferably add some email address format validation here
    // $validate = some_email_validate_function($to);
    // if ($validated) {$message = 'Please check your email for typos.';}
    // else {
        $post_id = $_REQUEST['postID'];

        // ! you would need to redefine $intro here !
        $subject = 'Download for '.$_REQUEST['intro'];
        $msg = 'Your download for '.$_REQUEST['intro'].' is attached to this email.';
        $headers = 'From: My Name <[email protected]>' . "\r\n";
        $mail_attachment = array(get_post_meta($post_id, 'podcast_file', true));
        $send = wp_mail($to, $subject, $msg, $headers, $mail_attachment);

        if ($send) {$message = 'Success! Check you email address.';}
        else {$message = 'Error: Mail sending failed.';}
    // }

    // alert the user to the result
    echo "<script>alert('".$message."');</script>";
    exit;
}
2
majick