it-swarm.com.ru

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

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

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

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

<?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' ); ?>

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

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

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

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

14
Ashley G

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

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

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

8
Jan Fabry

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

4
Mild Fuzz

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

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

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

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

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

4
Rarst