isset( $_POST['type'] ) ? sanitize_text_field( wp_unslash( $_POST['type'] ) ) : '', 'name' => isset( $_POST['name'] ) ? sanitize_text_field( wp_unslash( $_POST['name'] ) ) : '', 'description' => isset( $_POST['description'] ) ? sanitize_textarea_field( wp_unslash( $_POST['description'] ) ) : '', 'capacity_mode' => isset( $_POST['capacity_mode'] ) ? sanitize_key( wp_unslash( $_POST['capacity_mode'] ) ) : '', 'capacity_total' => isset( $_POST['capacity_total'] ) ? absint( $_POST['capacity_total'] ) : 0, 'max_persons' => isset( $_POST['max_persons'] ) ? sanitize_text_field( wp_unslash( $_POST['max_persons'] ) ) : '', 'min_persons' => isset( $_POST['min_persons'] ) ? sanitize_text_field( wp_unslash( $_POST['min_persons'] ) ) : '', 'min_notice_hours' => isset( $_POST['min_notice_hours'] ) ? sanitize_text_field( wp_unslash( $_POST['min_notice_hours'] ) ) : '', 'duration_minutes' => isset( $_POST['duration_minutes'] ) ? sanitize_text_field( wp_unslash( $_POST['duration_minutes'] ) ) : '', 'staff_required' => isset( $_POST['staff_required'] ) ? sanitize_text_field( wp_unslash( $_POST['staff_required'] ) ) : '', 'min_participants' => isset( $_POST['min_participants'] ) ? sanitize_text_field( wp_unslash( $_POST['min_participants'] ) ) : '', 'decision_hours' => isset( $_POST['decision_hours'] ) ? sanitize_text_field( wp_unslash( $_POST['decision_hours'] ) ) : '', // "Package" checkbox: how a resource is booked otherwise follows its availability. 'is_stay' => ! empty( $_POST['is_stay'] ), 'min_nights' => isset( $_POST['min_nights'] ) ? sanitize_text_field( wp_unslash( $_POST['min_nights'] ) ) : '', 'max_nights' => isset( $_POST['max_nights'] ) ? sanitize_text_field( wp_unslash( $_POST['max_nights'] ) ) : '', 'arrival_days' => isset( $_POST['arrival_days'] ) && is_array( $_POST['arrival_days'] ) ? array_map( 'absint', wp_unslash( $_POST['arrival_days'] ) ) : array(), 'compositions' => array(), ); // Allowed compositions: rows of "adults" / "children" numbers. // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- every cell is cast with absint() in normalize_compositions(). foreach ( isset( $_POST['compositions'] ) && is_array( $_POST['compositions'] ) ? wp_unslash( $_POST['compositions'] ) : array() as $vefmb_composition_row ) { if ( is_array( $vefmb_composition_row ) ) { $vefmb_input['compositions'][] = array( 'adults' => isset( $vefmb_composition_row['adults'] ) ? sanitize_text_field( $vefmb_composition_row['adults'] ) : '', 'children' => isset( $vefmb_composition_row['children'] ) ? sanitize_text_field( $vefmb_composition_row['children'] ) : '', ); } } $vefmb_result = $vefmb_resource_id ? $vefmb_service->update_resource( $vefmb_resource_id, $vefmb_input ) : $vefmb_service->create_resource( $vefmb_input ); if ( is_wp_error( $vefmb_result ) ) { $vefmb_notice = $vefmb_result->get_error_message(); $vefmb_notice_type = 'error'; } else { $vefmb_notice = $vefmb_resource_id ? __( 'Resource updated.', 'vefmultibooking' ) : __( 'Resource created.', 'vefmultibooking' ); } break; case 'delete_resource': $vefmb_resource_id = isset( $_POST['resource_id'] ) ? absint( $_POST['resource_id'] ) : 0; $vefmb_result = $vefmb_service->delete_resource( $vefmb_resource_id ); if ( is_wp_error( $vefmb_result ) ) { $vefmb_notice = $vefmb_result->get_error_message(); $vefmb_notice_type = 'error'; } else { $vefmb_notice = __( 'Resource deleted.', 'vefmultibooking' ); } break; case 'toggle_resource_status': $vefmb_resource_id = isset( $_POST['resource_id'] ) ? absint( $_POST['resource_id'] ) : 0; $vefmb_new_status = isset( $_POST['new_status'] ) ? sanitize_key( wp_unslash( $_POST['new_status'] ) ) : ''; $vefmb_service->set_resource_status( $vefmb_resource_id, $vefmb_new_status ); $vefmb_notice = ( 'active' === $vefmb_new_status ) ? __( 'Resource activated.', 'vefmultibooking' ) : __( 'Resource deactivated.', 'vefmultibooking' ); break; case 'duplicate_resource': $vefmb_resource_id = isset( $_POST['resource_id'] ) ? absint( $_POST['resource_id'] ) : 0; $vefmb_result = $vefmb_service->duplicate_resource( $vefmb_resource_id ); if ( is_wp_error( $vefmb_result ) ) { $vefmb_notice = $vefmb_result->get_error_message(); $vefmb_notice_type = 'error'; } else { $vefmb_notice = __( 'Resource duplicated. The copy is inactive until you activate it.', 'vefmultibooking' ); } break; case 'save_stay_item': $vefmb_stay_service = new VEFMB_Stay_Service(); $vefmb_resource_id = isset( $_POST['resource_id'] ) ? absint( $_POST['resource_id'] ) : 0; $vefmb_item_id = isset( $_POST['item_id'] ) ? absint( $_POST['item_id'] ) : 0; $vefmb_item_input = array( 'day' => isset( $_POST['item_day'] ) ? absint( $_POST['item_day'] ) : 0, 'item_type' => isset( $_POST['item_type'] ) ? sanitize_key( wp_unslash( $_POST['item_type'] ) ) : 'slot', 'resource_id' => isset( $_POST['item_resource_id'] ) ? absint( $_POST['item_resource_id'] ) : 0, 'start_time' => isset( $_POST['item_start_time'] ) ? sanitize_text_field( wp_unslash( $_POST['item_start_time'] ) ) : '', ); $vefmb_result = $vefmb_item_id ? $vefmb_stay_service->update_item( $vefmb_item_id, $vefmb_item_input ) : $vefmb_stay_service->add_item( $vefmb_resource_id, $vefmb_item_input ); if ( is_wp_error( $vefmb_result ) ) { $vefmb_notice = $vefmb_result->get_error_message(); $vefmb_notice_type = 'error'; } else { $vefmb_notice = $vefmb_item_id ? __( 'Line updated.', 'vefmultibooking' ) : __( 'Line added to the programme.', 'vefmultibooking' ); } break; case 'delete_stay_item': ( new VEFMB_Stay_Service() )->delete_item( isset( $_POST['item_id'] ) ? absint( $_POST['item_id'] ) : 0 ); $vefmb_notice = __( 'Line removed from the programme.', 'vefmultibooking' ); break; case 'save_unit': $vefmb_resource_id = isset( $_POST['resource_id'] ) ? absint( $_POST['resource_id'] ) : 0; $vefmb_unit_id = isset( $_POST['unit_id'] ) ? absint( $_POST['unit_id'] ) : 0; $vefmb_unit_input = array( 'name' => isset( $_POST['unit_name'] ) ? sanitize_text_field( wp_unslash( $_POST['unit_name'] ) ) : '', 'sort_order' => isset( $_POST['unit_sort_order'] ) ? absint( $_POST['unit_sort_order'] ) : 0, ); $vefmb_result = $vefmb_unit_id ? $vefmb_service->update_unit( $vefmb_unit_id, $vefmb_unit_input ) : $vefmb_service->create_unit( $vefmb_resource_id, $vefmb_unit_input ); if ( is_wp_error( $vefmb_result ) ) { $vefmb_notice = $vefmb_result->get_error_message(); $vefmb_notice_type = 'error'; } else { $vefmb_notice = $vefmb_unit_id ? __( 'Unit updated.', 'vefmultibooking' ) : __( 'Unit created.', 'vefmultibooking' ); } break; case 'delete_unit': $vefmb_service->delete_unit( isset( $_POST['unit_id'] ) ? absint( $_POST['unit_id'] ) : 0 ); $vefmb_notice = __( 'Unit deleted.', 'vefmultibooking' ); break; case 'toggle_unit_status': $vefmb_unit_id = isset( $_POST['unit_id'] ) ? absint( $_POST['unit_id'] ) : 0; $vefmb_new_status = isset( $_POST['new_status'] ) ? sanitize_key( wp_unslash( $_POST['new_status'] ) ) : ''; $vefmb_service->set_unit_status( $vefmb_unit_id, $vefmb_new_status ); $vefmb_notice = ( 'active' === $vefmb_new_status ) ? __( 'Unit activated.', 'vefmultibooking' ) : __( 'Unit deactivated.', 'vefmultibooking' ); break; } } // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only, only selects the view being displayed. $vefmb_view = isset( $_GET['view'] ) ? sanitize_key( wp_unslash( $_GET['view'] ) ) : 'list'; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only. $vefmb_resource_id_get = isset( $_GET['resource_id'] ) ? absint( $_GET['resource_id'] ) : 0; ?>