get_template_part против хуков действий в темах

15

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

Мой вопрос, является ли один метод предпочтительнее другого.

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

<?php get_template_part('before_sitecontainer' ); ?>
<div id="sitecontainer" class="sitecontainer" <?php //closed in footer ?>>

<?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><!-- end topcontainer div -->
<?php get_template_part( 'after_topcontainer' ); ?>

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

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

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

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

Эшли Г
источник

Ответы:

8

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

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

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

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

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

Мягкий пух
источник
1
Да, это имеет смысл и является частью того, чего я пытался достичь с помощью примера кода.
Эшли Г
4

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

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

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

PS также отметим проблемы с производительностью. Вещи с зацепками происходят в памяти, вещи с шаблонами занимают много места на диске. Особенно, если вы пишете что-то вроде вашего примера.

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

Rarst
источник
Я бы подумал, что игнорировать родительский шаблон будет так же просто, как создать пустой файл шаблона для его замены. Гораздо проще, чем возиться с хуками (и, следовательно, с PHP) для не технически подкованного пользователя. Хотя для кого-то с опытом зацепки было бы намного проще. Что касается того, почему всегда есть те, кто хочет настроить, вы даже признались, что делаете. Что касается того, почему я создаю тему, это то направление, в котором я хочу заняться своим бизнесом. Создание вокруг кого-то другого бизнеса не кажется мне перспективным, в том числе потому, что большинство существующих тем IMO оставляют желать лучшего. Я думаю, что могу сделать лучше.
Эшли Г
Хорошие моменты о проблемах производительности, хотя. Хотя, поскольку WordPress был разработан для работы с get_template_part, я бы подумал, что это не так сильно скажется на производительности. У кого-нибудь есть какие-либо критерии по этому вопросу?
Эшли Г
Я понимаю, что вы имеете в виду, игнорируя часть шаблона. Не так просто, как я думал
Эшли Г
На самом деле это так же просто, как поместить пустой файл шаблона в дочернюю папку, если он находится в корне папки. Когда это становится трудным, это когда файлы шаблонов находятся в подпапках папки родительских / дочерних тем
Ashley G
На самом деле, даже подпапки не проблема. У меня просто была неправильная папка (верный признак того, что я работаю слишком поздно, LOL). Для переопределения части шаблона требуется только файл с тем же именем в том же пути в дочернем элементе, что и в родительском
Ashley G