关于发送电子邮件:
wp\\u mail默认使用默认PHP的邮件设置,PHP默认使用sendmail服务,因此如果您在localhost上没有一个功能,您将无法发送电子邮件,您可以使用类似MailHog的东西来捕获在localhost上为您发送的电子邮件,并且您实际上将能够看到这些消息,这是一个非常好的调试选项。
在实时网站上,主机公司通常只是禁用sendmail
因为他们不希望自己的IP地址被列入黑名单,因为可能是来自客户托管站点的垃圾邮件。因此,您可以做的是安装https://wordpress.org/plugins/wp-mail-smtp/ 插件并使用您自己的gmail帐户发送电子邮件,以测试它是否正常工作。但对于生产使用,最好还是使用一些邮件发送服务,如MailGun\\SendGrid等。虽然这些服务是付费的,但它们会为您解决大量邮件发送的问题。
让我们深入了解如何改进代码,以便帮助您诊断发生了什么。
首先,如果您制作了一个ajax处理程序,那么最好通过以下方式将数据发送回jswp_send_json_success()
和wp_send_json_error()
功能使您的$。ajax将转到.done()
只有当您返回了HTTP代码为200的成功响应时,它才会转到.fail()
如果php代码返回错误。
让我们看看ajax处理程序的样子。
/**
* Form contatti front-end
*/
function submit_contact_form() {
if ( ! isset( $_POST[\'message_hash\'] ) || ! wp_verify_nonce( $_POST[\'message_hash\'], \'submit_message\' ) ) {
wp_send_json_error( array( \'error\' => \'wrong_nonce\' ) );
exit;
}
// Customer contacts and message
$email = sanitize_email( $_POST[\'email\'] );
$fname = sanitize_text_field( $_POST[\'fname\'] );
$lname = sanitize_text_field( $_POST[\'lname\'] );
$phone = sanitize_text_field( $_POST[\'phone\'] );
$subject = sanitize_text_field( $_POST[\'subject\'] );
$message = "Hai ricevuto un nuovo messaggio da: $fname $lname \\n";
$message .= "Puoi contattare l\'utente utilizzando il numero: $phone \\n";
$message .= "Testo del messaggio: \\n";
$message .= sanitize_textarea_field( $_POST[\'message\'] );
// send ticket
$to = \'[email protected]\';
$headers[] = "From: $fname $lname <$email>";
$mail_result = wp_mail( $to, $subject, $message, $headers );
if( $mail_result ) {
wp_send_json_success([\'message\'=>\'mail_sent\']);
}else {
wp_send_json_error([\'error\'=>\'email_sending_error\']);
}
}
add_action( \'wp_ajax_send_message\', \'submit_contact_form\' );
add_action( \'wp_ajax_nopriv_send_message\', \'submit_contact_form\' );
和JS代码,它们将优雅地处理数据,以避免盲目地相信如果数据被发送,它们就会被处理。
$(\'#submit-form\').on(\'click\', function(e){
e.preventDefault();
var data = $(\'#message-form\').serialize();
$.ajax({
type: \'POST\',
url: wpcf.ajaxurl,
data: data,
}).done(function handleAjaxSuccess(response){
console.log(\'success\', response);
$(\'#message-notice\').css({\'display\':\'block\'});
$(\'#message-form\')[0].reset();
setTimeout(function(){
$(\'#message-notice\').css({\'display\':\'none\'});
}, 3000);
console.log(\'Done!\');
}).fail(function handleAjaxError(jqXhr,errorText){
console.warn(\'Error\'); // just for you to see what\'s going on, here you can also display some error message to user.
console.warn(errorText);
console.warn(jqXhr);
});
});
我使用了命名的js函数,因此在发生错误时,您可以更好地了解错误发生的位置,而不是依赖js匿名函数。
还有一个本地化脚本的小编辑:最好先让脚本排队,然后再本地化它。
wp_enqueue_script(\'main\');
wp_localize_script(\'main\', \'wpcf\', $localize);
您还可以将其简化为:
function _res() {
wp_enqueue_style( \'my-plugin-style\', get_template_directory_uri() . \'/style.min.css\' );
wp_enqueue_script( \'my-plugin-main\', get_template_directory_uri() . \'/assets/js/main.js\', array( \'jquery\' ), null, true );
wp_localize_script(
\'my-plugin-main\',
\'wpcf\',
array(
\'ajaxurl\' => admin_url( \'admin-ajax.php\' ),
)
);
}
add_action( \'wp_enqueue_scripts\', \'_res\' );
另外,不要忘记为正在链接的css和js设置唯一的句柄名称,因为
main
是非常广泛的东西,您可以覆盖其他插件的js\\css代码链接或wp core。这绝对不是我们想要做的事情。
在做了这些更改之后,您将能够诊断浏览器控制台中发生了什么,并看到php返回给您的消息。