Как получить загруженный файл из поля carbon fields?
Сделал кастомное поле с помощью carbon fields и хочу передать выбранный мне файл в папку, но выяснил путём логирования, что у меня он не видит его в поле, почему так происходит?
Как делаю я: нажимаю добавить запись новую, открывается окно для добавления записи, Заполняю всю информацию, потом открываю поле для загрузки файла, выбираю там нужный мне файл и жму сохранить и опублковать, после чего смотрю в логи и вижу, что информация о файле не выводится будто бы он пустой, потом сделал еще одну проверку и действительно оказалось, что он не видит файл, что я не так сделал?
add_action('carbon_fields_register_fields', 'crb_attach_post_meta'); function crb_attach_post_meta() { Container::make('post_meta', __('Добавление игры', 'crb')) ->where('post_type', '=', 'post') ->add_fields(array( Field::make('text', 'crb_game_title', 'Название игры'), Field::make('text', 'crb_additional_seo_game', 'Описание для SEO'), Field::make('text', 'crb_additional_about_game', 'Об игре'), Field::make('text', 'crb_additional_controls', 'Управление'), Field::make('file', 'crb_game_files', 'Загрузить файлы игры') ->set_required(true) ->set_help_text('Загрузите архив с файлами игры'), )); } add_action('save_post', 'crb_save_post', 10, 3); function crb_save_post($post_id, $post, $update) { // Проверяем наличие данных о загруженном файле if (empty($_FILES['crb_game_files'])) { error_log("Ошибка: Файл не был загружен."); // Как раз вот тут и ловлю вызов этого лога, до этого делал еще логи, но там вместо веса файла, названия файла и тд получал пустоту просто return; } |
add_action('carbon_fields_register_fields', 'crb_attach_post_meta'); function crb_attach_post_meta() { Container::make('post_meta', __('Добавление игры', 'crb')) ->where('post_type', '=', 'post') ->add_fields(array( Field::make('text', 'crb_game_title', 'Название игры'), Field::make('text', 'crb_additional_seo_game', 'Описание для SEO'), Field::make('text', 'crb_additional_about_game', 'Об игре'), Field::make('text', 'crb_additional_controls', 'Управление'), Field::make('file', 'crb_game_files', 'Загрузить файлы игры') ->set_required(true) ->set_help_text('Загрузите архив с файлами игры'), )); } add_action('save_post', 'crb_save_post', 10, 3); function crb_save_post($post_id, $post, $update) { // Проверяем наличие данных о загруженном файле if (empty($_FILES['crb_game_files'])) { error_log("Ошибка: Файл не был загружен."); // Как раз вот тут и ловлю вызов этого лога, до этого делал еще логи, но там вместо веса файла, названия файла и тд получал пустоту просто return; }
Дополнительно:
https://developer.wordpress.org/reference/hooks/po...
но карбон по идее не должен этого требовать т.к. использует медиа-библиотеку
- IvanU7n, не совсем понимаю для чего его использовать в моём случае
- yraiv, это если руками делать аплоад
но карбон делает всё через медиа-библиотеку и смотреть нужно в $_POST, там должен быть идентификатор attachment, а получить имя файла можно через get_attached_file($_POST['crb_game_files']), ссылку на него через wp_get_attachment_url($_POST['crb_game_files'])а если нужно после, то получаем это поле через апи и используем то что получили вместо $_POST['crb_game_files']
<?php $attachment_url = wp_get_attachment_url(carbon_get_post_meta( 'crb_game_files')); ?> |
<?php $attachment_url = wp_get_attachment_url(carbon_get_post_meta( 'crb_game_files')); ?>
- Также рекомендую скурить документацию
- Роман Страх, странно, но у меня не работает ->set_value_type( 'url' )
- Роман Страх,
$attachment_url = wp_get_attachment_url(carbon_get_post_meta( 'crb_game_files'));
$attachment_url = wp_get_attachment_url(carbon_get_post_meta( 'crb_game_files'));
сам по себе не сработал, красным все время горело, поэтому добавил post_id, но лучше стало не до конца, пока вот так вод выглядит
add_action('save_post', 'crb_save_post', 10, 3); function crb_save_post($post_id, $post, $update) { $attachment_url = wp_get_attachment_url(carbon_get_post_meta($post_id, 'crb_game_files')); error_log("Attachment URL: " . print_r($attachment_url, true)); if (!$attachment_url) { error_log("Ошибка: Файл не был загружен."); return; } $file_info = array( 'tmp_name' => get_attached_file($attachment_url), 'name' => basename($attachment_url), 'type' => mime_content_type($attachment_url), 'error' => 0, 'size' => filesize($attachment_url), ); error_log("==== Начало обработки сохранения поста ===="); error_log("post_id: $post_id"); error_log("post_title: {$post->post_title}"); error_log("update: " . ($update ? 'true' : 'false')); if (!$update && defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { error_log("Производится автосохранение, прерываем обработку."); return; } if (!isset($file_info['error']) || $file_info['error'] !== UPLOAD_ERR_OK) { $error_message = "Ошибка при загрузке файла. Код ошибки: {$file_info['error']}"; error_log($error_message); return; } error_log("Проверяем успешность перемещения файла..."); $games_folder = get_stylesheet_directory() . '/games/'; $post_folder = $games_folder . $post_id; error_log("Путь к папке: $post_folder"); error_log("Размер файла: {$file_info['size']} байт"); error_log("Имя файла: {$file_info['name']}"); error_log("Тип файла: {$file_info['type']}"); error_log("Временное имя файла: {$file_info['tmp_name']}"); if (!file_exists($post_folder)) { error_log("Папка не существует, создаем: $post_folder"); mkdir($post_folder, 0755, true); } else { error_log("Папка уже существует: $post_folder"); } $target_path = $post_folder . '/' . basename($file_info['name']); if (move_uploaded_file($file_info['tmp_name'], $target_path)) { $log_message = "Файл успешно перемещен в папку: $target_path"; file_put_contents($post_folder . '/log.txt', $log_message . PHP_EOL, FILE_APPEND); error_log($log_message); } else { $log_message = "Не удалось переместить файл."; file_put_contents($post_folder . '/log.txt', $log_message . PHP_EOL, FILE_APPEND); error_log($log_message); error_log("Детали ошибки при перемещении файла: " . error_get_last()['message']); } error_log("==== Завершение обработки сохранения поста ===="); }
add_action('save_post', 'crb_save_post', 10, 3); function crb_save_post($post_id, $post, $update) { $attachment_url = wp_get_attachment_url(carbon_get_post_meta($post_id, 'crb_game_files')); error_log("Attachment URL: " . print_r($attachment_url, true)); if (!$attachment_url) { error_log("Ошибка: Файл не был загружен."); return; } $file_info = array( 'tmp_name' => get_attached_file($attachment_url), 'name' => basename($attachment_url), 'type' => mime_content_type($attachment_url), 'error' => 0, 'size' => filesize($attachment_url), ); error_log("==== Начало обработки сохранения поста ===="); error_log("post_id: $post_id"); error_log("post_title: {$post->post_title}"); error_log("update: " . ($update ? 'true' : 'false')); if (!$update && defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { error_log("Производится автосохранение, прерываем обработку."); return; } if (!isset($file_info['error']) || $file_info['error'] !== UPLOAD_ERR_OK) { $error_message = "Ошибка при загрузке файла. Код ошибки: {$file_info['error']}"; error_log($error_message); return; } error_log("Проверяем успешность перемещения файла..."); $games_folder = get_stylesheet_directory() . '/games/'; $post_folder = $games_folder . $post_id; error_log("Путь к папке: $post_folder"); error_log("Размер файла: {$file_info['size']} байт"); error_log("Имя файла: {$file_info['name']}"); error_log("Тип файла: {$file_info['type']}"); error_log("Временное имя файла: {$file_info['tmp_name']}"); if (!file_exists($post_folder)) { error_log("Папка не существует, создаем: $post_folder"); mkdir($post_folder, 0755, true); } else { error_log("Папка уже существует: $post_folder"); } $target_path = $post_folder . '/' . basename($file_info['name']); if (move_uploaded_file($file_info['tmp_name'], $target_path)) { $log_message = "Файл успешно перемещен в папку: $target_path"; file_put_contents($post_folder . '/log.txt', $log_message . PHP_EOL, FILE_APPEND); error_log($log_message); } else { $log_message = "Не удалось переместить файл."; file_put_contents($post_folder . '/log.txt', $log_message . PHP_EOL, FILE_APPEND); error_log($log_message); error_log("Детали ошибки при перемещении файла: " . error_get_last()['message']); } error_log("==== Завершение обработки сохранения поста ===="); }
Но! я не понимаю почему, тепеь в логах следующее: Размер файла: байт Имя файла: MenuImage.png Тип файла: Временное имя файла: Не удалось переместить файл. Детали ошибки при перемещении файла: filesize(): stat failed for my-local-site/wp-content/uploads/2023/12/MenuImage.png ==== Завершение обработки сохранения поста ====.
Получается, что он прочёл тепеь название файла, но дальше это не ушло и все по нулям, это как? - yraiv, вы видимо не понимаете до конца как все работает.
У вас уже в $attachment_url лежит ссылка (my-local-site/wp-content/uploads/2023/12/MenuImage.png)
get_attached_file получает абсолютный (серверный) путь вложения (прикрепленного файла) по переданному ID вложения. (вы передаете ссылку), далее не смотрел - yraiv, так будет лучше
if (empty($attachment_url)) { error_log("Ошибка: Файл не был загружен."); return; }
if (empty($attachment_url)) { error_log("Ошибка: Файл не был загружен."); return; }
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

В Carbon Fields поле типа file обычно хранит не сам файл, а ID вложения или URL, в зависимости от настроек поля. Если Вы пытаетесь получить “загруженный файл” как обычный
$_FILESпри сохранении записи, его там может уже не быть: WordPress загрузил файл в медиабиблиотеку, а Carbon Fields сохранил ссылку на attachment.Сначала проверьте, что именно возвращает поле:
$file = carbon_get_post_meta($post_id, 'crb_file'); error_log(print_r($file, true));
Если возвращается ID attachment, путь можно получить так:
$attachment_id = (int) carbon_get_post_meta($post_id, 'crb_file'); $path = get_attached_file($attachment_id); $url = wp_get_attachment_url($attachment_id);
Если возвращается массив, смотрите ключи массива. Иногда там есть
id,url,type. Тогда код будет зависеть от структуры:$file = carbon_get_post_meta($post_id, 'crb_file'); if (is_array($file) && !empty($file['id'])) { $path = get_attached_file((int) $file['id']); }
Если хотите скопировать файл в отдельную папку при сохранении, делайте это после того, как meta уже сохранена. В
save_postможно попасть раньше, чем Carbon Fields обновит свои данные. Ищите hook Carbon Fields после сохранения или используйте более поздний приоритет и проверяйте результат.Пример копирования:
$source = get_attached_file($attachment_id); $target_dir = WP_CONTENT_DIR . '/custom-files/' . $post_id; if ($source && file_exists($source)) { wp_mkdir_p($target_dir); copy($source, $target_dir . '/' . basename($source)); }
Проверьте права на папку назначения. Если папка не создаётся и ошибок нет, включите логирование WordPress и проверяйте результат
wp_mkdir_p()иcopy().Итог: получайте не
$_FILES, а attachment ID/URL из Carbon Fields, затем через WordPress-функции доставайте путь к файлу. Для копирования используйте поздний hook и проверяйте права директории.