您没有包括send_email()
函数,但我查看了原始source (修订版1)的问题send_email()
函数很好,但如果这个答案无助于解决问题,那么将函数代码添加到问题正文中
所以我不知道为什么要将(REST)API端点的(HTTP)方法设置为POST和PUT,即。\'methods\' => [\'POST\',\'PUT\']
, 因为我认为POST已经足够了(即。\'methods\' => \'POST\'
), 但在我看来,您没有正确地将表单数据发送到API端点。
请注意,当您使用FormData
(在JavaScript中)使用PUT方法$request->get_json_params()
还有超全球$_POST
是空的,因此如果必须使用PUT方法,则需要将表单数据作为JSON编码的字符串发送。
其次,无论使用何种(HTTP)方法,如果以JSON的形式发送数据,请确保Content-Type
标题设置为application/json
作为值。
这里有两个使用JavaScript的示例,每个HTTP方法一个,这些示例在WordPress 5.6.0上运行良好:
使用fetch()
, FormData
以及POST方法
const formData = new FormData();
formData.append( \'contact_name\', \'John Doe\' );
formData.append( \'contact_email\', \'[email protected]\' );
formData.append( \'contact_message\', \'Just testing\' );
fetch( \'https://example.com/wp-json/contact/v1/send\', {
method: \'POST\',
body: formData
} )
.then( res => res.json() )
.then( data => console.log( data ) )
.catch( error => console.log( error ) );
使用fetch()
, JSON.stringify()
以及PUT方法
const formData = {
contact_name: \'John Doe\',
contact_email: \'[email protected]\',
contact_message: \'Just testing\'
};
fetch( \'https://example.com/wp-json/contact/v1/send\', {
method: \'PUT\',
body: JSON.stringify( formData ),
headers: {
\'Content-Type\': \'application/json\'
}
} )
.then( res => res.json() )
.then( data => console.log( data ) )
.catch( error => console.log( error ) );
所以我希望这有帮助,你不必使用
fetch()
甚至JavaScript,但我的回答是,确保您的请求使用
proper body/content and content type header.
使用$request->get_params()
获取所有参数(URL编码的帖子正文、JSON负载、URL查询字符串等)。因此,在您的情况下:
// Instead of this:
$parameters = $request->get_json_params();
if (count($_POST) > 0) {
$parameters = $_POST;
}
// You could simply do:
$parameters = $request->get_params();
对作为第一个参数传递给端点回调的对象使用直接数组访问,即
$request
上述变量。例如。
$contactName = $request[\'contact_name\'];
$contactEmail = $request[\'contact_email\'];
$contactMessage = $request[\'contact_message\'];
对于您的情况,您可能只需要使用上面的第二个选项。
你测试过你的send_email()
通过直接函数调用(即不通过REST API)实现函数
虽然我不知道你的
send_email()
函数,您应该通过传递测试数据来测试该函数,并查看该函数是否实际工作,例如,它是否返回true、false、null、是否存在任何错误/通知等。如果是该函数不工作,那么问题不在于REST API,即即使在主页之类的正常请求上,该函数也不会工作。
因此,请测试您的电子邮件发送功能,确认它收到了所有必要的参数,并且确实正确发送了电子邮件(例如,使用正确的标题,如“发件人”和“内容类型”)。
始终设置permission_callback
, 并利用validate_callback
和sanitize_callback
基本上是为了验证/清理请求参数,除了send_email()
函数,您的代码的工作方式是注册端点并返回良好的响应。但在添加自定义端点时,您应该记住以下几点:
确保始终设置permission_callback
对于端点,因为如果不设置它,则会发生以下情况(但默认情况下,只有在debugging 在您的站点上启用):
从WordPress5.5开始,如果permission_callback
如果未提供,REST API将发出_doing_it_wrong
注意
将发布的通知样本:
的REST API路由定义contact/v1/send
缺少所需的permission_callback
论点对于打算公开的REST API路由,请使用__return_true
作为权限回调。
第三个参数register_rest_route()
接受名为args
这是端点的参数数组,对于每个参数,可以设置验证回调(validate_callback
) 和消毒回调(sanitize_callback
), 因此,您应该使用它,而不是在端点的主回调中进行验证/清理。下面是您希望使用这些回调的一个很好的原因:
使用sanitize_callback
和validate_callback
允许maincallback仅处理请求,并使用WP_REST_Response
班通过使用这两个回调,您将能够安全地假设您的输入是有效的,并且在处理时是安全的。
这是摘自API手册(顺便说一句)的(稍微重新格式化)摘录。
试试我的代码Note: 我最初用一个虚拟测试了您的代码send_email()
函数,但在这里,我使用wp_mail()
直接在主回调中。
// The code is basically based on yours.
function sendContactMail( WP_REST_Request $request ) {
$response = array(
\'status\' => 304,
\'message\' => \'There was an error sending the form.\'
);
$siteName = wp_strip_all_tags( trim( get_option( \'blogname\' ) ) );
$contactName = $request[\'contact_name\'];
$contactEmail = $request[\'contact_email\'];
$contactMessage = $request[\'contact_message\'];
$subject = "[$siteName] (testing) New message from $contactName";
// $body = "<h3>$subject</h3><br/>";
$body = "<p><b>Name:</b> $contactName</p>";
$body .= "<p><b>Email:</b> $contactEmail</p>";
$body .= "<p><b>Message:</b> $contactMessage</p>";
$to = get_option( \'admin_email\' );
$headers = array(
\'Content-Type: text/html; charset=UTF-8\',
"Reply-To: $contactName <$contactEmail>",
);
if ( wp_mail( $to, $subject, $body, $headers ) ) {
$response[\'status\'] = 200;
$response[\'message\'] = \'Form sent successfully.\';
$response[\'test\'] = $body;
}
return new WP_REST_Response( $response );
}
add_action( \'rest_api_init\', function () {
register_rest_route( \'contact/v1\', \'send\', array(
\'methods\' => \'POST\',
\'callback\' => \'sendContactMail\',
\'permission_callback\' => \'__return_true\',
\'args\' => array(
\'contact_name\' => array(
\'required\' => true,
\'validate_callback\' => function ( $value ) {
return preg_match( \'/[a-z0-9]{2,}/i\', $value ) ? true :
new WP_Error( \'invalid_contact_name\', \'Your custom error.\' );
},
\'sanitize_callback\' => \'sanitize_text_field\',
),
\'contact_email\' => array(
\'required\' => true,
\'validate_callback\' => \'is_email\',
\'sanitize_callback\' => \'sanitize_email\',
),
\'contact_message\' => array(
\'required\' => true,
\'sanitize_callback\' => \'sanitize_textarea_field\',
),
),
) );
} );