Как изменить папку загрузки для кастомного поля, созданного с помощью Carbon Fields?

Я пытаюсь изменить путь для сохранения медиафайлов, загружаемых через поле CF <code>crb_app_download_apk</code>, но сталкиваюсь с трудностями. Не подскажете, в чем может быть проблема? <br/> <pre><code class="php">add_filter('upload_dir', 'custom_upload_dir_for_carbon_fields');
function custom_upload_dir_for_carbon_fields($upload) {
    // Проверяем, есть ли в массиве $_POST мета-ключ '_crb_app_download_apk'
    if (isset($_POST['_crb_app_download_apk'])) {
        // Устанавливаем новую папку для загрузки
        $custom_dir = '/source';

        // Проверка, существует ли папка, если нет - создаем
        if (!file_exists(ABSPATH . $custom_dir)) {
            mkdir(ABSPATH . $custom_dir, 0755, true);
        }

        // Обновляем массив путей загрузки
        $upload['path'] = ABSPATH . $custom_dir;
        $upload['url'] = get_site_url() . $custom_dir;
        $upload['basedir'] = ABSPATH . $custom_dir;
        $upload['baseurl'] = get_site_url() . $custom_dir;
    }
    return $upload;
}</code></pre>
  • 25 февраля 2025 г. 9:14
Ответы на вопрос 1
Ваша функция для изменения каталога загрузки медиафайлов почти правильная, но есть несколько моментов, которые можно улучшить и исправить, чтобы она работала корректно при использовании Carbon Fields.

1. **Проверка наличия мета-ключа**: Вы проверяете наличие мета-ключа `_crb_app_download_apk`, но правильнее будет проверять не только его наличие, но и то, есть ли в `$_FILES` файл. Это обеспечит корректную работу функции только когда файл действительно загружается.

2. **Правильное использование структуры путей**: `ABSPATH` следует использовать аккуратно. При создании новых директорий или при указании путей необходимо учитывать, что вам необходимо создавать подкаталог внутри стандартной структуры загрузок WordPress.

3. **Использование `wp_handle_upload_prefilter`**: Вместо изменения путей в `upload_dir` можно использовать хук `wp_handle_upload_prefilter`, если необходимо изменить поведение загрузки файлов до их сохранения.

В итоге, улучшенная версия вашей функции может выглядеть так:

```php
add_filter('upload_dir', 'custom_upload_dir_for_carbon_fields');
function custom_upload_dir_for_carbon_fields($upload) {
    // Проверяем, есть ли файл в массиве $_FILES и соответствует ли он полю Carbon Fields
    if (isset($_FILES['_crb_app_download_apk']) && $_FILES['_crb_app_download_apk']['tmp_name']) {
        // Устанавливаем новую папку для загрузки
        $custom_dir = 'source'; // Убираем начальный слеш
        
        // Создаем путь к новой директории
        $upload['path'] = $upload['basedir'] . '/' . $custom_dir;
        $upload['url'] = $upload['baseurl'] . '/' . $custom_dir;

        // Проверка, существует ли папка, если нет - создаем
        if (!file_exists($upload['path'])) {
            mkdir($upload['path'], 0755, true);
        }
    }
    return $upload;
}
```

### Важно:
- Убедитесь, что мета-ключи и названия в вашем Carbon Fields совпадают с тем, что используется в коде (`'_crb_app_download_apk'` должен быть корректен).
- После внесения изменений проверьте, работает ли загрузка как ожидалось. Возможно, вам придется очистить кэш или удалить старые записи в базе данных, если возникли проблемы с ранее загруженными файлами.
- В зависимости от настроек вашего сервера, возможно, потребуется удостовериться, что у Apache/Nginx есть разрешения на запись в созданную директорию.

Попробуйте данные изменения и проверьте, работает ли это так, как вам нужно.
Похожие вопросы