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

Как автоматически переименовывать медиа-файлы при вставке в пост | 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

Автор n-wp.ru — блога о WordPress для новичков.

Оцените автора
Добавить комментарий

  1. Ростислав

    НЕ РАБОТАЕТ

    Ответить
    1. tiaurus автор

      Попробуйте плагин File Renaming on upload.

      Ответить
      1. Ростислав

        Он тоже не работает, дело в том, что использую 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. tiaurus автор

          Работает и способ без плагинов и плагины. Не используйте wpgrabber.

          Ответить
  2. Ростислав

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

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

    Ответить
    1. tiaurus автор

      До: https://n-wp.ru/wp-content/uploads/2015/11/n-wp.ru_20151118231208.jpg
      После: https://n-wp.ru/wp-content/uploads/2015/11/n-wp.ru_20151118231215.jpg
      Во время загрузки имя файла изменяется по определенной маске.
      Самый простой способ — плагин File Renaming on upload (ссылка в моем комментарии выше).

      картинка загружается с “иероглифами”

      А у вас стоит плагин Cyr2Lat или подобный?

      Ответить
  3. Ростислав

    Напишите мне на почту, обсудим за доп. плату.

    Ответить
  4. Федор

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

    Ответить
    1. tiaurus автор

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

      Ответить