自定义 post 类型后端中的发送电子邮件按钮

Send email button in custom post type backend

我在自定义 post 类型编辑器的后端添加了一个按钮。

我想在管理员用户单击按钮时使用 wp_mail() 发送电子邮件。

我已将此自定义表单和按钮添加到元框。见截图。

问题是单击此按钮时,Wordpress 会重定向到默认后端 posts 列表页面 (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 解决了问题。

这是我更新后的代码:

<?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.log(data);
      },
      error: function ( MLHttpRequest, textStatus, errorThrown ) {
          $('.preloader-window').removeClass('active')
          console.log(errorThrown);
      }
    })

  })
});
</script>