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

关于该主题的案例很多,争论很多,主要是因为对内部主题有一些误解WordPress的运作方式。我要求的答案是基于事实,而不是根据观点。

它应该解释如何处理这些问题(可能还有更多):类型和分类法
联系表格
简码
自定义小部件
add_theme_support( 'automatic-feed-links' );
SEO函数,例如自定义meta元素
主题开关

有双方通常都是利弊。对于您的functions.php文件,我们最受欢迎的问题“最佳代码收集”有很多代码片段,这些答案至少值得商.。
我们需要初学者可以理解的标准,或者是清单,并附上理由。
/>
在我们的元网站上另请参见Chip Bennett的相关问题:专门要求“无插件”解决方案的问题

相关:在哪里可以找到在这里找到的代码片段或网络上的其他地方?

评论

我想知道出于这个问题的目的将构成什么事实。人A说CPT进入插件,人B说CPT进入主题。我们如何获取事实以验证其中一项意见?这可能很危险地接近“非建设性”。

#1 楼

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

如果该功能不是专门相关的内容呈现,然后就在插件领域内。此列表很长:


修改核心WP过滤器(wp_head的内容,例如规范链接,生成器和其他HTML meta等)
站点Favicon
发布后内容简码
发布共享链接
Google Analytics(分析)(和类似)页脚脚本
SEO工具/控件
等。

如果该功能与演示文稿有关内容,那么它是包含在主题中的候选对象。在这一点上,我将回复到@ Raf912的主题切换标准:切换主题时会错过功能吗?功能属于主题。一些示例:


删除/覆盖WP核心库CSS
过滤帖子摘录长度,“阅读更多”文字等。
通过add_theme_support()实现的任何操作(我想这应该很明显)
自定义CSS

通常,这两个问题将提供相当清晰的区分;但是,也有例外。 >
自定义帖子类型

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

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

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

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

评论


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

– fuxia♦
2012年11月19日在22:01



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

–芯片Bennett
2012年11月19日在22:48

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

– fuxia♦
2012年11月19日在22:55

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

–芯片Bennett
2012年11月19日23:49

#2 楼

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


将代码写入函数中。php
切换主题

,您是否错过了功能,是博客无法正常工作还是保留了旧主题的片段(例如,短代码)?


是:将其放入插件中
否:将其保留在functions.php中



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

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

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

评论


+1如果代码是特定于主题的,则将其命名为functions.php。如果需要应用于多个主题,则将其放在插件中。

– s_ha_dum
2012年11月18日15:15

#3 楼

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



此代码是否托管在WordPress的单站点安装中?

是-仅网站主题通过重大的重新设计和功能变更而改变?

是-所涉及的代码是否特定于当前设计?

是:functions.php
否:插件


否(它经常更改或随即更改)-插件


否(Multsisite)-您托管的是多站点安装,还是托管的允许插件的多站点解决方案? br />
是:有问题的功能是否特定于此站点,或者是否可以/应该被网络中的其他站点使用?

特定于此站点:functions.php
在多个站点之间共享-您是否要在每个站点上强制使用它?不相关的网站? (例如,不同的客户端)

是:如果客户端A看到或激活了您为客户端B,C和D编写的插件,这是不好还是不专业? (例如,可能会破坏站点或导致不良功能)

是:functions.php
否:插件


否:可能是插件






否(由类似VIP的服务托管,不允许插件):使用functions.php





我不知道该如何适应的其他一些想法:


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


#4 楼

从这里主题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_contactmethods


添加新的自定义帖子类型-代码
向用户添加新字段-上面的代码
添加新的小部件-代码

添加自定义永久链接-WordPress永久链接设置



#5 楼

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

如果您进行活泼的编程并发现自己在截止日期之前在wordpress网站上工作,会发现它真的会随着时间而变。

经常,尤其是对于刚起步的人,将主题中需要的东西添加并完成它会更快,更简单。 。也就是说,如果您半定期使用wordpress,则应认真考虑执行以下操作:



插件框架

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

如果您花时间去做,您会发现:


不再需要太多时间来通过插件添加功能
您可以开始构建可靠的插件列表再利用在其他项目上需要的话,从长远来看可以节省很多时间。
如果您希望获得更多的可见性,可以将其公开发布

现在您可以正确构建内容并获得未来项目可以更快地完成。



构建主题框架

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


包含常用样式的核心样式表(resets等)
适当的index.php文件,处理任何模板所需的一切
functions.php文件-您几乎不会使用它,但是它仍然会派上用场。

完成后,请构建使用主主题的子主题框架。


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

完成这两项操作后,为人们创建新网站变得非常重要更快。


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


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


如果您完成上述所有操作,您会发现Chip的答案就不会只有理想,它才会变得最优。

#6 楼

简单的答案是这样。

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

您是否希望此代码在站点之间和主题之间可传递?如果是,则插入一个插件。

如果以上两个方法均不能,请在未来5年重新设计该站点。您正在编写的代码功能是否可以在下一次设计更新中保留下来?如果是,请插入一个插件。

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