feat: add standalone form page, close all audit gaps, pass v1.0 milestone

Add standalone form page template that bypasses the theme, with admin
setting and auto-creation on plugin activation. Fix reCAPTCHA v3 double
submission, remove jQuery dependency, extend localized JS strings, and
overhaul form CSS/JS. Update milestone audit to PASSED (9/9, 10/10, 5/5).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-07 12:08:52 +09:00
parent a9b1f2eb40
commit c0021befe2
14 changed files with 2382 additions and 1393 deletions

64
templates/form-page.php Normal file
View File

@@ -0,0 +1,64 @@
<?php
/**
* Standalone Form Page Template
*
* Renders the umzugsliste form as a full HTML document without theme wrapper.
*
* @package Umzugsliste
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$plugin_url = UMZUGSLISTE_PLUGIN_URL;
$captcha = Umzugsliste_Captcha::get_instance();
// Build localization data
$l10n_data = array(
'fieldRequired' => __( 'This field is required', 'siegel-umzugsliste' ),
'invalidEmail' => __( 'Please enter a valid email address', 'siegel-umzugsliste' ),
'selectMovingDate' => __( 'Please select a complete moving date', 'siegel-umzugsliste' ),
'enterFurnitureItem' => __( 'Please enter at least one furniture item', 'siegel-umzugsliste' ),
'stepNext' => __( 'Next', 'siegel-umzugsliste' ),
'stepBack' => __( 'Back', 'siegel-umzugsliste' ),
'stepSubmit' => __( 'Submit Request', 'siegel-umzugsliste' ),
'summaryTitle' => __( 'Summary', 'siegel-umzugsliste' ),
'summaryMovingDate' => __( 'Moving Date', 'siegel-umzugsliste' ),
'summaryLoading' => __( 'Loading Address', 'siegel-umzugsliste' ),
'summaryUnloading' => __( 'Unloading Address', 'siegel-umzugsliste' ),
'summaryGrandTotal' => __( 'Grand Total', 'siegel-umzugsliste' ),
'summaryItems' => __( 'Items', 'siegel-umzugsliste' ),
'summaryCbm' => __( 'cbm', 'siegel-umzugsliste' ),
'summaryMontage' => __( 'Assembly', 'siegel-umzugsliste' ),
'summaryYes' => __( 'Yes', 'siegel-umzugsliste' ),
'summaryNo' => __( 'No', 'siegel-umzugsliste' ),
'summaryAdditional' => __( 'Additional Work', 'siegel-umzugsliste' ),
'summaryOther' => __( 'Other', 'siegel-umzugsliste' ),
'totalLabel' => __( 'Total', 'siegel-umzugsliste' ),
'roomTotalLabel' => __( 'Room Total', 'siegel-umzugsliste' ),
'grandTotalLabel' => __( 'Grand Total', 'siegel-umzugsliste' ),
'quantityLabel' => __( 'Qty', 'siegel-umzugsliste' ),
'cbmLabel' => __( 'cbm', 'siegel-umzugsliste' ),
'nonce' => wp_create_nonce( 'umzugsliste_submit' ),
);
?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?php echo esc_html__( 'Moving List', 'siegel-umzugsliste' ); ?> - <?php bloginfo( 'name' ); ?></title>
<link rel="stylesheet" href="<?php echo esc_url( $plugin_url . 'assets/css/form.css?v=' . UMZUGSLISTE_VERSION ); ?>">
<script>
var umzugslisteL10n = <?php echo wp_json_encode( $l10n_data ); ?>;
</script>
<?php if ( $captcha->is_enabled() && $captcha->get_script_url() ) : ?>
<script src="<?php echo esc_url( $captcha->get_script_url() ); ?>" async defer></script>
<?php endif; ?>
</head>
<body class="umzugsliste-standalone">
<?php echo Umzugsliste_Form_Renderer::render(); ?>
<script src="<?php echo esc_url( $plugin_url . 'assets/js/form.js?v=' . UMZUGSLISTE_VERSION ); ?>"></script>
</body>
</html>