Я добавил кнопку в бэкэнд редактора пользовательских типов сообщений.
Я хочу отправить электронное письмо, используя wp_mail()
, когда пользователь с правами администратора нажимает кнопку.
Я добавил эту пользовательскую форму и кнопку в мета-поле. Смотрите скриншот.
Проблема в том, что при нажатии на эту кнопку Wordpress перенаправляет на страницу со списком постов по умолчанию (https://mysite.test/wp-admin/edit.php).
Я использую крючок do_action( "admin_post_{$action}" )
.
Когда я проверяю страницу, я вижу, что Wordpress удалил теги.
Любая помощь будет оценена.
Вот мой код:
<?php
$quote_add_meta_nonce = wp_create_nonce('send_quote_email_form_nonce');
add_action('admin_post_quote_email_pdf', 'quote_email_pdf');
function quote_email_pdf()
{
if (isset($_POST['send_quote_email_meta_nonce']) && wp_verify_nonce($_POST['send_quote_email_meta_nonce'], 'send_quote_email_form_nonce')) {
$emailMessage = '<h1>It works</h1>';
echo $emailMessage;
} else {
echo 'Something went wrong';
}
}
?>
<form action = "<?php echo esc_url(admin_url('admin-post.php')); ?>" method = "POST">
<input type = "hidden" name = "action" value = "quote_email_pdf">
<input type = "hidden" name = "send_quote_email_meta_nonce" value = "<?php echo $quote_add_meta_nonce ?>" />
<input type = "submit" value = "Email quote to customer" class = "button">
</form>
Если вы хотите остаться на странице редактирования, на которой вы сейчас находитесь, то было бы гораздо разумнее сделать запрос AJAX для отправки этих данных на сервер, чем на самом деле отправить форму.
@CBroe Спасибо. Ваш первый комментарий указал на ошибку с моей стороны. Похоже, мне нужно добавить действие action = "<?php echo esc_url(admin_url('admin-post.php')); ?>?action=quote_email_pdf"
вот так.
@CBroe, что касается вашего второго комментария, я прочитал статью о том, что AJAX не рекомендуется отправлять электронное письмо. Я пока пытаюсь найти это в своей истории. Если вышеуказанное действие не сработает, я попробую метод AJAX.
Спасибо @CBroe. Я пошел с AJAX, и это работает.
Как упоминалось в моем комментарии, AJAX решил проблему.
Вот мой обновленный код:
<?php
add_action('wp_ajax_quote_email_pdf', 'quote_email_pdf');
function quote_email_pdf()
{
wp_mail( $to, $subject, $message, $headers, $attachments );
die();
}
?>
<button class = "button" id = "downloadQuote">Send email</button>
<script>
jQuery(document).ready(function($){
const fullName = $('#quoteFullName').text();
const emailAddress = $('#quoteEmail a').text();
$('#downloadQuote').click(function(e){
e.preventDefault();
$.ajax({
url: sf_admin_ajax.sf_admin_ajax_url,
type: 'POST',
data: {
action: 'quote_email_pdf',
emailAddress: emailAddress,
fullName: fullName
},
beforeSend: function() {
$('.preloader-window').addClass('active')
},
success: function(data, textStatus, XMLHttpRequest) {
$('.preloader-window').removeClass('active')
console.info(data);
},
error: function ( MLHttpRequest, textStatus, errorThrown ) {
$('.preloader-window').removeClass('active')
console.info(errorThrown);
}
})
})
});
</script>
https://mysite.test/wp-admin/edit.php
)». — кажется, это действие формы, которое вы указали с помощьюaction = "<?php echo esc_url(admin_url('admin-post.php')); ?>"
, так что вас сейчас удивляет?