form-testing
Test WordPress form submissions and email delivery. Validates contact forms, checks WP Mail SMTP configuration, and sends test emails. Use when verifying form functionality or troubleshooting email delivery issues.
What this skill does
# Form Testing Skill Comprehensive form testing for WordPress sites - validates form submissions, email delivery, and SMTP configuration. ## Quick Start ```bash # Test WP Mail SMTP configuration /root/.claude/skills/form-testing/scripts/test-mail.sh wordpress-container # Test contact form submission /root/.claude/skills/form-testing/scripts/test-form.sh https://site.com/contact/ # Full form audit /root/.claude/skills/form-testing/scripts/audit-forms.sh wordpress-container ``` --- ## What This Skill Tests ### 1. Email Delivery - WP Mail SMTP plugin configuration - Email sending capability via `wp_mail()` - SMTP server connectivity - Email headers and formatting ### 2. Contact Form Functionality - Form field validation - Nonce verification - Success/error redirects - Email receipt ### 3. Form Security - CSRF protection (nonces) - Input sanitization - Spam protection (if applicable) --- ## Testing Methods ### Method 1: WP-CLI Email Test The most reliable way to test email delivery: ```bash # Send test email via WP-CLI docker exec wordpress-container wp eval ' $to = "[email protected]"; $subject = "WordPress Test Email"; $message = "This is a test email from WordPress at " . date("Y-m-d H:i:s"); $headers = array("Content-Type: text/plain; charset=UTF-8"); $result = wp_mail($to, $subject, $message, $headers); if ($result) { echo "SUCCESS: Email sent to $to\n"; } else { echo "FAILED: Could not send email\n"; global $phpmailer; if (isset($phpmailer)) { echo "Error: " . $phpmailer->ErrorInfo . "\n"; } } ' ``` ### Method 2: Check SMTP Configuration ```bash # Check WP Mail SMTP options docker exec wordpress-container wp option get wp_mail_smtp --format=json | jq # Check if SMTP is configured docker exec wordpress-container wp eval ' $options = get_option("wp_mail_smtp"); if (!empty($options["smtp"]["host"])) { echo "SMTP Host: " . $options["smtp"]["host"] . "\n"; echo "SMTP Port: " . $options["smtp"]["port"] . "\n"; echo "SMTP Auth: " . ($options["smtp"]["auth"] ? "Yes" : "No") . "\n"; echo "Encryption: " . $options["smtp"]["encryption"] . "\n"; } else { echo "SMTP not configured - using PHP mail()\n"; } ' ``` ### Method 3: HTTP Form Submission Test ```bash # Test contact form via curl curl -X POST "https://site.com/contact/" \ -d "first_name=Test" \ -d "last_name=User" \ -d "[email protected]" \ -d "message=This is a test submission" \ -d "csr_contact_form=1" \ -L -v 2>&1 | grep -E "(< HTTP|Location:|contact=)" ``` --- ## Automated Test Script ### test-mail.sh ```bash #!/bin/bash # Test email sending via WordPress CONTAINER="${1:-wordpress}" TO_EMAIL="${2:[email protected]}" echo "Testing email delivery..." docker exec "$CONTAINER" wp eval " \$to = '$TO_EMAIL'; \$subject = 'Form Test - ' . date('Y-m-d H:i:s'); \$message = 'This is an automated test from the form-testing skill.\\n\\n'; \$message .= 'Site: ' . home_url() . '\\n'; \$message .= 'Time: ' . current_time('mysql') . '\\n'; \$message .= '\\nIf you receive this, email delivery is working!'; \$headers = array( 'Content-Type: text/plain; charset=UTF-8', 'From: WordPress <wordpress@' . parse_url(home_url(), PHP_URL_HOST) . '>' ); echo 'Sending test email to: ' . \$to . \"\\n\"; \$result = wp_mail(\$to, \$subject, \$message, \$headers); if (\$result) { echo \"SUCCESS: Test email sent!\\n\"; echo \"Check inbox for: \$subject\\n\"; } else { echo \"FAILED: Could not send email\\n\"; global \$phpmailer; if (isset(\$phpmailer) && !empty(\$phpmailer->ErrorInfo)) { echo \"PHPMailer Error: \" . \$phpmailer->ErrorInfo . \"\\n\"; } } " ``` --- ## Troubleshooting ### Email Not Sending 1. **Check WP Mail SMTP is active:** ```bash docker exec wordpress wp plugin is-active wp-mail-smtp && echo "Active" || echo "Not active" ``` 2. **Verify SMTP settings:** ```bash docker exec wordpress wp option get wp_mail_smtp --format=json ``` 3. **Test with debug logging:** ```bash docker exec wordpress wp eval ' define("WP_DEBUG", true); define("WP_DEBUG_LOG", true); wp_mail("[email protected]", "Debug Test", "Testing"); ' ``` 4. **Check email log (if using WP Mail SMTP Pro):** ```bash docker exec wordpress wp db query "SELECT * FROM wp_wpmailsmtp_logs ORDER BY id DESC LIMIT 5" ``` ### Form Submission Errors 1. **Check nonce verification:** - Ensure form has `wp_nonce_field()` - Verify nonce name matches in handler 2. **Check redirect after submit:** ```bash curl -X POST "https://site.com/contact/" \ -d "form_data=here" \ -L -w "%{redirect_url}" -o /dev/null -s ``` 3. **Check for PHP errors:** ```bash docker exec wordpress tail -50 /var/www/html/wp-content/debug.log ``` ### Common Issues | Issue | Cause | Solution | |-------|-------|----------| | Emails go to spam | Missing SPF/DKIM | Configure DNS records | | "Could not instantiate mail function" | PHP mail disabled | Use SMTP plugin | | Form returns blank page | PHP error | Enable WP_DEBUG | | Nonce verification failed | Session expired or cache | Check caching plugin | | Form fields not received | Missing name attributes | Add name to inputs | --- ## WP Mail SMTP Configuration ### Recommended Providers 1. **SMTP.com** - Free tier, reliable 2. **SendGrid** - 100 emails/day free 3. **Mailgun** - Developer-friendly 4. **Amazon SES** - Cheapest for volume 5. **Gmail SMTP** - Quick setup (personal use) ### Configuration via WP-CLI ```bash # Set up SMTP configuration docker exec wordpress wp option update wp_mail_smtp '{ "mail": { "from_email": "[email protected]", "from_name": "Your Site", "mailer": "smtp" }, "smtp": { "host": "smtp.example.com", "port": 587, "encryption": "tls", "auth": true, "user": "smtp-user", "pass": "smtp-password" } }' --format=json ``` --- ## Form Types Tested ### Contact Form (CSR Theme) - **Template**: `page-contact.php` - **Handler**: `csr_handle_contact_form()` in functions.php - **Fields**: first_name, last_name, email, message - **Nonce**: `csr_contact_nonce` - **Success Redirect**: `?contact=success` ### Property Inquiry Form (CSR Theme) - **Template**: `single-property.php` - **Handler**: `csr_handle_inquiry_form()` in functions.php - **Fields**: name, company, email, message, property_title - **Nonce**: `csr_inquiry_nonce` - **Success Redirect**: `?inquiry=success` --- ## Audit Report Template When running a form audit, document: ```markdown ## Form Audit Report - [Site Name] **Date**: YYYY-MM-DD **Auditor**: Claude ### Email Delivery - [ ] WP Mail SMTP installed and active - [ ] SMTP credentials configured - [ ] Test email received successfully - [ ] SPF/DKIM records in place (check via MXToolbox) ### Contact Form - [ ] Form displays correctly - [ ] All fields validate properly - [ ] Nonce verification working - [ ] Success message shown after submit - [ ] Email received by admin - [ ] Reply-to header set correctly ### Security - [ ] CSRF protection (nonces) in place - [ ] Input sanitization (sanitize_text_field, etc.) - [ ] Email header injection prevention - [ ] Rate limiting (if needed) ### Recommendations 1. ... 2. ... ``` --- ## Related Skills - **wp-docker**: WordPress container management - **visual-qa**: Visual testing after form changes - **seo-optimizer**: Check form pages for SEO - **white-label**: Admin branding for form notifications --- ## Sources - [WP Mail SMTP Documentation](https://wpmailsmtp.com/docs/) - [WordPress wp_mail() Function](https://developer.wordpress.org/reference/functions/wp_mail/) - [Contact Form Security Best Practices](https://developer.wordpress.org/plugins/security/)
Related in Web Dev
generating-lwc-components
IncludedLightning Web Components with PICKLES methodology and 165-point scoring. Use this skill when the user creates or edits LWC components, builds wire service patterns, or writes Jest tests for LWC. TRIGGER when: user creates/edits LWC components, touches lwc/**/*.js, .html, .css, .js-meta.xml files, or asks about wire service, SLDS, or Jest LWC tests. DO NOT TRIGGER when: Apex classes (use generating-apex), Aura components, or Visualforce.
tanstack-query
IncludedManage server state in React with TanStack Query v5. Set up queries with useQuery, mutations with useMutation, configure QueryClient caching strategies, implement optimistic updates, and handle infinite scroll with useInfiniteQuery. Use when: setting up data fetching in React projects, migrating from v4 to v5, or fixing object syntax required errors, query callbacks removed issues, cacheTime renamed to gcTime, isPending vs isLoading confusion, keepPreviousData removed problems.
document-processor-api
IncludedProcess documents with Nutrient DWS. Use when the user wants to generate PDFs from HTML or URLs, convert Office/images/PDFs, assemble or split packets, OCR scans, extract text/tables/key-value pairs, redact PII, watermark, sign, fill forms, optimize PDFs, or produce compliance outputs like PDF/A or PDF/UA. Triggers include convert to PDF, merge these PDFs, OCR this scan, extract tables, redact PII, sign this PDF, make this PDF/A, or linearize for web delivery.
nutrient-document-processing
IncludedProcess documents with Nutrient DWS. Use when the user wants to generate PDFs from HTML or URLs, convert Office/images/PDFs, assemble or split packets, OCR scans, extract text/tables/key-value pairs, redact PII, watermark, sign, fill forms, optimize PDFs, or produce compliance outputs like PDF/A or PDF/UA. Triggers include convert to PDF, merge these PDFs, OCR this scan, extract tables, redact PII, sign this PDF, make this PDF/A, or linearize for web delivery.
tanstack-query
IncludedManage server state in React with TanStack Query v5. Covers useMutationState, simplified optimistic updates, throwOnError, network mode (offline/PWA), and infiniteQueryOptions. Use when setting up data fetching, fixing v4→v5 migration errors (object syntax, gcTime, isPending, keepPreviousData), or debugging SSR/hydration issues with streaming server components.
accelint-nextjs-best-practices
IncludedNext.js performance optimization and best practices. Use when writing Next.js code (App Router or Pages Router); implementing Server Components, Server Actions, or API routes; optimizing RSC serialization, data fetching, or server-side rendering; reviewing Next.js code for performance issues; fixing authentication in Server Actions; or implementing Suspense boundaries, parallel data fetching, or request deduplication.