fix: resolve form submission issues and add CPT detail view

- Rename day/month/year form fields to umzug_day/umzug_month/umzug_year
  to avoid conflict with WordPress reserved public query variables that
  caused a 404 on form POST
- Move form handler instantiation to init_hooks() so handle_submission
  registers on the init action before it fires
- Add standalone template fallback: detect [umzugsliste] shortcode in
  page content when form_page_id option is not set
- Add submission details meta box to CPT entries showing addresses,
  furniture, additional work, and status
- Add German translations for all new admin meta box strings

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-07 13:02:46 +09:00
parent c0021befe2
commit 64caccc5c1
9 changed files with 261 additions and 23 deletions

View File

@@ -32,7 +32,7 @@ class Umzugsliste_CPT {
* Constructor
*/
private function __construct() {
// CPT registration is called directly from main plugin init
add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
}
/**
@@ -68,4 +68,164 @@ class Umzugsliste_CPT {
register_post_type( 'umzugsliste_entry', $args );
}
/**
* Register meta boxes
*/
public function add_meta_boxes() {
add_meta_box(
'umzugsliste_entry_details',
__( 'Submission Details', 'siegel-umzugsliste' ),
array( $this, 'render_details_meta_box' ),
'umzugsliste_entry',
'normal',
'high'
);
}
/**
* Render the submission details meta box
*
* @param WP_Post $post Current post object
*/
public function render_details_meta_box( $post ) {
$data = json_decode( $post->post_content, true );
if ( empty( $data ) ) {
echo '<p>' . esc_html__( 'No submission data found.', 'siegel-umzugsliste' ) . '</p>';
return;
}
// Meta info
$email_sent = get_post_meta( $post->ID, '_umzugsliste_email_sent', true );
$email_time = get_post_meta( $post->ID, '_umzugsliste_email_sent_at', true );
$total_cbm = get_post_meta( $post->ID, '_umzugsliste_total_cbm', true );
echo '<style>.umzugsliste-details table{width:100%;border-collapse:collapse;margin-bottom:16px}.umzugsliste-details th,.umzugsliste-details td{text-align:left;padding:6px 10px;border:1px solid #ddd}.umzugsliste-details th{background:#f5f5f5}.umzugsliste-details h4{margin:16px 0 8px}</style>';
echo '<div class="umzugsliste-details">';
// Status bar
echo '<p><strong>' . esc_html__( 'Email sent:', 'siegel-umzugsliste' ) . '</strong> ';
echo $email_sent ? esc_html__( 'Yes', 'siegel-umzugsliste' ) : esc_html__( 'No', 'siegel-umzugsliste' );
if ( $email_time ) {
echo ' (' . esc_html( $email_time ) . ')';
}
echo ' &nbsp; <strong>' . esc_html__( 'Total CBM:', 'siegel-umzugsliste' ) . '</strong> ' . esc_html( $total_cbm ?: '0' ) . '</p>';
// Moving date
$date_str = ( $data['umzug_day'] ?? '' ) . '.' . ( $data['umzug_month'] ?? '' ) . '.' . ( $data['umzug_year'] ?? '' );
echo '<h4>' . esc_html__( 'Moving Date', 'siegel-umzugsliste' ) . '</h4>';
echo '<p>' . esc_html( $date_str ) . '</p>';
// Addresses
echo '<h4>' . esc_html__( 'Addresses', 'siegel-umzugsliste' ) . '</h4>';
echo '<table><tr><th></th><th>' . esc_html__( 'Loading', 'siegel-umzugsliste' ) . '</th><th>' . esc_html__( 'Unloading', 'siegel-umzugsliste' ) . '</th></tr>';
$address_rows = array(
__( 'Name', 'siegel-umzugsliste' ) => array( 'bName', 'eName' ),
__( 'Street', 'siegel-umzugsliste' ) => array( 'bStrasse', 'eStrasse' ),
__( 'ZIP/City', 'siegel-umzugsliste' ) => array( 'bort', 'eort' ),
__( 'Phone', 'siegel-umzugsliste' ) => array( 'bTelefon', 'eTelefon' ),
);
foreach ( $address_rows as $label => $keys ) {
echo '<tr><th>' . esc_html( $label ) . '</th>';
echo '<td>' . esc_html( $data[ $keys[0] ] ?? '' ) . '</td>';
echo '<td>' . esc_html( $data[ $keys[1] ] ?? '' ) . '</td></tr>';
}
// Info fields with proper label mapping
$info_labels = array(
'bLift' => __( 'Elevator (Loading)', 'siegel-umzugsliste' ),
'eLift' => __( 'Elevator (Unloading)', 'siegel-umzugsliste' ),
'bGeschoss' => __( 'Floor (Loading)', 'siegel-umzugsliste' ),
'eGeschoss' => __( 'Floor (Unloading)', 'siegel-umzugsliste' ),
'eE-Mail' => __( 'Email', 'siegel-umzugsliste' ),
'bTelefax' => __( 'Fax (Loading)', 'siegel-umzugsliste' ),
'eTelefax' => __( 'Fax (Unloading)', 'siegel-umzugsliste' ),
'bMobil' => __( 'Mobile (Loading)', 'siegel-umzugsliste' ),
'eMobil' => __( 'Mobile (Unloading)', 'siegel-umzugsliste' ),
);
if ( ! empty( $data['info'] ) && is_array( $data['info'] ) ) {
foreach ( $data['info'] as $key => $value ) {
if ( ! empty( $value ) ) {
$label = isset( $info_labels[ $key ] ) ? $info_labels[ $key ] : $key;
echo '<tr><th>' . esc_html( $label ) . '</th><td colspan="2">' . esc_html( $value ) . '</td></tr>';
}
}
}
echo '</table>';
// Furniture items
if ( class_exists( 'Umzugsliste_Furniture_Data' ) ) {
$rooms = Umzugsliste_Furniture_Data::get_rooms();
$has_items = false;
foreach ( $rooms as $room_key => $room_label ) {
$post_array_name = ucfirst( $room_key );
if ( 'kueche_esszimmer' === $room_key ) {
$post_array_name = 'Kueche_Esszimmer';
}
$room_data = $data[ $post_array_name ] ?? array();
$room_items = array();
foreach ( $room_data as $key => $value ) {
if ( substr( $key, 0, 1 ) === 'v' && ! empty( $value ) && floatval( $value ) > 0 ) {
$item_name = substr( $key, 1 );
$quantity = $value;
$cbm = $room_data[ 'q' . $item_name ] ?? '0';
$montage = $room_data[ 'm' . $item_name ] ?? '';
$room_items[] = array( $item_name, $quantity, $cbm, $montage );
}
}
if ( ! empty( $room_items ) ) {
if ( ! $has_items ) {
echo '<h4>' . esc_html__( 'Furniture', 'siegel-umzugsliste' ) . '</h4>';
echo '<table><tr><th>' . esc_html__( 'Room', 'siegel-umzugsliste' ) . '</th><th>' . esc_html__( 'Item', 'siegel-umzugsliste' ) . '</th><th>' . esc_html__( 'Qty', 'siegel-umzugsliste' ) . '</th><th>CBM</th><th>' . esc_html__( 'Assembly', 'siegel-umzugsliste' ) . '</th></tr>';
$has_items = true;
}
foreach ( $room_items as $item ) {
echo '<tr><td>' . esc_html( $room_label ) . '</td>';
echo '<td>' . esc_html( $item[0] ) . '</td>';
echo '<td>' . esc_html( $item[1] ) . '</td>';
echo '<td>' . esc_html( $item[2] ) . '</td>';
echo '<td>' . esc_html( $item[3] ?: '-' ) . '</td></tr>';
}
}
}
if ( $has_items ) {
echo '</table>';
}
}
// Additional work
if ( ! empty( $data['additional_work'] ) && is_array( $data['additional_work'] ) ) {
echo '<h4>' . esc_html__( 'Additional Work', 'siegel-umzugsliste' ) . '</h4>';
echo '<table>';
foreach ( $data['additional_work'] as $section => $fields ) {
if ( is_array( $fields ) ) {
foreach ( $fields as $field_key => $value ) {
if ( ! empty( $value ) ) {
echo '<tr><th>' . esc_html( $section ) . '</th><td>' . esc_html( $field_key ) . ': ' . esc_html( $value ) . '</td></tr>';
}
}
}
}
echo '</table>';
}
// Sonstiges
if ( ! empty( $data['sonstiges'] ) ) {
echo '<h4>' . esc_html__( 'Other', 'siegel-umzugsliste' ) . '</h4>';
echo '<p>' . esc_html( $data['sonstiges'] ) . '</p>';
}
echo '</div>';
}
}

View File

@@ -27,7 +27,7 @@ class Umzugsliste_Date_Helpers {
$selected = (int) current_time( 'j' );
}
$html = '<div class="date-field"><label>' . esc_html__( 'Day', 'siegel-umzugsliste' ) . '</label><select name="day">';
$html = '<div class="date-field"><label>' . esc_html__( 'Day', 'siegel-umzugsliste' ) . '</label><select name="umzug_day">';
for ( $i = 1; $i <= 31; $i++ ) {
$sel = ( $i === $selected ) ? ' selected' : '';
@@ -50,7 +50,7 @@ class Umzugsliste_Date_Helpers {
$selected = (int) current_time( 'n' );
}
$html = '<div class="date-field"><label>' . esc_html__( 'Month', 'siegel-umzugsliste' ) . '</label><select name="month">';
$html = '<div class="date-field"><label>' . esc_html__( 'Month', 'siegel-umzugsliste' ) . '</label><select name="umzug_month">';
for ( $i = 1; $i <= 12; $i++ ) {
$sel = ( $i === $selected ) ? ' selected' : '';
@@ -73,7 +73,7 @@ class Umzugsliste_Date_Helpers {
$selected = (int) current_time( 'Y' );
}
$html = '<div class="date-field"><label>' . esc_html__( 'Year', 'siegel-umzugsliste' ) . '</label><select name="year">';
$html = '<div class="date-field"><label>' . esc_html__( 'Year', 'siegel-umzugsliste' ) . '</label><select name="umzug_year">';
// Show current year plus 15 years (matching legacy)
$current_year = (int) current_time( 'Y' );

View File

@@ -27,9 +27,9 @@ class Umzugsliste_Email_Generator {
// Moving date
$content .= self::generate_date_section(
$data['day'] ?? '',
$data['month'] ?? '',
$data['year'] ?? ''
$data['umzug_day'] ?? '',
$data['umzug_month'] ?? '',
$data['umzug_year'] ?? ''
);
// Customer info

View File

@@ -164,7 +164,7 @@ class Umzugsliste_Form_Handler {
}
// Validate date
if ( empty( $data['day'] ) || empty( $data['month'] ) || empty( $data['year'] ) ) {
if ( empty( $data['umzug_day'] ) || empty( $data['umzug_month'] ) || empty( $data['umzug_year'] ) ) {
$errors[] = __( 'Moving date is missing', 'siegel-umzugsliste' );
}
@@ -205,7 +205,7 @@ class Umzugsliste_Form_Handler {
$sanitized = array();
// Sanitize simple text fields
$text_fields = array( 'bName', 'eName', 'bStrasse', 'eStrasse', 'bort', 'eort', 'bTelefon', 'eTelefon', 'day', 'month', 'year' );
$text_fields = array( 'bName', 'eName', 'bStrasse', 'eStrasse', 'bort', 'eort', 'bTelefon', 'eTelefon', 'umzug_day', 'umzug_month', 'umzug_year' );
foreach ( $text_fields as $field ) {
$sanitized[ $field ] = isset( $data[ $field ] ) ? sanitize_text_field( $data[ $field ] ) : '';
@@ -269,7 +269,7 @@ class Umzugsliste_Form_Handler {
*/
private function save_to_cpt( $data ) {
$customer_name = $data['bName'] ?? 'Unbekannt';
$date_string = ( $data['day'] ?? '' ) . '.' . ( $data['month'] ?? '' ) . '.' . ( $data['year'] ?? '' );
$date_string = ( $data['umzug_day'] ?? '' ) . '.' . ( $data['umzug_month'] ?? '' ) . '.' . ( $data['umzug_year'] ?? '' );
// Calculate total CBM
$total_cbm = 0;