其他一些编程语言或库具有组织目录和文件的受控方式。有时这很烦人,并且突显了PHP提供的自由,但是在另一方面,WordPress插件却以其作者确定的任何方式组合在一起。
没有正确的答案,但是我的希望是完善我和其他人构建插件的方式,使它们对其他开发人员更友好地进行剖析,更易于调试,更易于导航以及可能更高效。
最后一个问题:怎么办您认为是组织插件的最佳方法吗?
下面是一些示例结构,但绝不是详尽的列表。随时添加自己的建议。
假定的默认结构
/wp-content
/>
/plugins
/my-plugin
my-plugin.php
模型视图控制器(MVC)方法
/wp-content
>
/plugins
/my-plugin
/controller
Controller.php
/model
Model.php
/view
view.php
my-plugin.php
MVC的三个部分:
模型与数据库交互,查询和保存数据,并包含逻辑。
控制器将包含模板标签。视图将使用的视图和功能。
视图负责显示由控制器构造的模型提供的数据。
组织通过类型化方法
/wp-content
/plugins
/my-plugin
/admin
admin.php
/assets
css/
/>
images/
/classes
my-class.php
/lang
my-es_ES.mo
/templates
my-template.php
/widgets
my-widget.php
my-plugin.php
WordPress插件样板
基于Github提供
基于插件API,编码标准和文档标准。
/wp-content
/plugins
/my-plugin
/admin
/css
/js
/partials
my-plugin-admin.php
/includes
my_plugin_activator.php
my_plugin_deactivator.php
my_plugin_i18n.php
my_plugin_loader.php
my_plugin.php
/languages
my_plugin.pot
/public
/css
/js
/partials
my-plugin-public.php
LICENSE.txt
README.txt
index.php
my-plugin.php
uninstall.php
组织松散的方法
/wp-content
/>
/plugins
/my-plugin
css/
images/
js/
my-admin.php
/>
my-class.php
my-template.php
my-widget.php
my-plugin.php
#1 楼
请注意,按照WP标准,插件都是“控制器”。这是轻松实现此目的的一种方法-首先,定义一个加载模板的函数:
function my_plugin_load_template(array $_vars){
// you cannot let locate_template to load your template
// because WP devs made sure you can't pass
// variables to your template :(
$_template = locate_template('my_plugin', false, false);
// use the default one if the theme doesn't have it
if(!_$template)
$_template = 'views/template.php';
// load it
extract($_vars);
require $template;
}
现在,如果插件使用小部件显示数据:
class Your_Widget extends WP_Widget{
...
public function widget($args, $instance){
$title = apply_filters('widget_title', $instance['title'], $instance, $this->id_base);
// this widget shows the last 5 "movies"
$posts = new WP_Query(array('posts_per_page' => 5, 'post_type' => 'movie'));
if($title)
print $before_title . $title . $after_title;
// here we rely on the template to display the data on the screen
my_plugin_load_template(array(
// variables you wish to expose in the template
'posts' => $posts,
));
print $before_widget;
}
...
}
模板:
<?php while($posts->have_posts()): $posts->the_post(); ?>
<p><?php the_title(); ?></p>
<?php endwhile; ?>
文件:
/plugins/my_plugin/plugin.php <-- just hooks
/plugins/my_plugin/widget.php <-- widget class, if you have a widget
/themes/twentyten/my_plugin.php <-- template
/plugins/my_plugin/views/template.php <-- fallback template
将CSS,JS,图像放在何处,或者如何设计用于钩子的容器并不重要。我猜这是个人喜好。
#2 楼
这取决于插件。这是我几乎所有插件的基本结构:my-plugin/
inc/
Any additional plugin-specific PHP files go here
lib/
Library classes, css, js, and other files that I use with many
plugins go here
css/
js/
images/
lang/
Translation files
my-plugin.php
readme.txt
这将放在
lib
文件夹中。如果特别的话复杂的插件,具有很多管理区域功能,我将添加一个
admin
文件夹以包含所有这些PHP文件。如果插件的功能类似于替换包含的主题文件,则可能还有一个template
或theme
文件夹。因此,目录结构可能如下所示:
my-plugin/
inc/
lib/
admin/
templates/
css/
js/
images/
lang/
my-plugin.php
readme.txt
评论
您还会在/ admin文件夹中包含管理员的css和js文件吗?因此在/ admin中有另一个/ css和/ js?
–urok93
2012年8月12日7:52
#3 楼
恕我直言,最简单,最强大,最易维护的方法是使用MVC结构,而WP MVC旨在使编写MVC插件非常容易(不过,我有些偏见...)。借助WP MVC,您只需创建模型,视图和控制器,其他所有操作都在后台进行。可以为公共和管理部分创建单独的控制器和视图,并且整个框架都利用了WordPress的许多本机功能。文件结构和大部分功能与最流行的MVC框架(Rails,CakePHP等)完全相同。
更多信息和教程可以在这里找到:
插件页面
教程
#4 楼
我们混合使用了所有方法。首先,我们在插件中使用Zend Framework 1.11,因此由于自动加载机制,我们不得不对类文件使用类似的结构。我们核心插件的结构(
webeo-core/
css/
images/
js/
languages/
lib/
Webeo/
Core.php
Zend/
/** ZF files **/
Loader.php
views/
readme.txt
uninstall.php
webeo-core.php
WordPress调用了插件根文件夹中的
webeo-core.php
文件。在此文件中,我们将设置PHP包含路径并注册插件的激活和停用钩子。
我们在该文件中还有一个
Webeo_CoreLoader
类,该类设置一些插件常量,初始化类autoloader和调用Core.php
文件夹中的lib/Webeo
类的设置方法。它在plugins_loaded
动作钩子上运行,优先级为9
。Core.php
类是我们的插件引导文件。该名称基于插件名称。 如您所见,我们所有供应商软件包(
lib
,Webeo
)的Zend
文件夹中都有一个子目录。供应商内部的所有子包均由模块本身构成。对于新的Mail Settings
管理表单,我们将具有以下结构:webeo-core/
...
lib/
Webeo/
Form/
Admin/
MailSettings.php
Admin.php
Core.php
Form.php
我们的子插件具有相同的结构,但有一个例外。由于在自动加载事件期间解决了命名冲突,因此我们在供应商文件夹内更深入。我们还将在
E.g. Faq.php
钩子内优先级为10
的插件称为boostrap类plugins_loaded
。webeo-faq/ (uses/extends webeo-core)
css/
images/
js/
languages/
lib/
Webeo/
Faq/
Faq.php
/** all plugin relevant class files **/
views/
readme.txt
uninstall.php
webeo-faq.php
我可能会将
lib
文件夹重命名为vendors
并移动所有公用文件夹(图像,js,语言)添加到下一版本中名为public
的文件夹。#5 楼
就像这里已经回答的许多问题一样,这实际上取决于插件的功能,但这是我的基本结构:my-plugin/
admin/
holds all back-end administrative files
js/
holds all back-end JavaScript files
css/
holds all back-end CSS files
images/
holds all back-end images
admin_file_1.php back-end functionality file
admin_file_2.php another back-end functionality file
js/
holds all front end JavaScript files
css/
holds all fronted CSS files
inc/
holds all helper classes
lang/
holds all translation files
images/
holds all fronted images
my-plugin.php main plugin file with plugin meta, mostly includes,action and filter hooks
readme.txt
changelog.txt
license.txt
#6 楼
我只喜欢以下插件布局,但是它通常会根据插件要求而改变。wp-content/
plugins/
my-plugin/
inc/
Specific files for only this plugin
admin/
Files for dealing with administrative tasks
lib/
Library/helper classes go here
css/
CSS files for the plugin
js/
JS files
images/
Images for my plugin
lang/
Translation files
plugin.php
This is the main file that calls/includes other files
README
I normally put the license details in here in addition to helpful information
我还没有创建需要MVC样式的WordPress插件。体系结构,但是如果要执行此操作,我将使用单独的MVC目录对其进行布局,该目录本身包含视图/控制器/模型。
#7 楼
我的逻辑是,插件越大,我使用的结构就越多。对于大型插件,我倾向于使用MVC。
我以此为起点,跳过不需要的内容。
controller/
frontend.php
wp-admin.php
widget1.php
widget2.php
model/
standard-wp-tables.php // if needed split it up
custom-tabel1.php
custom-tabel2.php
view/
helper.php
frontend/
files...php
wp-admin/
files...php
widget1/
file...php
widget2/
file...php
css/
js/
image/
library/ //php only, mostly for Zend Framework, again if needed
constants.php //tend to use it often
plugin.php //init file
install-unistall.php //only on big plugins
#8 楼
我所有的插件都遵循这种结构,这似乎与大多数其他开发人员的工作非常相似:plugin-folder/
admin/
css/
images/
js/
core/
css/
images/
js/
languages/
library/
templates/
plugin-folder.php
readme.txt
changelog.txt
license.txt
plugin-folder.php通常是一个加载类核心/文件夹中的所有必需文件。
我也经常给所有文件加上前缀,但正如上面@kaiser所指出的那样,它确实是多余的,我最近决定将其从将来的任何插件中删除。 。
library /文件夹包含该插件可能依赖的所有外部帮助程序库。
取决于插件,插件根目录中可能会有一个uninstall.php文件。也一样不过,大多数情况下,这是通过register_uninstall_hook()处理的。
显然,某些插件可能不需要任何管理文件或模板等,但是上面的结构对我有用。最后,您只需要找到一个适合您的结构,然后坚持使用即可。
基于上面的结构,我也有一个入门插件,我将其用作所有我的起点插件。然后,我要做的就是搜索/替换函数/类前缀,然后关闭。当我仍在给文件加上前缀时,这是我需要做的一个额外步骤(这很烦人),但是现在我只需要重命名插件文件夹和主插件文件即可。
#9 楼
另外,请参见此出色的WP小部件样板。它为结构提供了很好的提示(即使没有类也没有单独模型的文件夹)。#10 楼
构建插件文件和目录的一种较不常用的方法是文件类型方法。出于完整性考虑,这里值得一提:plugin-name/
js/
sparkle.js
shake.js
css/
style.css
scss/
header.scss
footer.scss
php/
class.php
functions.php
plugin-name.php
uninstall.php
readme.txt
每个目录仅包含该类型的文件。值得注意的是,当您有许多文件类型
.png .gif .jpg
可能更合乎逻辑地存储在单个目录(例如images/
)下时,此方法就不够用了。
评论
这不是一个真正的问题,但是我不会结束投票,而是标记为将其成为社区Wiki。顺便说一句:我认为固定文件名没有任何意义。谢谢,我还是希望这是社区Wiki。我认为以这种方式添加文件前缀也没有多大意义,但我已经看到了很多。
另一个观点:css /,images /和js /文件夹在语义上更正确的名称是styles /,images /和scripts /。