您直接发布到formaction.php
, 因此,WordPress从未加载,因此您无权访问其任何API,包括存储在中的数据库APIglobal $wpdb
(导致错误的原因)。我建议将所有内容都保存在WordPress中。。。一种有用的表单处理方法是使用admin-post.php
(如果您熟悉WordPress的ajax处理,这是一个类似的想法)。
这个想法是你发布到url
.../wp-admin/admin-post.php
你可以通过
admin_url(\'admin-post.php\');
. 然后你发布了一个
unique 的值
action
变量(比如说
wpse111797_form_submitted
). 当表单提交给
admin-post.php
, WordPress将触发挂钩:
admin_post_wpse111797_form_submitted
- 如果您已登录inadmin_post_nopriv_wpse111797_form_submitted
- 如果您已登录out
因此您的表单可能如下所示:
<form action="<?php echo admin_url(\'admin-post.php\'); ?>" method="post">
<input type="hidden" name="action" value="wpse111797_form_submitted">
<input type="text" name="name1" value="">
<input type="text" name="name2" value="">
<input type="submit" name="submit" value="add">
</form>
请不要忘记使用
nonces 验证意图。
然后,您可以挂接上述任何一个挂接(或两者都挂接),具体取决于您是要处理登录用户、来宾提交的表单,还是同时处理这两个用户提交的表单。
function wpse111797_form_handler(){
global $wpdb;
$name1 = isset( $_POST[\'name1\'] ) ? $_POST[\'name1\'] : null;
$name2 = isset( $_POST[\'name2\'] ) ? $_POST[\'name2\'] : null;
//TODO Check nonces & permissions first!
$my_table_name=$wpdb->prefix."my_table";
$rows_affected = $wpdb->insert( $my_table_name, array( \'first\' => $name1, \'last\' => $name2 ) );
//Redirect user to a \'success\' page, or from back whence they came!
}
//Attach callback to hook (in this case, the hook for logged-in users)
add_action( \'admin_post_wpse111797_form_submitted\', \'wpse111797_form_handler\' );