首先,请参阅WordPress Codex页面:AJAX in Plugins
从技术上讲,你不需要编写插件来完成你想做的事情,但这样做是一种很好的做法,尤其是对于你正在构建的功能。(构建数据库表、处理表单数据、使用AJAX提交等)签出Writing a Plugin 了解更多信息。
话虽如此,我现在看到了您的代码存在的主要问题。
安全风险现在,您假设用户提交的数据总是正确的。这具有极高的安全风险。你应该always 假设用户试图输入错误的数据。为了使代码更安全,您应该先验证数据,然后再将其插入数据库。
下面是验证$_POST[\'name\']
字段,如果数据“无效”,则发送json错误。
if ( !isset($_POST[\'name\'] || strlen($_POST[\'name\']) > 30 ) {
// Check if \'name\' is set, and the length is shorter than 30
wp_send_json_error( \'Error: Your name should be no longer than 30 characters\' );
}
使用
$wpdb->prepare
对于原始SQL查询,实际上
$wpdb->insert
作用请参见
Class Reference/wpdb 有关如何使用的示例
$wpdb->insert
.
我也用了正确的方法insert
在下面的示例中。
首先,我们要将Javascript排队,以便WordPress可以使用它。我们也在通过ajaxurl
(admin ajax.php)通过此处,以便在Javascript中轻松使用。
function your_submit_order_scripts) {
// Register your Javascript file
wp_register_script( \'your-submit-order\', plugin_dir_url(__FILE__) . \'js/your-submit-order.js\', array( \'jquery\' ), false, true );
// Send ajaxurl as variable to this script
$local_arr = array(
\'ajaxurl\' => admin_url( \'admin-ajax.php\' )
);
wp_localize_script( \'your-submit-order\', \'yourSubmitOrder\', $local_arr );
wp_enqueue_script( \'your-submit-order\' );
}
add_action( \'wp_enqueue_scripts\', \'your_submit_order_scripts\' );
接下来,我们添加回调,这将处理我们使用AJAX发布的数据。add\\u操作部分确保我们的AJAX post函数知道将数据发送到哪里。
// Use this callback function for logged in users
add_action(\'wp_ajax_det_lilla_extra\', \'det_lilla_extra\');
// Also allow this function to be used by non-logged in users
add_action( \'wp_ajax_nopriv_det_lilla_extra\', \'det_lilla_extra\' );
function det_lilla_extra(){
// Convert form data to array
$formdata = array();
parse_str($_POST[\'formdata\'], $formdata);
// Check if name field is valid
if ( !isset($formdata[\'name\'] || strlen($formdata[\'name\']) > 30 ) {
// Check if \'name\' is set, and the length is shorter than 30
wp_send_json_error( \'Error: Your name should be no longer than 30 characters\' );
}
// More validation goes here depending on your needs...
// For example, is the email address a real email?
// Is the address written in the correct format?
// Is the city a real city?
// If validation has no errors, insert data
if ( $wpdb->insert(
\'orders\',
array(
\'name\' => $_POST[\'name\'],
\'email\' => $_POST[\'email\',
// etc.
),
array(
\'%s\',
\'%s\',
// etc.
)
)
) {
// If $wpdb->insert was successful, send success message back to AJAX updateDB function
wp_send_json_success(array(\'message\' => \'Successfully uploaded!\');
} else {
// If insert was unsuccessfull, send error message back to AJAX
wp_send_json_error(\'Error: Something went wrong\');
}
// Don\'t technically need it when using wp_send_json
wp_die();
}
最后,我们制作Javascript。我已经更新了updateDB函数,使其工作方式与上面链接的WordPress Codex页面上发布的示例类似。
此外,由于您使用HTML表单输入数据,因此我们可以使用jQueryserialize()
使事情变得更简单。
function updateDB() {
// Create the data to send with AJAX
var data = {
\'action\': \'det_lilla_extra\',
\'formdata\': $(\'form\').serialize() // Convert entire form to data
};
// Note how we use yourSubmitOrder.ajaxurl to pass the url to admin-ajax.php
// We set this our your_submit_order_scripts function earlier
jQuery.post(yourSubmitOrder.ajaxurl, data, function(response) {
if ( reponse.success == true ) {
alert(response.data.message);
} else {
alert(response.data);
}
});
}
我可能花了太多时间来写这个答案,但希望它对你有用。我已经花了很多时间找出在WordPress中使用AJAX的最佳方法,所以我认为这是对每一位教过我的人和资源的回馈!
如果有任何不清楚的地方,请随时发表评论。