วิธีการจัดโครงสร้างปลั๊กอิน


40

นี่ไม่ใช่คำถามเกี่ยวกับวิธีสร้างปลั๊กอิน WordPress คำแนะนำสามารถนำไปใช้กับวิธีการรวมสถาปัตยกรรมไฟล์ของปลั๊กอินเข้าด้วยกันได้

ภาษาโปรแกรมหรือไลบรารีอื่น ๆ มีวิธีควบคุมการจัดเรียงไดเรกทอรีและไฟล์อย่างมาก บางครั้งสิ่งนี้น่ารำคาญและเน้นถึงอิสรภาพที่ PHP เสนอ แต่ในปลั๊กอิน WordPress แบบพลิกจะรวมเข้าด้วยกันตามที่ผู้เขียนกำหนด

ไม่มีคำตอบที่ถูกต้องแต่ความหวังของฉันคือการปรับปรุงวิธีฉันและผู้อื่นสร้างปลั๊กอินเพื่อให้เป็นมิตรมากขึ้นสำหรับนักพัฒนาอื่น ๆ ในการตรวจจับการแก้จุดบกพร่องง่ายต่อการนำทางและมีประสิทธิภาพมากขึ้น

คำถามสุดท้าย: สิ่งที่คุณคิดว่าเป็นวิธีที่ดีที่สุดในการจัดระเบียบปลั๊กอิน?

ด้านล่างนี้เป็นตัวอย่างโครงสร้างบางส่วน แต่ไม่มีรายการครบถ้วนสมบูรณ์ อย่าลังเลที่จะเพิ่มคำแนะนำของคุณเอง

โครงสร้างเริ่มต้นที่สันนิษฐาน

  • /wp-content
    • /plugins
      • /my-plugin
        • my-plugin.php

Model View Controller (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

นี่ไม่ใช่คำถามจริง แต่ฉันจะไม่ปิดการลงคะแนน แต่ตั้งค่าสถานะเพื่อให้เป็น Community Wiki Btw: ฉันคิดว่ามันไม่สมเหตุสมผลเลยที่จะแก้ไขชื่อไฟล์
ไกเซอร์

ขอบคุณฉันอยากได้นี่เป็น Wiki ชุมชนหรือไม่ ฉันไม่คิดว่าการใส่คำนำหน้าไฟล์ด้วยวิธีนี้ก็สมเหตุสมผลดี แต่ฉันเห็นมันมาก
developdaly

1
อีกด้านจุด: บางทีชื่อที่ถูกต้องมากขึ้นความหมายสำหรับโฟลเดอร์css/, images/และjs/จะเป็นstyles/, และimages/ scripts/
Andrew Odri

คำตอบ:


16

โปรดทราบว่าปลั๊กอินนั้นเป็น "ตัวควบคุม" ทั้งหมดตามมาตรฐาน 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, รูปภาพหรือวิธีการที่คุณออกแบบคอนเทนเนอร์สำหรับ hooks นั้นสำคัญน้อยกว่า ฉันเดาว่ามันเป็นเรื่องของความชอบส่วนตัว


6

มันขึ้นอยู่กับปลั๊กอิน นี่คือโครงสร้างพื้นฐานของฉันสำหรับปลั๊กอินเกือบทุกอัน:

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

คุณจะรวมไฟล์ css และ js ของผู้ดูแลระบบไว้ในโฟลเดอร์ / admin หรือไม่ ดังนั้นจึงมีอีก / css และ / js ภายใน / admin?
urok93

6

IMHO เส้นทางที่ง่ายที่สุดมีประสิทธิภาพมากที่สุดและบำรุงรักษามากที่สุดคือการใช้โครงสร้าง MVC และ WP MVC ออกแบบมาเพื่อทำให้การเขียนปลั๊กอิน MVC ง่ายมาก (ฉันลำเอียงเล็กน้อยแม้ว่า ... ) ด้วย WP MVC คุณเพียงสร้างโมเดลมุมมองและตัวควบคุมและทุกสิ่งทุกอย่างจะถูกจัดการเบื้องหลังสำหรับคุณ

สามารถแยกส่วนควบคุมและมุมมองแยกต่างหากสำหรับส่วนสาธารณะและผู้ดูแลระบบและกรอบทั้งหมดใช้ประโยชน์จากคุณสมบัติดั้งเดิมของ WordPress โครงสร้างไฟล์และการใช้งานส่วนใหญ่นั้นเหมือนกับโครงสร้าง MVC ที่ได้รับความนิยมมากที่สุด (Rails, CakePHP, ฯลฯ )

ข้อมูลเพิ่มเติมและบทช่วยสอนสามารถพบได้ที่นี่:


5

เรากำลังใช้วิธีการทั้งหมดผสมผสานกัน ก่อนอื่นเรากำลังใช้ 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ไฟล์ในโฟลเดอร์ root plugin
  2. ในไฟล์นี้เราจะตั้งค่า PHP รวมเส้นทางและลงทะเบียนการเปิดใช้งานและการปิดการใช้งาน hooks สำหรับปลั๊กอิน
  3. นอกจากนี้เรายังมีWebeo_CoreLoaderคลาสในไฟล์นี้ซึ่งตั้งค่าคงที่ของปลั๊กอินเริ่มต้นการโหลดอัตโนมัติของคลาสและทำการเรียกวิธีการตั้งค่าของCore.phpคลาสที่อยู่ในlib/Webeoโฟลเดอร์ วิ่งนี้บนตะขอดำเนินการกับลำดับความสำคัญของplugins_loaded9
  4. Core.phpระดับไฟล์ปลั๊กอินบูตของเรา ชื่อจะขึ้นอยู่กับชื่อปลั๊กอิน

อย่างที่คุณเห็นเรามีไดเรกทอรีย่อยภายในlibโฟลเดอร์สำหรับแพ็คเกจผู้ขายทั้งหมดของเรา ( Webeo, Zend) แพ็คเกจย่อยทั้งหมดภายในผู้ขายเป็นโครงสร้างของโมดูลเอง สำหรับMail Settingsฟอร์มผู้ดูแลระบบใหม่เราจะมีโครงสร้างต่อไปนี้:

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

ปลั๊กอินย่อยของเรามีโครงสร้างเดียวกันโดยมีข้อยกเว้นหนึ่งข้อ เราก้าวไปอีกระดับในโฟลเดอร์ผู้ขายเนื่องจากการแก้ไขข้อขัดแย้งในการตั้งชื่อระหว่างเหตุการณ์ autoload นอกจากนี้เรายังเรียกคลาสเสริม plugrap E.g. Faq.phpตามลำดับความสำคัญ10ภายใน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, รูปภาพ, 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

4

ฉันมีรูปแบบของปลั๊กอินต่อไปนี้บางส่วน แต่โดยปกติจะเปลี่ยนไปตามความต้องการของปลั๊กอิน

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 

ฉันยังไม่ได้สร้างปลั๊กอิน WordPress ที่ต้องการสถาปัตยกรรมสไตล์ MVC แต่ถ้าฉันทำสิ่งนี้ฉันจะจัดทำมันด้วยไดเรกทอรี MVC แยกต่างหากซึ่งตัวเองมีมุมมอง / ตัวควบคุม / รุ่น


4

ตรรกะของฉันยิ่งปลั๊กอินยิ่งใช้ก็ยิ่งใหญ่เท่านั้น
สำหรับปลั๊กอินขนาดใหญ่ฉันมักจะใช้ 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

3

ปลั๊กอินทั้งหมดของฉันเป็นไปตามโครงสร้างนี้ซึ่งดูเหมือนจะคล้ายกับสิ่งที่ devs อื่น ๆ ส่วนใหญ่ทำ:

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 ()

เห็นได้ชัดว่าปลั๊กอินบางตัวอาจไม่ต้องการไฟล์ผู้ดูแลระบบหรือแม่แบบอื่น ๆ แต่โครงสร้างด้านบนใช้ได้สำหรับฉัน ในท้ายที่สุดคุณเพียงแค่ต้องค้นหาโครงสร้างที่เหมาะกับคุณแล้วติดกับมัน

ฉันยังมีปลั๊กอินเริ่มต้นตามโครงสร้างด้านบนที่ฉันใช้เป็นจุดเริ่มต้นสำหรับปลั๊กอินทั้งหมดของฉัน สิ่งที่ฉันต้องทำคือทำการค้นหา / แทนที่คำนำหน้าฟังก์ชั่น / คลาสและปิดฉันไป เมื่อฉันยังคงใส่คำนำหน้าไฟล์ของฉันซึ่งเป็นขั้นตอนพิเศษที่ฉันต้องทำ (และค่อนข้างน่ารำคาญในตอนนั้น) แต่ตอนนี้ฉันต้องเปลี่ยนชื่อโฟลเดอร์ปลั๊กอินและไฟล์ปลั๊กอินหลัก


1

นอกจากนี้ยังเห็นนี้ WP ดีเครื่องมือสำเร็จรูป มันให้คำแนะนำที่ดีเกี่ยวกับโครงสร้าง (แม้ว่าจะไม่มีคลาสหรือโฟลเดอร์สำหรับรุ่นแยกต่างหาก)


0

วิธีที่ใช้กันทั่วไปน้อยกว่าในการจัดโครงสร้างไฟล์และไดเรกทอรีของปลั๊กอินคือวิธีการพิมพ์ไฟล์ เป็นมูลค่าการกล่าวขวัญที่นี่เพื่อความสมบูรณ์:

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/ตัวอย่างเช่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.