@mytechtoday/augment-extensions 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/augment-extensions/domain-rules/wordpress/README.md +163 -0
- package/augment-extensions/domain-rules/wordpress/module.json +32 -0
- package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -0
- package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -0
- package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -0
- package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -0
- package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -0
- package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -0
- package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -0
- package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -0
- package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -0
- package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -0
- package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -0
- package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -0
- package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -0
- package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -0
- package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -0
- package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -0
- package/augment-extensions/examples/rest-api-plugin/README.md +98 -0
- package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -0
- package/augment-extensions/examples/rest-api-plugin/module.json +40 -0
- package/augment-extensions/examples/woocommerce-extension/README.md +98 -0
- package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -0
- package/augment-extensions/examples/woocommerce-extension/module.json +40 -0
- package/augment-extensions/workflows/wordpress-plugin/README.md +232 -0
- package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -0
- package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -0
- package/augment-extensions/workflows/wordpress-plugin/module.json +49 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -0
- package/cli/dist/cli.js +5 -1
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +41 -0
- package/cli/dist/commands/show.js.map +1 -1
- package/modules.md +52 -0
- package/package.json +1 -1
|
@@ -0,0 +1,693 @@
|
|
|
1
|
+
# WordPress Plugin Architecture Patterns
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This document outlines 7 proven WordPress plugin architecture patterns, from simple procedural to enterprise-level. Choose the appropriate pattern based on plugin complexity, team size, and long-term maintenance needs.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Pattern 1: Simple Procedural Plugin
|
|
10
|
+
|
|
11
|
+
**Complexity**: Low
|
|
12
|
+
**File Count**: 1-3 files
|
|
13
|
+
**Team Size**: 1 developer
|
|
14
|
+
**Use Case**: Single feature, utility functions, quick prototypes
|
|
15
|
+
|
|
16
|
+
### Structure
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
my-plugin/
|
|
20
|
+
├── my-plugin.php # Main plugin file (all code)
|
|
21
|
+
└── readme.txt # WordPress.org readme
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Implementation
|
|
25
|
+
|
|
26
|
+
```php
|
|
27
|
+
<?php
|
|
28
|
+
/**
|
|
29
|
+
* Plugin Name: My Simple Plugin
|
|
30
|
+
* Description: A simple plugin
|
|
31
|
+
* Version: 1.0.0
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
// Exit if accessed directly
|
|
35
|
+
if (!defined('ABSPATH')) {
|
|
36
|
+
exit;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Add action hooks
|
|
40
|
+
add_action('init', 'my_plugin_init');
|
|
41
|
+
add_filter('the_content', 'my_plugin_filter_content');
|
|
42
|
+
|
|
43
|
+
function my_plugin_init() {
|
|
44
|
+
// Initialization code
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function my_plugin_filter_content($content) {
|
|
48
|
+
// Filter content
|
|
49
|
+
return $content;
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### When to Use
|
|
54
|
+
|
|
55
|
+
✅ Single feature plugins (e.g., disable comments, add custom CSS)
|
|
56
|
+
✅ Utility functions
|
|
57
|
+
✅ Quick prototypes
|
|
58
|
+
✅ Learning/tutorial plugins
|
|
59
|
+
|
|
60
|
+
### Pros & Cons
|
|
61
|
+
|
|
62
|
+
**Pros**: Simple, fast to develop, easy to understand
|
|
63
|
+
**Cons**: Hard to maintain as complexity grows, no separation of concerns
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Pattern 2: Organized Procedural Plugin
|
|
68
|
+
|
|
69
|
+
**Complexity**: Medium
|
|
70
|
+
**File Count**: 5-20 files
|
|
71
|
+
**Team Size**: 1-2 developers
|
|
72
|
+
**Use Case**: Medium-sized plugins, organized code, team collaboration
|
|
73
|
+
|
|
74
|
+
### Structure
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
my-plugin/
|
|
78
|
+
├── my-plugin.php # Main plugin file (loader)
|
|
79
|
+
├── includes/
|
|
80
|
+
│ ├── functions.php # Core functions
|
|
81
|
+
│ ├── hooks.php # Hook callbacks
|
|
82
|
+
│ └── shortcodes.php # Shortcode handlers
|
|
83
|
+
├── admin/
|
|
84
|
+
│ ├── settings.php # Admin settings
|
|
85
|
+
│ └── meta-boxes.php # Meta boxes
|
|
86
|
+
├── public/
|
|
87
|
+
│ └── display.php # Frontend display
|
|
88
|
+
├── assets/
|
|
89
|
+
│ ├── css/
|
|
90
|
+
│ ├── js/
|
|
91
|
+
│ └── images/
|
|
92
|
+
├── languages/
|
|
93
|
+
├── uninstall.php
|
|
94
|
+
└── readme.txt
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Implementation
|
|
98
|
+
|
|
99
|
+
**Main Plugin File** (`my-plugin.php`):
|
|
100
|
+
|
|
101
|
+
```php
|
|
102
|
+
<?php
|
|
103
|
+
/**
|
|
104
|
+
* Plugin Name: My Organized Plugin
|
|
105
|
+
* Description: An organized procedural plugin
|
|
106
|
+
* Version: 1.0.0
|
|
107
|
+
*/
|
|
108
|
+
|
|
109
|
+
if (!defined('ABSPATH')) {
|
|
110
|
+
exit;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Define constants
|
|
114
|
+
define('MY_PLUGIN_VERSION', '1.0.0');
|
|
115
|
+
define('MY_PLUGIN_PATH', plugin_dir_path(__FILE__));
|
|
116
|
+
define('MY_PLUGIN_URL', plugin_dir_url(__FILE__));
|
|
117
|
+
|
|
118
|
+
// Load dependencies
|
|
119
|
+
require_once MY_PLUGIN_PATH . 'includes/functions.php';
|
|
120
|
+
require_once MY_PLUGIN_PATH . 'includes/hooks.php';
|
|
121
|
+
|
|
122
|
+
// Admin functionality
|
|
123
|
+
if (is_admin()) {
|
|
124
|
+
require_once MY_PLUGIN_PATH . 'admin/settings.php';
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Public functionality
|
|
128
|
+
if (!is_admin()) {
|
|
129
|
+
require_once MY_PLUGIN_PATH . 'public/display.php';
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Activation/Deactivation
|
|
133
|
+
register_activation_hook(__FILE__, 'my_plugin_activate');
|
|
134
|
+
register_deactivation_hook(__FILE__, 'my_plugin_deactivate');
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### When to Use
|
|
138
|
+
|
|
139
|
+
✅ Multiple features
|
|
140
|
+
✅ Admin and frontend functionality
|
|
141
|
+
✅ Custom assets (CSS/JS)
|
|
142
|
+
✅ Team collaboration
|
|
143
|
+
|
|
144
|
+
### Pros & Cons
|
|
145
|
+
|
|
146
|
+
**Pros**: Organized, easier to maintain, clear separation
|
|
147
|
+
**Cons**: Still procedural, limited extensibility
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Pattern 3: Object-Oriented Plugin
|
|
152
|
+
|
|
153
|
+
**Complexity**: Medium-High
|
|
154
|
+
**File Count**: 10-50 files
|
|
155
|
+
**Team Size**: 2-5 developers
|
|
156
|
+
**Use Case**: Large plugins, maintainable code, extensibility
|
|
157
|
+
|
|
158
|
+
### Structure
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
my-plugin/
|
|
162
|
+
├── my-plugin.php # Main plugin file (bootstrap)
|
|
163
|
+
├── includes/
|
|
164
|
+
│ ├── class-plugin.php # Main plugin class
|
|
165
|
+
│ ├── class-admin.php # Admin functionality
|
|
166
|
+
│ ├── class-public.php # Public functionality
|
|
167
|
+
│ ├── class-loader.php # Hook loader
|
|
168
|
+
│ └── class-activator.php # Activation logic
|
|
169
|
+
├── admin/
|
|
170
|
+
│ ├── class-settings.php # Settings page
|
|
171
|
+
│ └── partials/ # Admin view templates
|
|
172
|
+
├── public/
|
|
173
|
+
│ ├── class-shortcode.php # Shortcode handler
|
|
174
|
+
│ └── partials/ # Public view templates
|
|
175
|
+
├── assets/
|
|
176
|
+
├── languages/
|
|
177
|
+
├── uninstall.php
|
|
178
|
+
└── readme.txt
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Implementation
|
|
182
|
+
|
|
183
|
+
**Main Plugin File** (`my-plugin.php`):
|
|
184
|
+
|
|
185
|
+
```php
|
|
186
|
+
<?php
|
|
187
|
+
/**
|
|
188
|
+
* Plugin Name: My OOP Plugin
|
|
189
|
+
* Description: An object-oriented plugin
|
|
190
|
+
* Version: 1.0.0
|
|
191
|
+
*/
|
|
192
|
+
|
|
193
|
+
if (!defined('ABSPATH')) {
|
|
194
|
+
exit;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Define constants
|
|
198
|
+
define('MY_PLUGIN_VERSION', '1.0.0');
|
|
199
|
+
define('MY_PLUGIN_PATH', plugin_dir_path(__FILE__));
|
|
200
|
+
|
|
201
|
+
// Autoloader
|
|
202
|
+
spl_autoload_register(function ($class) {
|
|
203
|
+
$prefix = 'My_Plugin_';
|
|
204
|
+
$base_dir = MY_PLUGIN_PATH . 'includes/';
|
|
205
|
+
|
|
206
|
+
$len = strlen($prefix);
|
|
207
|
+
if (strncmp($prefix, $class, $len) !== 0) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
$relative_class = substr($class, $len);
|
|
212
|
+
$file = $base_dir . 'class-' . str_replace('_', '-', strtolower($relative_class)) . '.php';
|
|
213
|
+
|
|
214
|
+
if (file_exists($file)) {
|
|
215
|
+
require $file;
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
// Activation/Deactivation
|
|
220
|
+
register_activation_hook(__FILE__, array('My_Plugin_Activator', 'activate'));
|
|
221
|
+
register_deactivation_hook(__FILE__, array('My_Plugin_Deactivator', 'deactivate'));
|
|
222
|
+
|
|
223
|
+
// Run the plugin
|
|
224
|
+
function run_my_plugin() {
|
|
225
|
+
$plugin = new My_Plugin();
|
|
226
|
+
$plugin->run();
|
|
227
|
+
}
|
|
228
|
+
run_my_plugin();
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Main Plugin Class** (`includes/class-plugin.php`):
|
|
232
|
+
|
|
233
|
+
```php
|
|
234
|
+
<?php
|
|
235
|
+
class My_Plugin {
|
|
236
|
+
protected $loader;
|
|
237
|
+
protected $plugin_name;
|
|
238
|
+
protected $version;
|
|
239
|
+
|
|
240
|
+
public function __construct() {
|
|
241
|
+
$this->version = MY_PLUGIN_VERSION;
|
|
242
|
+
$this->plugin_name = 'my-plugin';
|
|
243
|
+
|
|
244
|
+
$this->load_dependencies();
|
|
245
|
+
$this->define_admin_hooks();
|
|
246
|
+
$this->define_public_hooks();
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
private function load_dependencies() {
|
|
250
|
+
require_once MY_PLUGIN_PATH . 'includes/class-loader.php';
|
|
251
|
+
require_once MY_PLUGIN_PATH . 'includes/class-admin.php';
|
|
252
|
+
require_once MY_PLUGIN_PATH . 'includes/class-public.php';
|
|
253
|
+
|
|
254
|
+
$this->loader = new My_Plugin_Loader();
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
private function define_admin_hooks() {
|
|
258
|
+
$admin = new My_Plugin_Admin($this->plugin_name, $this->version);
|
|
259
|
+
$this->loader->add_action('admin_menu', $admin, 'add_admin_menu');
|
|
260
|
+
$this->loader->add_action('admin_enqueue_scripts', $admin, 'enqueue_styles');
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
private function define_public_hooks() {
|
|
264
|
+
$public = new My_Plugin_Public($this->plugin_name, $this->version);
|
|
265
|
+
$this->loader->add_action('wp_enqueue_scripts', $public, 'enqueue_styles');
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
public function run() {
|
|
269
|
+
$this->loader->run();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### When to Use
|
|
275
|
+
|
|
276
|
+
✅ Complex functionality
|
|
277
|
+
✅ Need for extensibility
|
|
278
|
+
✅ Multiple developers
|
|
279
|
+
✅ Long-term maintenance
|
|
280
|
+
|
|
281
|
+
### Pros & Cons
|
|
282
|
+
|
|
283
|
+
**Pros**: Maintainable, extensible, testable, clear structure
|
|
284
|
+
**Cons**: More complex, steeper learning curve
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## Pattern 4: WordPress Plugin Boilerplate (WPPB)
|
|
289
|
+
|
|
290
|
+
**Complexity**: High
|
|
291
|
+
**File Count**: 20-100 files
|
|
292
|
+
**Team Size**: 3-10 developers
|
|
293
|
+
**Use Case**: Professional plugins, standardized structure, large teams
|
|
294
|
+
|
|
295
|
+
### Structure
|
|
296
|
+
|
|
297
|
+
```
|
|
298
|
+
plugin-name/
|
|
299
|
+
├── plugin-name.php
|
|
300
|
+
├── admin/
|
|
301
|
+
│ ├── class-plugin-name-admin.php
|
|
302
|
+
│ ├── css/
|
|
303
|
+
│ ├── js/
|
|
304
|
+
│ └── partials/
|
|
305
|
+
├── includes/
|
|
306
|
+
│ ├── class-plugin-name.php
|
|
307
|
+
│ ├── class-plugin-name-loader.php
|
|
308
|
+
│ ├── class-plugin-name-i18n.php
|
|
309
|
+
│ ├── class-plugin-name-activator.php
|
|
310
|
+
│ └── class-plugin-name-deactivator.php
|
|
311
|
+
├── public/
|
|
312
|
+
│ ├── class-plugin-name-public.php
|
|
313
|
+
│ ├── css/
|
|
314
|
+
│ ├── js/
|
|
315
|
+
│ └── partials/
|
|
316
|
+
├── languages/
|
|
317
|
+
├── uninstall.php
|
|
318
|
+
└── README.txt
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### When to Use
|
|
322
|
+
|
|
323
|
+
✅ Professional/commercial plugins
|
|
324
|
+
✅ Standardized team workflow
|
|
325
|
+
✅ WordPress.org submission
|
|
326
|
+
✅ Long-term support
|
|
327
|
+
|
|
328
|
+
### Pros & Cons
|
|
329
|
+
|
|
330
|
+
**Pros**: Industry standard, well-documented, proven structure
|
|
331
|
+
**Cons**: Overkill for simple plugins, verbose
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
## Pattern 5: Namespace-Based Plugin
|
|
336
|
+
|
|
337
|
+
**Complexity**: Medium-High
|
|
338
|
+
**File Count**: 10-50 files
|
|
339
|
+
**Team Size**: 2-5 developers
|
|
340
|
+
**Use Case**: Modern PHP, PSR-4 autoloading, Composer dependencies
|
|
341
|
+
|
|
342
|
+
### Structure
|
|
343
|
+
|
|
344
|
+
```
|
|
345
|
+
my-plugin/
|
|
346
|
+
├── my-plugin.php
|
|
347
|
+
├── src/
|
|
348
|
+
│ ├── Plugin.php
|
|
349
|
+
│ ├── Admin/
|
|
350
|
+
│ │ ├── Settings.php
|
|
351
|
+
│ │ └── MetaBoxes.php
|
|
352
|
+
│ ├── Frontend/
|
|
353
|
+
│ │ ├── Shortcodes.php
|
|
354
|
+
│ │ └── Widgets.php
|
|
355
|
+
│ └── Core/
|
|
356
|
+
│ ├── Activator.php
|
|
357
|
+
│ └── Deactivator.php
|
|
358
|
+
├── vendor/ # Composer dependencies
|
|
359
|
+
├── composer.json
|
|
360
|
+
└── readme.txt
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### Implementation
|
|
364
|
+
|
|
365
|
+
**composer.json**:
|
|
366
|
+
|
|
367
|
+
```json
|
|
368
|
+
{
|
|
369
|
+
"name": "vendor/my-plugin",
|
|
370
|
+
"autoload": {
|
|
371
|
+
"psr-4": {
|
|
372
|
+
"MyPlugin\\": "src/"
|
|
373
|
+
}
|
|
374
|
+
},
|
|
375
|
+
"require": {
|
|
376
|
+
"php": ">=7.4"
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
**Main Plugin File** (`my-plugin.php`):
|
|
382
|
+
|
|
383
|
+
```php
|
|
384
|
+
<?php
|
|
385
|
+
/**
|
|
386
|
+
* Plugin Name: My Namespace Plugin
|
|
387
|
+
* Description: A modern namespace-based plugin
|
|
388
|
+
* Version: 1.0.0
|
|
389
|
+
* Requires PHP: 7.4
|
|
390
|
+
*/
|
|
391
|
+
|
|
392
|
+
namespace MyPlugin;
|
|
393
|
+
|
|
394
|
+
if (!defined('ABSPATH')) {
|
|
395
|
+
exit;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// Composer autoloader
|
|
399
|
+
require_once __DIR__ . '/vendor/autoload.php';
|
|
400
|
+
|
|
401
|
+
// Define constants
|
|
402
|
+
define('MY_PLUGIN_VERSION', '1.0.0');
|
|
403
|
+
define('MY_PLUGIN_PATH', plugin_dir_path(__FILE__));
|
|
404
|
+
|
|
405
|
+
// Activation/Deactivation
|
|
406
|
+
register_activation_hook(__FILE__, [Core\Activator::class, 'activate']);
|
|
407
|
+
register_deactivation_hook(__FILE__, [Core\Deactivator::class, 'deactivate']);
|
|
408
|
+
|
|
409
|
+
// Run plugin
|
|
410
|
+
(new Plugin())->run();
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
**Plugin Class** (`src/Plugin.php`):
|
|
414
|
+
|
|
415
|
+
```php
|
|
416
|
+
<?php
|
|
417
|
+
namespace MyPlugin;
|
|
418
|
+
|
|
419
|
+
class Plugin {
|
|
420
|
+
public function run() {
|
|
421
|
+
add_action('init', [$this, 'init']);
|
|
422
|
+
|
|
423
|
+
if (is_admin()) {
|
|
424
|
+
new Admin\Settings();
|
|
425
|
+
} else {
|
|
426
|
+
new Frontend\Shortcodes();
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
public function init() {
|
|
431
|
+
// Initialization code
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
### When to Use
|
|
437
|
+
|
|
438
|
+
✅ Modern PHP (7.4+)
|
|
439
|
+
✅ Composer dependencies
|
|
440
|
+
✅ PSR-4 autoloading
|
|
441
|
+
✅ Third-party libraries
|
|
442
|
+
|
|
443
|
+
### Pros & Cons
|
|
444
|
+
|
|
445
|
+
**Pros**: Modern, clean namespaces, Composer support
|
|
446
|
+
**Cons**: Requires Composer, not beginner-friendly
|
|
447
|
+
|
|
448
|
+
---
|
|
449
|
+
|
|
450
|
+
## Pattern 6: Service Container Plugin
|
|
451
|
+
|
|
452
|
+
**Complexity**: High
|
|
453
|
+
**File Count**: 30-100 files
|
|
454
|
+
**Team Size**: 5-15 developers
|
|
455
|
+
**Use Case**: Enterprise plugins, dependency injection, testability
|
|
456
|
+
|
|
457
|
+
### Structure
|
|
458
|
+
|
|
459
|
+
```
|
|
460
|
+
my-plugin/
|
|
461
|
+
├── my-plugin.php
|
|
462
|
+
├── src/
|
|
463
|
+
│ ├── Container.php
|
|
464
|
+
│ ├── ServiceProvider.php
|
|
465
|
+
│ ├── Services/
|
|
466
|
+
│ │ ├── DatabaseService.php
|
|
467
|
+
│ │ ├── CacheService.php
|
|
468
|
+
│ │ └── ApiService.php
|
|
469
|
+
│ ├── Controllers/
|
|
470
|
+
│ │ ├── AdminController.php
|
|
471
|
+
│ │ └── FrontendController.php
|
|
472
|
+
│ └── Models/
|
|
473
|
+
│ └── Post.php
|
|
474
|
+
├── config/
|
|
475
|
+
│ └── services.php
|
|
476
|
+
├── vendor/
|
|
477
|
+
├── composer.json
|
|
478
|
+
└── readme.txt
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
### Implementation
|
|
482
|
+
|
|
483
|
+
**Service Container** (`src/Container.php`):
|
|
484
|
+
|
|
485
|
+
```php
|
|
486
|
+
<?php
|
|
487
|
+
namespace MyPlugin;
|
|
488
|
+
|
|
489
|
+
class Container {
|
|
490
|
+
private $services = [];
|
|
491
|
+
|
|
492
|
+
public function register($name, $resolver) {
|
|
493
|
+
$this->services[$name] = $resolver;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
public function resolve($name) {
|
|
497
|
+
if (!isset($this->services[$name])) {
|
|
498
|
+
throw new \Exception("Service {$name} not found");
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
$resolver = $this->services[$name];
|
|
502
|
+
return $resolver($this);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
**Service Provider** (`src/ServiceProvider.php`):
|
|
508
|
+
|
|
509
|
+
```php
|
|
510
|
+
<?php
|
|
511
|
+
namespace MyPlugin;
|
|
512
|
+
|
|
513
|
+
class ServiceProvider {
|
|
514
|
+
public static function register(Container $container) {
|
|
515
|
+
$container->register('database', function($c) {
|
|
516
|
+
return new Services\DatabaseService();
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
$container->register('cache', function($c) {
|
|
520
|
+
return new Services\CacheService();
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
$container->register('admin', function($c) {
|
|
524
|
+
return new Controllers\AdminController(
|
|
525
|
+
$c->resolve('database'),
|
|
526
|
+
$c->resolve('cache')
|
|
527
|
+
);
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
### When to Use
|
|
534
|
+
|
|
535
|
+
✅ Enterprise-level plugins
|
|
536
|
+
✅ Complex dependencies
|
|
537
|
+
✅ High testability requirements
|
|
538
|
+
✅ Large development teams
|
|
539
|
+
|
|
540
|
+
### Pros & Cons
|
|
541
|
+
|
|
542
|
+
**Pros**: Highly testable, dependency injection, scalable
|
|
543
|
+
**Cons**: Complex, overkill for most plugins
|
|
544
|
+
|
|
545
|
+
---
|
|
546
|
+
|
|
547
|
+
## Pattern 7: Modular Plugin System
|
|
548
|
+
|
|
549
|
+
**Complexity**: Very High
|
|
550
|
+
**File Count**: 50-500 files
|
|
551
|
+
**Team Size**: 10+ developers
|
|
552
|
+
**Use Case**: Plugin frameworks, extensible platforms, add-on ecosystems
|
|
553
|
+
|
|
554
|
+
### Structure
|
|
555
|
+
|
|
556
|
+
```
|
|
557
|
+
my-plugin/
|
|
558
|
+
├── my-plugin.php
|
|
559
|
+
├── src/
|
|
560
|
+
│ ├── Core/
|
|
561
|
+
│ │ ├── ModuleLoader.php
|
|
562
|
+
│ │ ├── HookManager.php
|
|
563
|
+
│ │ └── EventDispatcher.php
|
|
564
|
+
│ ├── Modules/
|
|
565
|
+
│ │ ├── Admin/
|
|
566
|
+
│ │ ├── Frontend/
|
|
567
|
+
│ │ ├── API/
|
|
568
|
+
│ │ └── Database/
|
|
569
|
+
│ └── Interfaces/
|
|
570
|
+
│ └── ModuleInterface.php
|
|
571
|
+
├── modules/ # Third-party modules
|
|
572
|
+
├── config/
|
|
573
|
+
├── vendor/
|
|
574
|
+
└── readme.txt
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
### Implementation
|
|
578
|
+
|
|
579
|
+
**Module Interface** (`src/Interfaces/ModuleInterface.php`):
|
|
580
|
+
|
|
581
|
+
```php
|
|
582
|
+
<?php
|
|
583
|
+
namespace MyPlugin\Interfaces;
|
|
584
|
+
|
|
585
|
+
interface ModuleInterface {
|
|
586
|
+
public function register();
|
|
587
|
+
public function boot();
|
|
588
|
+
public function getName();
|
|
589
|
+
}
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
**Module Loader** (`src/Core/ModuleLoader.php`):
|
|
593
|
+
|
|
594
|
+
```php
|
|
595
|
+
<?php
|
|
596
|
+
namespace MyPlugin\Core;
|
|
597
|
+
|
|
598
|
+
use MyPlugin\Interfaces\ModuleInterface;
|
|
599
|
+
|
|
600
|
+
class ModuleLoader {
|
|
601
|
+
private $modules = [];
|
|
602
|
+
|
|
603
|
+
public function register(ModuleInterface $module) {
|
|
604
|
+
$this->modules[$module->getName()] = $module;
|
|
605
|
+
$module->register();
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
public function boot() {
|
|
609
|
+
foreach ($this->modules as $module) {
|
|
610
|
+
$module->boot();
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
```
|
|
615
|
+
|
|
616
|
+
### When to Use
|
|
617
|
+
|
|
618
|
+
✅ Plugin frameworks (e.g., WooCommerce, BuddyPress)
|
|
619
|
+
✅ Extensible platforms
|
|
620
|
+
✅ Add-on ecosystems
|
|
621
|
+
✅ Very large teams
|
|
622
|
+
|
|
623
|
+
### Pros & Cons
|
|
624
|
+
|
|
625
|
+
**Pros**: Extremely extensible, modular, scalable
|
|
626
|
+
**Cons**: Very complex, requires significant architecture
|
|
627
|
+
|
|
628
|
+
---
|
|
629
|
+
|
|
630
|
+
## Choosing the Right Pattern
|
|
631
|
+
|
|
632
|
+
### Decision Matrix
|
|
633
|
+
|
|
634
|
+
| Pattern | Complexity | Files | Team Size | Use Case |
|
|
635
|
+
|---------|-----------|-------|-----------|----------|
|
|
636
|
+
| Simple Procedural | Low | 1-3 | 1 | Single feature |
|
|
637
|
+
| Organized Procedural | Medium | 5-20 | 1-2 | Multiple features |
|
|
638
|
+
| Object-Oriented | Medium-High | 10-50 | 2-5 | Large plugins |
|
|
639
|
+
| WPPB | High | 20-100 | 3-10 | Professional |
|
|
640
|
+
| Namespace-Based | Medium-High | 10-50 | 2-5 | Modern PHP |
|
|
641
|
+
| Service Container | High | 30-100 | 5-15 | Enterprise |
|
|
642
|
+
| Modular System | Very High | 50-500 | 10+ | Frameworks |
|
|
643
|
+
|
|
644
|
+
### Recommendation Flow
|
|
645
|
+
|
|
646
|
+
1. **Single feature?** → Simple Procedural
|
|
647
|
+
2. **Multiple features, 1-2 devs?** → Organized Procedural
|
|
648
|
+
3. **Need extensibility?** → Object-Oriented
|
|
649
|
+
4. **Professional/commercial?** → WPPB
|
|
650
|
+
5. **Using Composer?** → Namespace-Based
|
|
651
|
+
6. **Enterprise-level?** → Service Container
|
|
652
|
+
7. **Building framework?** → Modular System
|
|
653
|
+
|
|
654
|
+
---
|
|
655
|
+
|
|
656
|
+
## Best Practices
|
|
657
|
+
|
|
658
|
+
### All Patterns
|
|
659
|
+
|
|
660
|
+
✅ Always check `ABSPATH` constant
|
|
661
|
+
✅ Use proper WordPress coding standards
|
|
662
|
+
✅ Sanitize input, escape output
|
|
663
|
+
✅ Use WordPress APIs (don't reinvent the wheel)
|
|
664
|
+
✅ Follow semantic versioning
|
|
665
|
+
|
|
666
|
+
### OOP Patterns
|
|
667
|
+
|
|
668
|
+
✅ Use dependency injection
|
|
669
|
+
✅ Follow SOLID principles
|
|
670
|
+
✅ Write unit tests
|
|
671
|
+
✅ Use interfaces for contracts
|
|
672
|
+
✅ Keep classes focused (single responsibility)
|
|
673
|
+
|
|
674
|
+
### Modern Patterns
|
|
675
|
+
|
|
676
|
+
✅ Use Composer for dependencies
|
|
677
|
+
✅ Follow PSR-4 autoloading
|
|
678
|
+
✅ Use namespaces
|
|
679
|
+
✅ Leverage modern PHP features
|
|
680
|
+
✅ Write PHPDoc blocks
|
|
681
|
+
|
|
682
|
+
---
|
|
683
|
+
|
|
684
|
+
## Anti-Patterns to Avoid
|
|
685
|
+
|
|
686
|
+
❌ Global variables (use constants or class properties)
|
|
687
|
+
❌ Direct database queries (use `$wpdb` or WP_Query)
|
|
688
|
+
❌ Hardcoded paths (use `plugin_dir_path()`)
|
|
689
|
+
❌ Mixing HTML and PHP logic
|
|
690
|
+
❌ Not using WordPress hooks
|
|
691
|
+
❌ Ignoring security (nonces, sanitization)
|
|
692
|
+
❌ Not following WordPress coding standards
|
|
693
|
+
|