问题描述

有没有一个容易理解的方案来决定什么样的代码属于一个插件或主题的 functions.php

有关于该主题的 are many cases 和许多 debates,主要是因为对 WordPress 的内部工作有一些误解。我根据事实要求一个答案,而不是意见。

它应该解释如何处理这些问题 (或许更多):

  • 定制帖子类型和分类
  • 联络表格
  • 短码
  • 自定义小工具
  •  add_theme_support( 'automatic-feed-links' );
  • SEO 功能像自定义 meta 元素
  • 主题开关

双方往往有利弊。我们最受欢迎的问题 Best Collection of Code for your functions.php file 得到了很多代码片段作为至少有争议的答案。我们需要一个初学者可以理解的标准,也许是一个检查列表 – 有理由。

另见 Chip Bennett 在我们的元网站:Questions specifically asking for a solution “without a plugin” 的相关问题

相关:Where do I put the code snippets I found here or somewhere else on the web?

最佳解决方案

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

如果功能与内容的呈现不具体相关,那么它就是在插件领域内。这个列表很长:

  • 修改核心 WP 过滤器 (wp_head 内容,如规范链接,生成器和其他 HTML 元等)
  • 网站图标
  • Post-content 短码
  • 发布共享链接
  • Google Analytics(分析)(和类似的) 脚注脚本
  • SEO 工具/控件
  • 等等

如果功能与内容的呈现相关,那么它是被包含在主题中的候选者。在这一点上,我会回到 @Raf912’s Theme-switch criterion:你会错过功能,当你切换主题?如果该问题的答案为否,则该功能属于主题。一些例子:

  • 删除/覆盖 WP 核心 Gallery CSS
  • 过滤帖子摘录长度,「阅读更多」 文字等
  • 任何通过 add_theme_support()实现的 (我想这应该是明显的)
  • 自定义 CSS

通常,这两个问题将提供一个相当明确的区别; 但是,也有例外。

自定义帖子类型

例如,自定义帖子类型是内容生成和呈现的一个独特的混合,给出了模板层次结构对于 single-post-type archive index pagessingle post pages 的工作原理。 CPT 的 content-generation 方面通常将它们放在插件领域中; 然而,插件无法定义适合任何给定主题的设计/布局/样式的模板页面 (特别是如果 CPT 显示的内容不是通常的标题/内容/元数据,或者与之相关联的自定义分类法) 。

Long-term 是对这种差异的解决方案,IMHO 是针对给定类型内容 (房地产列表,日历事件,e-commerce 产品,图书/媒体库条目等) 的 CPT 定义具有标准约定/共识。这样,user-generated 内容将在实现给定 CPT 的标准/惯例定义的主题之间保持可移植性,而主题开发人员保留在主题模板文件中定义该 CPT 的设计/布局/样式的灵活性。

社交媒体链接

同样地,我通常会说社交媒体简介链接,ave 在现在的主题中变得普遍存在,是插件领域,因为它们与内容呈现无关。最好的解决方案是将这些配置文件定义在核心的某个位置; 然而,目前没有标准/共识的方式来定义这些链接。在 site-setting 级别是 best-defined 还是基于 per-user?如果 per-user,哪个用户的 meta 在模板中暴露出来?等等

那么,再次,long-term,解决这个差距是任何一个核心来定义这些链接的定义,否则主题开发者社区就会发展自己的共识。在此期间,真正没有任何东西可以让它们在每个主题中保持定义。

次佳解决方案

一个简单的测试代码最好放在哪里:

  • 将代码写入 functions.php
  • 切换主题
  • 你是否错过了这个功能,博客是不是正确的工作或旧主题的碎片 (如短码)?

    • 是的,把它放入一个插件
    • 否:将其留在 functions.php 中

示例:写一个短码。切换主题后,简短的代码将留在您的帖子中。所以它会更好地放在插件中。

写一个函数列出最后的注释。切换主题后,一切都可以,因为其他主题可能具有相同的功能。

它真的取决于代码和它将做什么。一些代码只影响主题的样式或内容,还有一些代码将修改博客文章。

第三种解决方案

我不认为这个问题有一个简单的答案,但我敢打赌,我们可以制作流程图来帮助决定。这是一个这样一个流程图的大纲,可以并且应该扩展。评论与建议!

      • 具体到这个当前的设计

        • 是的:functions.php
        • 否:插件
      • 不 (它经常改变或者是一个奇怪的) – 插件
      • 具体到这个网站

        • 具体到这个网站:functions.php
          • 是:插件,存储在 mu-plugins 目录或 network-activated
          • 无关

              • 是的:functions.php
              • 否:插件
            • 不,可能是插件
      • 否 (由诸如 VIP 的服务托管,不允许插件):use functions.php

  • 父主题 – 有时具有共享功能,最好做一个父主题,并将功能放在父主题的 functions.php 文件中。
  • 大型多站点安装的插件目录可能会很快变得不守规矩,所以有时在低百分比网站 (例如<1%) 使用的共享功能最好在 functions.php 文件中复制。

第四种方案

从这里 Themes VS Plugins

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

您还可以创建一个包含所有自定义代码的网站特定插件。

就编写代码与插件而言,您可以使用插件和功能,但是对于大多数您想要的,手工编码是最好的,因为它更容易修改,除了在某些情况下,如元框,您可以考虑使用插件,除非你 「是一个主题开发者

 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_contactmethods

  1. 添加新的自定义帖子类型 – Code
  2. 向用户 – 上面的代码添加新的字段
  3. 添加新的小工具 – Code
  4. 添加自定义永久链接 – WordPress Permalink Settings

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。