当前位置: 首页>>技术解读>>正文


如何构建插件

webfans 技术解读 , , , , , 去评论

问题描述

这不是关于如何构建WordPress插件的问题。相反,如果有的话,可以应用什么指南来组合任何插件的文件架构。

一些其他编程语言或库具有非常受控的组织目录和文件的方式。有时这很烦人并且突出了PHP提供的自由,但是在flip-side上,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

组织松散的方法

  • /wp-content

    • /plugins

      • /my-plugin

        • css/

        • images/

        • js/

        • my-admin.php

        • my-class.php

        • my-template.php

        • my-widget.php

        • my-plugin.php

最佳解决方法

请注意,插件都是WP标准的”controllers”。

这取决于插件应该做什么,但在所有情况下,我会尝试尽可能地将屏幕输出与PHP代码分开。

这是一种轻松实现的方法 – 首先,定义一个加载模板的函数:

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,图像放在哪里,或者你如何设计钩子的容器就不那么重要了。我想这是个人喜好的问题。

次佳解决方法

这取决于插件。这是我几乎每个插件的基本结构:

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

This将出现在lib文件夹中。

如果它是特别复杂的插件,具有很多管理区域功能,我会添加一个admin文件夹来包含所有这些PHP文件。如果插件执行类似替换包含的theme files,则可能还有templatetheme文件夹。

因此,目录结构可能如下所示:

my-plugin/
    inc/
    lib/
    admin/
    templates/
    css/
    js/
    images/
    lang/
    my-plugin.php
    readme.txt

第三种解决方法

恕我直言,最简单,最强大,最易维护的路线是使用MVC结构,而WP MVC旨在使编写MVC插件变得非常容易(虽然……我有点偏颇)。使用WP MVC,您只需制作模型,视图和控制器,其他所有内容都将在幕后为您处理。

可以为公共和管理部分分别创建控制器和视图,整个框架利用WordPress的许多本机功能。文件结构和许多功能与最流行的MVC框架(Rails,CakePHP等)完全相同。

更多信息和教程可以在这里找到:

第四种方法

我们正在使用所有方法的混合。首先,我们在插件中使用了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
  1. WordPress调用插件根文件夹中的webeo-core.php文件。

  2. 在这个文件中,我们将设置PHP包含路径并注册插件的激活和停用挂钩。

  3. 我们在这个文件中也有一个Webeo_CoreLoader类,它设置一些插件常量,初始化类自动加载器并调用lib/Webeo文件夹中Core.php类的setup方法。它在plugins_loaded操作挂钩上运行,优先级为9

  4. Core.php类是我们的插件引导程序文件。该名称基于插件名称。

如您所见,我们在所有供应商软件包(WebeoZend)的lib文件夹中都有一个子目录。供应商内的所有子包都是模块本身的结构。对于新的Mail Settings管理表单,我们将具有以下结构:

webeo-core/
    ...
    lib/
        Webeo/
            Form/
                Admin/
                    MailSettings.php
                Admin.php
            Core.php
            Form.php

我们的sub-plugins具有相同的结构,但有一个例外。由于在自动加载事件期间解决了命名冲突,我们在供应商文件夹内更深入了解。我们还在plugins_loaded挂钩内的10优先级上调用插件boostrap类E.g. Faq.php

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,并将所有公用文件夹(css,images,js,languages)移动到下一版本中名为public的文件夹中。

第五种方法

像这里的许多人已经回答它真的取决于插件应该做什么,但这是我的基础结构:

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

第六种方法

我偏爱以下插件布局,但它通常会根据插件要求而改变。

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目录来展示它,它本身包含视图/控制器/模型。

第七种方法

我的逻辑,插件越大,我使用的结构越多。对于大插件,我倾向于使用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

第八种方法

我的所有插件都遵循这种结构,这似乎与大多数其他开发人员正在做的非常相似:

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通常是一个从core /文件夹加载所有必需文件的类。最常见的是在init或plugins_loaded钩子上。

我过去常常为我的所有文件添加前缀,但正如上面提到的@kaiser,它真的是多余的,我最近决定将它从以后的任何插件中删除。

库/文件夹包含插件可能依赖的所有外部帮助程序库。

根据插件的不同,插件根目录中可能还有一个uninstall.php文件。但大部分时间都是通过 register_uninstall_hook()处理的。

显然,一些插件可能不需要任何管理文件或模板等,但上面的结构对我有用。最后,您只需找到适合您的结构,然后坚持下去。

我还有一个入门插件,基于上面的结构,我用作所有插件的起点。我需要做的就是对函数/类前缀进行搜索/替换,然后关闭。当我还在为我的文件添加前缀时,这是我必须做的额外步骤(并且非常烦人),但现在我只需要重命名插件文件夹和主插件文件。

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2416.html,转载请务必附带本地址声明。