Кнопка «Отправить электронное письмо» в бэкэнде пользовательского типа сообщения

Я добавил кнопку в бэкэнд редактора пользовательских типов сообщений.

Я хочу отправить электронное письмо, используя 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>
«Проблема в том, что при нажатии этой кнопки Wordpress перенаправляет на страницу со списком сообщений по умолчанию (https://mysite.test/wp-admin/edit.php)». — кажется, это действие формы, которое вы указали с помощью action = "<?php echo esc_url(admin_url('admin-post.php')); ?>", так что вас сейчас удивляет?
CBroe 23.03.2022 08:28

Если вы хотите остаться на странице редактирования, на которой вы сейчас находитесь, то было бы гораздо разумнее сделать запрос AJAX для отправки этих данных на сервер, чем на самом деле отправить форму.

CBroe 23.03.2022 08:29

@CBroe Спасибо. Ваш первый комментарий указал на ошибку с моей стороны. Похоже, мне нужно добавить действие action = "<?php echo esc_url(admin_url('admin-post.php')); ?>?action=quote_email_pdf" вот так.

Ben de Meillon 23.03.2022 08:34

@CBroe, что касается вашего второго комментария, я прочитал статью о том, что AJAX не рекомендуется отправлять электронное письмо. Я пока пытаюсь найти это в своей истории. Если вышеуказанное действие не сработает, я попробую метод AJAX.

Ben de Meillon 23.03.2022 08:36

Спасибо @CBroe. Я пошел с AJAX, и это работает.

Ben de Meillon 23.03.2022 11:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
19
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как упоминалось в моем комментарии, 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>

Другие вопросы по теме