plugin-name/ │ ├── plugin-name.php ├── uninstall.php ├── readme.txt ├── assets/ │ ├── css/ │ │ └── style.css │ ├── js/ │ │ └── script.js │ └── images/ ├── includes/ │ ├── class-plugin-name-activator.php │ ├── class-plugin-name-deactivator.php │ └── class-plugin-name.php └── languages/ └── plugin-name-en_US.mo
Để chuyển đổi cấu trúc plugin sang modules nhằm tránh xung đột, bạn có thể tổ chức lại các thành phần của plugin thành các module riêng biệt. Mỗi module sẽ chứa các tệp và logic riêng liên quan đến một chức năng cụ thể. Dưới đây là một gợi ý về cấu trúc mới:
plugin-name/ │ ├── plugin-name.php ├── uninstall.php ├── readme.txt ├── assets/ │ ├── css/ │ │ └── style.css │ ├── js/ │ │ └── script.js │ └── images/ ├── includes/ │ ├── modules/ │ │ ├── module-1/ │ │ │ ├── class-module-1.php │ │ │ ├── functions-module-1.php │ │ │ ├── assets/ │ │ │ │ ├── css/ │ │ │ │ ├── js/ │ │ │ │ └── images/ │ │ ├── module-2/ │ │ │ ├── class-module-2.php │ │ │ ├── functions-module-2.php │ │ │ ├── assets/ │ │ │ │ ├── css/ │ │ │ │ ├── js/ │ │ │ │ └── images/ │ │ └── ... │ ├── class-plugin-name-activator.php │ ├── class-plugin-name-deactivator.php │ └── class-plugin-name.php └── languages/ └── plugin-name-en_US.mo
plugin-name.php: Tệp chính của plugin, chịu trách nhiệm tải các module và khởi tạo các chức năng cần thiết.
uninstall.php: Tệp chịu trách nhiệm xử lý khi plugin bị gỡ cài đặt.
assets/: Thư mục chứa tài nguyên dùng chung như CSS, JavaScript và hình ảnh.
includes/modules/: Thư mục chứa các module của plugin. Mỗi module có một thư mục riêng, bên trong có thể chứa các class, hàm, và tài nguyên liên quan.
class-plugin-name-activator.php: Chứa logic kích hoạt plugin.
class-plugin-name-deactivator.php: Chứa logic khi plugin bị hủy kích hoạt.
class-plugin-name.php: Tệp class chính của plugin, có thể dùng để quản lý việc tải các module.
Với cấu trúc này, bạn có thể dễ dàng quản lý và phát triển các module mới mà không lo bị xung đột với các phần khác của plugin.
Dưới đây là code mẫu cho từng tệp trong cấu trúc plugin mới với cấu trúc modules:
<?php /** * Plugin Name: Plugin Name * Description: Mô tả ngắn gọn về plugin. * Version: 1.0 * Author: Tên tác giả * Text Domain: plugin-name */ if ( ! defined( 'ABSPATH' ) ) { exit; // Bảo vệ trực tiếp truy cập file. } class Plugin_Name { protected static $instance = null; private function __construct() { $this->load_dependencies(); $this->initialize_modules(); } public static function instance() { if ( is_null( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } private function load_dependencies() { require_once plugin_dir_path( __FILE__ ) . 'includes/class-plugin-name-activator.php'; require_once plugin_dir_path( __FILE__ ) . 'includes/class-plugin-name-deactivator.php'; } private function initialize_modules() { require_once plugin_dir_path( __FILE__ ) . 'includes/modules/module-1/class-module-1.php'; require_once plugin_dir_path( __FILE__ ) . 'includes/modules/module-2/class-module-2.php'; // Khởi tạo các module Module_1::instance(); Module_2::instance(); } public static function activate() { Plugin_Name_Activator::activate(); } public static function deactivate() { Plugin_Name_Deactivator::deactivate(); } } register_activation_hook( __FILE__, array( 'Plugin_Name', 'activate' ) ); register_deactivation_hook( __FILE__, array( 'Plugin_Name', 'deactivate' ) ); Plugin_Name::instance();
<?php if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) { exit; // Bảo vệ trực tiếp truy cập file. } // Xóa các cài đặt hoặc dữ liệu liên quan đến plugin tại đây.
<?php class Plugin_Name_Activator { public static function activate() { // Logic khi kích hoạt plugin, ví dụ như tạo bảng cơ sở dữ liệu. } }
<?php class Plugin_Name_Deactivator { public static function deactivate() { // Logic khi plugin bị hủy kích hoạt. } }
<?php class Module_1 { protected static $instance = null; private function __construct() { $this->setup_hooks(); } public static function instance() { if ( is_null( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } private function setup_hooks() { // Thêm các action và filter hook của module tại đây. add_action( 'init', array( $this, 'custom_post_type' ) ); } public function custom_post_type() { // Đăng ký custom post type hoặc các chức năng khác của module. } }
<?php class Module_2 { protected static $instance = null; private function __construct() { $this->setup_hooks(); } public static function instance() { if ( is_null( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } private function setup_hooks() { // Thêm các action và filter hook của module tại đây. add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); } public function enqueue_scripts() { // Đăng ký và xếp hàng các file CSS và JavaScript của module. wp_enqueue_style( 'module-2-style', plugin_dir_url( __FILE__ ) . 'assets/css/style.css' ); wp_enqueue_script( 'module-2-script', plugin_dir_url( __FILE__ ) . 'assets/js/script.js', array( 'jquery' ), false, true ); } }
/* Mẫu CSS cho plugin */ body { background-color: #f4f4f4; }
jQuery(document).ready(function($) { console.log('Plugin script loaded.'); });
Với các tệp này, bạn sẽ có một plugin với cấu trúc module rõ ràng và dễ quản lý. Mỗi module có thể được phát triển độc lập, giảm thiểu rủi ro xung đột trong quá trình phát triển.
Để giảm thiểu code bị lặp và tái sử dụng các class trong plugin, bạn có thể tạo các lớp cơ bản (base classes) hoặc sử dụng các trait để chia sẻ các phương thức và thuộc tính chung giữa các class. Dưới đây là một số cách tiếp cận:
Bạn có thể tạo một lớp cơ bản chứa các phương thức và thuộc tính chung mà các module khác có thể kế thừa.
Tạo Base Class
includes/class-base-module.php
<?php abstract class Base_Module { protected function log_message( $message ) { // Ví dụ: Ghi lại một thông báo vào log. error_log( $message ); } protected function enqueue_common_scripts() { // Đăng ký các script hoặc style chung cho các module. wp_enqueue_style( 'common-style', plugin_dir_url( __FILE__ ) . '../assets/css/common.css' ); wp_enqueue_script( 'common-script', plugin_dir_url( __FILE__ ) . '../assets/js/common.js', array( 'jquery' ), false, true ); } // Các phương thức và thuộc tính chung khác... }
Kế thừa Base Class trong Module
includes/modules/module-1/class-module-1.php
<?php class Module_1 extends Base_Module { protected static $instance = null; private function __construct() { $this->setup_hooks(); } public static function instance() { if ( is_null( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } private function setup_hooks() { $this->enqueue_common_scripts(); // Các hooks khác của module... } // Các phương thức riêng của module... }
includes/modules/module-2/class-module-2.php
<?php class Module_2 extends Base_Module { protected static $instance = null; private function __construct() { $this->setup_hooks(); } public static function instance() { if ( is_null( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } private function setup_hooks() { $this->enqueue_common_scripts(); // Các hooks khác của module... } // Các phương thức riêng của module... }
Traits trong PHP cho phép bạn chia sẻ các phương thức giữa các class mà không cần phải kế thừa. Điều này hữu ích khi bạn muốn sử dụng lại các phương thức chung mà không cần tạo quan hệ cha-con giữa các class.
Tạo Trait
includes/traits/trait-logger.php
<?php trait Logger { protected function log_message( $message ) { // Ví dụ: Ghi lại một thông báo vào log. error_log( $message ); } }
Sử dụng Trait trong Module
includes/modules/module-1/class-module-1.php
<?php class Module_1 { use Logger; protected static $instance = null; private function __construct() { $this->setup_hooks(); } public static function instance() { if ( is_null( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } private function setup_hooks() { $this->log_message( 'Module 1 initialized' ); // Các hooks khác của module... } // Các phương thức riêng của module... }
includes/modules/module-2/class-module-2.php
<?php class Module_2 { use Logger; protected static $instance = null; private function __construct() { $this->setup_hooks(); } public static function instance() { if ( is_null( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } private function setup_hooks() { $this->log_message( 'Module 2 initialized' ); // Các hooks khác của module... } // Các phương thức riêng của module... }
Nếu bạn có các chức năng hoặc logic tái sử dụng, bạn cũng có thể tạo các lớp helper để giữ các phương thức này. Những lớp helper này có thể được gọi từ bất kỳ module nào mà không cần kế thừa.
Tạo Helper Class
includes/helpers/class-helper.php
<?php class Plugin_Helper { public static function sanitize_input( $input ) { return sanitize_text_field( $input ); } public static function format_date( $date ) { return date( 'F j, Y', strtotime( $date ) ); } // Các phương thức khác... }
Sử dụng Helper Class trong Module
includes/modules/module-1/class-module-1.php
<?php class Module_1 { protected static $instance = null; private function __construct() { $this->setup_hooks(); } public static function instance() { if ( is_null( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } private function setup_hooks() { $formatted_date = Plugin_Helper::format_date( '2024-08-30' ); // Các hooks khác của module... } // Các phương thức riêng của module... }
Với các phương pháp trên, bạn có thể dễ dàng tái sử dụng các phần code chung giữa các module trong plugin của mình mà không cần phải lặp lại code.
Leave A Comment