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:
@@ -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 ' <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>';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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' );
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user