Я использую контактную форму 7 (5.4) и расширение CF7 Smart Grid Design Extension (4.10.0) в форме отправки на моем сайте WordPress для создания черновиков пользовательских типов сообщений. Первоначальным источником вдохновения для этого послужил этот потрясающий пост SO.
Форма отправки работала хорошо и надежно уже более года, но с новой версией CF7 5.4 что-то изменилось внутри, и загрузка изображений прервалась. Все остальные поля остались без изменений.
Поле CF7, с которым я загружаю, выглядит как
[file* field_image limit:10000000 filetypes:jpg|gif|png|jpeg class:field-image]
Изображения отправляются по почте, поэтому форма загружает файл правильно. Но что-то изменилось, что мешает моим попыткам получить изображения до того, как они будут удалены после отправки по электронной почте.
Вот соответствующий PHP в functions.php, который обрабатывает загруженные изображения в функции, которая создает WP CPT.
// Handle CF7 form submission and populate new CPT 'Thing'
// Ref: https://wordpress.stackexchange.com/questions/328429/how-to-save-contact-form-7-data-in-custom-post-types-cpt
//
add_action('wpcf7_before_send_mail', 'save_my_form_data_to_my_cpt', 10, 3);
function save_my_form_data_to_my_cpt($contact_form){
//Get the form ID
$contact_form = WPCF7_ContactForm::get_current();
$contact_form_id = $contact_form -> id;
$submission = WPCF7_Submission::get_instance();
if (!$submission){
return $contact_form;
}
$posted_data = $submission->get_posted_data();
//The Sent Fields are now in an array
//you can now access them with $posted_data['my-email']
//
// create new post array
$new_post = array();
//
// META META FIELDS
// post_type (i.e., your CPT)
$new_post['post_type'] = 'thing';
// post_status (draft, publish, pending)
$new_post['post_status'] = 'draft';
//
// POST FIELDS
// post_title
if(isset($posted_data['field_title']) &&
!empty($posted_data['field_title'])){
$new_post['post_title'] = $posted_data['field_title'];
} else {
$new_post['post_title'] = '[Insert Title Here]';
}
// POST CPT
//When everything is prepared, insert post into WP Database
if($post_id = wp_insert_post($new_post)){
// it worked so let's continue...
//
// IMAGE
// Retrieving and inserting uploaded image as featured image
// CF7 uploads the image and puts it in a temporary directory,
// deleting it after the mail is sent
// Before it deletes it, we will move into our media library,
// and attach it to our post
//
// get file upload info from form
$uploadedFiles = $submission->uploaded_files();
// if we have an uploaded image...
if( isset($posted_data['field_image']) ){
// move image from temp folder to upload folder
$imageUpload = wp_upload_bits($posted_data['field_image'], null,
file_get_contents($uploadedFiles['field_image']));
//
require_once(ABSPATH . 'wp-admin/includes/admin.php');
// construct array to register this image
$filename = $imageUpload['file'];
$attachment = array(
'post_mime_type' => $imageUpload['type'],
'post_parent' => $post_id,
'post_title' => $posted_data['field_title'] . ' - ' .
$posted_data['field_contributor'],
'post_content' => $posted_data['field_info'],
'post_status' => 'inherit'
);
// attach image to this post
$attachment_id = wp_insert_attachment( $attachment, $filename, $post_id );
// if we succeeded...
if (!is_wp_error($attachment_id)) {
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attachment_data = wp_generate_attachment_metadata( $attachment_id, $filename );
wp_update_attachment_metadata( $attachment_id, $attachment_data );
set_post_thumbnail( $post_id, $attachment_id );
// add image id (attchment id) to ad_image field
update_field( 'ad_image', $attachment_id, $post_id );
}
}
}
}
Это называется:
add_action('wpcf7_before_send_mail', 'save_my_form_data_to_my_cpt', 10, 3);
Изображения, которые успешно отправляются в электронных письмах CF7, не загружаются в новый создаваемый CPT.
Хотя проблема может заключаться в коде отправки сообщения, который обрабатывает отправку, ничего из этого не изменилось за год. Изменился только CF7.
Любые подсказки?
ПРИЛОЖЕНИЕ A: Полная функция
Вот вся функция save_my_form_data_to_my_cpt
:
~Удалено~
ПРИЛОЖЕНИЕ B: Отладка вывода
В начале функции мы вызываем получение данных, которые передаются из формы CF7:
$submission = WPCF7_Submission::get_instance();
$posted_data = $submission->get_posted_data();
$uploadedFiles = $submission->uploaded_files();
Когда мы выгружаем эти переменные в консоль, нас ждет сюрприз. Для $posted_data мы получаем:
array (
'field_title' => 'TEST',
'field_expires' => '1',
'field_tags' =>
array (
0 => 'Children',
),
'field_addl_tags' => '',
'field_info' => '',
'field_call_to_action' => '',
'field_phone_contact' => '',
'field_email_contact' => '',
'field_website' => '',
'field_location' => '',
'field_contributor' => 'Wes Modes',
'field_notes' => '',
'field_image' =>
array (
0 => '/srv/data/web/vhosts/unavoidabledisaster.com/htdocs/wp-content/uploads/wpcf7_uploads/0318808318/left-boob.jpg',
),
'mc4wp_checkbox' => 'No',
)
Для $uploadedFiles получаем:
array (
'field_image' =>
array (
),
)
Таким образом, хотя массив файлов кажется доступным в опубликованных данных, он недоступен из самой функции, предназначенной для его получения.
Что это значит?
РЕШЕНИЕ
Итак, на самом деле было две проблемы:
- Как предполагает @howard_e, разработчик CF7 изменил поле загрузки на массив (вероятно, чтобы разрешить загрузку нескольких файлов). Это сломало существующий код.
- Метод
WPCF7_Submission::get_instance()->uploaded_files()
перестал возвращать загруженные файлы. Хотя они не возвращаются в объекте поля загрузкиWPCF7_Submission::get_instance()
Итак, вот пересмотренные соответствующие части функции:
add_action('wpcf7_before_send_mail', 'save_my_form_data_to_my_cpt');
function save_my_form_data_to_my_cpt($contact_form){
//Get the form ID
$contact_form_id = $contact_form->id;
$submission = WPCF7_Submission::get_instance();
if (!$submission){
return; // exit the hook
}
// get posted data
$posted_data = $submission->get_posted_data();
// get file upload info from form
$uploadedFiles = $posted_data['field_image'];
// create new post array
$new_post = array();
//
// META META FIELDS
// post_type (i.e., your CPT)
$new_post['post_type'] = 'thing';
// post_status (draft, publish, pending)
$new_post['post_status'] = 'draft';
//
// POST FIELDS
// post_title
if(isset($posted_data['field_title']) &&
!empty($posted_data['field_title'])){
$new_post['post_title'] = $posted_data['field_title'];
} else {
$new_post['post_title'] = '[Insert Title Here]';
}
// POST CPT
//When everything is prepared, insert the post into WP Database
if($post_id = wp_insert_post($new_post)){
// it worked so let's continue...
//
// if we have an uploaded image...
if (!empty($uploadedFiles)) {
// move image from temp folder to upload folder
$file = file_get_contents($uploadedFiles[0]);
$image_name = basename($uploadedFiles[0]);
$imageUpload = wp_upload_bits(basename($uploadedFiles[0]), null, $file);
require_once(ABSPATH . 'wp-admin/includes/admin.php');
// construct array to register this image
$filename = $imageUpload['file'];
$attachment = array(
'post_mime_type' => $imageUpload['type'],
'post_parent' => $post_id,
'post_title' => $posted_data['field_title'] . ' - ' .
$posted_data['field_contributor'],
'post_content' => $posted_data['field_info'],
'post_status' => 'inherit'
);
// attach image to this post
$attachment_id = wp_insert_attachment( $attachment, $filename, $post_id );
// if we succeeded...
if (!is_wp_error($attachment_id)) {
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attachment_data = wp_generate_attachment_metadata( $attachment_id, $filename );
wp_update_attachment_metadata( $attachment_id, $attachment_data );
set_post_thumbnail( $post_id, $attachment_id );
// add image id (attchment id) to ad_image field
update_field( 'ad_image', $attachment_id, $post_id );
}
}
}
}
save_my_form_data_to_my_cpt
? - person Howard E   schedule 03.04.2021$post_id
быть родительским постом формы? Кажется, что это не определено. - person Howard E   schedule 04.04.2021