我的代码放在哪里:plugin或functions.php?


86

是否有一种易于理解的方案来确定插件或主题的代码属于哪种代码functions.php

目前 很多 情况下,许多辩论有关的话题,主要是因为有关于WordPress的内部运作的一些误解。我是在根据事实而不是根据观点寻求答案。

它应该说明如何处理这些问题(可能还有更多):

双方通常都有利弊。我们为您的functions.php文件提供的最受欢迎的最佳代码收集问题有很多代码片段,这些答案至少是值得商de的。
我们需要初学者可以理解的标准,也许还有清单,并附上原因。

另请参见Chip Bennett在我们的元网站上的相关问题:专门要求“没有插件”的解决方案的问题

相关:我在哪里或在网上其他地方找到的代码片段放在哪里?


我想知道,出于这个问题的目的,什么构成事实。人A说CPT进入插件,人B说CPT进入主题。我们如何获得一个事实来验证观点之一?这可能很危险地接近“非建设性”。
拉斯特

Answers:


72

我将从这个问题开始:功能是否与内容的呈现,内容的生成/管理,网站或用户身份有关?

如果该功能内容的呈现不是专门相关,那么它将直接在Plugin Territory中。此列表很长:

  • 修改核心WP过滤器(wp_head内容,例如规范链接,生成器和其他HTML meta等)
  • 网站图示
  • 内容后简码
  • 发表分享链接
  • Google Analytics(分析)页脚脚本
  • SEO工具/控件
  • 等等

如果功能相关,以呈现内容,那么它是一个候选为被包含在主题。在这一点上,我将回复到@ Raf912的主题切换条件切换主题时会丢失功能吗?如果这个问题的答案是没有,那么功能所属的主题。一些例子:

  • 删除/覆盖WP core Gallery CSS
  • 过滤文章摘录长度,“阅读更多”文字等。
  • 任何通过add_theme_support()(我想这应该是显而易见的)实现的东西
  • 自定义CSS

通常,这两个问题将提供明显的区分。但是,也有例外。

自定义帖子类型

举例来说,自定义帖子类型是内容生成和表示的一种独特混合方式,考虑到模板层次结构可用于单个帖子类型的存档索引页面单个帖子页面的方式。CPT的内容生成方面通常会将它们直接放置在Plugin Territory中;但是,插件无法为任何给定的主题定义固有地适合设计/布局/样式的模板页面(特别是如果CPT显示的不是通常的“标题/内容/元数据”,或者具有与其相关的自定义分类法)。

从长远来看,解决这种差异的方法是恕我直言,要针对给定内容类型(房地产清单,日历活动,电子商务产品,书籍/媒体库条目等)的CPT定义制定标准公约/共识。 )。这样,用户生成的内容将在实现给定CPT标准/约定定义的主题之间保持可移植性,而主题开发人员保留了在主题模板文件中定义该CPT的设计/布局/样式的灵活性。

社交媒体链接

同样,我通常会说,在当前主题中几乎无处不在的社交媒体配置文件链接都是插件领域,因为它们与内容的呈现无关。最好的解决方案是将这些配置文件定义在内核中的某个位置。但是,当前没有定义这些链接的标准/共识方法。是在网站设置级别还是基于每个用户的最佳定义?如果是每个用户,则哪个用户的元数据会在模板中公开?等等

因此,从长远来看,解决这一差距的方法是,要么是核心定义这些链接的定义位置,要么是主题开发者社区发展自己的共识。同时,除了在每个主题中定义它们之外,实际上没有任何其他用途。


add_theme_support( 'automatic-feed-links' );不是陈述性的。但这是主题准则必需的。为什么在主题切换后失去此功能会有必要的风险?
fuxia

1
通过实施的任何内容add_theme_support()都只能通过主题实施。add_theme_support( 'automatic-feed-links' )实际上,在主题内使用可以确保从主题到主题的一致体验,因为生成的提要链接是相同的。
Chip Bennett 2012年

4
我认为它的名字是错误的:Feed链接不是呈现性的。如果下一个主题没有调用该功能,则用户将丢失供稿链接。您可以毫无问题地为每个插件添加该插件。这就是为什么我对此感到困惑。:)
fuxia

1
您知道:这是一个好点。:)
Chip Bennett

50

最好放置代码的简单测试:

  • 将代码写入functions.php
  • 切换主题
  • 您是否错过了功能,博客无法正常工作还是遗留了旧主题的片段(例如,短代码)?

    • 是的:将其放入插件

    • 否:将其保留在functions.php中

示例:编写一个简码。切换主题后,普通的简码将保留在您的帖子中。因此,最好将其放置在插件中。

编写函数以列出最后的注释。切换主题后,一切正常,因为其他主题可能具有等效功能。

它实际上取决于代码及其功能。一些代码仅影响主题的样式或内容,而另一些则修改博客文章。


11
+1如果代码特定于主题,则输入functions.php。如果需要应用于多个主题,请将其放在插件中。
s_ha_dum 2012年

18

我认为这个问题没有一个简单的答案,但是我敢打赌,我们可以制作流程图来帮助做出决定。这是这种流程图的粗略概述,可以并且应该扩展。提出建议!

  • 此代码是否托管在WordPress的单站点安装中?
    • 是的-网站的主题是否仅随着重大的重新设计和功能变化而改变?
      • 是-所涉及的代码是否特定于此当前设计
        • 是的:functions.php
        • 否:插件
      • 否(经常更改或一时兴起)-插件
    • 否(Multsisite)-您要托管多站点安装,还是托管插件的多站点解决方案?
      • 是:问题功能是否特定于此站点,还是可以/应该由网络中的其他站点使用?
        • 特定于此站点:functions.php
        • 在多个站点之间共享-您是否要在每个站点上强制使用?
          • 是:插件,存储在mu-plugins目录中或通过网络激活
          • 否:这是不相关站点的网络吗?(例如,不同的客户)
            • 是:如果客户端A看到或激活了您为客户端B,C和D编写的插件,这将是不好还是不专业?(例如,可能会破坏站点或导致不良功能)
              • 是的:functions.php
              • 否:插件
            • 否:可能是插件
      • 否(由不允许插件的VIP之类的服务托管):使用functions.php
我不知道该如何适应的其他一些想法:

  • 父主题-有时具有共享功能,最好制作一个父主题并将该功能放在父主题的functions.php文件中。
  • 大型多站点安装的插件目录可能很快变得难以管理,因此有时,少数站点(例如<1%)使用的共享功能最好在functions.php文件中进行复制。

6

从这里主题VS插件

将自定义代码添加到子主题,以便在更新父主题时,自定义代码不会丢失。

您还可以创建一个特定于站点的插件,其中也包含所有自定义代码。

至于编写代码还是使用插件,您可以使用插件和函数,但是对于大多数您想要的功能,手动编码是最好的方法,因为它易于修改,除非在某些情况下(例如元盒),您可以考虑使用插件,除非您是主题开发人员。

 function modify_contact_methods($profile_fields) {

// Add new fields
$profile_fields['twitter'] = 'Twitter Username';
$profile_fields['facebook'] = 'Facebook URL';
$profile_fields['gplus'] = 'Google+ URL';

return $profile_fields;
}
add_filter('user_contactmethods', 'modify_contact_methods');

http://codex.wordpress.org/Plugin_API/Filter_Reference/user_contact方法

  1. 添加新的自定义帖子类型- 代码
  2. 向用户添加新字段-上面的代码
  3. 添加新的小部件- 代码
  4. 添加自定义永久链接-WordPress永久链接设置

5

我知道这是一匹死马,而Chip几乎掩盖了它,但想补充一些想法。

如果您进行了生动的编程,并发现自己在截止日期之前在wordpress网站上工作,那么您会发现它确实是按时完成的。

通常,尤其是对于刚起步的人来说,将所需的内容添加到主题中并称其完成会更快,更简单。

话虽如此,如果您半定期使用wordpress,则应认真考虑执行以下操作


  1. 建立一个插件框架

这应该处理您通常需要使用插件执行的所有操作,包括激活,停用,版本更新,构建管理面板和卸载。

如果您有时间这样做,您会发现:

  • 通过插件添加功能不再需要花费额外的时间
  • 您可以开始构建可靠的插件列表,以根据需要在其他项目上重复使用,从长远来看,可以节省大量时间。
  • 如果您希望获得更大的知名度,可以将其公开发布

您现在可以正确地构建事物,更快地完成将来的项目。


  1. 建立一个主题框架

这应该处理主题中通常需要的所有内容:

  • 核心样式表,其中包含您常用的样式(重置等)
  • 正确的index.php文件,可处理任何模板所需的一切
  • 一个functions.php文件-您几乎不会使用它,但是它仍然派上用场。

完成此操作后,构建一个使用主主题的子主题框架。

  • 添加样式表,引用您的父主题。
  • 添加functions.php文件

完成这两项操作后,为人们创建新站点的速度就会大大提高。


如果执行上述操作,则可以进行以下操作:

  • 花费您新发现的空闲时间来更熟悉PHP,WordPress,JavaScript,CSS和/或mySQL ...了解的越多,完成工作就越快。
  • 当发现需要改进的地方时,请更新插件,主题和子主题框架。无论您多么出色,如果您不断学习,就会发现有待改进。

并且,如果您完成上述所有操作,您会发现Chip的答案不仅将是理想的,而且将变为最佳。


3

简单的答案是这样。

代码是否依赖于特定主题中内置的任何功能?如果是,则输入一个主题。

您是否希望此代码可在网站之间和主题之间转移?如果是,则放入一个插件。

如果对以上两个问题的回答都不成立,那么请在未来5年重新设计该站点时,对它进行构想。您正在编写的代码功能是否可以在下一次设计更新中保留下来?如果是,请插入插件。

另外,如果您不使用子主题并且打算更新主题,那么我也建议您使用插件。

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.