Back to all posts

Contact Form 7 Rest API Integration


I used contact form 7 for multiple project but using with ReactJS for the first time I thought i need to write blog on this.

My requirement:

  • I will be able to collect Email from customer who enter info on my portfolio website.
  • And I need to store this in some where in my WordPress dashboard

If you want integrate contact form 7 then I assuming you will know how to install WordPress and contact form 7 plugin installation.

Follow below steps to configure rest API using CF7

Step 1:

Create a contact form with fields you want

  • On Mail tab change you reciever email address

Step 2: Test your CF7 API

How to get API router to post data

https://testwebsite.com/wp-json/contact-form-7/v1/contact-forms/<post_id>/feedback

How to get this <post_id>

On your contact form post id is your post_id. So with this Id the final route will look like this.

https://testwebsite.com/wp-json/contact-form-7/v1/contact-forms/1841/feedback

You can test API using Postman

Step 3: Creating React Component Form for submitting a Contact Form 7 form using Axios:

import React, { useState } from 'react';
import axios from 'axios';

const ContactForm = () => {
    const [name, setName] = useState('');
    const [email, setEmail] = useState('');
    const [message, setMessage] = useState('');
    const [response, setResponse] = useState(null);
    const [error, setError] = useState(null);

    const handleSubmit = async (e) => {
        e.preventDefault();

        // Create form data
        const formData = new FormData();
        formData.append('your-name', name);
        formData.append('your-email', email);
        formData.append('your-message', message);

        try {
            const res = await axios.post(
                'https://chethanspoojary.com/wp-json/contact-form-7/v1/contact-forms/1841/feedback',
                formData,
                {
                    headers: {
                        'Content-Type': 'multipart/form-data'
                    }
                }
            );
            setResponse(res.data);
            setError(null);
        } catch (error) {
            setError('Error submitting form. Please try again later.');
            setResponse(null);
        }
    };

    return (
        <div>
            <form onSubmit={handleSubmit}>
                <div>
                    <label htmlFor="name">Name:</label>
                    <input
                        type="text"
                        id="name"
                        value={name}
                        onChange={(e) => setName(e.target.value)}
                        required
                    />
                </div>
                <div>
                    <label htmlFor="email">Email:</label>
                    <input
                        type="email"
                        id="email"
                        value={email}
                        onChange={(e) => setEmail(e.target.value)}
                        required
                    />
                </div>
                <div>
                    <label htmlFor="message">Message:</label>
                    <textarea
                        id="message"
                        value={message}
                        onChange={(e) => setMessage(e.target.value)}
                        required
                    ></textarea>
                </div>
                <button type="submit">Submit</button>
            </form>
            {response && <p>Form submitted successfully!</p>}
            {error && <p>{error}</p>}
        </div>
    );
};

export default ContactForm;

Install Axios: If you haven’t already, install Axios in your project using npm or yarn:

npm install axios
# or
yarn add axios

Import and Use the Component: Import the ContactForm component and use it in your application:

import React from 'react';
import ContactForm from './ContactForm'; // Adjust the path as necessary

const App = () => {
    return (
        <div>
            <h1>Contact Us</h1>
            <ContactForm />
        </div>
    );
};

export default App;

A complete contact form JSX Code

import React, { useContext, useState } from 'react';
import axios from 'axios';
import { StoreContext } from '../../context/StoreContext';
import styles from './Footer.module.css'; // Import your CSS module

const ContactForm = () => {
    const { root_url } = useContext(StoreContext);
    const [name, setName] = useState('');
    const [email, setEmail] = useState('');
    const [message, setMessage] = useState('');
    const [response, setResponse] = useState(null);
    const [error, setError] = useState(null);

    const hideMessage = () => {
        // Hide error message after 2.5 seconds
        setTimeout(() => {
            setError(null);
            setResponse(null);
        }, 2500);
    };

    const handleSubmit = async (event) => {
        event.preventDefault();

        // Basic client-side validation
        if (!name.trim() || !email.trim() || !message.trim()) {
            setError('Please fill out all fields');
            hideMessage();
            return;
        }

        // Create form data
        const formData = new FormData();
        formData.append('senderName', name);
        formData.append('senderEmail', email);
        formData.append('senderMessage', message);
        formData.append('_wpcf7_unit_tag', Math.random);


        try {
            const res = await axios.post('https://chethanspoojary.com/wp-json/contact-form-7/v1/contact-forms/1841/feedback', formData, {
                headers: {
                    'Content-Type': 'multipart/form-data'
                }
            });
            setResponse(res.data.message);
            setError(null);
            hideMessage();
            // Clear form fields after successful submission
            setName('');
            setEmail('');
            setMessage('');
        } catch (err) {
            setError(err.response ? err.response.data.message : 'An error occurred');
            setResponse(null);
            hideMessage();
        }
    };

    return (
        <div>
            <form className={styles.contact__form} onSubmit={handleSubmit}>
                <div className={styles.contact__control}>
                    <label htmlFor="name" className="visually-hidden">Name</label>
                    <input type="text" id="name" value={name} onChange={(e) => setName(e.target.value)} name="name" placeholder="Name" required />
                </div>
                <div className={styles.contact__control}>
                    <label htmlFor="email" className="visually-hidden">Email</label>
                    <input type="email" id="email" name="email" value={email} onChange={(e) => setEmail(e.target.value)} placeholder="Email" required />
                </div>
                <div className={styles.contact__control}>
                    <label htmlFor="message" className="visually-hidden">Message</label>
                    <textarea name="message" id="message" cols="30" rows="3" placeholder="Message" value={message} onChange={(e) => setMessage(e.target.value)} required></textarea>
                </div>
                <div className={`${styles.contact__control} ${styles.align_right}`}>
                    <button type="submit">Send Message</button>
                </div>
            </form>
            {response && <p className={styles.response}>{response}</p>}
            {error && <p className={styles.error}>{error}</p>}
        </div>
    );
};

export default ContactForm;