WordPress как на ладони
Шаблоны, плагины и темы для настоящих поклонников Elementor. От TemplateMonster.com wordpress jino

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

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

Не скажу, что я делал много тем и порой меня это раздражало, а скажу, - я делал не так много тем, но каждый раз, меня это раздражало. Раздражался я до тех пор, пока как-то раз меня не осенило и придумалась эта хитрость. Я почему-то не подумал писать об этом, пока недавно не подумал, - а почему я раньше не подумал об этом написать 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 комментов
  • Привет. Несомненно функция очень полезна но использовать её таким образом не разумно. Почему бы сразу нормальный и читабельный каркас не сделать. mosking

    Ответить2 года назад #
    • Kama6809

      Ну да, есть ситуации, где неразумно, там и не надо использовать.

      А есть где хорошо подойдет и упростит код: зашел например в single.php и видишь только то что относится к этой странице, никаких лишних тегов, которые по всему шаблону дублируются...

      Думаю, о разумности можно говорить в рамках структуры шаблона.

      Ответить2 года назад #
  • Юрий cайт: eysman.pro

    Всем привет.

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

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

    С тем же успехом, мы могли наш контейнер вывенести в partial и подкючать через get_template_part()

    Наверно, было бы правильней, пример привести в рамках написания какого-то плагина, где бы действительно понадобилось отлавливать сработку того или иного акшена.

    Ответить2 года назад #
    • Kama6809

      Для начала, то что я тут написал, я это использую, это удобно и это работает!

      А что будет, если мы захотим добавить еще один сайдбар?

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

      Да и просто, после нас, кто-то захочем чуток изменить разметку шаблона?

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

      С тем же успехом, мы могли наш контейнер вывенести в partial и подкючать через get_template_part()

      Это как, можно пример?

      Наверно, было бы правильней, пример привести в рамках написания какого-то плагина

      Я не событие did_action() описывал... Другие примеры есть в описании did_action()...

      Спасибо за коммент! thank_you

      Ответить2 года назад #
      • Юрий cайт: eysman.pro

        Это как, можно пример?

        Ну поместить в какой-нить /parts/loop.php и подключить его в шаблоне get_template_part('/parts/loop') И дублируйте на здоровье этот шаблон сколько угодно, если нужен сайдбар - просто удаляете его подлючение с сайдбара. А нужно сделать какую-то иную логику с постами, создали еще один парт, там по своему обыграли. В последствии получается проще обслуживать и в процессе создания шаблона, как бы проблем с неудобствами нет. И фронтендеру так будет понятней после нас правки какие-то вносить.

        В-третьих, как часто, например, ты меняешь фундаментальную разметку шаблона - каркас?

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

        Ну вот как-то так smile

        Ответить1.10 год назад #
        • Kama6809

          Ну поместить в какой-нить /parts/loop.php и подключить его в шаблоне get_template_part('/parts/loop')

          Я предлагаю выносить теги, которые относятся к общему каркасу а не к циклам. Эти теги не должны дублировать несколько раз в одном файле. При чем тут loop? Они дублируются в разных файлах шаблона. Точно также как дублируется код header.php... Ок мы можем создать еще два файла только в этими тегами и подключать их один в начале другой в конце, но это извращение уже...

          Короче, я тут писал про один из вариантов упрощения шаблона... Если он не очень подходит под структуру текущего шаблона, то и не надо его использовать. В подключении частей шаблона, тоже есть минусы. К примеру, я не могу одну часть подключать везде: для отдельных страниц, для архивов, меток. Там везде нужны разные части... А то как тут написано, подразумевает вообще не создавать дополнительных файлов, а рассовать все в имеющиеся: header.php, sidebar.php и footer.php. Подключаемые части шаблона, это немного другая тема, как по мне...

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

          Если речь идет о необычном блоге, то нужен необычный подход. А дублировать то, что всегда должно быть в шапке и в подвале или если есть СБ, то в СБ. Это совсем не обязательно...

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

          Для нестандарта, и ваши части шаблона и другие хитрости тоже будут мешать. К примеру, тут на блоге страница /filecode - ссылка имеет такую структуру, что там нужно полностью шапку и подвал переделывать у меня там вообще нет ни get_header() ни get_footer() - это как вы сказали - нестандартная структура шаблона, где вся база прошлой структуры не используется и переписана. И поэтому этот прием работает на этом сайте - я примерно в файлах 10 убрал дублирование одинаковых тегов, чем упростил код...

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

          Реальный пример

          У меня есть структура

          header.php

          head
          
          <body>
          <div class="wrapper">
          	<header class="header">код</header>
          
          	<div class="content_wrap">
          
          		код
          
          		<div class="content">
          
          			Хлебные крошки

          footer.php

          	<footer>код</footer>
          
          </div><!-- wrapper -->
          
          </body>
          </html>

          Теперь, в каждом промежуточном файле

          get_header();
          
          <article>код</article>
          
          какой-то код отдельного файла бла бла
          
          	</div><!-- .content -->
          </div><!-- .content_wrap -->
          
          get_sidebar();
          get_footer();

          Тут определенно лишнее

              </div><!-- .content -->
          </div><!-- .content_wrap -->

          Но я вынужден их повторять везде - потому что это часть структуры. Сунуть в sidebar.php не могу, потому есть файлы без СБ:

          get_header();
          
          <article>код</article>
          
          	</div><!-- .content -->
          </div><!-- .content_wrap -->
          
          get_footer();

          Как убрать повторяющиеся теги?

          1
          Ответить1.9 год назад #
          • Юрий cайт: eysman.pro

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

            Я не могу понять, а чем плохи подключаемые части? И почему нельзя подключать одну и ту же часть в разных шаблонах (.. архивах, метках..)? Что мешает, сделать какойнить posts-list и подключать его везде где нужна лента и, скажем photo-list, который мы будем подключать там где нам нужно выводить блоки с картинками?

            Я понимаю, что данный вопрос уже уходит от темы, но возник он в рамках этой smile Ну и чтоб, как бы в тему: в данном случае, .content_wrap - это ненужная обертка над .content За сим, убираем ее, крошки оставляем в шапке (ну если им нужна какая-то обертка, вот для них мы ее и оставим), ну и как ранее говорил - кидаем .content в часть (/parts/some-content.php, чтоб loop не смущало smile ).

            Мне кажется ну не правильно решать вопросы с версткой (в частности закрывающиеся/открывающиеся теги) методами if...

            Ответить1.9 год назад #
            • Kama6809

              Я не могу понять, а чем плохи подключаемые части?

              Я не говорил что они плохи... Это просто другое...

              Ну блин, ок, вот тебе еще пример: сейчас написал в поиске "шаблоны WordPress", попал на сайт wp-templates.ru, скачал первый шаблон http://wp-templates.ru/hotel-melbourne/

              Открыл код. И что я вижу:

              В нем есть файлы отвечающие за вывод страниц: 404.php, archive.php, author.php, category.php, index.php, page.php, search.php, single.php, tag.php - 9 файлов, других отвечающих за всю страницу нет. И в каждом, в начале одно и тоже:

              <?php get_header(); ?>
              <div class="clearfix"></div>
              
              <?php hotel_melbourne_breadcrumbs(); ?>   
              <div class="clearfix"></div>    
              <section class="blog-section">
              	<div class="container ">
              		<div class="row">

              Зачем? Почему в header это не сунуть, зачем везде дублировать?

              Но и пример немного не из реальности.

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

              Мне кажется ну не правильно решать вопросы с версткой (в частности закрывающиеся/открывающиеся теги)

              Я понимаю о чем ты, но иногда это просто удобно. Точно также как удобно что-то совать в header а что-то в footer. Крайние теги открывать и закрывать совсем не обязательно в каждом файле. Это может и усложняет изменение каркаса шаблона в случае необходимости, но зато упрощает код.

              Я не говорю что эта тема панацея, но согласиться что у нее нет права на жизнь никак не могу. Я частенько встречаюсь с подобным, где можно упростить, но этого не сделано. Почему, я не знаю... Другие ненужные "огороды нагорожены", а "огородик" поставить - этого по феншую делать не стоит, похоже. smile

              1
              Ответить1.9 год назад #
Здравствуйте, !     Войти . Зарегистрироваться