ContactForm7 to chyba najpopularniejsza wtyczka do łatwego tworzenia formularzy, które można umieścić na stronie. Nie jest ona co prawda najwygodniejsza, najładniejsza, ani najbardziej intuicyjna, ale z pewnością jest szybka, bezpieczna i spełnia swoją rolę. A co więcej – dzięki przemyślanemu użyciu filtrów i akcji, pozwala na łatwe modyfikacje i integracje.

Zacznijmy od najprostszej i chyba najczęściej spotykanej modyfikacji, czyli:

Jak zrobić coś dodatkowego (zapisać do pliku, zachować w bazie danych, utworzyć wpis, itd.) z przesłanym formularzem?

Dzięki temu, że autor wtyczki przewidział taką możliwość, dodanie takiej integracji jest stosunkowo proste. Spójrzmy na poniższy kod, który realizuje chyba najprostszą formę takiej integracji, a jednocześnie jest świetnym startem do budowania swoich, bardziej rozbudowanych wersji:

function prefiks_process_submitted_form_data( $contact_form ) {
    $submission = WPCF7_Submission::get_instance();
    if ( $submission ) {

        // Pobierz dane przesłane w formularzu
        $submitted_name = $submission->get_posted_data('your-name');
        $submitted_email = $submission->get_posted_data('your-email');
        $submitted_subject = $submission->get_posted_data('your-subject');
        $submitted_message = $submission->get_posted_data('your-message');
        // ...

        // Zrób coś z danymi (np. zapisz je do pliku)
        file_put_contents('cf7-log.txt', 'Data: ' . date('c') . "\n", FILE_APPEND);
        file_put_contents('cf7-log.txt', "Autor: {$submitted_name} <{$submitted_email}>\n", FILE_APPEND);
        file_put_contents('cf7-log.txt', 'Temat: ' . $submitted_subject . "\n", FILE_APPEND);
        file_put_contents('cf7-log.txt', "Wiadomość:\n" . $submitted_message, FILE_APPEND);
        file_put_contents('cf7-log.txt', "\n--------------------\n", FILE_APPEND);
    }
}
add_action( 'wpcf7_before_send_mail', 'prefiks_process_submitted_form_data' );

Dodatkowe warianty i pytania

Mam wiele formularzy. Jak sprawdzić, który został wysłany?

Jako parametr akcji przekazywany jest obiekt przesłanego formularza. Możemy sprawdzić jego ID (ID wpisu z opisem formularza), nazwę i tytuł.

$form_id = $contact_form->id();
$form_name = $contact_form->name();
$form_title = $contact_form->title();

Mój formularz nie musi wysyłać maila po przetworzeniu. Mogę to jakoś zablokować?

Tak. Autor wtyczki przewidział także taką możliwość. Wystarczy, że w swojej funkcji podpiętej pod akcję ustawisz flagę skip_mail na true jak poniżej:

$contact_form->skip_mail = true;

Jak dostać się do wszystkich wysłanych danych?

Wystarczy użyć $data = $submission->get_posted_data();. W ten sposób w zmiennej $data będziemy mieć tablicę zawierającą wszystkie dane przesłane w formularzu.

Uwaga: Będą tam także dane pomocnicze, jak nonce, itp.

Jak przetworzyć przesłane w formularzu pliki?

Choćby tak:

$uploaded_files = $submission->uploaded_files();
foreach ( (array) $uploaded_files as $name => $path ) {
    // zrób coś z plikiem wysłanym z pola o nazwie $name,
    // który znajduje się na serwerze w miejscu określonym przez $path
}