web-dev-qa-db-ja.com

フォームデータがWordPressデータベースに保存されない

投稿ページチェックアウトページの2つのページを作成しました。

投稿ページ私は以下のコードを持っている:

<?php
if(isset($_POST['submitnow'])) {
        global $wpdb;
$wpdb->insert( 
    'wp9c_treetweet', 
    array( 
        'name' => $_POST['aname'], 
        'amt' => $_POST['aamt'],
        'dept' => $_POST['adept']
    ), 
    array( 
        '%s', 
        '%d',
                '%s' 
    )

);        
}    
?>

<form action="" method="POST" id="addcourse">
<label>Name:<input type="text" name="aname" size="30" required></label>
<label>Amount:<input type="text" name="aamt" size="30" required></label>
<label>Department:<input type="text" name="adept" size="30" required></label>

<input type="submit" name="submitnow" id="addcoursesubmit" value="Submit">
</form>

このコードは問題なく機能し、フォームデータをデータベースに正しく挿入しています。

このページをチェックアウトページにリダイレクトするにはfunctions.phpに次のコードを追加しました。

function redirect_from_checkout() {

   if( !isset( $_POST['submitnow'] ) )

       return;

         wp_redirect( home_url( '/checkout/' ) );

         exit;  
}

add_action( 'template_redirect', 'redirect_from_checkout' );

functions.phpにリダイレクトコードを追加した後、リダイレクトは正しく機能していますが、フォームデータがデータベーステーブルに挿入されていません。

Plzは解決策を教えてくれます。

1
Minu

template_redirectフックについての WordPress Codex によると:

このアクションフックは、WordPressがどのテンプレートページを読み込むかを決定する直前に実行されます。

そのため、テンプレートがロードされる前にユーザーを別のページにリダイレクトしています。フォームはまったくロードされません。 template_redirectのように、wp_footerの後に実行される別のフックを使うことができます。

コードを次のように変更して、データベースにフォームを挿入した直後にユーザーをリダイレクトすることもできます。

<?php
    if(isset($_POST['submitnow'])) {
        global $wpdb;
        $wpdb->insert( 
            'wp9c_treetweet', 
            array( 
                'name' => $_POST['aname'], 
                'amt' => $_POST['aamt'],
                'dept' => $_POST['adept']
            ), 
            array( 
                '%s', 
                '%d',
                        '%s' 
            )

        );
        wp_safe_redirect(home_url( '/checkout/' ));
        exit();
    }
?>

このように、フォームが挿入された場合、ユーザーはその後リダイレクトされます。

1
Jack Johansson