get_template_part vs хуки действий в темах

18 окт. 2010 г., 11:34:26
Просмотры: 4.12K
Голосов: 17

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

Мой вопрос: предпочтителен ли один метод перед другим?

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

<?php get_template_part('before_sitecontainer' ); ?>
<div id="sitecontainer" class="sitecontainer" <?php //закрывается в футере ?>>

<?php get_template_part( 'before_topcontainer' ); ?>
<div id="topcontainer ">

    <?php get_template_part( 'before_topedge_navigation' ); ?>
    <?php get_template_part( 'topedge_navigation' ); ?>

    <?php get_template_part( 'before_site_header' ); ?>
    <?php get_template_part( 'site_header' ); ?>

    <?php get_template_part( 'before_second_navigation' ); ?>
    <?php get_template_part( 'second_navigation' ); ?>

    <?php get_template_part( 'after_second_navigation' ); ?>

</div><!-- конец div topcontainer -->
<?php get_template_part( 'after_topcontainer' ); ?>

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

Конечно, я мог бы добиться того же с помощью хуков и фильтров.

Есть ли преимущество в использовании хуков/фильтров? Учитывая, что целевая аудитория, которая будет использовать эту тему, определенно не разбирается в коде. Я могу дать им относительно простые инструкции для использования метода шаблонов, но хуки почти наверняка их запутают.

Или есть ситуации, когда один метод будет лучше другого в рамках одной темы?

0
Все ответы на вопрос 3
1
10

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

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

Что касается производительности: get_template_part() использует (в locate_template()) функцию file_exists() один, два или четыре раза (в зависимости от способа вызова). Похоже, что file_exists() работает очень быстро, и использует кэширование в PHP, а возможно, даже на уровне ОС. Так что это, вероятно, не является проблемой.

19 окт. 2010 г. 09:48:00
Комментарии

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

Lemon Bacon Lemon Bacon
19 окт. 2010 г. 10:44:16
1

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

18 окт. 2010 г. 12:28:17
Комментарии

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

Lemon Bacon Lemon Bacon
18 окт. 2010 г. 12:39:46
5

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

По сути, работа с хуками ближе к PHP-стороне, а работа с шаблонами — к HTML-стороне. Я использую родительскую тему Hybrid, которая очень ориентирована на хуки. Это просто замечательно, пока вам не понадобится избавиться от какого-то шаблона родительской темы.

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

P.S. Также обратите внимание на проблемы производительности. Операции с хуками происходят в памяти, а работа с шаблонами требует множества обращений к диску. Особенно если вы пишете что-то вроде примера в вашем коде.

P.P.S. Это не всем по вкусу... но вместо создания родительской темы с нуля, почему бы не взять существующую родительскую тему и предоставить пользователю простую дочернюю тему?

18 окт. 2010 г. 12:41:14
Комментарии

Игнорирование родительского шаблона казалось бы таким же простым, как создание пустого файла шаблона для его замены. Гораздо проще, чем возиться с хуками (а значит, и с PHP) для пользователей без технической подготовки. Хотя для опытного разработчика хуки были бы намного проще. Что касается "зачем" - всегда найдутся те, кто хочет кастомизировать, вы и сами признали, что делаете это. А почему я создаю тему - это направление, в котором я хочу развивать свой бизнес. Строить бизнес вокруг чужого продукта не кажется мне перспективным, к тому же, на мой взгляд, большинство существующих тем оставляют желать лучшего. Думаю, я могу сделать лучше.

Lemon Bacon Lemon Bacon
18 окт. 2010 г. 13:25:50

Хорошие замечания по поводу проблем с производительностью. Хотя, поскольку WordPress был разработан для работы с get_template_part, я бы предположил, что это не должно так сильно влиять на производительность. У кого-нибудь есть бенчмарки по этому поводу?

Lemon Bacon Lemon Bacon
18 окт. 2010 г. 13:27:44

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

Lemon Bacon Lemon Bacon
18 окт. 2010 г. 13:36:59

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

Lemon Bacon Lemon Bacon
18 окт. 2010 г. 13:40:43

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

Lemon Bacon Lemon Bacon
18 окт. 2010 г. 14:00:42