it-swarm-ko.tech

플러그인을 구조화하는 방법

이것은 워드 프레스 플러그인을 만드는 방법에 관한 질문이 아닙니다. 오히려, 가이드가 있다면, 플러그인의 파일 아키텍처를 결합하는 방법에 적용 할 수있는 것은 무엇입니까?.

다른 프로그래밍 언어 나 라이브러리는 디렉토리와 파일을 체계적으로 관리하는 방법을 가지고 있습니다. 때때로 이것은 성가시다. PHP가 제공하는 자유를 강조하지만, 플립 사이드의 WordPress 플러그인은 작성자가 결정한대로 어떤 방식 으로든 결합됩니다.

정답은 없지만, 다른 개발자가 싫어하고, 디버그하기 쉽고, 탐색하기 쉽고, 더 효율적일 수 있도록 플러그인을 빌드하는 방법을 개선하는 것이 나의 희망입니다.

마지막 질문 :what do youthink가 플러그인을 구성하는 가장 좋은 방법입니까?

다음은 몇 가지 샘플 구조입니다. 그러나 절대로 완전한 목록이 아닙니다. 자신의 추천을 자유롭게 추가하십시오.

가정 된 기본 구조

  • /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의 세 부분 :

  • model은 데이터베이스와 상호 작용하고 데이터를 쿼리 및 저장하며 논리를 포함합니다.
  • controller에는 뷰가 활용할 템플릿 태그와 함수가 포함됩니다.
  • view는 컨트롤러가 생성 한 모델에서 제공하는 데이터를 표시합니다.

형식 메서드로 구성

  • /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 플러그인 Boilerplate

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
37
developdaly

플러그인은 WP 표준에 의한 모든 "컨트롤러"입니다.

그것은 플러그인이 무엇을 해야하는지에 달려 있지만, 모든 경우에 가능한 한 화면 출력을 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, 이미지를 어디에 두거나 갈고리 용 컨테이너를 디자인하는 것이 덜 중요합니까? 개인적으로 선호하는 문제입니다.

16
onetrickpony

IMHO는 MVC 구조를 사용하는 것이 가장 쉽고 강력하며 유지 관리가 쉬운 방법이며, WP MVC는 MVC 플러그인을 매우 쉽게 작성할 수 있도록 설계되었습니다 (비록 조금 편견이 있지만 ...) . WP MVC를 사용하면 모델, 뷰 및 컨트롤러 만 만들면 나머지는 다룰 수 있습니다.

공용 및 관리 섹션에 대해 별도의 컨트롤러 및보기를 만들 수 있으며 전체 프레임 워크는 WordPress의 기본 기능 중 많은 부분을 활용합니다. 파일 구조와 많은 기능은 가장 널리 사용되는 MVC 프레임 워크 (Rails, CakePHP 등)와 정확히 동일합니다.

추가 정보 및 자습서는 다음에서 찾을 수 있습니다.

6
Tom

그것은 플러그인에 따라 다릅니다. 이것은 거의 모든 플러그인을위한 기본 구조입니다.

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

Thislib 폴더에 들어갈 수 있습니다.

특히 관리 영역 기능이 많은 복잡한 플러그인 인 경우 해당 PHP 파일을 모두 포함 할 수있는 admin 폴더를 추가해야합니다. 플러그인이 포함 된 테마 파일 을 바꾸는 것과 같은 일을하는 경우 template 또는 theme 폴더가있을 수 있습니다.

따라서 디렉토리 구조는 다음과 같습니다.

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

여기에 많은 사람들이 이미 대답했듯이 플러그인이해야 할 일에 대해 실제로 depends이지만 여기 내 기본 구조는 다음과 같습니다.

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
5
Bainternet

우리는 모든 방법을 혼합하여 사용하고 있습니다. 우선 플러그인에서 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 include 경로를 설정하고 플러그인의 활성화 및 비활성화 후크를 등록합니다.
  3. 우리는 또한이 파일 안에 Webeo_CoreLoader 클래스를 가지고 있습니다.이 클래스는 플러그인 상수를 설정하고, 클래스 자동 로더를 초기화하고, Core.php 폴더 안에있는 lib/Webeo 클래스의 setup 메소드를 호출합니다. 이것은 plugins_loaded 우선 순위로 9 동작 훅에서 실행됩니다.
  4. Core.php 클래스는 우리의 플러그인 부트 스트랩 파일입니다. 이름은 플러그인 이름을 기반으로합니다.

보시다시피, 모든 공급 업체 패키지 (lib, Webeo)에 대해 Zend 폴더 안에 하위 디렉토리가 있습니다. 공급 업체 내의 모든 하위 패키지는 모듈 자체의 구조입니다. 새로운 Mail Settings 관리 양식의 경우 다음과 같은 구조가됩니다.

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

우리의 하위 플러그인은 하나의 예외를 제외하고는 같은 구조를 가지고 있습니다. autoload 이벤트 중 이름 충돌을 해결하기 위해 벤더 폴더 내에서 좀 더 깊이 들어가 있습니다. 또한 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으로 바꾸고 모든 공용 폴더 (css, images, js, languages)를 다음 릴리스에서 public 폴더로 옮길 것입니다.

5
rofflox

내 논리는 플러그인이 커질수록 내가 사용하는 구조가 더 커진다.
큰 플러그인의 경우 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
4
janw

나는 다음 플러그인 레이아웃의 일부분이지만, 일반적으로 플러그인 요구 사항에 따라 변경됩니다.

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 

아직 MVP 스타일 아키텍처가 필요한 WordPress 플러그인을 만들지 만,이 작업을 수행하려면 뷰/컨트롤러/모델이 포함 된 별도의 MVC 디렉토리로 레이아웃해야합니다.

4
mystline

모든 플러그인은이 구조를 따르며, 이는 대부분의 다른 개발자가 수행하는 것과 매우 유사합니다.

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는 대개 코어/폴더에서 필요한 모든 파일을로드하는 클래스입니다. 대부분 init 또는 plugins_loaded 훅에서.

나는 모든 파일에 접두어를 붙 였지만, @ kaiser가 위에 언급 한 것처럼, 그것은 정말로 중복되어 있으며, 나는 미래의 어떤 플러그인에서도 그것을 제거하기로 결정했다.

라이브러리/폴더는 플러그인이 의존 할 수있는 모든 외부 도우미 라이브러리를 보유합니다.

플러그인에 따라 플러그인 루트에 uninstall.php 파일이있을 수도 있습니다. 대부분이 시간은 register_uninstall_hook ()를 통해 처리됩니다.

분명히, 일부 플러그인은 관리 파일이나 템플릿 등을 필요로하지 않을 수도 있지만 위의 구조는 저에게 효과적입니다. 결국 당신은 당신을 위해 일하는 구조를 찾아서 붙잡아 야합니다.

또한 필자는 모든 플러그인의 시작점으로 사용하는 위의 구조를 기반으로 시작 플러그인이 있습니다. 그 때해야 할 일은 함수/클래스 접두사를 검색/대체하고 나가는 것입니다. 필자가해야 할 여분의 단계 인 필자 접미어를 붙였을 때 (그리고 그 일을 상당히 짜증나게 할 때), 이제 플러그인 폴더와 메인 플러그인 파일의 이름을 변경해야합니다.

3
shabushabu

또한 이 훌륭한 WP widget 상용구 를 참조하십시오. 그것은 구조의 중요한 힌트를 제공합니다 (별도의 모델을위한 클래스 나 폴더가 없더라도).

1
Cedric

플러그인의 파일과 디렉토리를 구조화하기위한 덜 일반적인 접근법은 파일 유형 접근법입니다. 완전성을 위해 여기서 언급 할 가치가 있습니다.

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/가있는 경우이 방법이 부족하다는 점에 유의하십시오.

0
henrywright