J'ai créé un champ de saisie Ajouter/Supprimer dynamique. J'utilise wp_mail();
pour envoyer des mails. J'ai empêché le premier utilisateur de recevoir du courrier. Je veux envoyer du courrier à d'autres utilisateurs. Tout fonctionne correctement. Le seul problème est que chaque utilisateur reçoit deux courriels. wp_mail();
le crée deux fois en même temps.
Cela signifie que lorsque je soumets le formulaire, chaque utilisateur reçoit le même courrier électronique deux fois. Je veux que chaque utilisateur ne reçoive qu'un seul email. Voici mon code:
<?php get_header(); ?>
<?php
$member_details->user_email = array_map( 'sanitize_text_field', $_POST['user_email'] );
$member_details->user_role = array_map( 'sanitize_text_field', $_POST['user_role'] );
$member_details->status = array_map( 'sanitize_text_field', $_POST['status'] );
if ( isset( $_POST['project_prev'] ) ) {
$user_emails = $member_details->user_email;
$user_statuses = $member_details->status;
for ($i=1; $i < count($user_emails); $i++) {
$user_email1[] = $user_emails[$i];
}
for ($a=1; $a < count($user_statuses); $a++) {
$user_status = $user_statuses[$a];
if ( $user_status == 'Unverified' ) {
$to = $user_email1;
$subject = "Congrats! You are added to the Project - " . "'" . $project_title . "'";
$message = 'If you are not the member of project plz contact us to remove at [email protected]';
wp_mail( $to, $subject, $message );
}
}
}
?>
<form method="POST">
<div class="panel panel-default">
<div class="panel-heading"><center><b>Team Members</b></center></div>
<div class="panel-body">
<div class="row">
<div class="col-md-5"><label>Member's Registered Email</label></div>
<div class="col-md-5"><label>Role in Project</label></div>
<div class="col-md-2"></div>
</div>
<div class="row">
<div class="col-md-5">
<div class="form-group">
<input type="text" class="form-control" name="user_email[]" value="<?php $current_user = wp_get_current_user(); if ( !($current_user instanceof WP_User) ) return; echo $current_user->user_email; ?>" placeholder="" readonly="readonly">
</div>
</div>
<div class="col-md-5">
<div class="form-group">
<input type="text" class="form-control" name="user_role[]" placeholder="">
<input type="hidden" class="form-control" name="status[]" value="Verified" placeholder="">
</div>
</div>
<div class="col-md-2">
<button type="button" class="btn btn-success" id="add-member-fields"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add</button>
</div>
</div>
<div id="member-fields">
</div>
<p class="help-block"><i>To add member please register new User, if already not registered.</i></p>
</div>
</div>
<input class="btn btn-info btn-block" type="submit" name="project_prev" value="Preview" style="border-radius: 0px;">
</form>
<?php
$user = wp_get_current_user();
$args = array(
'role' => 'backer',
'exclude' => array( $user->ID ),
);
$users = get_users( $args );
$get_user_emails = wp_list_pluck( $users, 'user_email' );
?>
<script type='text/javascript'>
jQuery(document).ready(function($) {
var wrapper = $("#member-fields");
var add_button = $("#add-member-fields");
var x = 1;
var availableAttributes = <?php echo json_encode($get_user_emails); ?>;
var previousValue="";
add_button.click(function(e) {
e.preventDefault();
x++;
var element = $('<div id="user-fields"><div class="row"><div class="col-md-5"><div class="form-group"><input type="text" class="form-control" id="user_email" name="user_email[]" placeholder=""></div></div><div class="col-md-5"><div class="form-group"><input type="text" class="form-control" name="user_role[]" placeholder=""><input type="hidden" class="form-control" name="status[]" value="Unverified" placeholder=""></div></div><div class="col-md-2"><button type="button" class="btn btn-danger" id="remove_member_field"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span> Remove</button></div></div><div class="clear"></div></div>');
element.fadeIn("slow").find("input[name^='user_email']").autocomplete({
autoFocus: true,
source: availableAttributes,
});
wrapper.append(element);
});
wrapper.on("keyup","#user_email",function() {
var isValid = false;
for (i in availableAttributes) {
if (availableAttributes[i].toLowerCase().match(this.value.toLowerCase())) {
isValid = true;
}
}
if (!isValid) {
this.value = previousValue
} else {
previousValue = this.value;
}
});
wrapper.on("click", "#remove_member_field", function(e) {
e.preventDefault();
$(this).parent().fadeOut(300, function() {
$(this).closest('#user-fields').remove();
x--;
});
});
});
</script>
<?php get_footer(); ?>
Ces variables POST
: $_POST['user_email']
, $_POST['user_role']
et $_POST['status']
(chacune étant une array
) sont connectées les unes aux autres par leur index; vous pouvez donc en parcourir une seule et utiliser lemême index( ou itérateur) pour accéder aux éléments duothertableaux.
Cela devrait vous aider à comprendre:
for ( $i = 0; $i < count( $member_details->user_email ); $i++ ) {
$user_email = $member_details->user_email[ $i ];
$user_role = $member_details->user_role[ $i ];
$status = $member_details->status[ $i ];
...
}
Donc cette partie/code:
if ( isset( $_POST['project_prev'] ) ) {
$user_emails = $member_details->user_email;
$user_statuses = $member_details->status;
...
}
Je l'ai codé comme ceci:
(Notez que je l'ai re-indenté pour plus de clarté. )
if ( isset( $_POST['project_prev'] ) ) {
// Starts with the first user (index 1).
for ( $i = 1; $i < count( $member_details->user_email ); $i++ ) {
$user_status = $member_details->status[ $i ];
if ( $user_status === 'Unverified' ) {
$to = $member_details->user_email[ $i ];
$project_title = '??'; // This wasn't defined anywhere in the file/code.
$subject = "Congrats! You are added to the Project - " . "'" . $project_title . "'";
$message = 'If you are not the member of project plz contact us to remove at [email protected]';
wp_mail( $to, $subject, $message );
}
}
}
Le problème ici est que vous créez d’abord un tableau de toutes les adresses électroniques, puis dans votre deuxième boucle "for" pour les statuts d’utilisateur, si le statut de l’utilisateur actuel dans la boucle n’est pas vérifié, vous envoyez un courrier électronique à l’ensemble du tableau $user_email1
. Si vous pouvez supposer que $i
fait référence au même utilisateur dans les tableaux $user_email1
et $user_statuses
, vous pouvez simplement changer
$to = $user_email1;
à
$to = $user_email1[$i];
et de cette façon, vous n'envoyez que le courrier électronique à l'utilisateur actuel de votre boucle.