> $fields * @param array> $values * @param array $settings form settings (manifest defaults merged) * @param array $meta ip, user_agent, referrer, user_id, page */ public function __construct( public string $form_id, public string $form_name, public int $post_id, public array $fields, public array $values, public array $settings, public array $meta = [], /** Row id in the submissions table once the `collect` action stored it (0 = not stored). */ public int $id = 0 ) { } /** Label of a field (falls back to its id). */ public function label(string $id): string { foreach ($this->fields as $field) { if ($field['id'] === $id) { return (string) $field['label'] !== '' ? wp_strip_all_tags((string) $field['label']) : $id; } } return $id; } /** Value as text: lists are joined with ", ". */ public function text(string $id): string { $v = $this->values[$id] ?? ''; return is_array($v) ? implode(', ', array_map('strval', $v)) : (string) $v; } /** Field type of an id ('' when unknown). */ public function type(string $id): string { foreach ($this->fields as $field) { if ($field['id'] === $id) { return (string) $field['type']; } } return ''; } /** First non-empty email field value (for Reply-To). */ public function first_email(): string { foreach ($this->fields as $field) { if ($field['type'] === 'email' && !empty($this->values[$field['id']]) && is_string($this->values[$field['id']])) { return $this->values[$field['id']]; } } return ''; } /** Array shape stored in the submissions table (`data` column): id => {label, type, value}. */ public function data(): array { $out = []; foreach (Fields::inputs($this->fields) as $id => $field) { $out[$id] = ['label' => $this->label($id), 'type' => (string) $field['type'], 'value' => $this->values[$id] ?? '']; } return $out; } }