Еще одна задача, связанная с сохранением данных формы WP Contact Form 7 в базе WP, это загрузка и сохранение файла (обычно — изображения).
Особенность работы WPCF7, заключается в том, что загруженный через форму временный файл, плагин переносит в собственное временное хранилище. Потому на этапе обработки зацепки wpcf7_mail_sent, вы уже не найдете временного файла, который указан в глобальном массиве $_FILES.
Пусть в форме есть поле, для загрузки файла с именем photo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
/* цепляемся к отправке формы отзыва через плагин WPCF7 */ add_action( 'wpcf7_mail_sent', 'hookToProcessFormData', $priority = 10, $accepted_args = 1 ); function hookToProcessFormData($contact_form) { // передаваемый объект $contant_form позволит определить // та ли эта форма, которая требует обработки if ($contant_form->id() == [ID ВАШЕЙ ФОРМЫ]) { // Позаботимся о картинке // Получим объект Submission, // откуда можно извлечь информацию о новом имени загруженного файла $SBM = WPCF7_Submission::get_instance(); $uploaded = $SBM->uploaded_files(); // теперь по имени поля извлечем адрес и загрузим файл // в медиа библиотеку WP if (!empty($uploaded['photo'])) { $picture_id = my_media_handle_upload($uploaded['photo'], false); } else { $picture_id = 0; } // подготавливаем данные для создания публикации // подробнее см. в предыдущих статьях // а нам нужно подключить картинку как миниатюру // добавив в мета теги: ... if ($picture_id) { $meta_input['_thumbnail_id'] = $picture_id; } ... // создаём публикацию $my_post_id = wp_insert_post( $post_arr ); // теперь, зная код публикации // нужно обновить файл, прикрепив его к созданной статье if ($picture_id) { $picture = get_post($picture_id, ARRAY_A); wp_insert_attachment($picture, false, $my_post_id); } } } |
В админке WP используется специальная функция для загрузки картинок в библиотеку, её функционал я собираюсь адаптировать для нашего случая.
Кое что можно было и убрать из функции. Нам понадобятся два первых параметра — $file_url — путь или url файла (картинки) и необязательный $post_id — для создания связи между изображением и существующей публикацией.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
/* загрузка картинки по заданному URL or path */ function my_media_handle_upload( $file_url, $post_id, $post_data = array(), $overrides = array( 'test_form' => false )) { $time = current_time('mysql'); if ( $post = get_post($post_id) ) { if ( substr( $post->post_date, 0, 4 ) > 0 ) $time = $post->post_date; } //получение файла и создание его временной копии $file = file_get_contents($file_url); if (!empty($file)) { $tmpfname = tempnam(sys_get_temp_dir(), 'EX_'); $temp = fopen($tmpfname, "wb"); fwrite($temp, $file); fclose($temp); //имитируем загрузку временного файла $file_id = 'myfile'; $_FILES[$file_id] = array( 'name' => basename($file_url), 'type' => mime_content_type($tmpfname), 'size' => filesize($tmpfname), 'tmp_name' => $tmpfname, ); } else { return 0; } require_once $_SERVER['DOCUMENT_ROOT'] . '/wp-admin/includes/file.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/wp-admin/includes/image.php'; $name = $_FILES[$file_id]['name']; $file = _wp_handle_upload($_FILES[$file_id], $overrides, $time, 'user-export'); if ( isset($file['error']) ) { return new WP_Error( 'upload_error', $file['error'] ); } $name_parts = pathinfo($name); $name = trim( substr( $name, 0, -(1 + strlen($name_parts['extension'])) ) ); $url = $file['url']; $type = $file['type']; $file = $file['file']; $title = $name; $content = ''; $excerpt = ''; if ( 0 === strpos( $type, 'image/' ) && $image_meta = @wp_read_image_metadata( $file ) ) { if ( trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) { $title = $image_meta['title']; } if ( trim( $image_meta['caption'] ) ) { $excerpt = $image_meta['caption']; } } // Construct the attachment array $attachment = array_merge( array( 'post_mime_type' => $type, 'guid' => $url, 'post_parent' => $post_id, 'post_title' => $title, 'post_content' => $content, 'post_excerpt' => $excerpt, ), $post_data ); // This should never be set as it would then overwrite an existing attachment. unset( $attachment['ID'] ); // Save the data $id = wp_insert_attachment($attachment, $file, $post_id); if ( !is_wp_error($id) ) { wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) ); } return $id; } |
Возможно, не все понятно, даже с комментариями :), но это действительно не простой случай. В результате работы этого кода, можно сохранить картинку из формы как элемент thumbnail публикации.
Для этого конечно же следует должным образом зарегистрировать тип публикации.