WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Хитрость: динамическое закрытие тегов в теме

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

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

А теперь по-порядку...

Каждый кто создавал тему для WordPress, наверняка сталкивался с ситуацией: есть структура страницы, такого рода:

<?php get_header(); ?>

<div id="content">

	<!-- цикл вывода или еще какой-то вывод контента -->

</div><!--#content-->

<?php
get_sidebar();
get_footer();

И эта структура используется для всех видов страниц: home.php, page.php, single.php, archive.php, category.php, search.php, 404.php, page-name.php и т.д. Т.е. какую бы мы страницу не создавали, она будет иметь подобную структуру.

Отсюда возникает вопрос, а почему бы не спрятать теги <div id="content"> в шапку и </div><!--#content--> в сайдбар. Все равно же везде одинаковая структура, чего их повторять во всех файлах шаблона. Пусть лежат в одном файле. И тогда структура будет выглядеть проще:

<?php
get_header();

	// цикл вывода или еще какой-то вывод контента

get_sidebar();
get_footer();

Но, если так сделать, то получается мы нигде не можем убрать сайдбар: get_sidebar();. Потому что в нем находится важный закрывающий тег. А убирать его нужно, а если и не нужно, то может будет нужно в будущем...

Пока не начали читать ниже, подумайте сами, как можно сунуть эти теги в общие файлы header.php, sidebar.php или footer.php так, чтобы наличие или отсутствие сайдбара ничего не ломало?

Решение

Решение очень простое и заключается оно в использовании не всем известной и мало используемой функции did_action().

Нужно поместить <div id="content"> в файл header.php и поместить </div><!--#content--> в файл sidebar.php. А дальше продублировать показ </div><!--#content--> в файле footer.php, но с условием - выводить этот тег, только если не была вызвана функция get_sidebar(), в которой срабатывает хук get_sidebar...

Т.е. код в начале footer.php будет выглядеть так:

// если сайдбар не вызывался, то нужные теги не закрыты - закроем...
if( ! did_action('get_sidebar') )
	echo '</div><!--#content-->';

did_action() работает молниеносно, поэтому если у кого-то возникнет вопрос производительности, на казалось бы, ненужном месте, то это лишнее...

На этом все, подписывайтесь, ставьте лайки и что-то там еще...

8 комментов