Как ограничить отправку электронной почты дважды в wp mail
Я создал Добавление/Удаление динамических полей ввода. Я использую wp_mail();
для отправки писем. Я запретил первому пользователю получать почту. Я хочу отправлять почту другим пользователям. Все работает должным образом. Единственная проблема заключается в том, что каждый пользователь получает двойные электронные письма. wp_mail();
создает его дважды одновременно.
Означает, что когда я отправляю форму, каждый пользователь дважды получает одно и то же электронное письмо. Я хочу, чтобы каждый пользователь получал только одно электронное письмо. Ниже приведен мой код:
<?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(); ?>
2 answers
Эти POST
переменные: $_POST['user_email']
, $_POST['user_role']
, и $_POST['status']
(каждый из которых является array
) связаны друг с другом своим индексом, поэтому вы можете перебирать только один из них и использовать тот же индекс (или итератор) для доступа к элементам в других массивах .
Это должно помочь вам понять это:
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 ];
...
}
Итак, эта часть/код:
if ( isset( $_POST['project_prev'] ) ) {
$user_emails = $member_details->user_email;
$user_statuses = $member_details->status;
...
}
Я закодировал его так:
( Обратите внимание, что я изменил отступ для ясности.)
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 );
}
}
}
Проблема здесь в том, что вы сначала создаете массив всех адресов электронной почты, а затем во втором цикле "для" для статусов пользователей, если статус текущего пользователя в цикле не проверен, вы отправляете электронное письмо всему массиву $user_email1
. Если можно с уверенностью предположить, что $i
относится к одному и тому же пользователю как в массиве $user_email1
, так и в массиве $user_statuses
, вы можете просто изменить
$to = $user_email1;
До
$to = $user_email1[$i];
И таким образом вы отправляете электронное письмо только текущему пользователю в вашем для цикл.