使用ADMIN_POST处理错误状态

时间:2017-12-14 作者:Kevin Robinson

我有一个前端表单发布到admin\\U post。在这里,我做一些验证。如果有错误,我想显示相关字段的错误消息。

但是,我不知道如何重定向回提交页面并保留字段值。

目前我正在使用以下内容:。

add_action( \'admin_post_form\', \'form_post\' );
function form_post() {
  $validate = // Validation functions go here
  if ($validate == \'error\') {
    $url = wp_get_referer();
    $url = add_query_arg( \'error\', \'email\', $url );
    wp_redirect( $url );
    die();
  }
}
但这(自然)不会保留填充的表单字段值,因此用户必须重新开始。

如果我发布到与表单相同的页面,这将很简单-只需将值设置为<input value="<?php echo $_POST[\'email\']; ?>"> 但我不知道如何使用admin post达到同样的效果。

你能帮忙吗?

3 个回复
SO网友:Solomon Closson

您可以使用set_transient 使用user_id 如果您依赖于用户登录,否则,cookie可能会更好。对于已登录的用户,您可以使用user_id 在瞬态名称内设置。这里有一个例子:

function form_post() {
    $user_info = wp_get_current_user();
    $user_id = $user_info->exists() && !empty($user_info->ID) ? $user_info->ID : 0;
    $url = wp_get_referer();

    // Validate the form fields and populate this array when errors occur
    $validation_errors = array();  // I like to use the id of the elements as keys and the error string as the values of the array, so i can add error class to the elements if needed easily...

    // Now to save the transient...
    if (!empty($validation_errors)) {
        set_transient(\'validation_errors_\' . $user_id, $my_errors);
        wp_redirect($url);
        die();
    }
}
现在,在页面上输出表单元素之前,只需检查该用户的瞬态,如果存在,则输出错误,然后立即删除瞬态。。。

例如:

<?php 
$user_info = wp_get_current_user();

$user_id = $user_info->exists() && !empty($user_info->ID) ? $user_info->ID : 0;
$validation_errors = get_transient(\'validation_errors_\' . $user_id);

if ($validation_errors !== FALSE) {
   echo \'<div class="errors">Please fix the following Validation Errors:<ul><li>\' . implode(\'</li><li>\', $validation_errors) . \'</li></ul></div>\';
   delete_transient(\'validation_errors_\' . $user_id);
} ?>

<form ...>

</form>

SO网友:Kevin Robinson

我使用$\\u SESSION变量将数据传递到下一页来解决这个问题。

  if ($validate == \'error\') {
    $_SESSION[\'formstatus\'] = \'error\';
    $_SESSION[\'formdata\'] = $_POST;
    $url = wp_get_referer();
    wp_redirect( $url );
    die();
  }
以及

<input name="email" value="<?php echo $_SESSION[\'formdata\'][\'email\']">
最后,在使用完页面底部的数据后,请将其清除。。。

$_SESSION[\'formstatus\'] = $_SESSION[\'formdata\'] = null;

SO网友:Mark Kaplun

你应该传递所有的参数。当试图在URL上传递它们时,这显然不是一个很好的解决方案,因此使用cookie可能是一个更好的解决方案。

但坦率地说,在现代网站上,您应该只使用AJAX,在浏览器端报告和处理错误,并从中重定向。

结束

相关推荐

使用自己的php脚本从wp标题批量生成wp分类标签

我想使用插件将wp标题生成到标签中,https://wordpress.org/plugins/wp-full-auto-tags-manager/,因为我有数百万个帖子,所以日程表/cronjob工作不正常。所以我想用self-php脚本手动执行,我可以使用插件中的一段代码并在ssh终端上独立运行它吗,这是一段代码:$nsw_sql_gen_tags = $wpdb - > prepare(\" SELECT ID, post_title FROM $wpdb->posts WHERE po