WordPress

rest api — WordPress — Formularz kontaktowy 7 — Problem z pobraniem przesłanego pliku

  • 24 maja, 2024
  • 3 min read
rest api — WordPress — Formularz kontaktowy 7 — Problem z pobraniem przesłanego pliku


Zamierzam przesłać dane z formularza kontaktowego 7 w WordPress do interfejsu API (wszystkie pola są w porządku, ale dodanie załącznika do pliku przerywa moje przesyłanie – błąd 500), który zawiera załącznik. Mogę sprawić, że będzie działać z fikcyjnym plikiem w następujący sposób:

$attachedfile = get_template_directory() . '/test.pdf';

$file_contents = file_get_contents($attachedfile);
    $base64_file = base64_encode($file_contents);
    $file_name = basename($attachedfile);
    $mime_type = mime_content_type($attachedfile);

        $documents = [
            [
                'FileName' => $file_name,
                'MimeType' => $mime_type,
                'Base64' => $base64_file,
            ],
        ];

Spowoduje to wysłanie pliku na serwer i odebranie go w porządku. Ale muszę to zrobić dynamicznie poprzez formularz.

Skonstruowałem więc tę funkcję:

function my_custom_form_submission($contact_form) {
    $submission = WPCF7_Submission::get_instance();
    if ($submission) {
        $data = $submission->get_posted_data();
        
        
        $email = isset($data['your-email']) ? sanitize_email($data['your-email']) : '';
        $phone="Nincs megadva";
        $lastname = isset($data['your-name']) ? sanitize_text_field($data['your-name']) : '';
        $firstname = isset($data['text-532']) ? sanitize_text_field($data['text-532']) : '';
        $companyname = isset($data['text-479']) ? sanitize_textarea_field($data['text-479']) : '';
        $created = current_time('Y-m-d\TH:i:s'); 


        $branch = isset($data['menu-586']) ? sanitize_textarea_field($data['menu-586']) : '';
        if ($branch == 'Divat / Design') {
            $flow = 'DivatDesign';
        } else {
            $flow = 'Startup';
        }

        $uploaded_files = $submission->uploaded_files();
        
        
        // if (!empty($uploaded_files)) {
            
        //     $uploaded_file = $uploaded_files['file-524'];

        //     // Read file contents
        //     $file_content = file_get_contents($uploaded_file);

        //     if ($file_content !== false) {
        //         // Encode file content in base64
        //         $base64_file = base64_encode($file_content);

        //         // Prepare data array for API
        //         $documents = array(
        //             'FileName' => $uploaded_file['name'],
        //             'MimeType' => $uploaded_file['type'],
        //             'Base64' => 'data:' . $uploaded_file['type'] . ';base64,' . $base64_file
        //         );
        //     }
        // }
       

        //error_log('Uploaded File Path: ' . $attachedfile);

         if (wf_checkEmail($email) == false) {
            $userId = saveToWf($email, $lastname, $firstname);

            //Log the userId for debugging
             error_log('User ID: ' . $userId);
            
            if ($userId) {
                registerToWf($email, $lastname, $firstname, $flow, $userId, $companyname, $phone, $attachedfile, $branch, $documents);
            }
        } 
    }
}
add_action('wpcf7_before_send_mail', 'my_custom_form_submission');

Problem polega na tym, że jeśli prześlę formularz w ten sposób, działa on dla wszystkich pól, jednak jeśli skomentuję pola powiązane z $uploaded_files, spowoduje to przerwanie przesyłania i wyświetlenie błędu 500. Nie znalazłem sposobu, aby zobaczyć (wyjście/zrzut), co dokładnie zwraca $uploaded_files, ale zgaduję, że jest to coś innego niż mój fikcyjny plik.

Warto przeczytać!  wtyczki - Błąd 400 Nieprawidłowe „produkty”[1].productId" Kinguin

Przesłano tylko 1 plik, więc nie potrzebuję foreach. Czy ktoś robił coś podobnego lub może wskazać mi właściwy kierunek? Nie udało mi się nic znaleźć na ten temat.

  • Warto również zauważyć, że mam dostęp tylko do ich serwera FTP i wp_debug wydaje się być w jakiś sposób wyłączony. Żaden dziennik nie jest widoczny pomimo zdefiniowania („WP_DEBUG”, prawda); zdefiniuj(’WP_DEBUG_DISPLAY’, prawda); zdefiniuj(’WP_DEBUG_LOG’, prawda); w wp_config.


Źródło