@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,702 @@
|
|
|
1
|
+
# WordPress Plugin Development Workflow
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This workflow guides you through adding features to an existing WordPress plugin using a security-first, test-driven approach with OpenSpec and Beads integration.
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
- Existing WordPress plugin structure
|
|
10
|
+
- Local WordPress development environment
|
|
11
|
+
- OpenSpec initialized (`openspec/` directory)
|
|
12
|
+
- Beads initialized (`.beads/` directory)
|
|
13
|
+
- Domain rules: `domain-rules/wordpress-plugin` module
|
|
14
|
+
|
|
15
|
+
## Workflow Steps
|
|
16
|
+
|
|
17
|
+
### 1. Feature Planning with OpenSpec
|
|
18
|
+
|
|
19
|
+
**Create OpenSpec Spec**:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Create spec file
|
|
23
|
+
mkdir -p openspec/specs/plugin-features
|
|
24
|
+
touch openspec/specs/plugin-features/[feature-name].md
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Spec Template**:
|
|
28
|
+
|
|
29
|
+
```markdown
|
|
30
|
+
---
|
|
31
|
+
id: plugin-features/[feature-name]
|
|
32
|
+
status: active
|
|
33
|
+
relatedTasks: []
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
# [Feature Name]
|
|
37
|
+
|
|
38
|
+
## Overview
|
|
39
|
+
[Brief description of the feature]
|
|
40
|
+
|
|
41
|
+
## Requirements
|
|
42
|
+
|
|
43
|
+
### Functional Requirements
|
|
44
|
+
- [Requirement 1]
|
|
45
|
+
- [Requirement 2]
|
|
46
|
+
|
|
47
|
+
### Security Requirements
|
|
48
|
+
- Nonce verification for all forms
|
|
49
|
+
- Capability checks for admin actions
|
|
50
|
+
- Input sanitization using WordPress functions
|
|
51
|
+
- Output escaping for all user-generated content
|
|
52
|
+
|
|
53
|
+
### Performance Requirements
|
|
54
|
+
- Database queries must be optimized
|
|
55
|
+
- Caching strategy defined
|
|
56
|
+
- Asset loading optimized (conditional loading)
|
|
57
|
+
|
|
58
|
+
## User Stories
|
|
59
|
+
|
|
60
|
+
**As a** [user type]
|
|
61
|
+
**I want** [goal]
|
|
62
|
+
**So that** [benefit]
|
|
63
|
+
|
|
64
|
+
## Technical Approach
|
|
65
|
+
|
|
66
|
+
### Architecture Pattern
|
|
67
|
+
[e.g., MVC, Service Layer, Repository Pattern]
|
|
68
|
+
|
|
69
|
+
### WordPress Integration Points
|
|
70
|
+
- Hooks: [list hooks to use]
|
|
71
|
+
- Filters: [list filters to use]
|
|
72
|
+
- Custom Post Types: [if applicable]
|
|
73
|
+
- Taxonomies: [if applicable]
|
|
74
|
+
- Database Tables: [if applicable]
|
|
75
|
+
|
|
76
|
+
### Files to Create/Modify
|
|
77
|
+
- `includes/[feature-name].php` - Core logic
|
|
78
|
+
- `admin/[feature-name]-admin.php` - Admin interface
|
|
79
|
+
- `public/[feature-name]-public.php` - Frontend display
|
|
80
|
+
- `tests/test-[feature-name].php` - Unit tests
|
|
81
|
+
|
|
82
|
+
## Testing Requirements
|
|
83
|
+
|
|
84
|
+
### Unit Tests
|
|
85
|
+
- Test core logic in isolation
|
|
86
|
+
- Mock WordPress functions
|
|
87
|
+
- Test edge cases and error conditions
|
|
88
|
+
|
|
89
|
+
### Integration Tests
|
|
90
|
+
- Test WordPress integration
|
|
91
|
+
- Test database operations
|
|
92
|
+
- Test AJAX handlers
|
|
93
|
+
|
|
94
|
+
### Manual Testing
|
|
95
|
+
- Test in WordPress admin
|
|
96
|
+
- Test on frontend
|
|
97
|
+
- Test with different user roles
|
|
98
|
+
- Test with different WordPress versions
|
|
99
|
+
|
|
100
|
+
## Documentation Updates
|
|
101
|
+
- Update main plugin README
|
|
102
|
+
- Add inline PHPDoc comments
|
|
103
|
+
- Update changelog
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 2. Break Down into Beads Tasks
|
|
107
|
+
|
|
108
|
+
**Create Epic Task**:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
bd create "Implement [feature-name]" -p 1 --type epic --label wordpress --label plugin --label [feature-name]
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Create Subtasks**:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
# Planning
|
|
118
|
+
bd create "Create OpenSpec spec for [feature-name]" -p 1 --label planning
|
|
119
|
+
|
|
120
|
+
# Implementation
|
|
121
|
+
bd create "Create [feature-name] core class" -p 1 --label implementation
|
|
122
|
+
bd create "Add admin interface for [feature-name]" -p 1 --label admin
|
|
123
|
+
bd create "Add frontend display for [feature-name]" -p 1 --label frontend
|
|
124
|
+
bd create "Add AJAX handlers for [feature-name]" -p 1 --label ajax
|
|
125
|
+
|
|
126
|
+
# Security
|
|
127
|
+
bd create "Add nonce verification" -p 1 --label security
|
|
128
|
+
bd create "Add capability checks" -p 1 --label security
|
|
129
|
+
bd create "Add input sanitization" -p 1 --label security
|
|
130
|
+
bd create "Add output escaping" -p 1 --label security
|
|
131
|
+
|
|
132
|
+
# Testing
|
|
133
|
+
bd create "Write unit tests for [feature-name]" -p 1 --label testing
|
|
134
|
+
bd create "Write integration tests for [feature-name]" -p 1 --label testing
|
|
135
|
+
bd create "Manual testing in WordPress" -p 2 --label testing
|
|
136
|
+
|
|
137
|
+
# Documentation
|
|
138
|
+
bd create "Update plugin documentation" -p 2 --label documentation
|
|
139
|
+
bd create "Add inline PHPDoc comments" -p 2 --label documentation
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 3. Implementation Workflow
|
|
143
|
+
|
|
144
|
+
**Step 3.1: Set Up Feature Structure**
|
|
145
|
+
|
|
146
|
+
Create necessary files following plugin architecture:
|
|
147
|
+
|
|
148
|
+
```php
|
|
149
|
+
// includes/[feature-name].php
|
|
150
|
+
<?php
|
|
151
|
+
/**
|
|
152
|
+
* [Feature Name] Core Class
|
|
153
|
+
*
|
|
154
|
+
* @package [Plugin_Name]
|
|
155
|
+
* @subpackage [Plugin_Name]/includes
|
|
156
|
+
*/
|
|
157
|
+
|
|
158
|
+
class Plugin_Name_Feature_Name {
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Initialize the class
|
|
162
|
+
*/
|
|
163
|
+
public function __construct() {
|
|
164
|
+
$this->load_dependencies();
|
|
165
|
+
$this->define_hooks();
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Load required dependencies
|
|
170
|
+
*/
|
|
171
|
+
private function load_dependencies() {
|
|
172
|
+
// Load dependencies
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Register hooks
|
|
177
|
+
*/
|
|
178
|
+
private function define_hooks() {
|
|
179
|
+
add_action( 'init', array( $this, 'init' ) );
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Initialize feature
|
|
184
|
+
*/
|
|
185
|
+
public function init() {
|
|
186
|
+
// Implementation
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**Step 3.2: Implement Core Logic (Security-First)**
|
|
192
|
+
|
|
193
|
+
Always implement security checks FIRST:
|
|
194
|
+
|
|
195
|
+
```php
|
|
196
|
+
public function handle_form_submission() {
|
|
197
|
+
// 1. Verify nonce
|
|
198
|
+
if ( ! isset( $_POST['_wpnonce'] ) || ! wp_verify_nonce( $_POST['_wpnonce'], 'feature_action' ) ) {
|
|
199
|
+
wp_die( __( 'Security check failed', 'text-domain' ) );
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// 2. Check capabilities
|
|
203
|
+
if ( ! current_user_can( 'manage_options' ) ) {
|
|
204
|
+
wp_die( __( 'Insufficient permissions', 'text-domain' ) );
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// 3. Sanitize input
|
|
208
|
+
$data = array(
|
|
209
|
+
'field1' => sanitize_text_field( $_POST['field1'] ),
|
|
210
|
+
'field2' => sanitize_email( $_POST['field2'] ),
|
|
211
|
+
'field3' => absint( $_POST['field3'] ),
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
// 4. Validate data
|
|
215
|
+
if ( empty( $data['field1'] ) ) {
|
|
216
|
+
return new WP_Error( 'invalid_data', __( 'Field 1 is required', 'text-domain' ) );
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// 5. Process data
|
|
220
|
+
$result = $this->process_data( $data );
|
|
221
|
+
|
|
222
|
+
// 6. Return result
|
|
223
|
+
return $result;
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**Step 3.3: Add Admin Interface**
|
|
228
|
+
|
|
229
|
+
```php
|
|
230
|
+
// admin/[feature-name]-admin.php
|
|
231
|
+
public function add_admin_menu() {
|
|
232
|
+
add_submenu_page(
|
|
233
|
+
'options-general.php',
|
|
234
|
+
__( 'Feature Settings', 'text-domain' ),
|
|
235
|
+
__( 'Feature', 'text-domain' ),
|
|
236
|
+
'manage_options',
|
|
237
|
+
'feature-settings',
|
|
238
|
+
array( $this, 'render_settings_page' )
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
public function render_settings_page() {
|
|
243
|
+
// Check capabilities
|
|
244
|
+
if ( ! current_user_can( 'manage_options' ) ) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Get current settings
|
|
249
|
+
$settings = get_option( 'feature_settings', array() );
|
|
250
|
+
|
|
251
|
+
?>
|
|
252
|
+
<div class="wrap">
|
|
253
|
+
<h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
|
|
254
|
+
<form method="post" action="options.php">
|
|
255
|
+
<?php
|
|
256
|
+
settings_fields( 'feature_settings_group' );
|
|
257
|
+
do_settings_sections( 'feature-settings' );
|
|
258
|
+
submit_button();
|
|
259
|
+
?>
|
|
260
|
+
</form>
|
|
261
|
+
</div>
|
|
262
|
+
<?php
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**Step 3.4: Add Frontend Display**
|
|
267
|
+
|
|
268
|
+
```php
|
|
269
|
+
// public/[feature-name]-public.php
|
|
270
|
+
public function render_shortcode( $atts ) {
|
|
271
|
+
$atts = shortcode_atts( array(
|
|
272
|
+
'id' => 0,
|
|
273
|
+
'type' => 'default',
|
|
274
|
+
), $atts, 'feature_shortcode' );
|
|
275
|
+
|
|
276
|
+
// Sanitize attributes
|
|
277
|
+
$id = absint( $atts['id'] );
|
|
278
|
+
$type = sanitize_key( $atts['type'] );
|
|
279
|
+
|
|
280
|
+
// Get data
|
|
281
|
+
$data = $this->get_data( $id );
|
|
282
|
+
|
|
283
|
+
if ( ! $data ) {
|
|
284
|
+
return '';
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Start output buffering
|
|
288
|
+
ob_start();
|
|
289
|
+
|
|
290
|
+
// Include template
|
|
291
|
+
include plugin_dir_path( __FILE__ ) . 'partials/feature-display.php';
|
|
292
|
+
|
|
293
|
+
return ob_get_clean();
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
**Step 3.5: Add AJAX Handlers**
|
|
298
|
+
|
|
299
|
+
```php
|
|
300
|
+
public function register_ajax_handlers() {
|
|
301
|
+
add_action( 'wp_ajax_feature_action', array( $this, 'ajax_feature_action' ) );
|
|
302
|
+
add_action( 'wp_ajax_nopriv_feature_action', array( $this, 'ajax_feature_action' ) );
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
public function ajax_feature_action() {
|
|
306
|
+
// Verify nonce
|
|
307
|
+
check_ajax_referer( 'feature_nonce', 'nonce' );
|
|
308
|
+
|
|
309
|
+
// Check capabilities (if needed)
|
|
310
|
+
if ( ! current_user_can( 'edit_posts' ) ) {
|
|
311
|
+
wp_send_json_error( array( 'message' => __( 'Insufficient permissions', 'text-domain' ) ) );
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Sanitize input
|
|
315
|
+
$data = isset( $_POST['data'] ) ? sanitize_text_field( $_POST['data'] ) : '';
|
|
316
|
+
|
|
317
|
+
// Process request
|
|
318
|
+
$result = $this->process_ajax_request( $data );
|
|
319
|
+
|
|
320
|
+
if ( is_wp_error( $result ) ) {
|
|
321
|
+
wp_send_json_error( array( 'message' => $result->get_error_message() ) );
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
wp_send_json_success( array( 'data' => $result ) );
|
|
325
|
+
}
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### 4. Add Tests
|
|
329
|
+
|
|
330
|
+
**Create Unit Tests**:
|
|
331
|
+
|
|
332
|
+
```php
|
|
333
|
+
// tests/test-[feature-name].php
|
|
334
|
+
class Test_Feature_Name extends WP_UnitTestCase {
|
|
335
|
+
|
|
336
|
+
private $feature;
|
|
337
|
+
|
|
338
|
+
public function setUp(): void {
|
|
339
|
+
parent::setUp();
|
|
340
|
+
$this->feature = new Plugin_Name_Feature_Name();
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
public function test_feature_initialization() {
|
|
344
|
+
$this->assertInstanceOf( 'Plugin_Name_Feature_Name', $this->feature );
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
public function test_data_sanitization() {
|
|
348
|
+
$input = '<script>alert("xss")</script>Test';
|
|
349
|
+
$expected = 'alert("xss")Test';
|
|
350
|
+
$result = $this->feature->sanitize_data( $input );
|
|
351
|
+
$this->assertEquals( $expected, $result );
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
public function test_capability_check() {
|
|
355
|
+
// Test without capabilities
|
|
356
|
+
$result = $this->feature->handle_form_submission();
|
|
357
|
+
$this->assertWPError( $result );
|
|
358
|
+
|
|
359
|
+
// Test with capabilities
|
|
360
|
+
wp_set_current_user( $this->factory->user->create( array( 'role' => 'administrator' ) ) );
|
|
361
|
+
// Add nonce to $_POST
|
|
362
|
+
$_POST['_wpnonce'] = wp_create_nonce( 'feature_action' );
|
|
363
|
+
$_POST['field1'] = 'test';
|
|
364
|
+
|
|
365
|
+
$result = $this->feature->handle_form_submission();
|
|
366
|
+
$this->assertNotWPError( $result );
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
**Run Tests**:
|
|
372
|
+
|
|
373
|
+
```bash
|
|
374
|
+
# Run all tests
|
|
375
|
+
vendor/bin/phpunit
|
|
376
|
+
|
|
377
|
+
# Run specific test file
|
|
378
|
+
vendor/bin/phpunit tests/test-[feature-name].php
|
|
379
|
+
|
|
380
|
+
# Run with coverage
|
|
381
|
+
vendor/bin/phpunit --coverage-html coverage/
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
### 5. Update Documentation
|
|
385
|
+
|
|
386
|
+
**Update Plugin README**:
|
|
387
|
+
|
|
388
|
+
```markdown
|
|
389
|
+
## Features
|
|
390
|
+
|
|
391
|
+
### [Feature Name]
|
|
392
|
+
[Description of the feature]
|
|
393
|
+
|
|
394
|
+
**Usage**:
|
|
395
|
+
\`\`\`php
|
|
396
|
+
// Code example
|
|
397
|
+
\`\`\`
|
|
398
|
+
|
|
399
|
+
**Shortcode**:
|
|
400
|
+
\`\`\`
|
|
401
|
+
[feature_shortcode id="123" type="default"]
|
|
402
|
+
\`\`\`
|
|
403
|
+
|
|
404
|
+
**Hooks**:
|
|
405
|
+
- `plugin_name_before_feature` - Fires before feature execution
|
|
406
|
+
- `plugin_name_after_feature` - Fires after feature execution
|
|
407
|
+
|
|
408
|
+
**Filters**:
|
|
409
|
+
- `plugin_name_feature_data` - Filter feature data before processing
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
**Add PHPDoc Comments**:
|
|
413
|
+
|
|
414
|
+
```php
|
|
415
|
+
/**
|
|
416
|
+
* Process feature data
|
|
417
|
+
*
|
|
418
|
+
* @since 1.0.0
|
|
419
|
+
* @param array $data The data to process.
|
|
420
|
+
* @return array|WP_Error Processed data or error.
|
|
421
|
+
*/
|
|
422
|
+
public function process_data( $data ) {
|
|
423
|
+
// Implementation
|
|
424
|
+
}
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
### 6. Manual Testing Checklist
|
|
428
|
+
|
|
429
|
+
**Admin Testing**:
|
|
430
|
+
- [ ] Settings page loads without errors
|
|
431
|
+
- [ ] Settings save correctly
|
|
432
|
+
- [ ] Nonce verification works
|
|
433
|
+
- [ ] Capability checks prevent unauthorized access
|
|
434
|
+
- [ ] Admin notices display correctly
|
|
435
|
+
- [ ] AJAX requests work as expected
|
|
436
|
+
|
|
437
|
+
**Frontend Testing**:
|
|
438
|
+
- [ ] Shortcode renders correctly
|
|
439
|
+
- [ ] Frontend forms submit successfully
|
|
440
|
+
- [ ] Data displays correctly
|
|
441
|
+
- [ ] No JavaScript errors in console
|
|
442
|
+
- [ ] Responsive design works on mobile
|
|
443
|
+
|
|
444
|
+
**Security Testing**:
|
|
445
|
+
- [ ] XSS attempts are blocked
|
|
446
|
+
- [ ] SQL injection attempts are blocked
|
|
447
|
+
- [ ] CSRF protection works (nonces)
|
|
448
|
+
- [ ] Unauthorized users cannot access admin features
|
|
449
|
+
- [ ] File upload restrictions work (if applicable)
|
|
450
|
+
|
|
451
|
+
**Performance Testing**:
|
|
452
|
+
- [ ] Database queries are optimized
|
|
453
|
+
- [ ] Caching works correctly
|
|
454
|
+
- [ ] Assets load conditionally
|
|
455
|
+
- [ ] No N+1 query problems
|
|
456
|
+
|
|
457
|
+
**Compatibility Testing**:
|
|
458
|
+
- [ ] Works with latest WordPress version
|
|
459
|
+
- [ ] Works with minimum supported WordPress version
|
|
460
|
+
- [ ] Works with common themes
|
|
461
|
+
- [ ] Works with common plugins
|
|
462
|
+
- [ ] No PHP errors or warnings
|
|
463
|
+
|
|
464
|
+
### 7. Code Review Checklist
|
|
465
|
+
|
|
466
|
+
**Security**:
|
|
467
|
+
- [ ] All user input is sanitized
|
|
468
|
+
- [ ] All output is escaped
|
|
469
|
+
- [ ] Nonces are used for all forms
|
|
470
|
+
- [ ] Capability checks are in place
|
|
471
|
+
- [ ] No direct database queries (use $wpdb prepared statements)
|
|
472
|
+
|
|
473
|
+
**Code Quality**:
|
|
474
|
+
- [ ] Follows WordPress Coding Standards
|
|
475
|
+
- [ ] PHPDoc comments are complete
|
|
476
|
+
- [ ] No hardcoded values (use constants)
|
|
477
|
+
- [ ] Error handling is implemented
|
|
478
|
+
- [ ] Logging is implemented for debugging
|
|
479
|
+
|
|
480
|
+
**Performance**:
|
|
481
|
+
- [ ] Database queries are optimized
|
|
482
|
+
- [ ] Caching is implemented where appropriate
|
|
483
|
+
- [ ] Assets are minified and combined
|
|
484
|
+
- [ ] Lazy loading is used where appropriate
|
|
485
|
+
|
|
486
|
+
**Testing**:
|
|
487
|
+
- [ ] Unit tests cover core logic
|
|
488
|
+
- [ ] Integration tests cover WordPress integration
|
|
489
|
+
- [ ] Code coverage is > 80%
|
|
490
|
+
- [ ] All tests pass
|
|
491
|
+
|
|
492
|
+
## AI Prompt Templates
|
|
493
|
+
|
|
494
|
+
### Feature Implementation Prompt
|
|
495
|
+
|
|
496
|
+
```
|
|
497
|
+
Implement [feature name] for the [plugin name] WordPress plugin.
|
|
498
|
+
|
|
499
|
+
Requirements:
|
|
500
|
+
- [Requirement 1]
|
|
501
|
+
- [Requirement 2]
|
|
502
|
+
|
|
503
|
+
Security requirements:
|
|
504
|
+
- Nonce verification for all forms
|
|
505
|
+
- Capability checks: [required capability]
|
|
506
|
+
- Input sanitization using WordPress functions
|
|
507
|
+
- Output escaping for all user-generated content
|
|
508
|
+
|
|
509
|
+
Architecture:
|
|
510
|
+
- Follow [architecture pattern] pattern
|
|
511
|
+
- Create files: [list files]
|
|
512
|
+
- Use hooks: [list hooks]
|
|
513
|
+
|
|
514
|
+
Testing:
|
|
515
|
+
- Write unit tests for core logic
|
|
516
|
+
- Write integration tests for WordPress integration
|
|
517
|
+
- Achieve > 80% code coverage
|
|
518
|
+
|
|
519
|
+
Reference the domain-rules/wordpress-plugin module for detailed implementation patterns.
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
### Security Audit Prompt
|
|
523
|
+
|
|
524
|
+
```
|
|
525
|
+
Perform a security audit on [feature name] in [plugin name].
|
|
526
|
+
|
|
527
|
+
Check for:
|
|
528
|
+
- Missing nonce verification
|
|
529
|
+
- Missing capability checks
|
|
530
|
+
- Unsanitized input
|
|
531
|
+
- Unescaped output
|
|
532
|
+
- SQL injection vulnerabilities
|
|
533
|
+
- XSS vulnerabilities
|
|
534
|
+
- CSRF vulnerabilities
|
|
535
|
+
|
|
536
|
+
Provide a report with:
|
|
537
|
+
- List of vulnerabilities found
|
|
538
|
+
- Severity rating (Critical, High, Medium, Low)
|
|
539
|
+
- Recommended fixes
|
|
540
|
+
- Code examples for fixes
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
### Testing Prompt
|
|
544
|
+
|
|
545
|
+
```
|
|
546
|
+
Create comprehensive tests for [feature name] in [plugin name].
|
|
547
|
+
|
|
548
|
+
Test coverage needed:
|
|
549
|
+
- Unit tests for [list functions]
|
|
550
|
+
- Integration tests for [list WordPress integration points]
|
|
551
|
+
- Security tests for [list security features]
|
|
552
|
+
|
|
553
|
+
Use WordPress test suite and PHPUnit.
|
|
554
|
+
Mock WordPress functions where appropriate.
|
|
555
|
+
Achieve > 80% code coverage.
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
## Common Development Patterns
|
|
559
|
+
|
|
560
|
+
### Pattern 1: Settings API Integration
|
|
561
|
+
|
|
562
|
+
```php
|
|
563
|
+
public function register_settings() {
|
|
564
|
+
register_setting(
|
|
565
|
+
'feature_settings_group',
|
|
566
|
+
'feature_settings',
|
|
567
|
+
array( $this, 'sanitize_settings' )
|
|
568
|
+
);
|
|
569
|
+
|
|
570
|
+
add_settings_section(
|
|
571
|
+
'feature_main_section',
|
|
572
|
+
__( 'Main Settings', 'text-domain' ),
|
|
573
|
+
array( $this, 'render_section_description' ),
|
|
574
|
+
'feature-settings'
|
|
575
|
+
);
|
|
576
|
+
|
|
577
|
+
add_settings_field(
|
|
578
|
+
'feature_option_1',
|
|
579
|
+
__( 'Option 1', 'text-domain' ),
|
|
580
|
+
array( $this, 'render_option_1_field' ),
|
|
581
|
+
'feature-settings',
|
|
582
|
+
'feature_main_section'
|
|
583
|
+
);
|
|
584
|
+
}
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
### Pattern 2: Custom Post Type Registration
|
|
588
|
+
|
|
589
|
+
```php
|
|
590
|
+
public function register_post_type() {
|
|
591
|
+
$args = array(
|
|
592
|
+
'labels' => array(
|
|
593
|
+
'name' => __( 'Items', 'text-domain' ),
|
|
594
|
+
'singular_name' => __( 'Item', 'text-domain' ),
|
|
595
|
+
),
|
|
596
|
+
'public' => true,
|
|
597
|
+
'has_archive' => true,
|
|
598
|
+
'supports' => array( 'title', 'editor', 'thumbnail' ),
|
|
599
|
+
'show_in_rest' => true,
|
|
600
|
+
);
|
|
601
|
+
|
|
602
|
+
register_post_type( 'feature_item', $args );
|
|
603
|
+
}
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
### Pattern 3: Meta Box Implementation
|
|
607
|
+
|
|
608
|
+
```php
|
|
609
|
+
public function add_meta_box() {
|
|
610
|
+
add_meta_box(
|
|
611
|
+
'feature_meta_box',
|
|
612
|
+
__( 'Feature Settings', 'text-domain' ),
|
|
613
|
+
array( $this, 'render_meta_box' ),
|
|
614
|
+
'post',
|
|
615
|
+
'side',
|
|
616
|
+
'default'
|
|
617
|
+
);
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
public function render_meta_box( $post ) {
|
|
621
|
+
wp_nonce_field( 'feature_meta_box', 'feature_meta_box_nonce' );
|
|
622
|
+
$value = get_post_meta( $post->ID, '_feature_meta_key', true );
|
|
623
|
+
?>
|
|
624
|
+
<label for="feature_field">
|
|
625
|
+
<?php _e( 'Feature Field', 'text-domain' ); ?>
|
|
626
|
+
</label>
|
|
627
|
+
<input type="text" id="feature_field" name="feature_field" value="<?php echo esc_attr( $value ); ?>" />
|
|
628
|
+
<?php
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
public function save_meta_box( $post_id ) {
|
|
632
|
+
// Verify nonce
|
|
633
|
+
if ( ! isset( $_POST['feature_meta_box_nonce'] ) || ! wp_verify_nonce( $_POST['feature_meta_box_nonce'], 'feature_meta_box' ) ) {
|
|
634
|
+
return;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
// Check autosave
|
|
638
|
+
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
|
|
639
|
+
return;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
// Check capabilities
|
|
643
|
+
if ( ! current_user_can( 'edit_post', $post_id ) ) {
|
|
644
|
+
return;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
// Sanitize and save
|
|
648
|
+
if ( isset( $_POST['feature_field'] ) ) {
|
|
649
|
+
$value = sanitize_text_field( $_POST['feature_field'] );
|
|
650
|
+
update_post_meta( $post_id, '_feature_meta_key', $value );
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
## Best Practices
|
|
656
|
+
|
|
657
|
+
### DO
|
|
658
|
+
|
|
659
|
+
✅ Always verify nonces before processing forms
|
|
660
|
+
✅ Always check user capabilities
|
|
661
|
+
✅ Always sanitize input using WordPress functions
|
|
662
|
+
✅ Always escape output using WordPress functions
|
|
663
|
+
✅ Write tests before implementing features (TDD)
|
|
664
|
+
✅ Use WordPress coding standards
|
|
665
|
+
✅ Add PHPDoc comments to all functions
|
|
666
|
+
✅ Use WordPress APIs instead of direct database queries
|
|
667
|
+
✅ Implement error handling and logging
|
|
668
|
+
✅ Test with different WordPress versions
|
|
669
|
+
|
|
670
|
+
### DON'T
|
|
671
|
+
|
|
672
|
+
❌ Trust user input without sanitization
|
|
673
|
+
❌ Output data without escaping
|
|
674
|
+
❌ Skip nonce verification
|
|
675
|
+
❌ Skip capability checks
|
|
676
|
+
❌ Use direct SQL queries without preparation
|
|
677
|
+
❌ Hardcode values (use constants or options)
|
|
678
|
+
❌ Ignore WordPress coding standards
|
|
679
|
+
❌ Skip writing tests
|
|
680
|
+
❌ Commit code without testing
|
|
681
|
+
❌ Deploy without security audit
|
|
682
|
+
|
|
683
|
+
## Resources
|
|
684
|
+
|
|
685
|
+
- [WordPress Plugin Handbook](https://developer.wordpress.org/plugins/)
|
|
686
|
+
- [WordPress Coding Standards](https://developer.wordpress.org/coding-standards/wordpress-coding-standards/)
|
|
687
|
+
- [WordPress Security Best Practices](https://developer.wordpress.org/plugins/security/)
|
|
688
|
+
- [PHPUnit Documentation](https://phpunit.de/documentation.html)
|
|
689
|
+
- [WordPress Test Suite](https://make.wordpress.org/core/handbook/testing/automated-testing/phpunit/)
|
|
690
|
+
|
|
691
|
+
## Related Workflows
|
|
692
|
+
|
|
693
|
+
- `scaffolding-workflow.md` - Creating new plugins
|
|
694
|
+
- `testing-workflow.md` - Testing setup and execution
|
|
695
|
+
- `submission-workflow.md` - WordPress.org submission
|
|
696
|
+
|
|
697
|
+
## Related Domain Rules
|
|
698
|
+
|
|
699
|
+
- `domain-rules/wordpress-plugin/plugin-structure.md`
|
|
700
|
+
- `domain-rules/wordpress-plugin/security-best-practices.md`
|
|
701
|
+
- `domain-rules/wordpress-plugin/testing-patterns.md`
|
|
702
|
+
|