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

上面的内容允许主题的用户通过简单地在其子主题文件夹中创建一个适当命名的文件,以及通过相同的方法-之前/之后模板在每个现有部分之前/之后添加新代码,来替换现有代码的任何部分。零件文件根本不存在于父主题中,只是在那里允许它们插入代码-并且此方法不需要它们了解钩子/过滤器即可完成。

我当然可以使用钩子和过滤器实现相同的目的。

代替使用钩子/过滤器是否有优势?牢记将要使用此功能的目标受众绝对不是精通代码。我可以给他们一个相对基本的指导,让他们可以遵循使用模板方法,但是几乎可以肯定会使钩子使魔鬼迷惑不解。

还是在相同主题下有一个比另一个更好的情况?

Answers:


8

我更喜欢钩子,因为它们更灵活:您可以从主题functions.php文件中也可以从插件中将它们钩入。我尝试在插件中添加尽可能多的逻辑,以使主题大部分包含布局内容。

如果您使用动作挂钩,则仍可以get_template_part() 在该挂钩处理程序中使用。这使您两全其美。您甚至可以创建一个默认的hook来调用get_template_part(),以便对编码没有太多经验的人可以添加额外的文件,而其他人则可以删除此钩子。

关于性能:get_template_part()使用(inlocate_template()file_exists()1、2或4次(取决于您如何称呼它)。它看起来file_exists()非常快,并且在PHP中甚至在OS中使用了缓存。因此,这可能不是问题。


那讲得通。我的设计重点之一是消除了在最常见的使用情况下对插件的需求,同时仍然保留了将插件与需要的插件一起使用的能力。我的目标客户对WordPress或插件知之甚少,没有资格从不好(好的IMO插件)中分辨出好的插件,也不想处理更新和管理多个软件的问题。因此,我确实必须在主题中构建很多功能,以便交付他们想要的东西:简单易用,易于维护,一站式解决方案。
Ashley G

4

我要说的主要区别是可读性。如果看到几个命名良好的模板部分,则可以轻松掌握正在发生的事情。如果只看到一个钩子,则需要搜索主题的其余部分以建立连接到钩子的内容。


1
是的,这很有意义,并且是我尝试使用示例代码实现的一部分。
Ashley G

4

从子主题中的钩子中删除功能(相对)容易,但是要使其忽略不需要的父模板则要困难得多。

本质上,使用钩子更接近PHP,而使用模板更接近HTML。我使用混合父主题,这是非常面向挂钩的。直到您需要摆脱某些父母的模板,这才是一种幸福。

对于不精通技术的用户来说,这都不是一个很好的选择。他们为什么仍然需要弄乱这样的主题内部?

PS还记录了性能问题。带钩子的东西发生在内存中,带模板的东西需要大量的磁盘查找。特别是如果您在示例中编写类似的内容。

PPS不是每个人的喜好……而是代替从头开始编写父主题,为什么不采用现有的父主题并向用户提供简单的子主题呢?


忽略父模板就像创建空白模板文件来替换它一样容易。对于不懂技术的用户来说,比弄钩子(以及PHP)要容易得多。尽管对于有经验的人来说,使用钩子会容易得多。至于为什么,总是有那些想要定制的人,您甚至承认您这样做。至于我为什么要创建主题,这就是我要开展业务的方向。围绕其他人开展业务对我来说似乎不是很未来的证据,这也是因为IMO大多数现有主题仍有很多不足之处。我想我可以做得更好。
Ashley G

但是,有关性能问题的要点。虽然,由于wordpress被设计为与get_template_part一起使用,我会认为这不会对性能造成太大影响。有人对此有基准吗?
Ashley G

我了解您对忽略模板零件的意思。不像我想的那么容易
Ashley G

实际上,就像在子文件夹中放置空白模板文件一样简单,只要在子文件夹的根目录下即可。困难的是模板文件位于父/子主题文件夹的子文件夹中
Ashley G 2010年

实际上,即使是子文件夹也没问题。我只是将文件夹命名为错误(肯定的迹象是我工作得太晚了,哈哈)。要覆盖模板部件,它只需要与父级文件在同一路径中具有相同名称的文件
Ashley G 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.