Добрый день. При разработке собственных тем, особенно если они подразумевают гибкую настройку оформления и активное использование графических элементов, я почти всегда сталкивался с проблемой медиафайлов. Ни для кого не секрет, что одни и те же шаблоны могут использоваться для создания сайтов разной тематики. А элементы оформления, при грамотном дизайне, должны поддерживать общую идею.

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

От проблемы до идеи и реализации

Если вы автор шаблонов, вы возможно, хотели бы сделать свои разработки более гибкими и мультифункциональными. Вы не одиноки 🙂 К примеру, в зарубежных платных шаблонах предоставляется «демо-контент». Создать сайт с нуля становится легче и быстрее. Это очень удобно для конечного пользователя.

Размышляя об этом, меня посетила идея реализации подобного функционала, но по ещё более упрощённой схеме. Если мы хотим предоставить пользователю, скажем дефолтные демонстрационные материалы, у нас есть как минимум два варианта. Первый — создать папку с медиафайлами и приложить её к файлам темы. Из неё пользователь сможет вручную загрузить материалы. Однако, такой подход создаст необходимость в документации. Мало вероятно, что пользователь догадается о предназначении этой папки. Давайте не будем заставлять его этим заниматься.

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

Для реализации второго способа я написал небольшую функцию, которую мы прикрепим к хуку after_switch_theme. Данный хук, в отличие от after_setup_theme срабатывает только один раз в момент активации темы. Код целиком ниже. Его необходимо разместить в начале файла function.php вашей темы.

/*
 * Action after switch theme
 */
function tutor_switch() {
	/*
	 * Download image to mediafiles
	 */
	$images = array( 'bg2.jpg', 'camera-min.png', 'microfon-min.png', 'music-min.png', 'radio-min.png' );
	$path = get_template_directory() . '/delete-after-setup-theme/';
	if ( $images && file_exists( $path ) ) {
		$dir = get_template_directory_uri() . '/delete-after-setup-theme/';
		foreach ( $images as $uri ) {
			$url = $dir . $uri;
			$file_array = array();

			require_once ABSPATH . 'wp-admin/includes/image.php';
			require_once ABSPATH . 'wp-admin/includes/file.php';
			require_once ABSPATH . 'wp-admin/includes/media.php';
			
			preg_match('/[^?]+\.(jpg|jpe|jpeg|gif|png)/i', $url, $matches);
			$file_array['name'] = basename($matches[0]);
			$file_array['tmp_name'] = download_url( $url );

			media_handle_sideload( $file_array, 0 );

			// delete time file
			@unlink( $file_array['tmp_name'] );
		}
		
		
		// delete dir with mediafiles
		if ( file_exists( $path ) ) {
			foreach ( glob( $path . '*' ) as $file ) {
				unlink( $file );
			}
			rmdir( $path );
		}
	}
}
add_action( 'after_switch_theme', 'tutor_switch' );

к содержанию ↑

Пояснения

Для работы данной функции вам необходимо создать папку с файлами, назвать её delete-after-setup-theme и разместить корневую папку темы. В массиве $images укажите названия всех файлов в папке по указанному образцу. Код получился довольно простым. Итак, при активации темы проверяется наличие массива с названиями картинок и существование папки, где они хранятся. Если всё в порядке, с помощью функции media_handle_sideload загружаем в библиотеку с медиафайлами. Так как у нас всё уже загружено, не будем занимать дисковое пространство, а просто удалим сначала файлы, а потом и папку. Теперь всё готово. Можно приступать к настройкам темы и использовать дефолтные изображения.

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