Как получить загруженный файл из поля carbon fields?

Ссылка скопирована
1 ответ

Сделал кастомное поле с помощью 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; }

Дополнительно:

Как получить загруженный файл из поля carbon fields?

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; }

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Mobile-редакция Ответ

В 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));

$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);

$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']);
}

$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));
}

$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 и проверяйте права директории.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно