web-dev-qa-db-fra.com

Gestion des états d'erreur avec admin_post

J'ai une publication sous forme de front-end sur admin_post. Ici, je fais quelques validations. S'il y a des erreurs, je souhaite afficher un message d'erreur pour les champs pertinents.

Cependant, je ne sais pas comment rediriger la page de soumission et conserver les valeurs de champ.

J'utilise actuellement le ci-dessous:.

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();
  }
}

Mais ceci (naturellement) ne conserve pas les valeurs des champs de formulaire remplis, de sorte que l'utilisateur doit tout recommencer.

Si je publiais sur la même page que le formulaire, ce serait simple: il suffit de définir la valeur sur <input value="<?php echo $_POST['email']; ?>"> mais je ne suis pas sûr de savoir comment obtenir le même effet avec admin-post.

Pouvez vous aider?

3
Kevin Robinson

Vous pouvez utiliser set_transient avec le user_id si vous comptez sur les utilisateurs connectés, sinon le cookie serait probablement meilleur. Pour les utilisateurs connectés, vous pouvez configurer le user_id dans le nom du transitoire. Un exemple ici:

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();
    }
}

Maintenant, avant de sortir votre élément de formulaire sur votre page, il vous suffit de vérifier le transitoire pour cet utilisateur, le cas échéant, de générer les erreurs, puis de supprimer le transitoire juste après ...

Par exemple:

<?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>
1
Solomon Closson

J'ai résolu ce problème en utilisant la variable $ _SESSION pour transmettre des données à la page suivante.

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

Et

<input name="email" value="<?php echo $_SESSION['formdata']['email']">

Enfin, effacez les données au bas de la page, après les avoir utilisées ...

$_SESSION['formstatus'] = $_SESSION['formdata'] = null;
0
Kevin Robinson

Vous devriez simplement passer tous les arguments. Évidemment, ce n'est pas une bonne solution lorsque vous essayez de les transmettre sur l'URL. L'utilisation de cookies pourrait donc s'avérer une bien meilleure solution.

Mais franchement, sur un site Web moderne, vous devez simplement utiliser AJAX, signaler et gérer les erreurs du côté du navigateur, ainsi que les rediriger.

0
Mark Kaplun