Пользователь
0,0
рейтинг
8 октября 2014 в 12:27

Разработка → Создание шаблона для WordPress из песочницы

В этой статье мы создадим простой минимальный шаблон для WordPress. Для начала я хочу заметить, что есть два варианта написания шаблонов для WordPress. Если вы хотите внести изменения в уже существующий шаблон, дополнить его или изменить функциональность, то самым простым вариантом будет создание дочернего шаблона. Такой шаблон может состоять всего из одного файла css, объявляющего стили новой темы, а все остальные файлы будут взяты из родительской темы. Это самый лучший вариант для создания новых шаблонов для новичков, а так же в том случае, если тема является модификацией существующей, потому что таким образом можно избежать ошибок и создать действительно корректно работающий шаблон. Темы WordPress должны отвечать всем требованиям, заявленным в кодексе, и одно из этих требований звучит так: весь код в тему должен добавляться осмысленно.

Создание дочерней темы


Для этого в директории с темами создайте папку с названием новой темы, а внутри нее файл style.css. Для того, чтобы тема заработала, необходимо оформить комментарий в начале этого файла. Вот пример заголовка для темы, которая будет дочерней для стандартной темы Twenty Fourteen:

/*
 Theme Name:   Twenty Fourteen Child
 Theme URI:    http://example.com/twenty-fourteen-child/
 Description:  Twenty Fourteen Child Theme
 Author:       John Doe
 Author URI:   http://example.com
 Template:     twentyfourteen
 Version:      1.0.0
 Tags:         light, dark, two-columns, right-sidebar, responsive-layout, accessibility-ready
 Text Domain:  twenty-fourteen-child
*/

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

Создание темы с нуля


Мы создадим тему, состоящую всего из двух файлов:
  • style.css
  • index.php


Файл стилей

В этом файле необходимо корректно заполнить заголовок, именно из этого файла WordPress узнает всю информацию о новой теме:
  • Theme Name — название новой темы. Для размещения на wordpress.org оно должно быть уникальным среди всех тем этого сайта, написано на английском и не содержать слов 'theme', 'WordPress' или рекламы.
  • Theme URI — адрес сайта темы. Должна указывать на страницу или сайт, посвященный данной теме.
  • Description — описание темы.
  • Author — имя разработчика.
  • Author URI — сайт разработчика.
  • Version — версия.
  • Tags — ключевые слова, используемые в фильтре поиска сайта wordpress.org.
  • Text Domain — используется для перевода, имя темы с заменой пробелов на '-'.
  • License: GNU General Public License v2 or later. — все темы WordPress как и она сама лицензированы GPL лицензией.
  • License URI: — лицензия указывается ссылкой или файлом.


В итоге получим следующий комментарий:

/*
Theme Name: Simplest Site
Author: Sam Gold
Description: The 2014 simplest theme for WordPress.
Version: 1.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: black
Text Domain: simplest-site

This theme, like WordPress, is licensed under the GPL.
Use it to make something cool, have fun, and share what you've learned with others.
*/

Комментарий всегда размещается в начале файла style.css.

Файл index.php

Единственным файлом нашей самой простой темы будет index.php. Когда WordPress хочет отобразить ту или иную страницу сайта, она ведет поиск подходящего шаблона, начиная с самого специфического для данного вида контента. Скажем, в данный момент пользователь зашел на страницу сайта, тогда WordPress проверит, есть ли шаблон с названием page-ID.php, где ID — уникальный идентификатор страницу, не найдя этот файл, она проверит наличие файла <page.php>, если и его нет, то она обратится к файлу Index.php, лежащему в корне всей иерархии шаблонов WordPress. Названий шаблонов достаточно много, я не стану их перечислять, если интересно, вы можете посмотреть полный список в кодексе. Весь код нашей темы будет содержаться в одном единственном файле и этот файл будет отображать страницы, записи, результаты поиска и все архивы. Этот шаблон сделан с целью обучения, чтобы показать как выглядит самая простая тема WordPress, состоящая из двух файлов.

Итак, файл начинается с комментария в стиле стандартных тем:

<?php
/**
 * Файл Index.php
 *
 *
 * Отображает страницы сайта, работающего на WordPress
 *
 * @package WordPress
 * @subpackage Simplest_Site
 * @since Simplest Site 1.0
 */
?>

Здесь мы указываем назначение шаблона и версию.
Далее идет информация, которая обычно размещается в шапке сайта, доктайп и мета теги:

<!DOCTYPE html>
<!--[if IE 7]>
<html class="ie ie7" <?php language_attributes(); ?>>
<![endif]-->
<!--[if IE 8]>
<html class="ie ie8" <?php language_attributes(); ?>>
<![endif]-->
<!--[if !(IE 7) | !(IE 8) ]><!-->
<html <?php language_attributes(); ?>>
<!--<![endif]-->
<head>
	<meta charset="<?php bloginfo( 'charset' ); ?>">
	<meta name="viewport" content="width=device-width">
	<title><?php wp_title( '|', true, 'right' ); ?></title>
	<link rel="profile" href="http://gmpg.org/xfn/11">
	<link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>">
	<link rel='stylesheet' id='main-style'  href='<?php echo get_stylesheet_uri(); ?>' type='text/css' media='all' />
	<?php wp_head(); ?>
</head>

Пути к js и css файлам мы не прописываем вручную, вместо этого необходимо пользоваться функциями WordPress, ведь эти url изменяются на разных сайтах. Перед тегом идет объявление обязательного хука wp_head, если этого не сделать, то большинство плагинов не сможет работать с этим шаблоном.

Цепляем к body классы:

<body <?php body_class(); ?>>

Следующая секция кода выведет шапку. Здесь мы покажем название сайта, которое пользователь вводит в персонализаторе темы WordPress, форму поиска и основное меню:

<div id="page" class="hfeed site">

	<!-- Шапка -->
	<header id="masthead" class="site-header" role="banner">
		<!-- Название сайта -->
		<h1 class="site-title"><a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a></h1>
		<div id="search-container">
			<div class="search-box">
				<?php get_search_form(); ?>
			</div>
		</div>
		<!-- Меню -->
		<nav id="primary-navigation" class="site-navigation" role="navigation">
			<?php wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu' ) ); ?>
		</nav>
	</header><!-- #masthead -->


Далее необходимо показать контент сайта. Это происходит в цикле WordPress, она отдает нам всю информацию, относящуюся к запрошенному пользователем url адресу. Начало цикла:

			<?php while ( have_posts() ) : the_post(); ?>

Внутри этого цикла мы имеем полный доступ к информации, относящейся к текущей записи, для обращения к ней пользуемся стандартными функциями WordPress.
Эта строка выведет классы, относящиеся к текущей записи и ее ID:

				<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

А в следующей выполняются проверки: является ли текущая страница избранной и в тоже время находимся ли мы на странице списка всех записей и не разделен ли она на много страниц:

					<?php if ( is_sticky() && is_home() && ! is_paged() ) : ?>

Дело в том, что в WordPress есть возможность прилепить запись в начале при отображении списка всех страниц и эту возможность каждая тема должна поддерживать, избранную запись нужно выделить как-то, поэтому эти строки нам необходимы в шаблонов WordPress. Далее мы выделяем ее:

					<div class="featured-post">
						<?php _e( 'Избранная запись'); ?>
					</div>

Этот вариант темы не поддерживает перевод, а все слова я пишу просто по-русски. Так делать не стоит. Функция _e() предназначена для перевода фраз на другой язык, вторым параметром ей задается идентификатор, который предварительно связывается с файлом перевода, обычно это происходит в файле functions.php, которого у нас просто нет.
Вернемся к нашему шаблону, дальше мы выводим заголовок записи, если это единичная страница или запись, просто покажем его, иначе сделаем из него ссылку на страницу, а затем выведем список всех категорий и меток, которые связаны с данной записью:

					<header class="entry-header">
						<!-- Если это запись -->
						<?php if ( is_single() || is_sticky() ) : ?>
						<h1 class="entry-title"><?php the_title(); ?></h1>
						<?php else : ?>
						<h1 class="entry-title">
							<a href="<?php the_permalink(); ?>" rel="bookmark"><?php echo get_the_title(); ?></a>
						</h1>
						<?php endif; ?>
						
						<?php echo get_the_category_list(); ?>
						<?php echo get_the_tag_list('', ', ');?>
						
					</header><!-- .entry-header -->

Теперь настала пора показать контент. Для результатов поиска будем выводить только краткое описание. А если страница разделена на несколько, то покажем и навигацию по страничкам:

					<?php if ( is_search() ) : // Показывать только краткое описание записи, если это результаты поиска?>
					<div class="entry-summary">
						<?php the_excerpt(); ?>
					</div><!-- .entry-summary -->
					<?php else : ?>
					<div class="entry-content">
						<?php the_content( __( 'Читатать дальше.. <span class="meta-nav">→</span>') ); ?>
						<?php wp_link_pages( array( 'before' => '<div class="page-links">' . __( 'Страницы:'), 'after' => '</div>' ) ); ?>
					</div><!-- .entry-content -->
					<?php endif; ?>

В конце страницы выведем дату публикации и имя автора, а также ссылку на редактирование записи, которая будет отображаться для зарегистрированного пользователя с правами на изменение записи:

					<footer class="entry-meta">

						<?php printf(
							 __( 'Эта запись была опубликована %1$s автором %2$s.' ),
							esc_html( get_the_date() ),
							esc_html( get_the_author() )
						);	
						?>
						<?php edit_post_link( __( 'Редактировать', '' ), '<span class="edit-link">', '</span>' ); ?>
						
					</footer><!-- .entry-meta -->

Конец цикла:

				</article><!-- #post -->
			<?php endwhile; ?>
			<!-- Конец цикла WordPress -->

Покажем постраничную навигацию:

			<?php if ( $wp_query->max_num_pages > 1 ) : ?>
				<nav id="nav-below">
					<div class="nav-previous"><?php next_posts_link( __( '<span class="meta-nav">←</span> Предыдущая запись' ) ); ?></div>
					<div class="nav-next"><?php previous_posts_link( __( 'Следующая запись <span class="meta-nav">→</span>' ) ); ?></div>
				</nav><!-- #nav-below .navigation -->
			<?php endif; ?>

Далее идет кусочек кода, отображающий информацию в том случае, если страниц в блоге нет или результаты поиска ничего не дали:

		<!-- Записей для отображения нет, тогда выводим сообщение об этом -->
		<?php else : ?>

			<article class="not-found">

			<?php if ( current_user_can( 'edit_posts' ) ) : ?>
				<header class="entry-header">
					<h1 class="entry-title"><?php _e( 'Нет записей для отображения.', '' ); ?></h1>
				</header>

				<div class="entry-content">
					<p><?php printf( __( 'Готовы опубликовать свою первую запись? <a href="%s">Get started here</a>.'), admin_url( 'post-new.php' ) ); ?></p>
				</div><!-- .entry-content -->

			<?php else : ?>
				<header class="entry-header">
					<h1 class="entry-title"><?php _e( 'Ничего не найдено'); ?></h1>
				</header>

				<div class="entry-content">
					<p><?php _e( 'Ничего не найдено, воспользуйтесь поиском.'); ?></p>
					<?php get_search_form(); ?>
				</div><!-- .entry-content -->
			<?php endif; ?>

			</article><!--.not-found -->

		<?php endif; // конец have_posts() проверки ?>

Ну и подвал, где мы покажем традиционную ссылку на официальный сайт WordPress:

		</div><!-- .site-content -->
		<div class="clear"></div>

	<!-- Подвал сайта -->
		<footer id="colophon" class="site-footer">
			<div class="site-info">
				<a href="<?php echo esc_url( __( 'http://wordpress.org/' ) ); ?>"><?php printf( __( 'Сайт работает на %s' ), 'WordPress' ); ?></a>
			</div><!-- .site-info -->
		</footer><!-- #colophon -->
	</div><!-- #page -->

	<?php wp_footer(); ?>
</body>
</html>

Здесь, в самом конце сайта, объявлен хук wp_footer, это объявление крайне необходимо и используется плагинами, например, для подгрузки скриптов.
Весь файл полностью:

<?php
/**
 * Файл Index.php
 *
 *
 * Отображает страницы сайта, работающего на WordPress
 *
 * @package WordPress
 * @subpackage Simplest_Site
 * @since Simplest Site 1.0
 */
?>
<!DOCTYPE html>
<!--[if IE 7]>
<html class="ie ie7" <?php language_attributes(); ?>>
<![endif]-->
<!--[if IE 8]>
<html class="ie ie8" <?php language_attributes(); ?>>
<![endif]-->
<!--[if !(IE 7) | !(IE 8) ]><!-->
<html <?php language_attributes(); ?>>
<!--<![endif]-->
<head>
	<meta charset="<?php bloginfo( 'charset' ); ?>">
	<meta name="viewport" content="width=device-width">
	<title><?php wp_title( '|', true, 'right' ); ?></title>
	<link rel="profile" href="http://gmpg.org/xfn/11">
	<link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>">
	<link rel='stylesheet' id='main-style'  href='<?php echo get_stylesheet_uri(); ?>' type='text/css' media='all' />
	<?php wp_head(); ?>
</head>

<body <?php body_class(); ?>>
<div id="page" class="hfeed site">

	<!-- Шапка -->
	<header id="masthead" class="site-header" role="banner">
		<!-- Название сайта -->
		<h1 class="site-title"><a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a></h1>
		<div id="search-container">
			<div class="search-box">
				<?php get_search_form(); ?>
			</div>
		</div>
		<!-- Меню -->
		<nav id="primary-navigation" class="site-navigation" role="navigation">
			<?php wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu' ) ); ?>
		</nav>
	</header><!-- #masthead -->
	<div class="site-content"> 
		<!-- Начало цикла WordPress -->
		<?php if ( have_posts() ) : ?>
			<?php while ( have_posts() ) : the_post(); ?>
				<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
					<?php if ( is_sticky() && is_home() && ! is_paged() ) : ?>
					<div class="featured-post">
						<?php _e( 'Избранная запись' ); ?>
					</div>
					<?php endif; ?>
					<header class="entry-header">
						<!-- Если это запись -->
						<?php if ( is_single() || is_sticky() ) : ?>
						<h1 class="entry-title"><?php the_title(); ?></h1>
						<?php else : ?>
						<h1 class="entry-title">
							<a href="<?php the_permalink(); ?>" rel="bookmark"><?php echo get_the_title(); ?></a>
						</h1>
						<?php endif; ?>
						
						<?php echo get_the_category_list(); ?>
						<?php echo get_the_tag_list('', ', ');?>
						
					</header><!-- .entry-header -->

					<?php if ( is_search() ) : // Покаывать только краткое описание записи, если это результаты поиска?>
					<div class="entry-summary">
						<?php the_excerpt(); ?>
					</div><!-- .entry-summary -->
					<?php else : ?>
					<div class="entry-content">
						<?php the_content( __( 'Читатать дальше.. <span class="meta-nav">→</span>') ); ?>
						<?php wp_link_pages( array( 'before' => '<div class="page-links">' . __( 'Страницы:'), 'after' => '</div>' ) ); ?>
					</div><!-- .entry-content -->
					<?php endif; ?>

					<footer class="entry-meta">

						<?php printf(
							 __( 'Эта запись была опубликована %1$s автором %2$s.' ),
							esc_html( get_the_date() ),
							esc_html( get_the_author() )
						);	
						?>
						<?php edit_post_link( __( 'Редактировать', '' ), '<span class="edit-link">', '</span>' ); ?>
						
					</footer><!-- .entry-meta -->
				</article><!-- #post -->
			<?php endwhile; ?>
			<!-- Конец цикла WordPress -->

			<?php if ( $wp_query->max_num_pages > 1 ) : ?>
				<nav id="nav-below">
					<div class="nav-previous"><?php next_posts_link( __( '<span class="meta-nav">←</span> Предыдущая запись') ); ?></div>
					<div class="nav-next"><?php previous_posts_link( __( 'следующая запись <span class="meta-nav">→</span>') ); ?></div>
				</nav><!-- #nav-below .navigation -->
			<?php endif; ?>
			
		<!-- Записей для отображения нет, тогда выводим сообщение об этом -->
		<?php else : ?>

			<article class="not-found">

			<?php if ( current_user_can( 'edit_posts' ) ) : ?>
				<header class="entry-header">
					<h1 class="entry-title"><?php _e( 'Нет записей для отображения.', '' ); ?></h1>
				</header>

				<div class="entry-content">
					<p><?php printf( __( 'Готовы опубликовать свою первую запись? <a href="%s">Тогда перейдите по этой ссылке.</a>.'), admin_url( 'post-new.php' ) ); ?></p>
				</div><!-- .entry-content -->

			<?php else : ?>
				<header class="entry-header">
					<h1 class="entry-title"><?php _e( 'Ничего не найдено'); ?></h1>
				</header>

				<div class="entry-content">
					<p><?php _e( 'Ничего не найдено, воспользуйтесь поиском.'); ?></p>
					<?php get_search_form(); ?>
				</div><!-- .entry-content -->
			<?php endif; ?>

			</article><!--.not-found -->

		<?php endif; // конец have_posts() проверки ?>

		</div><!-- .site-content -->
		<div class="clear"></div>

	<!-- Подвал сайта -->
		<footer id="colophon" class="site-footer">
			<div class="site-info">
				<a href="<?php echo esc_url( __( 'http://wordpress.org/' ) ); ?>"><?php printf( __( 'Сайт работает на %s' ), 'WordPress' ); ?></a>
			</div><!-- .site-info -->
		</footer><!-- #colophon -->
	</div><!-- #page -->

	<?php wp_footer(); ?>
</body>
</html>


Окончательный вид шаблона

Я дополнила файл style.css несколькими строчками, чтобы придать шаблону внешний вид, похожий на сайт. Вот что из этого вышло:
image

Исходный css:

/*
Theme Name: Simplest Site
Author: Sam Gold
Description: The 2014 simplest theme for WordPress.
Version: 1.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: black
Text Domain: simplest-site

This theme, like WordPress, is licensed under the GPL.
Use it to make something cool, have fun, and share what you've learned with others.
*/
body {
	background-color: #000;
	min-width: 600px;
}
a {
	color: #199999;
}
a:hover {
	color: red;
}
.site {
	background-color: #eee;
	border: 3px double #fff;
	margin: 20px auto;
	width: 90%;
}
.site-title {
	border-bottom: 1px solid #555;
	padding-bottom: 10px;
	text-align: center;
}
.search-box {
	border-bottom: 1px solid #555;
	padding-bottom: 20px;
}
#masthead {
	background-color: #111;
	border-right: 1px solid #000;
	color: #ddd;
	display: inline-block;
	float: left;
	margin: 0 auto;
	width: 300px;
}
#masthead a {
	color: #fff;
}
#masthead a:hover {
	color: #bbb;
}
#colophon {
	background-color: #000;
	display: block;
	padding: 20px;
	text-align: center;
}	
.site-content {
	border: none;
	margin-left: 300px;
	padding: 20px;
}
.clear {
	clear: both;
}
.nav-previous {
	float: left;
	padding: 10px 0;
	width: 50%;
}
.nav-next {
	float: right;
	padding: 10px 0;
	text-align: right;
	width: 50%;
}

Примечание: файл css не является законченным, а используется только как пример.

Чего в этом шаблоне нет

  • Произвольного заголовка.
  • Произвольного фона.
  • Миниатюры записи.
  • Поддержки перевода на другие языки.
  • Стилей для редактора TinyMCE.
  • Сайдбаров для виджетов.
  • Самих виджетов.
  • Иерархических меню.
  • Дополнительных опций для персонализатора тем WordPress.
  • Произвольных таксономий.
  • Шрифтов Google.
  • Различных форматов для записей.
  • Дополнительных шаблонов для страниц.
  • RSS.
  • Комментариев.
  • Хуков WordPress.

Это некоторые из возможностей, которые может включать тема WordPress, которые сразу приходят на ум. Наш шаблон очень простой и много не использует, но с чего-то надо начинать, а этот шаблон пишется с нуля и предназначен скорее для изучения WordPress, чем для использования в исходном варианте. Взяв эту тему за основу мы увидим, что да, шаблон WordPress действительно может состоять всего из двух файлов, далее, осознав для чего нам нужно добавить те или иные возможности, изменяем шаблон в соответствии со своими потребностями или желаниями. Для того, чтобы понять что и как происходит внутри WordPress необходимо ознакомиться с концепцией хуков. Эти хуки объявляются в исходных кодах WordPress и активно используются темами и плагинами, поиск нужных функций, действий и фильтров ведется в основном в исходниках WordPress, сама она является системой с открытым кодом и разрабатывается добровольцами. Любой желающий может присоединиться к команде по разработке WordPress сделав, например, новый шаблон и разместив его на сайте wordpress.org.

Примечание


Если у вас есть замечания или дополнения по этому материалу, то я буду рада услышать их в комментариях к этой статье.

При создании шаблона был использован исходный код стандартных тем WordPress.
@layka
карма
–1,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (68)

  • +2
    Рекомендую для этих целей использовать underscores.me/ — вводим название темы и качаем архив с полноценным каркасом темы, остается подкорректировать разметку и написать css.
    Есть еще более продвинутые (и менее «чистые») скелетоны themble.com/bones/ и roots.io/starter-theme/ (на базе bootstrap).
    • 0
      О, спасибо, еще несколько полезных тем в копилку. На офсайте также можно найти Customizr, Responsive — это из тех, что вспоминаются навскидку.
    • 0
      Спасибо, интересное мнение.

      Я придерживаюсь концептуально других взглядов.
      • +1
        Для целей обучения может есть смысл писать тему «с нуля», но для реальных проектов — это просто нецелесообразно по времени, а иногда и вредно, потому что можно упустить некоторые с виду необязательные куски кода, но без которых могут не работать некоторые плагины.
        В конце концов, смысл использования CMS — это в первую очередь экономия времени, правда ведь?
        • 0
          Тут такой вопрос. Если вы реально делаете не первую тему, то вы можете пользоваться своими наработками, понимая, что там и зачем. Тогда на создание последующих шаблонов будет уходить меньше времени, потому что вы уже не будете писать код на клавиатуре, вместо этого вы копируете нужные файлы и редактируете их так, как вам требуется. Если абстрагироваться от деления на кусочки, то можно представить шаблон wp как вот этот файл index.php (в него надо добавить вывод картинок и комментарии для полноты) и файл functions.php, где объявляются функции темы. Последний файл как раз не получится просто скопировать, потому что в него включены все параметры темы, его необходимо писать. Например вот эта строка:
          if ( ! isset( $content_width ) )
          	$content_width = 660;
          

          Ее нельзя создать автоматически, потому что она зависит от css темы, ведь правда?
          Или размер картинки:

          set_post_thumbnail_size( 465, 9999 ); 
          


          Вы его задаете именно таким, чтобы он совпадал с отображаемым.
          То есть, я хочу сказать, что все строчки в файле functions.php имеют смысл, их не копируют, а через них задаются параметры темы.

          Вы говорите, что если что-то сделать не так, то плагины не будут работать. А вот я думаю, что если есть два хука в нужном месте, то все будет работать правильно. Что вы мне на это можете возразить?

          Использование CMS — это экономия времени для пользователей. А авторы тем создают свои уникальные темы, задавая им определенную функциональность. И потом, используя этот шаблон и не изменяя ничего в коде и даже в css, пользователь можете создавать сайты и добавлять в них свои баннеры, настраивать внешний вид с помощью виджетов, бэкграундов. В настройках шаблона может быть много сайдбаров, которые исчезают и появляются по желанию пользователя, размеры колонок можно менять, справа, слева, сверху или где вы ее хотите видеть, менять цвета, одни шаблон может включать несколько файлов css. И, конечно, сайт по шаблону должен делаться реально быстрее. Но именно сайт по шаблону, а не сам шаблон. Нет смысла для каждого конкретного сайта делать новый шаблон, верстать, менять и так далее. Вот в этом смысл CMS я считаю. А те, кто пишут шаблоны обязаны не просто копировать и что-то править, а создавать такие шаблоны, по которым можно будет быстро оформлять свои сайты пользователям. Для того, чтобы писать сайты не нужно писать шаблоны. Если вы хотите отредактировать только css существующей темы, то создайте дочернюю и все.

          Если делать сайт по шаблону, то по шаблону, то это не значит, что нужно делать шаблон. Вот так.
          • 0
            Если говорить именно о шаблонных темах — то с вами нельзя не согласиться. Но если писать не шаблонную, а именно уникальную тему (многие заказчики не хотят шаблонов, они хотят быть единственными и неповторимыми) — то скелетоны очень даже помогают.

            И еще у меня один вопрос:

            if ( ! isset( $content_width ) )
                $content_width = 660;
            


            Это действительно нужно где-то в php-файлах? Я всегда стараюсь избегать подобного, и все, что касается размеров — выносить в CSS по мере возможности. Тот же responsive-дизайн (до сих пор не знаю, как это правильно по-русски) вряд ли удастся легко реализовать, задавая ширину контента в серверном коде. set_post_thumbnail_size для меня вообще ад, так как в своем личном блоге я никак не могу определиться с темой, и после очередной смены одной на другую с картинками начинается полный бардак, потому что размеры старых не подходят к новой теме. Я использую nextgen gallery для картинок и галерей, что добавляет еще больше неразберихи.
            • 0
              $content_width используется плагинами и wp для встройки oEmbed контента. Плохо это или хорошо, вопрос не в этом, просто она так работает…
              Можете скачать плагин Regenerate Thumbnails, если надо поменять размеры:)
              • 0
                Понятно насчет content_width. А по поводу Regenerate Thumbnails — он, по-моему, с nextgen не работает. Сам nextgen умеет регенерировать превьюшки, но у меня с ним регулярно что-то идет не так в процессе, и получается кавардак: у меня фотоблог, и изображений там очень много. Поэтому на каком-то этапе я просто остановился на twentyfourteen и что-то менять уже боюсь — нет времени разгребать последствия :)
                • 0
                  Даже не представляю, что такое nextgen, а вот twentyfourteen хорош, жаль, что $content_width маловат. Что действительно меня порадовало, так это добавление объекта setting в хуки WordPress 4.0. Читаю я файл и думаю: какое странное действие return do_action( 'customize_update_'. $this->type, $value ); и оно всегда срабатывает на сохранении, когда тип setting не theme_mods и не option, а какой же тогда? Думаю я. И тут такое! Выходит новая версия WordPress а там… Добавлен вторым параметром WP_Customize_Setting, представляете? Я просто в восторге от этого.
                  • 0
                    Ух, по-моему, после вашего коммента я сам в восторг пришел, хотя толком не понял, о чем это вы )) Я 4.0 еще не ковырял, но что мне в нем сходу понравилось — так это совместимость с предыдущими версиями. Я когда-то давно написал пару плагинов под WP, и они до сих пор работают. И заработали безо всяких изменений, когда я поставил их неделю назад на WP4.0. Представляете? ;)
                    А nextgen gallery — это плагин, позволяющий удобно управлять изображениями: организовывать их в галереи, альбомы, обрабатывать там всячески, теги вешать и т.д. По-моему, самый лучший из всех ему подобных. Ну, по крайней мере, я лучше для себя не нашел. Ну и еще под него есть дополнительный плагин, позволяющий напрямую из Adobe Lightroom публиковать альбомы в блог, что для моего фотоблога прямо вообще удобство из удобств.
                    • 0
                      Я от вас тоже в диком восторге, хотя и не понимаю, о чем вы сейчас говорите, именно это и приятно, возможно:)

                      Плагины — знакомое слово. WP 4.0 неделю назад. Вот что я уловила из вашего сообщения… Работает.
      • 0
        А могли бы поделиться концепцией ваших взглядов? Я вот никогда не могу определиться, с какой базы лучше всего начать очередную тему, и почему.
        • +1
          Если нужно сделать красиво и быстро без наличия psd дизайна и верстки — берем хорошую premium тему и адаптируем ее под нужнды проекта.
          Если есть дизайн и\или верстка — используем underscores и интегрируем верстку просто подключая нужные ассетсы и расставляя теги и селекторы. Это позволяет добиться максимального результата за ограниченное время.
          • 0
            А ссылками на хорошие премиум-темы не поделитесь, раз уж пошла такая пьянка? ) У меня есть в избранном несколько, еще в гугле можно найти, конечно, но как-то не особо они меня впечатляют. А у вас явно что-то должно быть в загажниках ;) Не знаю, правда, как к такому НЛО относится, я тут недавно, но, думаю, людям, читающим эту статью, эти ссылки тоже могут оказаться полезными.
            • 0
              Самые оптимальные в основном тут http://themeforest.net/category/wordpress — все разбито по рубрикам и там хороший поиск. Есть как универсальные, так и нишевые темы. Все новые темы адаптивны и хорошо документированы.
              • 0
                И снова спасибо)
                • 0
                  О премиум темах с неизвестных сайтов. Вы уверены в том, что они не содержат какой-то нехороший код? Вы им можете доверять?

                  Например, если тема WordPress преднамеренно или случайно, создает файлы на сервере при помощи php функций, то все пользователи на хостинге, если вы там не один, получат доступ к этому сайту.

                  Использование тем WordPress, скаченных с любых сайтов за исключением wordpress.org, является небезопасным!
                  • 0
                    Это сайт с платными темами, они жестко модерируются. Купить там тему с зараженными файлами менее вероятно, чем скачать зараженную тему с wordpress.org
                    Конечно, если вы на просторах инета нашли варезную версию платной темы — то тут сами понимаете, на свой страх и риск :)
          • 0
            Вот именно. Но сначала эту хорошую тему кто-то создал. Думаете, он тоже сделал ее из другой хорошей темы или с помощью сайта underscores?:)
            • 0
              Вот именно, wordpress кто-то же взял и написал на php. Вы думаете он взял готовую CMS? Но вы же не пишите свою CMS для каждого сайта?
              А авторы языка PHP тоже взяли C/C++ да и создали новый язык…
              Логика, думаю, ясна) Давайте исходить из причин целесообразности, и разумного повторного использования кода. Принципы KISS и DRY не зря придумали ;)
              • 0
                > Вы думаете он взял готовую CMS?
                Вы меня извините, но да :) ma.tt/2003/01/the-blogging-software-dilemma/
                Wordpress основывался на b2/cafeblog, и это ни для кого не секрет.

                P.S. В обсуждаемом в этой ветке вопросе полностью вас поддерживаю.
              • 0
                А вы в этом уверены?;)
          • 0
            Если нет дизайна, то поменяйте баннер в готовом шаблоне, да и всего делов. Красиво и быстро.
        • 0
          Я поделилась чуть выше. Что вы имеете ввиду под базой?
          • 0
            Ну либо брать какую-то родительскую тему (какую именно?), либо писать все с нуля, либо брать скелет (по типу underscores) — вот это я имел в виду.
            • 0
              Копируйте пример отсюда и дополняйте.
    • 0
      Зачем вам этот сайт? Он файлы копирует? Вы их сами скопировать не можете из какой-либо темы?
      • 0
        Все просто — он дает чистый и рабочий код, без лишних стилей и специфик конкретных тем. Если есть верстка в виде html, то интеграция происходит быстрее всего используя подобные скелетоны. Да, мы можем использовать и полноценную тему, но тогда придется «вычищать» лишнее. А тут — отличный фундамент с нужным вам названием темы.
        • 0
          Тут вы заблуждаетесь в том, что в полноценной теме есть нечто якобы лишнее, что вам приходится вычищать. Одно из двух: либо с темой что-то не так, раз в ней столько лишнего, либо вы убираете из темы нужное, но по какой-то причине принятое за мусор.

          По вашим сообщениям получается, что в теме для вас самое главное — это название.
      • +1
        Вы, кстати, почитайте концептуальную задумку underscores.me. Там на гитхабе все расписано: авторы рекомендуют использовать ее не как родительскую, а как основу, без наследования. Отсюда и underscore — его нужно просто заменить за название вашей темы. Собственно, для этого сайт underscores.me и предназначен: берет последнюю версию с гитхаба и заменяет подчеркивание на вбитое вами название. По-моему, выглядит очень удобно, обязательно попробую в следующий раз.
        • 0
          Вы не подскажете какой-либо отечественный сайт с подобной задумкой?
          • 0
            Я точно нет, я об этом-то только сегодня узнал. Может быть, nobilix подскажет?
            • 0
              Было бы интересно…
  • 0
    весь код в тему должен добавляться осмысленно.

    Не смог удержаться, прямо представилось: программист в тяжком бреду встает с постели, с вытянутыми, как у зомби, руками, топает к компьютеру, и начинает бессмысленно кодить в тему вордпресса :)
    • 0
      Мы очень радуемся этому.
      • 0
        Ух ты, оказывается неотредактированный комментарий приходит на почту адресату! А я уже несколько раз так редактировал в надежде, что исходный текст остается в тайне =) Но вашу тайну я никому не открою ;)
        • 0
          Мне комментарии не приходят на почту почему-то. Не подскажете, как вы этого добились?

          Ну раз уж вы узнали мою тайну, то я вам откроюсь. Это моя тайная миссия (шепотом).
          • 0
            В левом нижнем углу есть шестеренка, там меню «Уведомления». А вообще, мы тут таким откровенным оффтопом занимаемся :) Как бы нас завтра не заминусили все дружно.
            • 0
              А вы знаете, у нас много общего. Я о вашей статье, очень интересная. Похоже, что с вами это часто происходит.
              • 0
                Какой именно статье из тех многих (двух!), что я успел написать? ) И что именно часто происходит?
                • 0
                  Про то, что вы всегда используете автоматы. конечно же.

                  Это же вы завели эту ветку!
                  • 0
                    Ну, не всегда, но часто. Но теперь я не понимаю, как автоматы связаны с вашей статьей, с этой веткой, с вами, и почему у нас много общего? Вы явно чего-то не договариваете )
                    • 0
                      У нас с ними давняя и прочная связь…

                      А вы точно уверены, что в комментариях флудить нельзя? Я читала правила, но не видела ничего про это. Только, что здесь нельзя просить какие-то хабы…
                      • 0
                        Ну это многое проясняет. А вы напишите про них статью, думаю, это не только нам с вами интересно.
                        • 0
                          Что вы! Вы же уже один раз ее написали.

                          Когда я прочла ваши слова «теперь я всегда использую конечные автоматы», то сразу поняла: это судьба. Таких совпадений просто не бывает!
                          • 0
                            Ну будет две) У меня статья-урок. Теория. А все практические варианты применения, о которых мне известно, исчерпываются моим собственным проектом. Да и вообще, хабр ведь — для того, чтобы люди делились опытом.
                            • 0
                              Искренне жаль… А как вы считаете, в каком аспекте вы бы смогли связать их с проектом WordPress?
                              • 0
                                Это, скорее, к вам вопрос.
                                • 0
                                  Я читаю вашу вторую статью и я в шоке! Как похожа наша судьба…
                        • 0
                          Простите, а вы их детерминизируете перед использованием или… так?
                          • 0
                            Да не, куда там. Прям так. Я не настолько умный.
                            • 0
                              «Создание актора и подключение его к IMAP-серверу заняло буквально несколько строк кода.»

                              Вы прям поэт!

                              Нет, это же действительно гениально!

                              «И вот в лог приложения вывалился текст сообщения, которое я сам себе отправил на почту для теста.»

                              Вам нужно издаваться.
                              • 0
                                «И я, скрепя сердце, во имя экономии времени, решил отступить от намеченного курса полной асинхронности и использовать синхронную блокирующую библиотеку JavaMail»

                                Господи,. что же я делаю? До чего вы меня довели? Я занялась копипастой. Но это так красиво звучит! Невероятно!

                                У меня нет слов, браво!

                                «После этого я уже твердо решил, что отказываться от идеалов — путь для слабаков и лентяев, а я все-таки напишу свого IMAP-клиента, с асинхронностью и акторами»
                                • 0
                                  Я не понимаю, что происходит, но надеюсь, что вы испытываете удовольствие от того, что делаете :)
                                  • 0
                                    Я вас читаю, помолчите. У меня оргазм.
                                    • 0
                                      Нет, говорите.
                                      • 0
                                        Может быть вам стоит воспользоваться wp_mail?
                                        • 0
                                          Эмм… Это не совсем согласуется с реактивным подходом, мягко выражаясь. Да и вообще, это ПХП, а я сейчас все больше на Scala. А это вы так ненавязчиво пытаетесь вернуть обсуждение из бездны флуда в праведное русло вордпресса? ;) Мне кажется, мы тут из комментариев к статье устроили чат, и кому-то это может не понравится о_0
                                          • 0
                                            И вообще, за то короткое время на хабре у меня развилась стойкая паранойя, что за мной постоянно следят и в любую минуту готовы минусануть.
                                            • 0
                                              Я нашла кнопку, которой можно спрятать это сообщение ото всех. И никто не сможет читать комментарии, не бойтесь. Пишите!
                                              • 0
                                                Вы имеете в виду, спрятать статью в черновики? Но зачем же, она же может оказаться кому-то очень полезной!
                                                • 0
                                                  Ну да, чтобы спрятать наш с вами разговор. А статью я новую напишу, более полезную!
                                      • 0
                                        Сотрите это, а то что обо мне подумают люди?
                                    • 0
                                      Надеюсь в переносном смысле :)
        • –1
          предупреждение ко всем: комментарии не отправленные и даже еще не написанные тоже могут быть записаны.
          • +1
            image
  • 0
    Чем меня удивляют российские форумы и в частности ru.forums.wordpress.org, так это тем, что там вместо ответа на вопросы принято отсылать людей в поиск. Но товарищи, вы поймите, люди, которые пользуются поиском, попадают на эти страницы, где их снова отсылают обратно в поиск. И что получается в итоге? Весь поиск выдает один прекрасный совет — пользоваться поиском. Понимаете? Такое впечатление, что в рунете завелся один хулиган, который захватил все форумы и рассылает на них спам: «воспользуйтесь поиском». Я вас умоляю, пожалуйста, прекратите давать этот совет. Ваш ответ попадает в результаты поиска на первую строку, вторую строку и так далее. Поиск уже не работает. Пора давать ответы на вопросы.
    • 0
      ищите ответы на вопросы на английском языке. суммарно во всем мире не меньше, а то и больше программистов и разработчиков сталкиваются с проблемами, решение которых они описывают и, зачастую, гораздо адекватнее реагируют на вопросы. я всегда в первую очередь стараюсь искать ответы на свои вопросы на английском и чаще всего получается найти ответ на уже 1 или 2 ссылке с 1 страницы поиска. помню в своё время тоже плевался от русских форумов и их привычки отсылать на поиски в поисковики… =)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.