Вопрос или проблема
Я ретроактивно создаю пост с помощью wp_insert_post() и прикрепляю к нему изображение. Мне нужно, чтобы изображение помещалось в папку, соответствующую дате публикации поста.
Я использую параметр time в функции wp_handle_upload, который должен перемещать файлы в директории в соответствии со значением параметра (смотрите в коде – $upload_date – статическое значение на данный момент). Но сейчас изображение перемещается в папку текущего года/месяца, игнорируя $upload_date (Пример: Должно быть 2007/11, а идет в 2012/12).
$output_dir = $uploads['path'];
new_filepath = $output_dir."https://wordpress.stackexchange.com/".$file;
// ВСТАВКА ПОСТА И ПОЛУЧЕНИЕ ID ПОСТА
$my_post_id = wp_insert_post($my_post);
// Копирование изображения из моей папки в WP Uploads
rename($filename,$new_filepath);
// необходимо для wp_handle_upload() для загрузки файла
$upload_overrides = array( 'test_form' => FALSE );
$upload_date="2007/11"; // Использую эту дату для тестирования
$movefile = wp_handle_upload( $new_filepath, $upload_overrides, $upload_date );
$wp_filetype = wp_check_filetype(basename($new_filepath), null );
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => $post_title,
'post_content' => $post_content,
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment( $attachment, $new_filepath, $my_post_id );
$attach_data = wp_generate_attachment_metadata( $attach_id, $new_filepath );
wp_update_attachment_metadata( $attach_id, $attach_data );
// ДОБАВИТЬ ИЗОБРАЖЕНИЕ В ПУБЛИКАЦИЮ
add_post_meta($my_post_id, '_thumbnail_id', $attach_id);
Перед копированием файлов (rename()
) в конечное место назначения я устанавливаю параметр time для wp_upload_dir()
(вместо попытки заставить wp_handle_upload()
передать его), и теперь файлы перемещаются в соответствующие директории.
$uploads = wp_upload_dir( $upload_date );
$output_dir = $uploads[ 'path' ];
rename( $filename, $new_filepath );
Ответ или решение
Чтобы организовать загруженные медиафайлы в WordPress по параметру времени, необходимо правильно использовать функции wp_insert_post()
и wp_handle_upload()
. В вашем случае, проблема заключается в том, что загружаемое изображение помещается в текущую директорию года/месяца, а вам нужно разместить его в папке, соответствующей дате публикации поста.
Вот как можно решить вашу задачу:
-
Прежде всего, для изменения пути загрузки файлов, вы должны использовать функцию
wp_upload_dir()
с нужной датой. Это позволит вам указать папку, в которую следует переместить файл. -
Затем вам необходимо использовать путь, возвращаемый этой функцией, при загрузке файла. Ниже представлен обновленный пример кода.
// Определение даты публикации
$upload_date = '2007/11'; // Задайте нужную дату для тестирования
// Получение директории загрузки на основе заданной даты
$uploads = wp_upload_dir($upload_date);
$output_dir = $uploads['path']; // Папка назначения
$new_filepath = $output_dir . '/' . basename($filename); // Новый путь файла
// Вставка поста и получение ID
$my_post_id = wp_insert_post($my_post);
// Переименование загружаемого файла в новый путь
if (rename($filename, $new_filepath)) {
// Если переименование прошло успешно, обрабатываем загрузку
$wp_filetype = wp_check_filetype(basename($new_filepath), null);
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => $post_title,
'post_content' => $post_content,
'post_status' => 'inherit'
);
// Вставка вложения
$attach_id = wp_insert_attachment($attachment, $new_filepath, $my_post_id);
// Генерация метаданных для вложения
$attach_data = wp_generate_attachment_metadata($attach_id, $new_filepath);
wp_update_attachment_metadata($attach_id, $attach_data);
// Установка изображения как миниатюры
add_post_meta($my_post_id, '_thumbnail_id', $attach_id);
} else {
// Обработка ошибки, если переименование не удалось
error_log('Ошибка перемещения файла: ' . $filename);
}
Объяснение ключевых шагов:
-
Получение директории загрузки: Сначала мы исполняем
wp_upload_dir($upload_date)
, что обеспечивает получение пути, основанного на заданной дате, а не текущей. -
Переименование файла: Мы используем
rename()
для перемещения файла в папку, полученную ранее, что гарантирует, что файл будет находиться в нужной директории. -
Вставка вложения: Используйте
wp_insert_attachment()
для добавления медиафайла в базу данных WordPress. -
Обновление метаданных: После добавления вложения, важно сгенерировать метаданные и обновить их с помощью
wp_update_attachment_metadata()
.
Теперь ваш код будет правильно организовывать загруженные медиафайлы по дате, что решает проблему размещения изображений в папке, соответствующей дате публикации поста.