Лучики здоровья мне|...или хитрые заголовки

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

Хорошо то, что еще недельку можно не ходить на работу. Впрочем, и это омрачается тем фактом, что придется ходить уже в больницу. Капелька мёда здесь — прелестные медсестрички. Что, конечно же, тоже сдобрено ушатом холодной воды... ну, так до бесконечности.

Но самое главное — запланированные на эти десять дней дела, конечно же, не сделаны. Поэтому я тружусь не покладая рук, ног и прочих атрофированных конечностей. И, чтобы не расслабляться, да по просьбе @lilumi, рассказываю о замечательных штучках, которые можно сделать с заголовками на Вордпрессе. Которые, уже по традиции, конгениально просты и забавны.

Адаптирующийся хедер

Самое унылое в текущем HTML (да и в грядущем HTML5) — это многоуровневые заголовки, за расстановкой которых просто необходимо следить при верстке. Действительно — ведь на хедеры обращен пристальный взгляд всех поисковых систем.

Основные рекомендации (в спецификации они прописаны вообще мельком) просты — один заголовок первого уровня <h1> на всю страницу, следующие уровни должны быть вложены друг в друга в соответствии с рангом (Ханойские башни!!!). Также не рекомендуются пропускать уровни.

Основная проблема для меня — то, что на 90% сайтов в <h1> находится всегда название всего сайта, а не заголовок страницы. Это вполне логично, но мне всегда хотелось делать все наоборот. Впрочем, есть подозрение, что поисковики не сильно обращают внимание на циферку в теге, лично переранжируя заголовки.

Да не суть. Есть задача — выводить на главной странице в h1 название блога, а в посте заголовком становится название поста (для таксономии — имя тега, категории и т.п.), при этом не меняя стиля шапки. Это, как понимаете, продолжение задачи нет ссылке с главной на главную.

Для этого в header.php в блоке шапки мы просто будем, в зависимости от того, где находимся, ставить либо ссылку, либо заголовок.

<div id="header">
	<?php if($_SERVER['REQUEST_URI']!='/') :  ?>
		<a title="на главную страницу бложека" href="<?php bloginfo('url') ?>"><?php bloginfo('description'); ?></a>
	<?php else : ?>
		<h1><?php bloginfo('description'); ?></h1>
	<?php endif ?>
</div>

Мы используем реквест-юри только потому, что условные тэги is_home() и is_front_page() с задачей не справляются.

Соответственно, в single.php (а также archive.php, tag.php, category.php и др.) вместо стандартного

<h2><?php the_title(); ?></h2>

ставим уже человеческий

<h1><?php the_title(); ?></h1>

И в CSS обращаемся со ссылкой в хедере так же, как обращались и с h1. Аналогично поступаем с двумя уровнями заголовка в посте (если нам надо, чтобы выводилось все одинаково).

#header a,#header h1{
...стили для шапки...
}
#header a{
display:block;
}
.post h1, .post h2{
...стили для заголовка поста...
}

Остается один момент — в результате получается, что в использованных в посте заголовки (а это соответственно, <h3>, <h4>, <h5>, <h6>) появляется пропуск — ведь мы можем спокойно использовать теперь <h2> для подзаголовков. Хорошо, если они всегда под катом или за excerpt'ом — можно просто переопределить классы и заменить теги внутри single.php даже просто реплейсами:

$stext = get_the_content('');
$stext = apply_filters('the_content', $stext);
$stext = str_replace(']]>', ']]>', $stext);
$stext = str_replace('<h3', '<h2', $stext);
$stext = str_replace('</h3', '</h2', $stext);
$stext = str_replace('<h4', '<h3', $stext);
$stext = str_replace('</h4', '</h3', $stext);
echo $stext;

В случае же с отдачей больших постов, придется добавлять классы — чтобы пары <h2> на главной и <h3> в посте выглядели одинаково.

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

Журнальные подзаголовки

Второе, чем я буду сегодня ездить по ушам — это пародия на журнальные заголовки. Например, кричащий заголовок «Они убили Кенни» сверху и скучный, но более правдивый, подзаголовок «В результате операции террористы были уничтожены» снизу. В бложеках этому формату место еще как есть.

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

echo get_post_meta($post->ID, 'subtitle', true);

Можно сделать так же хитро как у меня, например — на главной выводить один заголовок (the_title()), а в single.php — уже дополнительный.

Впрочем, постоянно дополнять полем пост как-то лениво — мне хочется писать просто в самом заголовке «Лучики здоровья мне|...или хитрые заголовки», только разделяя вертикальной чертой заголовок и подзаголовок. Для этого можно создадим две функции в functions.php (который заменяет миллионы плагинов). Если файла нет в папке шаблона — создайте, ага.

function my_title($before = '', $after = '', $echo = true){
	$post = &get_post($id);
	$title = $post->post_title;

	$s=explode("|",$title);
	$title=$s[0];

	$title=apply_filters( 'the_title', $title );
	if ( strlen($title) == 0 )
		return;
	$title = $before . $title . $after;
	if ( $echo )
		echo $title;
	else
		return $title;
}
function my_subtitle($before = '', $after = '', $echo = true){
	$post = &get_post($id);
	$title = $post->post_title;

	$s=explode("|",$title);
	if(!empty($s[1])) $title=$s[1]; else $title=$s[0];
	$title=apply_filters( 'the_title', $title );
	if ( strlen($title) == 0 )
		return;
	$title = $before . $title . $after;
	if ( $echo )
		echo $title;
	else
		return $title;
}

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

С другой стороны, если шаблон менять не хочется, можно переопределить саму функцию the_title() в том же самом functions.php. Например, так, чтобы на всех страницах показывалась часть до вертикальной черты, а на главной — после:

add_filter('the_title', 'my_title', 50);
function my_title($title){
	if ( strlen($title) == 0 )
		return;
	$semtitle=explode("|",$title);
	if(!is_single()||empty($semtitle[1]))
		return $semtitle[0];
	return $semtitle[1];
}

Есть одна мелочь при генерации подзаголовков из заголовка — надо следить за слагами, чтобы они выходили нормальными и читаемыми. Впрочем, это надо в любом случае — от автоматического транлитерированного «ЧПУ» тошнит не только специалистов юзабилити.

Можно поиграть заголовками и дальше. И при этом не требуется чего-то большего, чем самые азы одного из простейших языков — было бы желание.


Но обычно шаблоны для Wordpress такие скучные, что зевать хочется.

Кстати, да. Пойду я спать.

{13 комментариев} Подписка на комментарии

Тема с пародией на «Журнальные подзаголовки» — офигенно понравилась между прочим!

Хм...

Я много думал о необходимости такого дела, но поскольку большую половину постов публикую через Live Writer (а он, надо вам сказать, начисто лишен функционала по кастомфилдс или управлении слагами) — то решил таки отказатся от этой идеи.

Excerpt для этого же можно использовать — большая часть людей вообще не обращает внимания на эту могущественную штуку, но я как раз ее использвую по полной...

Так что без меня, но я запомню — отличный метод :)

и, кстати, «журнальные подзаголовки» можно использовать и через Live Writer — там ведь главное сам заголовок написать через черту.

Есть, правда, одна проблема — кросспост, подписка на комментарии, некоторые не нативные плагины вывода последних, популярных и т.п. постов. В общем, некоторые плагины, которые не используют the_title, также придется править, чтобы они выводили только текст до или после черты.

excerpt все-таки немного другое — это для меня скорее подзаголовок в старых книгах — знаете, «Первое путешествие Гулливера. Автор сообщает кое-какие сведения о себе и о своем семействе. Первые

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

благополучно достигает берега страны лилипутов. Его берут в плен и увозят

внутрь страны.» Что-то вроде :). Использование просто сокращения и унылого [...] (в русском вообще-то надо ставить ) — все равно скучно.

Оооо! Посылаю тебе лучики здоровья!

Ты меня здорово выручил, счас займусь переделыванием шаблона. Спасибо тебе огроменное!

Кхех. я только начал читать пост с мыслью — вот оно, вот он маленький лытдыбр автора о пьянке, но эта ссылочка в конце на продолжение статьи...

ты в своём репертуаре ;)

@blogomober: не, ну для интернетовских и в твиттере лытдыбра моего достаточно.

Здесь 127 ридерам-то зачем знать, что я был в сауне, прыгал с парашютом, катался на снегокате и сноуборде вместо того, чтобы дела делать? :) А про больничку, запахи лекарств (и накрахмаленные коротенькие халатики) вообще не стоит.

...из которых добрая половина — боты, конечно же.

боты накрахмаленых коротеньких халатах? :)

Здоровские идеи после праздников появляются! Молодец! Запишу в блокнотик, а я вот только от праздников отходить начал, да к работе приступаю потихоньку

@Дизайнер-художник: я просто, как волшебник, вытащил из шляпы самого что ни на есть обычного кролика, всего-то :). Удачно приступить к работе — у меня вот никак не получается...

О! я вижу ты пост дополнил, про адаптирующийся хедер, а мне как раз это и было нужно.

Меня нервирует что у тебя нет поиска и нет каталогизатора, все яндексом приходится выискивать

кстати про выпадающий H2 — можно писать «журнальный подзаголовок» в нем ;)

Не нервничай, все будет.

А здесь можно оставить свое мнение ↓ Подписка на комментарии
какие-то из следующих трех полей можно оставить пустыми


нет тегам!!! **эмоция**, __ирония__, >цитата, {[код]}