From 1f89052f7293f6c022f325f796bb0d7eec1a18d2 Mon Sep 17 00:00:00 2001 From: Vladimir Bryzgalov Date: Fri, 17 Apr 2026 23:46:52 +0500 Subject: [PATCH] fix(flamingo-helper): extract field values from _field_* meta, not _fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flamingo's '_fields' meta stores only the list of field NAMES with null values; the actual values live in separate per-field meta keys prefixed with '_field_'. The old extract_fields() returned the null-valued '_fields' array on the first branch and never fell through to the '_field_*' collector, so every retro Telegram message showed '(не указан)' / '(пусто)' for every slot. Also collect '_from_name' / '_from_email' (set by Akismet) as convenience mappings to 'your-name' / 'your-email' so the formatter's standard slots are populated for most submissions even when the form uses custom field names like text-211 / name_user. Pilot on washanyanya.ru caught this (retro delivered empty skeletons). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../plans/2026-04-17-cf7-spam-to-telegram.md | 24 +++++++++++++++---- includes/class-flamingo-helper.php | 24 +++++++++++++++---- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/docs/superpowers/plans/2026-04-17-cf7-spam-to-telegram.md b/docs/superpowers/plans/2026-04-17-cf7-spam-to-telegram.md index b57ad0a..6e0e0ee 100644 --- a/docs/superpowers/plans/2026-04-17-cf7-spam-to-telegram.md +++ b/docs/superpowers/plans/2026-04-17-cf7-spam-to-telegram.md @@ -1922,20 +1922,34 @@ final class FlamingoHelper /** * Extract fields from a Flamingo inbound post. * + * Flamingo's '_fields' meta stores only the field *names* with null values; + * the actual values live in per-field meta keys prefixed with '_field_'. + * Collect them directly. + * * @return array */ public static function extract_fields(\WP_Post $post): array { - $fields = get_post_meta($post->ID, '_fields', true); - if (is_array($fields)) return $fields; - // Fallback: meta stored under Flamingo's structure $meta = get_post_meta($post->ID); $out = []; foreach ($meta as $key => $values) { - if (strpos($key, '_field_') === 0) { - $out[substr($key, strlen('_field_'))] = maybe_unserialize($values[0] ?? ''); + if (strpos($key, '_field_') !== 0) continue; + $name = substr($key, strlen('_field_')); + $raw = $values[0] ?? ''; + $val = maybe_unserialize($raw); + if (is_array($val)) { + $val = implode(', ', array_map('strval', $val)); + } + if ((string)$val !== '') { + $out[$name] = $val; } } + // Convenience: expose Akismet's "from" name / email so the formatter's + // standard slots aren't empty for most submissions. + $from_name = (string)get_post_meta($post->ID, '_from_name', true); + $from_email = (string)get_post_meta($post->ID, '_from_email', true); + if ($from_name !== '' && !isset($out['your-name'])) $out['your-name'] = $from_name; + if ($from_email !== '' && !isset($out['your-email'])) $out['your-email'] = $from_email; return $out; } diff --git a/includes/class-flamingo-helper.php b/includes/class-flamingo-helper.php index 2030524..6a2b76b 100644 --- a/includes/class-flamingo-helper.php +++ b/includes/class-flamingo-helper.php @@ -34,20 +34,34 @@ final class FlamingoHelper /** * Extract fields from a Flamingo inbound post. * + * Flamingo's '_fields' meta stores only the field *names* with null values; + * the actual values live in per-field meta keys prefixed with '_field_'. + * Collect them directly. + * * @return array */ public static function extract_fields(\WP_Post $post): array { - $fields = get_post_meta($post->ID, '_fields', true); - if (is_array($fields)) return $fields; - // Fallback: meta stored under Flamingo's structure $meta = get_post_meta($post->ID); $out = []; foreach ($meta as $key => $values) { - if (strpos($key, '_field_') === 0) { - $out[substr($key, strlen('_field_'))] = maybe_unserialize($values[0] ?? ''); + if (strpos($key, '_field_') !== 0) continue; + $name = substr($key, strlen('_field_')); + $raw = $values[0] ?? ''; + $val = maybe_unserialize($raw); + if (is_array($val)) { + $val = implode(', ', array_map('strval', $val)); + } + if ((string)$val !== '') { + $out[$name] = $val; } } + // Convenience: expose Akismet's "from" name / email so the formatter's + // standard slots aren't empty for most submissions. + $from_name = (string)get_post_meta($post->ID, '_from_name', true); + $from_email = (string)get_post_meta($post->ID, '_from_email', true); + if ($from_name !== '' && !isset($out['your-name'])) $out['your-name'] = $from_name; + if ($from_email !== '' && !isset($out['your-email'])) $out['your-email'] = $from_email; return $out; }