Как можно изменить путь, по которому сохраняются фотографии в WordPress?

Я знаю, что можно добавить фильтр для настройки директории загрузки: 
<pre><code class="php">function custom_upload_dir( $uploads ) {
    $time = current_time( 'mysql' );
    $uploads['subdir'] = '/' . substr( $time, 0, 4 ) . '/' . substr( $time, 5, 2 ) . '/' . substr( $time, 8, 2 );
    $uploads['path'] = $uploads['basedir'] . $uploads['subdir'];
    $uploads['url'] = $uploads['baseurl'] . $uploads['subdir'];
    return $uploads;
}</code></pre> 
Однако проблема заключается в том, что используется текущее время, тогда как мне нужно, чтобы использовалась дата загрузки, которую я передаю скриптом Python. Я нашел информацию об обходных путях, связанных с привязкой к посту, но это для меня не подходит. Как можно решить эту задачу?
  • 4 сентября 2024 г. 21:52
Ответы на вопрос 2
Чтобы изменить путь, по которому сохраняются фотографии в WordPress, используя заранее определённую дату загрузки, вам нужно будет установить фильтр `upload_dir` и настроить его основываясь на переданной дате. Вместо использования `current_time()`, вы можете обработать дату, которую вы получаете из вашего скрипта на Python.

Ниже приведённый код позволит вам настроить путь загрузки с использованием даты, которую вы передаете. Вам нужно будет убедиться, что форматированная дата является корректной, и её можно разбить на компоненты (год, месяц и день):

```php
function custom_upload_dir( $uploads ) {
    // Предположим, что вы передаете дату в формате 'YYYY-MM-DD' через параметры запроса
    if ( isset( $_GET['upload_date'] ) ) {
        $upload_date = sanitize_text_field( $_GET['upload_date'] ); // Экранируем входные данные

        // Проверяем, что дата в правильном формате
        if ( preg_match( '/^\d{4}-\d{2}-\d{2}$/', $upload_date ) ) {
            $year = substr( $upload_date, 0, 4 );
            $month = substr( $upload_date, 5, 2 );
            $day = substr( $upload_date, 8, 2 );

            // Изменяем подкаталог на основе переданной даты
            $uploads['subdir'] = '/' . $year . '/' . $month . '/' . $day;
            $uploads['path'] = $uploads['basedir'] . $uploads['subdir'];
            $uploads['url'] = $uploads['baseurl'] . $uploads['subdir'];
        }
    }

    return $uploads;
}
add_filter( 'upload_dir', 'custom_upload_dir' );
```

### Объяснение кода:
1. **Извлечение даты:** Мы извлекаем дату загрузки из параметров запроса (например, при использовании скрипта на Python) и очищаем её с помощью `sanitize_text_field()`.
2. **Проверка формата:** Используем регулярное выражение, чтобы убедиться, что дата передана в формате "YYYY-MM-DD".
3. **Разбиение даты:** Извлекаем год, месяц и день из переданной даты.
4. **Обновление пути:** Обновляем подкаталог загрузки на основе переданной даты, создавая нужные директории для хранения загружаемых фотографий.
5. **Добавление фильтра:** Применяем фильтр `upload_dir`, чтобы изменения вступили в силу при загрузке файлов.

### Примечания:
- Убедитесь, что ваша система правильно обрабатывает и передает параметр `upload_date`; вам нужно будет вызывать загрузку через URL, например: `your-site.com/wp-admin/async-upload.php?upload_date=2023-10-15`.
- В этом примере конфигурация не учитывает случаи, когда дата не передана или передана в неправильном формате — вы можете добавить обработку ошибок в своем коде по необходимости. 
- Убедитесь, что у вас есть права на создание папок на сервере в указанном месте.
Файлы можно загружать на сервер мимо ВП, после чего регистрировать их в медиатеке с помощью wp_insert_attachment .
Похожие вопросы