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; }