因为您想使用WordPress运行JS代码post
操作处理程序不会为您提供解决方案。
为此,您需要使用ajax。
我创建了一个可以复制/粘贴的小示例。
<form method="post" class="myform">
<input type="hidden" name="action" value="add_foobar">
<input type="hidden" name="data" value="foobarid">
<input type="submit" value="Submit">
</form>
对于我们的表单,我删除了该操作(不需要它,因为我们将使用ajax)
还添加了一个类,以便于确定目标。
($ => {
$(\'.myform\').on(\'submit\', e => {
// prevent form from submit
e.preventDefault();
// get current element (form)
const $this = $(e.currentTarget);
// get form values
const action = $this.find(\'[name="action"]\').val();
const data = $this.find(\'[name="data"]\').val();
// send the form data to our ajax action,
// and handle the response
// btSystemGlobals.ajaxUrl = http://localhost/timber/wp-admin/admin-ajax.php
// I have a property that contains the ajax endpoint
// you can copy the url but change it accordingly
$.ajax({
type: "post",
dataType: "json",
url: btSystemGlobals.ajaxUrl, // btSystemGlobals.ajaxUrl = http://localhost/timber/wp-admin/admin-ajax.php
data: {
action,
data
},
success: res => {
if (res.status) location.href = res.redirectTo;
else console.log(res);
}
});
});
})(jQuery);
处理请求/响应的JS
我使用ajax来保持简单,但您可以使用axios来实现一种现代化的方法,而且它会使代码更短,更易于阅读(如果您需要的话,我可以添加它)。
add_action(\'wp_ajax_nopriv_add_foobar\', \'add_foobar\');
function add_foobar () {
// get and sanitize the passed data
$data = filter_input(INPUT_POST, \'data\', FILTER_SANITIZE_STRING);
// do what ever logic you need here with $data
// create the response
$res = [
\'status\' => true,
\'data\' => $data,
\'redirectTo\' => \'http://example.com/\'
];
// return the response as json object
echo json_encode($res);
// die, stop any other code from running after this point
die;
}
最后是我们处理数据并返回响应的操作
我没有使用
nonce 尽可能简单,但考虑添加它(如果你愿意,我也可以添加)。
使用您提供的代码,我创建了这个用ajax和表单处理JS代码的简短示例
如果需要为表单提交和PHP逻辑运行JS代码,则需要使用XHR请求,因此ajax/axios/fetch将是正确的方法。