注意:这个答案显示了关于 AJAX 进程的 php 后端的一些想法。它是关于前端过程的其他答案的补充。
1.- 在 WP 中管理 AJAX 请求的模型,只是一些想法,好吗?
add_action('init', 'process_ajax_callback');
function process_ajax_callback()
{
if ( ! $_REQUEST['go_ajax'])
{
return;
}
try
{
if (isset($_REQUEST['nonce_my_ajax']))
{
$nonce = $_REQUEST['nonce_my_ajax'];
if ( ! wp_verify_nonce($nonce = $_REQUEST['nonce_my_ajax'], 'nonce_my_ajax'))
{
throw new Exception("Nonce token invalid."); // security
}
}
}
catch (Exception $e)
{
$output['result'] = false;
$output['message'] = $e->getMessage();
echo json_encode($output);
exit;
}
$result = true;
$message = '';
switch ($_REQUEST['action'])
{
case 'update_price':
try
{
// update price
// price value comes in $_REQUEST['price']
}
catch (Exception $e)
{
$result = false;
$message = $e->getMessage();
}
break;
case 'other_actions':
break;
}
$output['result'] = $result ? true : false;
$output['message'] = $message;
echo json_encode($output);
exit;
}
2.-不要忘记安全
// nonce_my_ajax is passed to javascript like this:
wp_localize_script('my_js_admin', 'myJsVars', array(
'nonce_my_ajax' => wp_create_nonce('nonce_my_ajax')
));
3.- 一般来说,前端所需的(与上面显示的后端模型一起使用)是这样的:
$("select[name='ChangeCurrency']").live("change", function() {
var price = $(this).val();
$.post(
window.location.href,
{
go_ajax : 1, // parse ajax
action : 'update_price', // what to do
price : price, // vars to use in backend
nonce_my_ajax : myJsVars.nonce_my_ajax // security
},
function(output) {
if ( output.result == true )
// update widgets or whatever
// $("#my_div").html("we happy, yabadabadoo!");
// or do nothing (AJAX action was successful)
else
alert(output.message)
}, 'json');
});
4.- 您可以使用$.get()
or$.post()
将数据发送/处理到服务器/服务器中,但.load()
在更新数据库时效果不佳,因为您无法以json
响应的精度管理返回的失败消息(例如:多重验证错误消息)。仅用于.load()
加载 HTML 视图。
更新:
设置session_id()
正常请求和ajax请求都可以执行的位置,并尽可能在早期阶段执行。我希望你使用一个类来包装你的插件,如果不是现在是时候做它......例如:
class my_plugin {
function __construct()
{
if ( ! session_id())
{
session_start();
}
add_action('init', array($this, 'process_ajax_callback'));
// ...
}
function process_ajax_callback()
{
// ...
}
}
更新 2:
关于基于 nonce 的安全性:
WordPress 中可用的安全功能是“nonce”。通常,“nonce”是一种只能使用一次的令牌,通常用于防止未经授权的人代表他人提交数据。
参考: http: //myatus.com/p/wordpress-caching-and-nonce-lifespan/
在这个模型nonce_my_ajax
中只是一个例子,确实它应该更独特,比如nonce_{my_plugin_name}
,甚至更好nonce_{my_plugin_name}_{what_action}
的地方what_action
代表updating user
,或inserting new book
,等等......
有关它的更多信息:WP Codex:WordPress Nonce ,WPtuts+:功能和 Nonce。