web-dev-qa-db-ja.com

Admin_postによるエラー状態の処理

Admin_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
Kevin Robinson

ログインしているユーザーに頼っている場合はset_transientuser_idと共に使用できます。ログインしているユーザーの場合は、user_id getを一時ファイルの名前内に設定することができます。ここでの例:

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

次のページにデータを渡すために$ _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;
0
Kevin Robinson

あなたはただすべての引数を渡すべきです。 URLでそれらを渡すことを試みるときこれは明らかにすばらしい解決策ではありません、従ってクッキーの使用ははるかによい解決策かもしれません。

率直に言って、現代のWebサイトでは、AJAXを使用し、ブラウザ側でエラーを報告および処理し、それからリダイレクトする必要があります。

0
Mark Kaplun