Вопрос или проблема
Я использую плагин 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, можно предпринять несколько шагов:
-
Проверка процесса отправки: Убедитесь, что данные отправляются в Google Sheet после обновления переменной
$posted_data
. Возможно, вам потребуется изменить порядок операций так, чтобы Google Sheet обновлялся после вызова функцииwp_update_attachment_metadata
. -
Асинхронная обработка: Рассмотрите возможность использования асинхронного подхода для обновления Google Sheet после успешной загрузки файлов и вставки их в медиа-библиотеку. Это можно сделать с помощью AJAX вызова или через выполнение специфического Cron Job в WordPress.
-
Детекция ошибок: Убедитесь, что обрабатываете возможные ошибки во время выполнения скрипта (например, ошибки, когда почта не отправляется) и корректно идентифицируете, когда стоит выполнять обновление Google Sheet.
-
Логирование: Добавьте функции логирования (например с помощью
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 может потребовать некоторой дополнительной работы с асинхронными процессами и более детальной отладки кода. Надеюсь, эти советы помогут вам решить возникшую проблему и улучшить функциональность вашего проекта.