@mytechtoday/augment-extensions 0.2.0 → 0.4.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/README.md +614 -39
- package/augment-extensions/coding-standards/bash/README.md +196 -0
- package/augment-extensions/coding-standards/bash/module.json +163 -0
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -0
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -0
- package/augment-extensions/coding-standards/css/README.md +40 -0
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/css/module.json +44 -0
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html/README.md +40 -0
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html/module.json +44 -0
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -0
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -0
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/js/README.md +46 -0
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/js/module.json +49 -0
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/php/README.md +248 -0
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -0
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -0
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -0
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -0
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -0
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -0
- package/augment-extensions/coding-standards/php/module.json +166 -0
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -0
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -0
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -0
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -0
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -0
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -0
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -0
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -0
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -0
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -0
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -0
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -0
- package/augment-extensions/coding-standards/php/rules/security.md +358 -0
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -0
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -0
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -0
- package/augment-extensions/coding-standards/powershell/README.md +154 -0
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -0
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -0
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -0
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -0
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -0
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -0
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -0
- package/augment-extensions/coding-standards/powershell/module.json +165 -0
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -0
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -0
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -0
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -0
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -0
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -0
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -0
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -0
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -0
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -0
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -0
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -0
- package/augment-extensions/coding-standards/python/README.md +12 -8
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -0
- package/augment-extensions/coding-standards/python/module.json +8 -4
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -0
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -0
- package/augment-extensions/coding-standards/python/rules/error-handling.md +855 -68
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -0
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -0
- package/augment-extensions/coding-standards/python/rules/type-hints.md +115 -50
- package/augment-extensions/collections/html-css-js/README.md +82 -0
- package/augment-extensions/collections/html-css-js/collection.json +41 -0
- package/augment-extensions/domain-rules/database/README.md +161 -0
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -0
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -0
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -0
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -0
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -0
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -0
- package/augment-extensions/domain-rules/database/module.json +28 -0
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -0
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -0
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -0
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -0
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -0
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -0
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -0
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -0
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -0
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -0
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -0
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -0
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -0
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -0
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -0
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -0
- package/augment-extensions/domain-rules/mcp/README.md +150 -0
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -0
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -0
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -0
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -0
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -0
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -0
- package/augment-extensions/domain-rules/mcp/module.json +49 -0
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -0
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -0
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -0
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -0
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -0
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -0
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -0
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -0
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -0
- package/augment-extensions/workflows/beads/module.json +4 -3
- package/augment-extensions/workflows/database/README.md +195 -0
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -0
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -0
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -0
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -0
- package/augment-extensions/workflows/database/module.json +42 -0
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -0
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -0
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -0
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -0
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -0
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -0
- package/augment-extensions/workflows/database/rules/workflow.md +458 -0
- package/augment-extensions/workflows/openspec/module.json +4 -3
- package/augment-extensions/writing-standards/screenplay/README.md +171 -0
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -0
- package/augment-extensions/writing-standards/screenplay/module.json +124 -0
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -0
- package/cli/MODULES.md +302 -0
- package/cli/dist/cli.js +142 -9
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/catalog.d.ts +13 -0
- package/cli/dist/commands/catalog.d.ts.map +1 -0
- package/cli/dist/commands/catalog.js +104 -0
- package/cli/dist/commands/catalog.js.map +1 -0
- package/cli/dist/commands/gui.d.ts +6 -0
- package/cli/dist/commands/gui.d.ts.map +1 -0
- package/cli/dist/commands/gui.js +211 -0
- package/cli/dist/commands/gui.js.map +1 -0
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +12 -0
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/install-rules.d.ts +14 -0
- package/cli/dist/commands/install-rules.d.ts.map +1 -0
- package/cli/dist/commands/install-rules.js +127 -0
- package/cli/dist/commands/install-rules.js.map +1 -0
- package/cli/dist/commands/link.d.ts.map +1 -1
- package/cli/dist/commands/link.js +9 -11
- package/cli/dist/commands/link.js.map +1 -1
- package/cli/dist/commands/list.d.ts.map +1 -1
- package/cli/dist/commands/list.js +11 -28
- package/cli/dist/commands/list.js.map +1 -1
- package/cli/dist/commands/mcp.d.ts +48 -0
- package/cli/dist/commands/mcp.d.ts.map +1 -0
- package/cli/dist/commands/mcp.js +229 -0
- package/cli/dist/commands/mcp.js.map +1 -0
- package/cli/dist/commands/self-remove.d.ts +7 -0
- package/cli/dist/commands/self-remove.d.ts.map +1 -0
- package/cli/dist/commands/self-remove.js +179 -0
- package/cli/dist/commands/self-remove.js.map +1 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +29 -99
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/skill.d.ts +67 -0
- package/cli/dist/commands/skill.d.ts.map +1 -0
- package/cli/dist/commands/skill.js +513 -0
- package/cli/dist/commands/skill.js.map +1 -0
- package/cli/dist/commands/unlink.d.ts +6 -0
- package/cli/dist/commands/unlink.d.ts.map +1 -0
- package/cli/dist/commands/unlink.js +115 -0
- package/cli/dist/commands/unlink.js.map +1 -0
- package/cli/dist/commands/validate.d.ts +6 -0
- package/cli/dist/commands/validate.d.ts.map +1 -0
- package/cli/dist/commands/validate.js +159 -0
- package/cli/dist/commands/validate.js.map +1 -0
- package/cli/dist/utils/catalog-sync.d.ts +22 -0
- package/cli/dist/utils/catalog-sync.d.ts.map +1 -0
- package/cli/dist/utils/catalog-sync.js +157 -0
- package/cli/dist/utils/catalog-sync.js.map +1 -0
- package/cli/dist/utils/character-count.d.ts +56 -0
- package/cli/dist/utils/character-count.d.ts.map +1 -0
- package/cli/dist/utils/character-count.js +190 -0
- package/cli/dist/utils/character-count.js.map +1 -0
- package/cli/dist/utils/documentation-validator.d.ts +18 -0
- package/cli/dist/utils/documentation-validator.d.ts.map +1 -0
- package/cli/dist/utils/documentation-validator.js +233 -0
- package/cli/dist/utils/documentation-validator.js.map +1 -0
- package/cli/dist/utils/install-rules.d.ts +32 -0
- package/cli/dist/utils/install-rules.d.ts.map +1 -0
- package/cli/dist/utils/install-rules.js +375 -0
- package/cli/dist/utils/install-rules.js.map +1 -0
- package/cli/dist/utils/mcp-integration.d.ts +70 -0
- package/cli/dist/utils/mcp-integration.d.ts.map +1 -0
- package/cli/dist/utils/mcp-integration.js +292 -0
- package/cli/dist/utils/mcp-integration.js.map +1 -0
- package/cli/dist/utils/module-system.d.ts +153 -0
- package/cli/dist/utils/module-system.d.ts.map +1 -0
- package/cli/dist/utils/module-system.js +528 -0
- package/cli/dist/utils/module-system.js.map +1 -0
- package/cli/dist/utils/modules-catalog.d.ts +33 -0
- package/cli/dist/utils/modules-catalog.d.ts.map +1 -0
- package/cli/dist/utils/modules-catalog.js +163 -0
- package/cli/dist/utils/modules-catalog.js.map +1 -0
- package/cli/dist/utils/rule-install-hooks.d.ts +19 -0
- package/cli/dist/utils/rule-install-hooks.d.ts.map +1 -0
- package/cli/dist/utils/rule-install-hooks.js +224 -0
- package/cli/dist/utils/rule-install-hooks.js.map +1 -0
- package/cli/dist/utils/skill-system.d.ts +95 -0
- package/cli/dist/utils/skill-system.d.ts.map +1 -0
- package/cli/dist/utils/skill-system.js +313 -0
- package/cli/dist/utils/skill-system.js.map +1 -0
- package/modules.md +518 -106
- package/package.json +12 -3
|
@@ -0,0 +1,561 @@
|
|
|
1
|
+
# PHP CMS Integration Best Practices
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This guide provides best practices for developing WordPress and Drupal plugins/modules, including hooks, filters, security, database interactions, and CMS-specific patterns.
|
|
6
|
+
|
|
7
|
+
## WordPress Development
|
|
8
|
+
|
|
9
|
+
### Plugin Structure
|
|
10
|
+
|
|
11
|
+
```php
|
|
12
|
+
<?php
|
|
13
|
+
/**
|
|
14
|
+
* Plugin Name: My Custom Plugin
|
|
15
|
+
* Plugin URI: https://example.com/my-plugin
|
|
16
|
+
* Description: A custom WordPress plugin
|
|
17
|
+
* Version: 1.0.0
|
|
18
|
+
* Author: Your Name
|
|
19
|
+
* Author URI: https://example.com
|
|
20
|
+
* License: GPL v2 or later
|
|
21
|
+
* Text Domain: my-custom-plugin
|
|
22
|
+
* Domain Path: /languages
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
// Prevent direct access
|
|
26
|
+
if (!defined('ABSPATH')) {
|
|
27
|
+
exit;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Define plugin constants
|
|
31
|
+
define('MY_PLUGIN_VERSION', '1.0.0');
|
|
32
|
+
define('MY_PLUGIN_PATH', plugin_dir_path(__FILE__));
|
|
33
|
+
define('MY_PLUGIN_URL', plugin_dir_url(__FILE__));
|
|
34
|
+
|
|
35
|
+
// Autoloader
|
|
36
|
+
require_once MY_PLUGIN_PATH . 'includes/class-my-plugin.php';
|
|
37
|
+
|
|
38
|
+
// Initialize plugin
|
|
39
|
+
function my_plugin_init() {
|
|
40
|
+
$plugin = new My_Plugin();
|
|
41
|
+
$plugin->run();
|
|
42
|
+
}
|
|
43
|
+
add_action('plugins_loaded', 'my_plugin_init');
|
|
44
|
+
|
|
45
|
+
// Activation hook
|
|
46
|
+
register_activation_hook(__FILE__, 'my_plugin_activate');
|
|
47
|
+
function my_plugin_activate() {
|
|
48
|
+
// Create database tables, set default options, etc.
|
|
49
|
+
flush_rewrite_rules();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Deactivation hook
|
|
53
|
+
register_deactivation_hook(__FILE__, 'my_plugin_deactivate');
|
|
54
|
+
function my_plugin_deactivate() {
|
|
55
|
+
flush_rewrite_rules();
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Hooks and Filters
|
|
60
|
+
|
|
61
|
+
#### Actions
|
|
62
|
+
|
|
63
|
+
```php
|
|
64
|
+
<?php
|
|
65
|
+
|
|
66
|
+
// Add custom action
|
|
67
|
+
add_action('init', 'my_custom_init_function');
|
|
68
|
+
function my_custom_init_function() {
|
|
69
|
+
// Register custom post types, taxonomies, etc.
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Admin menu
|
|
73
|
+
add_action('admin_menu', 'my_plugin_add_admin_menu');
|
|
74
|
+
function my_plugin_add_admin_menu() {
|
|
75
|
+
add_menu_page(
|
|
76
|
+
'My Plugin', // Page title
|
|
77
|
+
'My Plugin', // Menu title
|
|
78
|
+
'manage_options', // Capability
|
|
79
|
+
'my-plugin', // Menu slug
|
|
80
|
+
'my_plugin_admin_page', // Callback
|
|
81
|
+
'dashicons-admin-generic', // Icon
|
|
82
|
+
20 // Position
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Enqueue scripts and styles
|
|
87
|
+
add_action('wp_enqueue_scripts', 'my_plugin_enqueue_assets');
|
|
88
|
+
function my_plugin_enqueue_assets() {
|
|
89
|
+
wp_enqueue_style(
|
|
90
|
+
'my-plugin-style',
|
|
91
|
+
MY_PLUGIN_URL . 'assets/css/style.css',
|
|
92
|
+
[],
|
|
93
|
+
MY_PLUGIN_VERSION
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
wp_enqueue_script(
|
|
97
|
+
'my-plugin-script',
|
|
98
|
+
MY_PLUGIN_URL . 'assets/js/script.js',
|
|
99
|
+
['jquery'],
|
|
100
|
+
MY_PLUGIN_VERSION,
|
|
101
|
+
true
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
// Localize script
|
|
105
|
+
wp_localize_script('my-plugin-script', 'myPluginData', [
|
|
106
|
+
'ajaxUrl' => admin_url('admin-ajax.php'),
|
|
107
|
+
'nonce' => wp_create_nonce('my-plugin-nonce')
|
|
108
|
+
]);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Save post hook
|
|
112
|
+
add_action('save_post', 'my_plugin_save_post_meta', 10, 2);
|
|
113
|
+
function my_plugin_save_post_meta($post_id, $post) {
|
|
114
|
+
// Verify nonce
|
|
115
|
+
if (!isset($_POST['my_plugin_nonce']) ||
|
|
116
|
+
!wp_verify_nonce($_POST['my_plugin_nonce'], 'my_plugin_save')) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Check autosave
|
|
121
|
+
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Check permissions
|
|
126
|
+
if (!current_user_can('edit_post', $post_id)) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Save meta
|
|
131
|
+
if (isset($_POST['my_custom_field'])) {
|
|
132
|
+
update_post_meta(
|
|
133
|
+
$post_id,
|
|
134
|
+
'_my_custom_field',
|
|
135
|
+
sanitize_text_field($_POST['my_custom_field'])
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
#### Filters
|
|
142
|
+
|
|
143
|
+
```php
|
|
144
|
+
<?php
|
|
145
|
+
|
|
146
|
+
// Modify content
|
|
147
|
+
add_filter('the_content', 'my_plugin_modify_content');
|
|
148
|
+
function my_plugin_modify_content($content) {
|
|
149
|
+
if (is_single()) {
|
|
150
|
+
$custom_content = '<div class="custom-notice">Custom notice</div>';
|
|
151
|
+
$content = $custom_content . $content;
|
|
152
|
+
}
|
|
153
|
+
return $content;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Modify query
|
|
157
|
+
add_filter('pre_get_posts', 'my_plugin_modify_query');
|
|
158
|
+
function my_plugin_modify_query($query) {
|
|
159
|
+
if (!is_admin() && $query->is_main_query() && $query->is_home()) {
|
|
160
|
+
$query->set('posts_per_page', 20);
|
|
161
|
+
}
|
|
162
|
+
return $query;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Add custom body class
|
|
166
|
+
add_filter('body_class', 'my_plugin_body_class');
|
|
167
|
+
function my_plugin_body_class($classes) {
|
|
168
|
+
if (is_page('special-page')) {
|
|
169
|
+
$classes[] = 'special-page-class';
|
|
170
|
+
}
|
|
171
|
+
return $classes;
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Custom Post Types
|
|
176
|
+
|
|
177
|
+
```php
|
|
178
|
+
<?php
|
|
179
|
+
|
|
180
|
+
add_action('init', 'my_plugin_register_post_type');
|
|
181
|
+
function my_plugin_register_post_type() {
|
|
182
|
+
register_post_type('book', [
|
|
183
|
+
'labels' => [
|
|
184
|
+
'name' => __('Books', 'my-plugin'),
|
|
185
|
+
'singular_name' => __('Book', 'my-plugin'),
|
|
186
|
+
'add_new' => __('Add New Book', 'my-plugin'),
|
|
187
|
+
'add_new_item' => __('Add New Book', 'my-plugin'),
|
|
188
|
+
'edit_item' => __('Edit Book', 'my-plugin'),
|
|
189
|
+
],
|
|
190
|
+
'public' => true,
|
|
191
|
+
'has_archive' => true,
|
|
192
|
+
'rewrite' => ['slug' => 'books'],
|
|
193
|
+
'supports' => ['title', 'editor', 'thumbnail', 'excerpt'],
|
|
194
|
+
'menu_icon' => 'dashicons-book',
|
|
195
|
+
'show_in_rest' => true, // Enable Gutenberg
|
|
196
|
+
]);
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### WP_Query
|
|
201
|
+
|
|
202
|
+
```php
|
|
203
|
+
<?php
|
|
204
|
+
|
|
205
|
+
// Basic query
|
|
206
|
+
$args = [
|
|
207
|
+
'post_type' => 'post',
|
|
208
|
+
'posts_per_page' => 10,
|
|
209
|
+
'orderby' => 'date',
|
|
210
|
+
'order' => 'DESC',
|
|
211
|
+
];
|
|
212
|
+
|
|
213
|
+
$query = new WP_Query($args);
|
|
214
|
+
|
|
215
|
+
if ($query->have_posts()) {
|
|
216
|
+
while ($query->have_posts()) {
|
|
217
|
+
$query->the_post();
|
|
218
|
+
the_title('<h2>', '</h2>');
|
|
219
|
+
the_excerpt();
|
|
220
|
+
}
|
|
221
|
+
wp_reset_postdata();
|
|
222
|
+
} else {
|
|
223
|
+
echo '<p>No posts found.</p>';
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Advanced query with meta
|
|
227
|
+
$args = [
|
|
228
|
+
'post_type' => 'book',
|
|
229
|
+
'meta_query' => [
|
|
230
|
+
'relation' => 'AND',
|
|
231
|
+
[
|
|
232
|
+
'key' => '_price',
|
|
233
|
+
'value' => 20,
|
|
234
|
+
'compare' => '>=',
|
|
235
|
+
'type' => 'NUMERIC'
|
|
236
|
+
],
|
|
237
|
+
[
|
|
238
|
+
'key' => '_in_stock',
|
|
239
|
+
'value' => '1',
|
|
240
|
+
'compare' => '='
|
|
241
|
+
]
|
|
242
|
+
],
|
|
243
|
+
'tax_query' => [
|
|
244
|
+
[
|
|
245
|
+
'taxonomy' => 'genre',
|
|
246
|
+
'field' => 'slug',
|
|
247
|
+
'terms' => 'fiction'
|
|
248
|
+
]
|
|
249
|
+
]
|
|
250
|
+
];
|
|
251
|
+
|
|
252
|
+
$query = new WP_Query($args);
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Shortcodes
|
|
256
|
+
|
|
257
|
+
```php
|
|
258
|
+
<?php
|
|
259
|
+
|
|
260
|
+
// Register shortcode
|
|
261
|
+
add_shortcode('my_shortcode', 'my_shortcode_handler');
|
|
262
|
+
function my_shortcode_handler($atts, $content = null) {
|
|
263
|
+
// Parse attributes
|
|
264
|
+
$atts = shortcode_atts([
|
|
265
|
+
'title' => 'Default Title',
|
|
266
|
+
'count' => 5,
|
|
267
|
+
'type' => 'post'
|
|
268
|
+
], $atts, 'my_shortcode');
|
|
269
|
+
|
|
270
|
+
// Sanitize
|
|
271
|
+
$title = sanitize_text_field($atts['title']);
|
|
272
|
+
$count = absint($atts['count']);
|
|
273
|
+
$type = sanitize_key($atts['type']);
|
|
274
|
+
|
|
275
|
+
// Build output
|
|
276
|
+
ob_start();
|
|
277
|
+
?>
|
|
278
|
+
<div class="my-shortcode">
|
|
279
|
+
<h3><?php echo esc_html($title); ?></h3>
|
|
280
|
+
<?php
|
|
281
|
+
$query = new WP_Query([
|
|
282
|
+
'post_type' => $type,
|
|
283
|
+
'posts_per_page' => $count
|
|
284
|
+
]);
|
|
285
|
+
|
|
286
|
+
if ($query->have_posts()) {
|
|
287
|
+
echo '<ul>';
|
|
288
|
+
while ($query->have_posts()) {
|
|
289
|
+
$query->the_post();
|
|
290
|
+
echo '<li>' . get_the_title() . '</li>';
|
|
291
|
+
}
|
|
292
|
+
echo '</ul>';
|
|
293
|
+
wp_reset_postdata();
|
|
294
|
+
}
|
|
295
|
+
?>
|
|
296
|
+
</div>
|
|
297
|
+
<?php
|
|
298
|
+
return ob_get_clean();
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// Usage: [my_shortcode title="Recent Posts" count="10" type="post"]
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### AJAX Handling
|
|
305
|
+
|
|
306
|
+
```php
|
|
307
|
+
<?php
|
|
308
|
+
|
|
309
|
+
// Register AJAX handlers
|
|
310
|
+
add_action('wp_ajax_my_ajax_action', 'my_ajax_handler');
|
|
311
|
+
add_action('wp_ajax_nopriv_my_ajax_action', 'my_ajax_handler');
|
|
312
|
+
|
|
313
|
+
function my_ajax_handler() {
|
|
314
|
+
// Verify nonce
|
|
315
|
+
check_ajax_referer('my-plugin-nonce', 'nonce');
|
|
316
|
+
|
|
317
|
+
// Get data
|
|
318
|
+
$data = isset($_POST['data']) ? sanitize_text_field($_POST['data']) : '';
|
|
319
|
+
|
|
320
|
+
// Process
|
|
321
|
+
$result = process_data($data);
|
|
322
|
+
|
|
323
|
+
// Return JSON
|
|
324
|
+
if ($result) {
|
|
325
|
+
wp_send_json_success([
|
|
326
|
+
'message' => 'Success',
|
|
327
|
+
'data' => $result
|
|
328
|
+
]);
|
|
329
|
+
} else {
|
|
330
|
+
wp_send_json_error([
|
|
331
|
+
'message' => 'Error processing data'
|
|
332
|
+
]);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### Security Best Practices
|
|
338
|
+
|
|
339
|
+
#### Nonce Verification
|
|
340
|
+
|
|
341
|
+
```php
|
|
342
|
+
<?php
|
|
343
|
+
|
|
344
|
+
// Create nonce
|
|
345
|
+
$nonce = wp_create_nonce('my-action');
|
|
346
|
+
|
|
347
|
+
// Verify nonce in form submission
|
|
348
|
+
if (!isset($_POST['my_nonce']) || !wp_verify_nonce($_POST['my_nonce'], 'my-action')) {
|
|
349
|
+
wp_die('Security check failed');
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Verify nonce in AJAX
|
|
353
|
+
check_ajax_referer('my-ajax-action', 'nonce');
|
|
354
|
+
|
|
355
|
+
// Verify nonce in URL
|
|
356
|
+
if (!isset($_GET['_wpnonce']) || !wp_verify_nonce($_GET['_wpnonce'], 'my-action')) {
|
|
357
|
+
wp_die('Security check failed');
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
#### Data Sanitization
|
|
362
|
+
|
|
363
|
+
```php
|
|
364
|
+
<?php
|
|
365
|
+
|
|
366
|
+
// Sanitize text
|
|
367
|
+
$text = sanitize_text_field($_POST['text']);
|
|
368
|
+
|
|
369
|
+
// Sanitize email
|
|
370
|
+
$email = sanitize_email($_POST['email']);
|
|
371
|
+
|
|
372
|
+
// Sanitize URL
|
|
373
|
+
$url = esc_url_raw($_POST['url']);
|
|
374
|
+
|
|
375
|
+
// Sanitize HTML
|
|
376
|
+
$html = wp_kses_post($_POST['content']);
|
|
377
|
+
|
|
378
|
+
// Sanitize key
|
|
379
|
+
$key = sanitize_key($_POST['key']);
|
|
380
|
+
|
|
381
|
+
// Sanitize file name
|
|
382
|
+
$filename = sanitize_file_name($_FILES['file']['name']);
|
|
383
|
+
|
|
384
|
+
// Sanitize SQL for LIKE
|
|
385
|
+
$search = $wpdb->esc_like($_POST['search']);
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
#### Output Escaping
|
|
389
|
+
|
|
390
|
+
```php
|
|
391
|
+
<?php
|
|
392
|
+
|
|
393
|
+
// Escape HTML
|
|
394
|
+
echo esc_html($text);
|
|
395
|
+
|
|
396
|
+
// Escape attributes
|
|
397
|
+
echo '<input type="text" value="' . esc_attr($value) . '">';
|
|
398
|
+
|
|
399
|
+
// Escape URL
|
|
400
|
+
echo '<a href="' . esc_url($url) . '">Link</a>';
|
|
401
|
+
|
|
402
|
+
// Escape JavaScript
|
|
403
|
+
echo '<script>var data = "' . esc_js($data) . '";</script>';
|
|
404
|
+
|
|
405
|
+
// Escape textarea
|
|
406
|
+
echo '<textarea>' . esc_textarea($content) . '</textarea>';
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
#### Capability Checks
|
|
410
|
+
|
|
411
|
+
```php
|
|
412
|
+
<?php
|
|
413
|
+
|
|
414
|
+
// Check if user can edit posts
|
|
415
|
+
if (!current_user_can('edit_posts')) {
|
|
416
|
+
wp_die('You do not have permission');
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// Check if user can manage options
|
|
420
|
+
if (!current_user_can('manage_options')) {
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// Check if user can edit specific post
|
|
425
|
+
if (!current_user_can('edit_post', $post_id)) {
|
|
426
|
+
wp_die('You cannot edit this post');
|
|
427
|
+
}
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
## Drupal Development
|
|
431
|
+
|
|
432
|
+
### Module Structure
|
|
433
|
+
|
|
434
|
+
```php
|
|
435
|
+
<?php
|
|
436
|
+
|
|
437
|
+
// my_module.info.yml
|
|
438
|
+
name: My Module
|
|
439
|
+
type: module
|
|
440
|
+
description: 'A custom Drupal module'
|
|
441
|
+
core_version_requirement: ^9 || ^10
|
|
442
|
+
package: Custom
|
|
443
|
+
dependencies:
|
|
444
|
+
- drupal:node
|
|
445
|
+
- drupal:user
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### Hooks
|
|
449
|
+
|
|
450
|
+
```php
|
|
451
|
+
<?php
|
|
452
|
+
|
|
453
|
+
/**
|
|
454
|
+
* Implements hook_help().
|
|
455
|
+
*/
|
|
456
|
+
function my_module_help($route_name, RouteMatchInterface $route_match) {
|
|
457
|
+
switch ($route_name) {
|
|
458
|
+
case 'help.page.my_module':
|
|
459
|
+
return '<p>' . t('Help text for my module.') . '</p>';
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* Implements hook_node_presave().
|
|
465
|
+
*/
|
|
466
|
+
function my_module_node_presave(NodeInterface $node) {
|
|
467
|
+
if ($node->getType() == 'article') {
|
|
468
|
+
// Modify node before saving
|
|
469
|
+
$node->setTitle('Modified: ' . $node->getTitle());
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* Implements hook_form_alter().
|
|
475
|
+
*/
|
|
476
|
+
function my_module_form_alter(&$form, FormStateInterface $form_state, $form_id) {
|
|
477
|
+
if ($form_id == 'node_article_form') {
|
|
478
|
+
$form['title']['#description'] = t('Custom description');
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
### Services
|
|
484
|
+
|
|
485
|
+
```php
|
|
486
|
+
<?php
|
|
487
|
+
|
|
488
|
+
namespace Drupal\my_module\Service;
|
|
489
|
+
|
|
490
|
+
use Drupal\Core\Database\Connection;
|
|
491
|
+
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
|
|
492
|
+
|
|
493
|
+
class MyService {
|
|
494
|
+
|
|
495
|
+
protected $database;
|
|
496
|
+
protected $logger;
|
|
497
|
+
|
|
498
|
+
public function __construct(
|
|
499
|
+
Connection $database,
|
|
500
|
+
LoggerChannelFactoryInterface $logger_factory
|
|
501
|
+
) {
|
|
502
|
+
$this->database = $database;
|
|
503
|
+
$this->logger = $logger_factory->get('my_module');
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
public function processData($data) {
|
|
507
|
+
try {
|
|
508
|
+
// Process data
|
|
509
|
+
$this->logger->info('Data processed successfully');
|
|
510
|
+
return true;
|
|
511
|
+
} catch (\Exception $e) {
|
|
512
|
+
$this->logger->error('Error: @message', ['@message' => $e->getMessage()]);
|
|
513
|
+
return false;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
## Best Practices
|
|
520
|
+
|
|
521
|
+
### ✅ DO
|
|
522
|
+
|
|
523
|
+
- Use WordPress/Drupal coding standards
|
|
524
|
+
- Verify nonces for all form submissions
|
|
525
|
+
- Sanitize all input data
|
|
526
|
+
- Escape all output data
|
|
527
|
+
- Check user capabilities before operations
|
|
528
|
+
- Use translation functions for all strings
|
|
529
|
+
- Prefix all function/class names
|
|
530
|
+
- Use hooks and filters instead of modifying core
|
|
531
|
+
- Follow semantic versioning
|
|
532
|
+
- Document code with PHPDoc
|
|
533
|
+
- Use prepared statements for database queries
|
|
534
|
+
- Implement proper error handling
|
|
535
|
+
|
|
536
|
+
### ❌ DON'T
|
|
537
|
+
|
|
538
|
+
- Modify core files
|
|
539
|
+
- Use global variables unnecessarily
|
|
540
|
+
- Trust user input
|
|
541
|
+
- Output unescaped data
|
|
542
|
+
- Hardcode database table names
|
|
543
|
+
- Use deprecated functions
|
|
544
|
+
- Ignore coding standards
|
|
545
|
+
- Skip nonce verification
|
|
546
|
+
- Use direct database queries without sanitization
|
|
547
|
+
- Suppress errors in production
|
|
548
|
+
|
|
549
|
+
## Security Checklist
|
|
550
|
+
|
|
551
|
+
- [ ] Nonce verification on all forms
|
|
552
|
+
- [ ] Input sanitization
|
|
553
|
+
- [ ] Output escaping
|
|
554
|
+
- [ ] Capability checks
|
|
555
|
+
- [ ] SQL injection prevention (prepared statements)
|
|
556
|
+
- [ ] XSS prevention
|
|
557
|
+
- [ ] CSRF protection
|
|
558
|
+
- [ ] File upload validation
|
|
559
|
+
- [ ] Secure AJAX handlers
|
|
560
|
+
- [ ] Proper error handling (no sensitive data exposure)
|
|
561
|
+
|