URL загруженного файла с помощью плагина CF7 не отображается после использования wp_mail_sent [закрыто]

Вопрос или проблема

Я использую плагин Contact Form 7 и Contact Form Google Sheet Integrated. Я написал этот код:

add_action('wpcf7_mail_sent', 'furni_store_file_on_submission');
function furni_store_file_on_submission($contact_form) {
    // Целевая форма только с ID 119
    if ($contact_form->id() != 119) {
        return;
    }

    $submission = WPCF7_Submission::get_instance();
    if (!$submission) {
        return;
    }

    // Получить загруженные файлы
    $uploaded_files = $submission->uploaded_files();

    // Проверка, существует ли поле файла
    if (!empty($uploaded_files['user-file'])) {
        $uploaded_file_path = $uploaded_files['user-file'][0];

        // Подготовить директорию загрузки WordPress
        $upload_dir = wp_upload_dir();
        $file_name = basename($uploaded_file_path);
        $unique_file_name = wp_unique_filename($upload_dir['path'], $file_name);


        $new_file_path = $upload_dir['path'] . "https://wordpress.stackexchange.com/" . $unique_file_name;
        copy($uploaded_file_path, $new_file_path);

        
        $attachment = array(
            'guid'           => $upload_dir['url'] . "https://wordpress.stackexchange.com/" . $unique_file_name,
            'post_mime_type' => wp_check_filetype($unique_file_name)['type'],
            'post_title'     => sanitize_file_name(pathinfo($unique_file_name, PATHINFO_FILENAME)),
            'post_status'    => 'inherit'
        );

        $attach_id = wp_insert_attachment($attachment, $new_file_path);
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        $attach_data = wp_generate_attachment_metadata($attach_id, $new_file_path);
        wp_update_attachment_metadata($attach_id, $attach_data);


        $file_url = wp_get_attachment_url($attach_id);

        $posted_data = $submission->get_posted_data();
        $posted_data['file_url'] = $file_url;

        $reflection = new ReflectionClass($submission);
        
        $posted_data_property = $reflection->getProperty('posted_data');
        
        $posted_data_property->setAccessible(true);

        $posted_data_property->setValue($submission, $posted_data);
    }
}

Изначально код работал, когда я использовал wpcf7_before_sent_mail, но мне пришлось поменять хук на wpcf7_mail_sent при условии, что если моя служба SMTP перестанет работать, тогда мой файл будет загружен только в медиараздел.

Но теперь я вижу, что в моей Google-таблице путь url файла не обновляется.

Моя контактная форма

<label> Ваше имя
    [text* your-name autocomplete:name] </label>

<label> Ваш email
    [email* your-email autocomplete:email] </label>

<label class="d-none"> Заголовок страницы
    [text page-title] </label>


<div>
  <label> Файл
    [file user-file filetypes:pdf limit:1mb]
  </label>
</div>

[hidden file_url]

[submit "Отправить"]

Ответ или решение

Теория

Использование плагина Contact Form 7 (CF7) в WordPress для загрузки файлов и интеграции с Google Sheet может быть мощным инструментом, если настроено правильно. Ваша задача заключается в том, чтобы после успешной отправки формы загруженные файлы сохранялись в медиа-библиотеке WordPress, а ссылки на них отображались в Google Sheet. Давайте обсудим, почему путь URL файла, возможно, не обновляется в таблице Google после изменения хука с wpcf7_before_send_mail на wpcf7_mail_sent, и как это можно исправить.

Пример

Сценарий начинается с понимания различий между двумя хуками:

  • wpcf7_before_send_mail: Этот хук срабатывает после валидации формы и до отправки электронной почты. Он позволяет вам вмешиваться в процесс до передачи данных, что делает его подходящим для модификации данных до фактической отправки.
  • wpcf7_mail_sent: Срабатывает после того, как письмо успешно отправлено. Действие срабатывает только тогда, когда почта была отправлена, и именно этим может быть вызвано отсутствие обновления Google Sheet в вашем случае, если отправка не удалась, данные могут не обновиться.

Сценарий, который вы описали, подразумевает, что после изменения хука на wpcf7_mail_sent, URL файла перестает обновляться в Google Sheet. Это может быть связано с тем, что информация отправляется в Google Sheet еще до того, как URL файла обновится в переменной $posted_data.

Применение

Чтобы решить эту проблему и обеспечить правильное обновление URL, можно предпринять несколько шагов:

  1. Проверка процесса отправки: Убедитесь, что данные отправляются в Google Sheet после обновления переменной $posted_data. Возможно, вам потребуется изменить порядок операций так, чтобы Google Sheet обновлялся после вызова функции wp_update_attachment_metadata.

  2. Асинхронная обработка: Рассмотрите возможность использования асинхронного подхода для обновления Google Sheet после успешной загрузки файлов и вставки их в медиа-библиотеку. Это можно сделать с помощью AJAX вызова или через выполнение специфического Cron Job в WordPress.

  3. Детекция ошибок: Убедитесь, что обрабатываете возможные ошибки во время выполнения скрипта (например, ошибки, когда почта не отправляется) и корректно идентифицируете, когда стоит выполнять обновление Google Sheet.

  4. Логирование: Добавьте функции логирования (например с помощью error_log() или специализированных плагинов для логирования), чтобы точно выявить, на каком этапе происходит сбой, и использовать эти данные для более точной настройки хука и обмена данными с Google Sheet.

Ваш код после внесения исправлений может выглядеть примерно так:

add_action('wpcf7_mail_sent', 'furni_store_file_on_submission');
function furni_store_file_on_submission($contact_form) {
    if ($contact_form->id() != 119) {
        return;
    }

    $submission = WPCF7_Submission::get_instance();
    if (!$submission) {
        return;
    }

    $uploaded_files = $submission->uploaded_files();

    if (!empty($uploaded_files['user-file'])) {
        $uploaded_file_path = $uploaded_files['user-file'][0];
        $upload_dir = wp_upload_dir();
        $file_name = basename($uploaded_file_path);
        $unique_file_name = wp_unique_filename($upload_dir['path'], $file_name);
        $new_file_path = trailingslashit($upload_dir['path']) . $unique_file_name;

        copy($uploaded_file_path, $new_file_path);

        $attachment = array(
            'guid'           => trailingslashit($upload_dir['url']) . $unique_file_name,
            'post_mime_type' => wp_check_filetype($unique_file_name)['type'],
            'post_title'     => sanitize_file_name(pathinfo($unique_file_name, PATHINFO_FILENAME)),
            'post_status'    => 'inherit'
        );

        $attach_id = wp_insert_attachment($attachment, $new_file_path);
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        $attach_data = wp_generate_attachment_metadata($attach_id, $new_file_path);
        wp_update_attachment_metadata($attach_id, $attach_data);

        $file_url = wp_get_attachment_url($attach_id);

        $posted_data = $submission->get_posted_data();
        $posted_data['file_url'] = $file_url;

        $reflection = new ReflectionClass($submission);
        $posted_data_property = $reflection->getProperty('posted_data');
        $posted_data_property->setAccessible(true);
        $posted_data_property->setValue($submission, $posted_data);

        // Add your code here to update Google Sheet with the updated $posted_data
    }
}

Заключение

Понимание и управление процессом обмена данными в WordPress требует внимания к деталям, особенно в контексте изменений хуков и последовательности операций при интеграции с внешними сервисами. Оптимизация вашего скрипта и обеспечение корректного обновления Google Sheet может потребовать некоторой дополнительной работы с асинхронными процессами и более детальной отладки кода. Надеюсь, эти советы помогут вам решить возникшую проблему и улучшить функциональность вашего проекта.

Оцените материал
Добавить комментарий

Капча загружается...