Как автоматически переименовывать медиа-файлы при вставке в пост

Как автоматически переименовывать медиа-файлы при вставке в пост | n-wp.ru

Некоторые вебмастера не уделяют достаточно внимания названиям файлов, закачиваемых в блог. Конечно, ничего страшного в этом нет, и всегда можно задать заголовок, текст, подпись и описание файла в библитеке. Однако физические имя закачанного файла останется прежним. Со временем в блоге накопится достаточно файлов с ни о чем не говорящими названиями IMG05XX или 120204-01, по которым трудно ориентироваться. Чтобы привести в порядок названия файлов, можно воспользоваться кодом, автоматически переименовывающим файлы при их добавлении в пост.

Как автоматически переименовывать медиа-файлы при вставке в пост

Для этого нужно вставить в файл functions.php используемой вами темы:

function mfrh_media_send_to_editor($html, $attachment_id, $attachment) {
$post =& get_post($attachment_id);
if ( substr($post->post_mime_type, 0, 5) == 'image' ) {
$url = wp_get_attachment_url($attachment_id);
$align = !empty($attachment['align']) ? $attachment['align'] : 'none';
$size = !empty($attachment['image-size']) ? $attachment['image-size'] : 'medium';
$alt = !empty($attachment['image_alt']) ? $attachment['image_alt'] : '';
$rel = ( $url == get_attachment_link($attachment_id) );
return get_image_send_to_editor($attachment_id, $attachment['post_excerpt'], $attachment['post_title'], $align, $url, $rel, $size, $alt);
}
return $html;
}
function mfrh_attachment_fields_to_save( $post, $attachment ) {
$sanitized_media_title = sanitize_title( $attachment['post_title'] );
if ( $post['post_name'] == $sanitized_media_title || empty( $sanitized_media_title ) ) {
return $post; 
}
$old_filepath = get_attached_file( $post['ID'] ); 
$path_parts = pathinfo( $old_filepath );
$directory = $path_parts['dirname']; 
$old_filename = $path_parts['basename']; 
$ext = str_replace( 'jpeg', 'jpg', $path_parts['extension'] ); 
$media_library_mode = !isset($attachment['image-size']);
$new_filename = strtolower( wp_unique_filename( $directory, $sanitized_media_title . '.' . $ext ) );
$new_filepath = $directory . '/' . $new_filename ; 
if ( file_exists( $new_filepath ) === true ) {
trigger_error( "Media File Renamer wants to rename a file to " + $new_filepath + " but it already exists.", E_USER_NOTICE );
return $post;
}
$noext_old_filename = str_replace( '.' . $ext, '', $old_filename );
$noext_new_filename = str_replace( '.' . $ext, '', $new_filename );
$post['old_filename'] = $noext_old_filename;
$post['new_filename'] = $noext_new_filename;
$original_filename = get_post_meta( $post['ID'], '_original_filename', true );
if ( empty( $original_filename ) )
add_post_meta( $post['ID'], '_original_filename', $old_filename );
rename( $old_filepath, $new_filepath );
$meta = wp_get_attachment_metadata( $post['ID'] );
$meta['file'] = str_replace( $noext_old_filename, $noext_new_filename, $meta['file'] );
$meta["url"] = str_replace( $noext_old_filename, $noext_new_filename, $attachment['url'] );
$article = "";
if ( $media_library_mode && !empty($post['post_parent']) ) {
$article = get_post( $post['post_parent'] );
$article->post_content = str_replace( $old_filename, $new_filename, $article->post_content );
}
foreach ( $meta['sizes'] as $size => $meta_size ) {
$meta_old_filename = $meta['sizes'][$size]['file'];
$meta_old_filepath = $directory . '/' . $meta_old_filename;
$meta_new_filename = str_replace( $noext_old_filename, $noext_new_filename, $meta_old_filename );
$meta_new_filepath = $directory . '/' . $meta_new_filename;
if ( file_exists($meta_old_filepath) && ((!file_exists($meta_new_filepath)) || is_writable($meta_new_filepath)) ) {
rename($meta_old_filepath, $meta_new_filepath);
$meta['sizes'][$size]['file'] = $meta_new_filename;
}
if ( $media_library_mode && !empty( $article ) ) {
$article->post_content = str_replace( $meta_old_filename, $meta_new_filename, $article->post_content );
}	
}
wp_update_attachment_metadata( $post['ID'], $meta );
update_attached_file( $post['ID'], $new_filepath );
$post['post_name'] = $sanitized_media_title;
$post['guid'] = $meta["url"];
wp_update_post( $post );
if ( $media_library_mode && !empty( $article ) ) {
wp_update_post( $article );
}
if ( isset( $_REQUEST['_wp_original_http_referer'] ) && strpos( $_REQUEST['_wp_original_http_referer'], '/wp-admin/' ) === false ) {
$_REQUEST['_wp_original_http_referer'] = get_permalink( $post['ID'] );
}
return $post;
}
add_filter( 'attachment_fields_to_save', 'mfrh_attachment_fields_to_save', 1, 2 );
add_filter( 'media_send_to_editor', 'mfrh_media_send_to_editor', 20, 3 );

Эти две функции автоматически переименовывают файлы, вставляемые в посты, при их сохранении. Новые имена формируются по названию постов. Если стоит плагин Cyr2Lat, то имена файлов формуются латиницей. Если кому-то не нравится автоматический способ формирования названия, то можно воспользоваться плагином Faster Image Insert. Он умеет переименовывать по заданной маске сразу все файлы, добавленные в пост, пронумеровывая их по порядку.

Автор tiaurus 2182 Articles
Являюсь создателем n-wp.ru — блога о WordPress для новичков. Мне интересно многое, поэтому еще я сделал 123-box.ru — блог о программах для Windows, и tiaurus.info — блог о красоте.

9 Комментарии

      • Он тоже не работает, дело в том, что использую wpgrabber 2.1.1 и нужно:
        найти решения, а именно переименования изображений,
        например из
        site.ru/wp-content/uploads/2015/11/a77d867ecd27b9bb1389a8cb4860534c.jpg
        НА
        site.ru/wp-content/uploads/2015/11/name-iz-zagolovka.jpg
        Я использую wpgrabber 2.1.1, картинка загружается с “иероглифами”, а нужно что
        бы брало из заголовка статьи, и переименовало изображения автоматически.

  1. можете показать до и после? если он работает!

    И я вставлял код, у меня не работает, может поможете мне или хоть покажите пример

  2. Приветствую! Подскажите как пакетно (массово) изменить уже загруженные картинки, а именно интересует “отражение по вертикали”.

    • Не уверен, что это тривиальная задача для встроенного редактора изображений. Как вариант, можно скачать всю папку uploads, изменить все изображения в ней с помощью офлайновой программы, не изменяя расположения, названия и формата файлов, а потом закачать папку uploads с измененными файлами поверх старой. Так даже быстрее будет, да и безопаснее (можно создать резервную копию исходных файлов).

Оставить комментарий

Ваш электронный адрес не будет опубликован.


*