Ваша функция для изменения каталога загрузки медиафайлов почти правильная, но есть несколько моментов, которые можно улучшить и исправить, чтобы она работала корректно при использовании 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 есть разрешения на запись в созданную директорию.
Попробуйте данные изменения и проверьте, работает ли это так, как вам нужно.