テストページ(問題を1から順番に取得する場合)

WordPress

問題の取得

<?php

    global $wpdb;
    
    $table_question = $wpdb->prefix . 'question';
    $table_answer = $wpdb->prefix . 'answer';
    $current_question_id = isset($_GET['question_id']) ? intval($_GET['question_id']) : 1;
    $question = $wpdb->get_row(
        $wpdb->prepare("SELECT * FROM $table_name WHERE id = %d", $current_question_id)
    );

?>

解答の保存

<?php
    if ( isset($_POST['submit_answer']) ) {
        
        // 解答の保存
        if ( $_POST['input_answer'] == $question->correct_answer ) {
            $accuracy = 1;
        } else {
            $accuracy = 0;
        }
        $user_data = array(
            'user' => wp_get_current_user()->user_login,
            'question_id' => $question->id,
            'user_answer' => sanitize_text_field($_POST['input_answer']),
            'accuracy' => $accuracy,
            'created_at' => date('Y-m-d H:i:s'),
        );
        $format = array('%s', '%d', '%s', '%d', '%s');
        $inserted = $wpdb->insert($table_answer, $user_data, $format);

		// エラーハンドリング
		if ($inserted === false) {
			echo 'データの保存に失敗しました: ' . $wpdb->last_error;
		}

        // 次の問題へ
        $next_question_id = $current_question_id + 1;
        wp_redirect(
            add_query_arg('question_id', $next_question_id, get_permalink());
        );
        exit;
    }
?>

header

<!DOCTYPE html>
<html lang="ja">
省略
</header>

問題の終了

  	<?php
	if (!$question) {
		
		echo '<p class="result_good_job">全ての問題が終了しました。お疲れ様でした。</p>';
		echo '<a class="result_to_home" href="' . site_url() . '">トップページに戻る</a>';
		
		// 問題数と正解数
		$question_count = $wpdb->get_var(
			$wpdb->prepare("SELECT COUNT(*) FROM $table_question")
		);
		$accuracy_count = $wpdb->get_var(
			$wpdb->prepare("SELECT COUNT(*) FROM $table_answer WHERE user_name = %s AND accuracy = %d", wp_get_current_user()->user_login, 1)
		);
		?>
		
		<div class='result_accuracy'>
			<span><?php echo $question_count ?></span>問中
			<span><?php echo $accuracy_count ?></span>問正解
		</div>
		
		<?php
		// 正解とあなたの答え
		for ( $i = 1; $i <= $question_count; $i++ ) {
			$quiz = $wpdb->get_row(
				$wpdb->prepare("SELECT * FROM $table_question WHERE question_id = %d", $i)
			);
			$your_answer = $wpdb->get_row(
				$wpdb->prepare(
					"SELECT * FROM $table_answer WHERE user_name = %s AND question_id = %d",
					wp_get_current_user()->user_login,
					$i
				)
			);
		?>
			<section class='result_question'>
				<h2><?php echo esc_html($quiz->question_text) ?></h2>
				<ul>
					<li>
						<?php echo esc_html($quiz->option_a) ?>
					</li>
					<li>
						<?php echo esc_html($quiz->option_b) ?>
					</li>
					<li>
						<?php echo esc_html($quiz->option_c) ?>
					</li>
					<li>
						<?php echo esc_html($quiz->option_d) ?>
					</li>
				</ul>
				<div>
					<p>正解は<?php echo esc_html($quiz->correct_answer) ?></p>
					<p>あなたの答えは<?php echo esc_html($your_answer->user_answer) ?></p>
				</div>
			</section>
		<?php
		}
		echo '<a class="result_to_home" href="' . site_url() . '">トップページに戻る</a>';
		return;
	}
	?>

フォーム

	<form method="post" action="" class="form_question">
		<h2><?php echo esc_html($question->question_text) ?></h2>
		<ul>
			<li>
				<label>
					<input type="radio" name="input_answer" value="a" />
					<?php echo esc_html($question->option_a) ?>
				</label>
			</li>
			<li>
				<label>
					<input type="radio" name="input_answer" value="b" />
					<?php echo esc_html($question->option_b) ?>
				</label>
			</li>
			<li>
				<label>
					<input type="radio" name="input_answer" value="c" />
					<?php echo esc_html($question->option_c) ?>
				</label>
			</li>
			<li>
				<label>
					<input type="radio" name="input_answer" value="d" />
					<?php echo esc_html($question->option_d) ?>
				</label>
			</li>
		</ul>
		<input type='submit' name='submit_answer' value='次の問題へ' />
	</form>
BACK