@mytechtoday/augment-extensions 0.7.0 → 1.2.1

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.
Files changed (483) hide show
  1. package/AGENTS.md +265 -232
  2. package/README.md +956 -771
  3. package/augment-extensions/coding-standards/bash/README.md +196 -196
  4. package/augment-extensions/coding-standards/bash/module.json +163 -163
  5. package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -336
  6. package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -289
  7. package/augment-extensions/coding-standards/css/README.md +40 -40
  8. package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -550
  9. package/augment-extensions/coding-standards/css/module.json +44 -44
  10. package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -448
  11. package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -492
  12. package/augment-extensions/coding-standards/html/README.md +40 -40
  13. package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -267
  14. package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -505
  15. package/augment-extensions/coding-standards/html/module.json +44 -44
  16. package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -349
  17. package/augment-extensions/coding-standards/html-css-js/README.md +194 -194
  18. package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -487
  19. package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -550
  20. package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -667
  21. package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -267
  22. package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -612
  23. package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -505
  24. package/augment-extensions/coding-standards/html-css-js/module.json +48 -48
  25. package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -515
  26. package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -448
  27. package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -492
  28. package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -439
  29. package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -349
  30. package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -486
  31. package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -463
  32. package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -543
  33. package/augment-extensions/coding-standards/js/README.md +46 -46
  34. package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -487
  35. package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -667
  36. package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -612
  37. package/augment-extensions/coding-standards/js/module.json +49 -49
  38. package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -515
  39. package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -439
  40. package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -486
  41. package/augment-extensions/coding-standards/js/rules/performance.md +463 -463
  42. package/augment-extensions/coding-standards/js/rules/tooling.md +543 -543
  43. package/augment-extensions/coding-standards/php/README.md +248 -248
  44. package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -204
  45. package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -206
  46. package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -234
  47. package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -211
  48. package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -215
  49. package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -189
  50. package/augment-extensions/coding-standards/php/module.json +166 -166
  51. package/augment-extensions/coding-standards/php/rules/api-development.md +480 -480
  52. package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -332
  53. package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -472
  54. package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -561
  55. package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -402
  56. package/augment-extensions/coding-standards/php/rules/documentation.md +425 -425
  57. package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -627
  58. package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -336
  59. package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -677
  60. package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -279
  61. package/augment-extensions/coding-standards/php/rules/performance.md +392 -392
  62. package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -186
  63. package/augment-extensions/coding-standards/php/rules/security.md +358 -358
  64. package/augment-extensions/coding-standards/php/rules/testing.md +403 -403
  65. package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -331
  66. package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -426
  67. package/augment-extensions/coding-standards/powershell/README.md +154 -154
  68. package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -272
  69. package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -173
  70. package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -243
  71. package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -297
  72. package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -224
  73. package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -340
  74. package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -255
  75. package/augment-extensions/coding-standards/powershell/module.json +165 -165
  76. package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -439
  77. package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -240
  78. package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -384
  79. package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -383
  80. package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -482
  81. package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -296
  82. package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -314
  83. package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -466
  84. package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -244
  85. package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -266
  86. package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -209
  87. package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -314
  88. package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -268
  89. package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -197
  90. package/augment-extensions/coding-standards/python/README.md +48 -48
  91. package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -373
  92. package/augment-extensions/coding-standards/python/module.json +30 -30
  93. package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -884
  94. package/augment-extensions/coding-standards/python/rules/best-practices.md +232 -232
  95. package/augment-extensions/coding-standards/python/rules/code-organization.md +220 -220
  96. package/augment-extensions/coding-standards/python/rules/documentation.md +831 -831
  97. package/augment-extensions/coding-standards/python/rules/error-handling.md +1008 -1008
  98. package/augment-extensions/coding-standards/python/rules/naming-conventions.md +172 -172
  99. package/augment-extensions/coding-standards/python/rules/testing.md +409 -409
  100. package/augment-extensions/coding-standards/python/rules/tooling.md +446 -446
  101. package/augment-extensions/coding-standards/python/rules/type-hints.md +253 -253
  102. package/augment-extensions/coding-standards/react/README.md +45 -45
  103. package/augment-extensions/coding-standards/react/module.json +27 -27
  104. package/augment-extensions/coding-standards/react/rules/component-patterns.md +214 -214
  105. package/augment-extensions/coding-standards/react/rules/hooks-best-practices.md +235 -235
  106. package/augment-extensions/coding-standards/react/rules/performance.md +300 -300
  107. package/augment-extensions/coding-standards/react/rules/state-management.md +265 -265
  108. package/augment-extensions/coding-standards/react/rules/typescript-react.md +271 -271
  109. package/augment-extensions/coding-standards/typescript/README.md +45 -45
  110. package/augment-extensions/coding-standards/typescript/module.json +27 -27
  111. package/augment-extensions/coding-standards/typescript/rules/naming-conventions.md +225 -225
  112. package/augment-extensions/collections/html-css-js/README.md +82 -82
  113. package/augment-extensions/collections/html-css-js/collection.json +41 -41
  114. package/augment-extensions/domain-rules/api-design/README.md +41 -41
  115. package/augment-extensions/domain-rules/api-design/module.json +27 -27
  116. package/augment-extensions/domain-rules/api-design/rules/authentication.md +263 -263
  117. package/augment-extensions/domain-rules/api-design/rules/documentation.md +395 -395
  118. package/augment-extensions/domain-rules/api-design/rules/error-handling.md +290 -290
  119. package/augment-extensions/domain-rules/api-design/rules/graphql-api.md +313 -313
  120. package/augment-extensions/domain-rules/api-design/rules/rest-api.md +214 -214
  121. package/augment-extensions/domain-rules/api-design/rules/versioning.md +268 -268
  122. package/augment-extensions/domain-rules/database/README.md +161 -161
  123. package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -793
  124. package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -1132
  125. package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -868
  126. package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -805
  127. package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -621
  128. package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -965
  129. package/augment-extensions/domain-rules/database/module.json +28 -28
  130. package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -624
  131. package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -588
  132. package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -856
  133. package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -778
  134. package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -963
  135. package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -1076
  136. package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -697
  137. package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -671
  138. package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -607
  139. package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -907
  140. package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -783
  141. package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -980
  142. package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -485
  143. package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -521
  144. package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -858
  145. package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -934
  146. package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/README.md +23 -23
  147. package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/module.json +26 -26
  148. package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/README.md +23 -23
  149. package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/module.json +26 -26
  150. package/augment-extensions/domain-rules/design/color/themes/dracula/README.md +23 -23
  151. package/augment-extensions/domain-rules/design/color/themes/dracula/module.json +26 -26
  152. package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/README.md +23 -23
  153. package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/module.json +26 -26
  154. package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/README.md +23 -23
  155. package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/module.json +26 -26
  156. package/augment-extensions/domain-rules/design/color/themes/high-contrast/README.md +27 -27
  157. package/augment-extensions/domain-rules/design/color/themes/high-contrast/module.json +26 -26
  158. package/augment-extensions/domain-rules/design/color/themes/monokai/README.md +23 -23
  159. package/augment-extensions/domain-rules/design/color/themes/monokai/module.json +26 -26
  160. package/augment-extensions/domain-rules/design/color/themes/nord/README.md +23 -23
  161. package/augment-extensions/domain-rules/design/color/themes/nord/module.json +26 -26
  162. package/augment-extensions/domain-rules/design/color/themes/one-dark/README.md +23 -23
  163. package/augment-extensions/domain-rules/design/color/themes/one-dark/module.json +26 -26
  164. package/augment-extensions/domain-rules/design/color/themes/one-light/README.md +23 -23
  165. package/augment-extensions/domain-rules/design/color/themes/one-light/module.json +26 -26
  166. package/augment-extensions/domain-rules/design/color/themes/solarized-dark/README.md +23 -23
  167. package/augment-extensions/domain-rules/design/color/themes/solarized-dark/module.json +26 -26
  168. package/augment-extensions/domain-rules/design/color/themes/solarized-light/README.md +23 -23
  169. package/augment-extensions/domain-rules/design/color/themes/solarized-light/module.json +26 -26
  170. package/augment-extensions/domain-rules/design/color/themes/tokyo-night/README.md +23 -23
  171. package/augment-extensions/domain-rules/design/color/themes/tokyo-night/module.json +26 -26
  172. package/augment-extensions/domain-rules/mcp/README.md +150 -150
  173. package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -522
  174. package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -520
  175. package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -570
  176. package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -427
  177. package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -435
  178. package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -502
  179. package/augment-extensions/domain-rules/mcp/module.json +49 -49
  180. package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -595
  181. package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -345
  182. package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -687
  183. package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -636
  184. package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -484
  185. package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -360
  186. package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -393
  187. package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -194
  188. package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -625
  189. package/augment-extensions/domain-rules/security/README.md +41 -41
  190. package/augment-extensions/domain-rules/security/module.json +28 -28
  191. package/augment-extensions/domain-rules/security/rules/authentication-security.md +361 -361
  192. package/augment-extensions/domain-rules/security/rules/encryption.md +208 -208
  193. package/augment-extensions/domain-rules/security/rules/input-validation.md +294 -294
  194. package/augment-extensions/domain-rules/security/rules/owasp-top-10.md +339 -339
  195. package/augment-extensions/domain-rules/security/rules/secure-coding.md +293 -293
  196. package/augment-extensions/domain-rules/security/rules/web-security.md +268 -268
  197. package/augment-extensions/domain-rules/seo-sales-marketing/ANNOUNCEMENT.md +143 -0
  198. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/README.md +140 -136
  199. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/SCHEMA-VALIDATION-REPORT.md +216 -216
  200. package/augment-extensions/domain-rules/seo-sales-marketing/TEST-VALIDATION.md +129 -0
  201. package/augment-extensions/domain-rules/seo-sales-marketing/USAGE-GUIDES.md +254 -0
  202. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/brand-kit-example.yaml +292 -292
  203. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/campaign-brief-example.yaml +389 -389
  204. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/content-calendar-example.yaml +643 -643
  205. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/email-newsletter-example.md +376 -376
  206. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/landing-page-example.md +934 -934
  207. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/ppc-ad-copy-example.md +301 -301
  208. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/seo-blog-post-example.md +347 -347
  209. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/social-media-campaign-example.md +606 -606
  210. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/module.json +50 -50
  211. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/affiliate-influencer-marketing.md +593 -593
  212. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/asset-management.md +418 -418
  213. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/brand-consistency.md +210 -210
  214. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/content-marketing.md +337 -337
  215. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/conversion-optimization.md +455 -455
  216. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/direct-sales.md +499 -499
  217. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/email-marketing.md +439 -439
  218. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/legal-compliance.md +227 -227
  219. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/ppc-advertising.md +569 -569
  220. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/seo-optimization.md +470 -470
  221. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/social-media-marketing.md +414 -414
  222. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/universal-marketing.md +177 -177
  223. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/asset-inventory.schema.json +247 -247
  224. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/brand-kit.schema.json +326 -326
  225. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/campaign-brief.schema.json +342 -342
  226. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/color-palette.schema.json +223 -223
  227. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/content-template.schema.json +383 -383
  228. package/augment-extensions/domain-rules/wordpress/README.md +163 -163
  229. package/augment-extensions/domain-rules/wordpress/module.json +32 -32
  230. package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -617
  231. package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -270
  232. package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -423
  233. package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -493
  234. package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -568
  235. package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -510
  236. package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -251
  237. package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -501
  238. package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -564
  239. package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -388
  240. package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -441
  241. package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -139
  242. package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -1599
  243. package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -1727
  244. package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -428
  245. package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -422
  246. package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -1623
  247. package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -1343
  248. package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -734
  249. package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -1350
  250. package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -503
  251. package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -971
  252. package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -53
  253. package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -770
  254. package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -874
  255. package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -629
  256. package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -559
  257. package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -709
  258. package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -736
  259. package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -1057
  260. package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -463
  261. package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -478
  262. package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -818
  263. package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -416
  264. package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -667
  265. package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -878
  266. package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -693
  267. package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -352
  268. package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -818
  269. package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -624
  270. package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -866
  271. package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -1165
  272. package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -414
  273. package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -751
  274. package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -949
  275. package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -458
  276. package/augment-extensions/examples/design-patterns/README.md +37 -37
  277. package/augment-extensions/examples/design-patterns/examples/behavioral-patterns.md +370 -370
  278. package/augment-extensions/examples/design-patterns/examples/creational-patterns.md +250 -250
  279. package/augment-extensions/examples/design-patterns/examples/structural-patterns.md +264 -264
  280. package/augment-extensions/examples/design-patterns/module.json +27 -27
  281. package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -101
  282. package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -428
  283. package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -40
  284. package/augment-extensions/examples/rest-api-plugin/README.md +98 -98
  285. package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -1299
  286. package/augment-extensions/examples/rest-api-plugin/module.json +40 -40
  287. package/augment-extensions/examples/woocommerce-extension/README.md +98 -98
  288. package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -763
  289. package/augment-extensions/examples/woocommerce-extension/module.json +40 -40
  290. package/augment-extensions/workflows/beads/README.md +135 -135
  291. package/augment-extensions/workflows/beads/examples/complete-workflow-example.md +278 -278
  292. package/augment-extensions/workflows/beads/module.json +55 -55
  293. package/augment-extensions/workflows/beads/rules/best-practices.md +398 -398
  294. package/augment-extensions/workflows/beads/rules/file-format.md +327 -327
  295. package/augment-extensions/workflows/beads/rules/manual-setup.md +315 -315
  296. package/augment-extensions/workflows/beads/rules/workflow.md +326 -326
  297. package/augment-extensions/workflows/beads-integration/IMPLEMENTATION-STATUS.md +145 -145
  298. package/augment-extensions/workflows/beads-integration/README.md +143 -143
  299. package/augment-extensions/workflows/beads-integration/config/defaults.json +32 -32
  300. package/augment-extensions/workflows/beads-integration/config/schema.json +140 -140
  301. package/augment-extensions/workflows/beads-integration/examples/basic-task-generation.md +293 -293
  302. package/augment-extensions/workflows/beads-integration/module.json +75 -75
  303. package/augment-extensions/workflows/beads-integration/rules/core-rules.md +219 -219
  304. package/augment-extensions/workflows/beads-integration/rules/effectiveness-standards.md +256 -256
  305. package/augment-extensions/workflows/beads-integration/rules/task-generation.md +607 -607
  306. package/augment-extensions/workflows/database/README.md +195 -195
  307. package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -295
  308. package/augment-extensions/workflows/database/examples/migration-example.md +498 -498
  309. package/augment-extensions/workflows/database/examples/optimization-example.md +496 -496
  310. package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -444
  311. package/augment-extensions/workflows/database/module.json +42 -42
  312. package/augment-extensions/workflows/database/rules/data-migration.md +249 -249
  313. package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -339
  314. package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -352
  315. package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -435
  316. package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -535
  317. package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -305
  318. package/augment-extensions/workflows/database/rules/workflow.md +458 -458
  319. package/augment-extensions/workflows/wordpress-plugin/README.md +232 -232
  320. package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -839
  321. package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -854
  322. package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -540
  323. package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -1083
  324. package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -669
  325. package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -597
  326. package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -925
  327. package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -752
  328. package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -773
  329. package/augment-extensions/workflows/wordpress-plugin/module.json +49 -49
  330. package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -942
  331. package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -702
  332. package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -728
  333. package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -775
  334. package/augment-extensions/writing-standards/screenplay/README.md +339 -300
  335. package/augment-extensions/writing-standards/screenplay/_templates/README.md +121 -121
  336. package/augment-extensions/writing-standards/screenplay/_templates/genre-template.md +153 -153
  337. package/augment-extensions/writing-standards/screenplay/_templates/style-template.md +243 -243
  338. package/augment-extensions/writing-standards/screenplay/_templates/theme-template.md +213 -213
  339. package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -164
  340. package/augment-extensions/writing-standards/screenplay/examples/beat-sheet-example.yaml +95 -95
  341. package/augment-extensions/writing-standards/screenplay/examples/character-profile-example.yaml +116 -116
  342. package/augment-extensions/writing-standards/screenplay/examples/commercial-30sec.fountain +151 -151
  343. package/augment-extensions/writing-standards/screenplay/examples/independent-monologue.fountain +67 -67
  344. package/augment-extensions/writing-standards/screenplay/examples/news-segment.fountain +142 -142
  345. package/augment-extensions/writing-standards/screenplay/examples/plot-outline-example.yaml +184 -184
  346. package/augment-extensions/writing-standards/screenplay/examples/tv-episode-teaser.fountain +204 -204
  347. package/augment-extensions/writing-standards/screenplay/genres/README.md +181 -181
  348. package/augment-extensions/writing-standards/screenplay/genres/examples/.gitkeep +2 -2
  349. package/augment-extensions/writing-standards/screenplay/genres/module.json +70 -70
  350. package/augment-extensions/writing-standards/screenplay/genres/rules/.gitkeep +2 -2
  351. package/augment-extensions/writing-standards/screenplay/genres/rules/action.md +399 -399
  352. package/augment-extensions/writing-standards/screenplay/genres/rules/adventure.md +407 -407
  353. package/augment-extensions/writing-standards/screenplay/genres/rules/animation.md +293 -293
  354. package/augment-extensions/writing-standards/screenplay/genres/rules/biographical.md +293 -293
  355. package/augment-extensions/writing-standards/screenplay/genres/rules/comedy.md +401 -401
  356. package/augment-extensions/writing-standards/screenplay/genres/rules/documentary.md +293 -293
  357. package/augment-extensions/writing-standards/screenplay/genres/rules/drama.md +409 -409
  358. package/augment-extensions/writing-standards/screenplay/genres/rules/fantasy.md +293 -293
  359. package/augment-extensions/writing-standards/screenplay/genres/rules/historical.md +293 -293
  360. package/augment-extensions/writing-standards/screenplay/genres/rules/horror.md +268 -268
  361. package/augment-extensions/writing-standards/screenplay/genres/rules/musical.md +294 -294
  362. package/augment-extensions/writing-standards/screenplay/genres/rules/mystery.md +293 -293
  363. package/augment-extensions/writing-standards/screenplay/genres/rules/noir.md +294 -294
  364. package/augment-extensions/writing-standards/screenplay/genres/rules/romance.md +293 -293
  365. package/augment-extensions/writing-standards/screenplay/genres/rules/sci-fi.md +289 -289
  366. package/augment-extensions/writing-standards/screenplay/genres/rules/superhero.md +293 -293
  367. package/augment-extensions/writing-standards/screenplay/genres/rules/thriller.md +294 -294
  368. package/augment-extensions/writing-standards/screenplay/genres/rules/western.md +293 -293
  369. package/augment-extensions/writing-standards/screenplay/module.json +124 -124
  370. package/augment-extensions/writing-standards/screenplay/rules/aaa-hollywood-films.md +339 -339
  371. package/augment-extensions/writing-standards/screenplay/rules/ai-integration-testing.md +329 -329
  372. package/augment-extensions/writing-standards/screenplay/rules/character-development.md +169 -169
  373. package/augment-extensions/writing-standards/screenplay/rules/commercials.md +437 -437
  374. package/augment-extensions/writing-standards/screenplay/rules/dialogue-writing.md +263 -263
  375. package/augment-extensions/writing-standards/screenplay/rules/diversity-inclusion.md +261 -261
  376. package/augment-extensions/writing-standards/screenplay/rules/examples-guide.md +315 -315
  377. package/augment-extensions/writing-standards/screenplay/rules/file-organization.md +213 -0
  378. package/augment-extensions/writing-standards/screenplay/rules/formatting-validation.md +413 -413
  379. package/augment-extensions/writing-standards/screenplay/rules/fountain-format.md +372 -372
  380. package/augment-extensions/writing-standards/screenplay/rules/independent-films.md +374 -374
  381. package/augment-extensions/writing-standards/screenplay/rules/live-tv-productions.md +443 -443
  382. package/augment-extensions/writing-standards/screenplay/rules/narrative-structures.md +207 -207
  383. package/augment-extensions/writing-standards/screenplay/rules/news-broadcasts.md +444 -444
  384. package/augment-extensions/writing-standards/screenplay/rules/pacing-timing.md +331 -331
  385. package/augment-extensions/writing-standards/screenplay/rules/quality-review-checklist.md +334 -334
  386. package/augment-extensions/writing-standards/screenplay/rules/quick-reference.md +299 -299
  387. package/augment-extensions/writing-standards/screenplay/rules/screen-continuity.md +263 -263
  388. package/augment-extensions/writing-standards/screenplay/rules/streaming-content.md +412 -412
  389. package/augment-extensions/writing-standards/screenplay/rules/trope-management.md +370 -370
  390. package/augment-extensions/writing-standards/screenplay/rules/tv-series.md +374 -374
  391. package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -339
  392. package/augment-extensions/writing-standards/screenplay/rules/vscode-integration.md +277 -277
  393. package/augment-extensions/writing-standards/screenplay/rules/web-content.md +393 -393
  394. package/augment-extensions/writing-standards/screenplay/schemas/beat-sheet.json +332 -332
  395. package/augment-extensions/writing-standards/screenplay/schemas/character-profile.json +247 -247
  396. package/augment-extensions/writing-standards/screenplay/schemas/feature-selection.json +200 -200
  397. package/augment-extensions/writing-standards/screenplay/schemas/plot-outline.json +233 -233
  398. package/augment-extensions/writing-standards/screenplay/schemas/screenplay-config.json +245 -245
  399. package/augment-extensions/writing-standards/screenplay/schemas/trope-inventory.json +221 -221
  400. package/augment-extensions/writing-standards/screenplay/styles/README.md +159 -159
  401. package/augment-extensions/writing-standards/screenplay/styles/examples/.gitkeep +2 -2
  402. package/augment-extensions/writing-standards/screenplay/styles/examples/style-applications.md +1449 -1449
  403. package/augment-extensions/writing-standards/screenplay/styles/module.json +64 -64
  404. package/augment-extensions/writing-standards/screenplay/styles/rules/.gitkeep +2 -2
  405. package/augment-extensions/writing-standards/screenplay/styles/rules/dialogue-centric.md +520 -520
  406. package/augment-extensions/writing-standards/screenplay/styles/rules/ensemble.md +499 -499
  407. package/augment-extensions/writing-standards/screenplay/styles/rules/epic.md +497 -497
  408. package/augment-extensions/writing-standards/screenplay/styles/rules/experimental.md +492 -492
  409. package/augment-extensions/writing-standards/screenplay/styles/rules/flashback.md +509 -509
  410. package/augment-extensions/writing-standards/screenplay/styles/rules/linear.md +490 -490
  411. package/augment-extensions/writing-standards/screenplay/styles/rules/minimalist.md +499 -499
  412. package/augment-extensions/writing-standards/screenplay/styles/rules/non-linear.md +501 -501
  413. package/augment-extensions/writing-standards/screenplay/styles/rules/poetic.md +499 -499
  414. package/augment-extensions/writing-standards/screenplay/styles/rules/realistic.md +498 -498
  415. package/augment-extensions/writing-standards/screenplay/styles/rules/satirical.md +499 -499
  416. package/augment-extensions/writing-standards/screenplay/styles/rules/surreal.md +508 -508
  417. package/augment-extensions/writing-standards/screenplay/styles/rules/voice-over.md +500 -500
  418. package/augment-extensions/writing-standards/screenplay/themes/README.md +158 -158
  419. package/augment-extensions/writing-standards/screenplay/themes/examples/.gitkeep +2 -2
  420. package/augment-extensions/writing-standards/screenplay/themes/examples/common-mistakes-and-fixes.md +643 -643
  421. package/augment-extensions/writing-standards/screenplay/themes/examples/complete-scene-example.md +311 -311
  422. package/augment-extensions/writing-standards/screenplay/themes/examples/individual-theme-examples.md +562 -562
  423. package/augment-extensions/writing-standards/screenplay/themes/examples/multi-theme-weaving.md +538 -538
  424. package/augment-extensions/writing-standards/screenplay/themes/examples/theme-application-guide.md +432 -432
  425. package/augment-extensions/writing-standards/screenplay/themes/examples/theme-integration-across-acts.md +637 -637
  426. package/augment-extensions/writing-standards/screenplay/themes/module.json +66 -66
  427. package/augment-extensions/writing-standards/screenplay/themes/rules/.gitkeep +2 -2
  428. package/augment-extensions/writing-standards/screenplay/themes/rules/ambition.md +458 -458
  429. package/augment-extensions/writing-standards/screenplay/themes/rules/betrayal.md +490 -490
  430. package/augment-extensions/writing-standards/screenplay/themes/rules/environment.md +458 -458
  431. package/augment-extensions/writing-standards/screenplay/themes/rules/fate.md +459 -459
  432. package/augment-extensions/writing-standards/screenplay/themes/rules/friendship.md +491 -491
  433. package/augment-extensions/writing-standards/screenplay/themes/rules/growth.md +491 -491
  434. package/augment-extensions/writing-standards/screenplay/themes/rules/identity.md +490 -490
  435. package/augment-extensions/writing-standards/screenplay/themes/rules/isolation.md +464 -464
  436. package/augment-extensions/writing-standards/screenplay/themes/rules/justice.md +461 -461
  437. package/augment-extensions/writing-standards/screenplay/themes/rules/love.md +489 -489
  438. package/augment-extensions/writing-standards/screenplay/themes/rules/power.md +494 -494
  439. package/augment-extensions/writing-standards/screenplay/themes/rules/redemption.md +483 -483
  440. package/augment-extensions/writing-standards/screenplay/themes/rules/revenge.md +489 -489
  441. package/augment-extensions/writing-standards/screenplay/themes/rules/survival.md +496 -496
  442. package/augment-extensions/writing-standards/screenplay/themes/rules/technology.md +463 -463
  443. package/augment-extensions/writing-standards/screenplay/utils/__tests__/file-organization.test.ts +169 -0
  444. package/augment-extensions/writing-standards/screenplay/utils/file-organization.ts +165 -0
  445. package/cli/MODULES.md +302 -302
  446. package/cli/dist/cli.js +109 -22
  447. package/cli/dist/cli.js.map +1 -1
  448. package/cli/dist/commands/gui.d.ts.map +1 -1
  449. package/cli/dist/commands/gui.js +54 -6
  450. package/cli/dist/commands/gui.js.map +1 -1
  451. package/cli/dist/commands/init.d.ts.map +1 -1
  452. package/cli/dist/commands/init.js +76 -23
  453. package/cli/dist/commands/init.js.map +1 -1
  454. package/cli/dist/commands/self-remove.d.ts.map +1 -1
  455. package/cli/dist/commands/self-remove.js +48 -74
  456. package/cli/dist/commands/self-remove.js.map +1 -1
  457. package/cli/dist/commands/show.d.ts +11 -0
  458. package/cli/dist/commands/show.d.ts.map +1 -1
  459. package/cli/dist/commands/show.js +120 -0
  460. package/cli/dist/commands/show.js.map +1 -1
  461. package/cli/dist/commands/showCompleted.d.ts +21 -0
  462. package/cli/dist/commands/showCompleted.d.ts.map +1 -0
  463. package/cli/dist/commands/showCompleted.js +225 -0
  464. package/cli/dist/commands/showCompleted.js.map +1 -0
  465. package/cli/dist/commands/skill.js +88 -88
  466. package/cli/dist/commands/update.d.ts +2 -0
  467. package/cli/dist/commands/update.d.ts.map +1 -1
  468. package/cli/dist/commands/update.js +67 -1
  469. package/cli/dist/commands/update.js.map +1 -1
  470. package/cli/dist/utils/beadsCompletedChecker.d.ts +72 -0
  471. package/cli/dist/utils/beadsCompletedChecker.d.ts.map +1 -0
  472. package/cli/dist/utils/beadsCompletedChecker.js +198 -0
  473. package/cli/dist/utils/beadsCompletedChecker.js.map +1 -0
  474. package/cli/dist/utils/catalog-sync.js +13 -13
  475. package/cli/dist/utils/extractCommandHelp.d.ts +51 -0
  476. package/cli/dist/utils/extractCommandHelp.d.ts.map +1 -0
  477. package/cli/dist/utils/extractCommandHelp.js +250 -0
  478. package/cli/dist/utils/extractCommandHelp.js.map +1 -0
  479. package/cli/dist/utils/install-rules.js +55 -55
  480. package/cli/dist/utils/mcp-integration.js +44 -44
  481. package/cli/dist/utils/rule-install-hooks.js +8 -8
  482. package/modules.md +667 -630
  483. package/package.json +85 -85
@@ -1,942 +1,942 @@
1
- # WordPress Plugin Development Best Practices
2
-
3
- ## Overview
4
-
5
- This document provides comprehensive best practices for WordPress plugin development, covering code organization, naming conventions, security, performance, accessibility, and backward compatibility.
6
-
7
- ## Code Organization
8
-
9
- ### Directory Structure
10
-
11
- **Standard Plugin Structure**:
12
-
13
- ```
14
- plugin-name/
15
- ├── plugin-name.php # Main plugin file
16
- ├── uninstall.php # Uninstall cleanup
17
- ├── readme.txt # WordPress.org readme
18
- ├── LICENSE # License file
19
- ├── includes/ # Core plugin classes
20
- │ ├── class-plugin-name.php
21
- │ ├── class-activator.php
22
- │ ├── class-deactivator.php
23
- │ └── class-loader.php
24
- ├── admin/ # Admin-specific functionality
25
- │ ├── class-admin.php
26
- │ ├── partials/ # Admin view templates
27
- │ ├── css/
28
- │ └── js/
29
- ├── public/ # Public-facing functionality
30
- │ ├── class-public.php
31
- │ ├── partials/ # Public view templates
32
- │ ├── css/
33
- │ └── js/
34
- ├── languages/ # Translation files
35
- ├── assets/ # Plugin assets for WordPress.org
36
- │ ├── banner-772x250.png
37
- │ ├── banner-1544x500.png
38
- │ ├── icon-128x128.png
39
- │ └── icon-256x256.png
40
- └── tests/ # PHPUnit tests
41
- ├── bootstrap.php
42
- ├── unit/
43
- └── integration/
44
- ```
45
-
46
- ### File Organization Best Practices
47
-
48
- **DO**:
49
- - ✅ One class per file
50
- - ✅ Group related functionality in subdirectories
51
- - ✅ Separate admin and public functionality
52
- - ✅ Keep templates in `partials/` directories
53
- - ✅ Organize assets by type (css, js, images)
54
-
55
- **DON'T**:
56
- - ❌ Mix multiple classes in one file
57
- - ❌ Put all code in main plugin file
58
- - ❌ Mix admin and public code
59
- - ❌ Hardcode HTML in PHP classes
60
- - ❌ Put assets in root directory
61
-
62
- ## Naming Conventions
63
-
64
- ### File Naming
65
-
66
- **PHP Files**:
67
- ```
68
- class-plugin-name.php # Class files (lowercase, hyphens)
69
- class-admin.php
70
- class-public.php
71
- plugin-name-functions.php # Function files
72
- ```
73
-
74
- **Template Files**:
75
- ```
76
- admin-display.php # Admin templates
77
- public-display.php # Public templates
78
- settings-page.php
79
- ```
80
-
81
- **Asset Files**:
82
- ```
83
- plugin-name-admin.css # Prefixed with plugin name
84
- plugin-name-public.js
85
- plugin-name-icon.png
86
- ```
87
-
88
- ### Code Naming
89
-
90
- **Classes**:
91
- ```php
92
- class Plugin_Name {} # Capitalized with underscores
93
- class Plugin_Name_Admin {}
94
- class Plugin_Name_Public {}
95
- ```
96
-
97
- **Functions**:
98
- ```php
99
- function plugin_name_activate() {} # Lowercase with underscores
100
- function plugin_name_get_data() {}
101
- function plugin_name_sanitize_input() {}
102
- ```
103
-
104
- **Variables**:
105
- ```php
106
- $plugin_name = 'value'; # Lowercase with underscores
107
- $user_data = array();
108
- $is_active = true;
109
- ```
110
-
111
- **Constants**:
112
- ```php
113
- define( 'PLUGIN_NAME_VERSION', '1.0.0' ); # Uppercase with underscores
114
- define( 'PLUGIN_NAME_PATH', plugin_dir_path( __FILE__ ) );
115
- ```
116
-
117
- **Hooks**:
118
- ```php
119
- // Actions
120
- do_action( 'plugin_name_before_save' );
121
- do_action( 'plugin_name_after_save' );
122
-
123
- // Filters
124
- apply_filters( 'plugin_name_data', $data );
125
- apply_filters( 'plugin_name_settings', $settings );
126
- ```
127
-
128
- ### Database Naming
129
-
130
- **Tables**:
131
- ```php
132
- global $wpdb;
133
- $table_name = $wpdb->prefix . 'plugin_name_items'; # Prefixed, lowercase, underscores
134
- ```
135
-
136
- **Options**:
137
- ```php
138
- get_option( 'plugin_name_settings' ); # Prefixed with plugin name
139
- get_option( 'plugin_name_version' );
140
- ```
141
-
142
- **Post Meta**:
143
- ```php
144
- get_post_meta( $post_id, '_plugin_name_meta_key', true ); # Prefixed, leading underscore for hidden
145
- ```
146
-
147
- **User Meta**:
148
- ```php
149
- get_user_meta( $user_id, 'plugin_name_preference', true );
150
- ```
151
-
152
- **Transients**:
153
- ```php
154
- get_transient( 'plugin_name_cache_key' ); # Prefixed, max 172 characters
155
- ```
156
-
157
- ## WordPress Coding Standards
158
-
159
- ### Indentation and Spacing
160
-
161
- **Use Tabs for Indentation**:
162
- ```php
163
- function plugin_name_example() {
164
- if ( $condition ) {
165
- // Code here (indented with tab)
166
- }
167
- }
168
- ```
169
-
170
- **Space After Control Structures**:
171
- ```php
172
- if ( $condition ) { // Space after 'if', space inside parentheses
173
- // Code
174
- }
175
-
176
- foreach ( $items as $item ) { // Space after 'foreach'
177
- // Code
178
- }
179
- ```
180
-
181
- **No Space Before Function Parentheses**:
182
- ```php
183
- function my_function( $param ) { // No space before (
184
- // Code
185
- }
186
- ```
187
-
188
- ### Braces and Brackets
189
-
190
- **Opening Braces on Same Line**:
191
- ```php
192
- if ( $condition ) {
193
- // Code
194
- }
195
-
196
- function my_function() {
197
- // Code
198
- }
199
- ```
200
-
201
- **Arrays**:
202
- ```php
203
- $array = array(
204
- 'key1' => 'value1',
205
- 'key2' => 'value2',
206
- );
207
- ```
208
-
209
- ### Quotes
210
-
211
- **Use Single Quotes for Strings**:
212
- ```php
213
- $string = 'Hello World';
214
- $html = '<div class="wrapper">'; // Single quotes for HTML
215
- ```
216
-
217
- **Use Double Quotes for Interpolation**:
218
- ```php
219
- $name = 'John';
220
- $greeting = "Hello, $name"; // Double quotes for variable interpolation
221
- ```
222
-
223
- ### Yoda Conditions
224
-
225
- **Use Yoda Conditions for Comparisons**:
226
- ```php
227
- if ( 'value' === $variable ) { // Constant on left
228
- // Code
229
- }
230
-
231
- if ( true === $is_active ) {
232
- // Code
233
- }
234
- ```
235
-
236
- ## Security Checklist
237
-
238
- ### Input Validation and Sanitization
239
-
240
- **Always Sanitize User Input**:
241
-
242
- ```php
243
- // Text fields
244
- $text = sanitize_text_field( $_POST['text'] );
245
-
246
- // Email
247
- $email = sanitize_email( $_POST['email'] );
248
-
249
- // URL
250
- $url = esc_url_raw( $_POST['url'] );
251
-
252
- // Integer
253
- $number = absint( $_POST['number'] );
254
-
255
- // Array
256
- $array = array_map( 'sanitize_text_field', $_POST['array'] );
257
-
258
- // HTML (allowed tags)
259
- $html = wp_kses_post( $_POST['content'] );
260
- ```
261
-
262
- ### Output Escaping
263
-
264
- **Always Escape Output**:
265
-
266
- ```php
267
- // HTML
268
- echo esc_html( $text );
269
-
270
- // Attributes
271
- echo '<div class="' . esc_attr( $class ) . '">';
272
-
273
- // URL
274
- echo '<a href="' . esc_url( $url ) . '">';
275
-
276
- // JavaScript
277
- echo '<script>var data = ' . wp_json_encode( $data ) . ';</script>';
278
-
279
- // Translation with escaping
280
- echo esc_html__( 'Text', 'text-domain' );
281
- ```
282
-
283
- ### Nonce Verification
284
-
285
- **Always Use Nonces for Forms**:
286
-
287
- ```php
288
- // Create nonce
289
- wp_nonce_field( 'action_name', 'nonce_name' );
290
-
291
- // Verify nonce
292
- if ( ! isset( $_POST['nonce_name'] ) || ! wp_verify_nonce( $_POST['nonce_name'], 'action_name' ) ) {
293
- wp_die( __( 'Security check failed', 'text-domain' ) );
294
- }
295
- ```
296
-
297
- **Nonces for AJAX**:
298
-
299
- ```php
300
- // Create nonce for AJAX
301
- wp_localize_script( 'script-handle', 'ajax_object', array(
302
- 'ajax_url' => admin_url( 'admin-ajax.php' ),
303
- 'nonce' => wp_create_nonce( 'ajax_nonce' ),
304
- ) );
305
-
306
- // Verify in AJAX handler
307
- check_ajax_referer( 'ajax_nonce', 'nonce' );
308
- ```
309
-
310
- ### Capability Checks
311
-
312
- **Always Check User Capabilities**:
313
-
314
- ```php
315
- // Admin actions
316
- if ( ! current_user_can( 'manage_options' ) ) {
317
- wp_die( __( 'Insufficient permissions', 'text-domain' ) );
318
- }
319
-
320
- // Post editing
321
- if ( ! current_user_can( 'edit_post', $post_id ) ) {
322
- return;
323
- }
324
-
325
- // Custom capability
326
- if ( ! current_user_can( 'plugin_name_custom_capability' ) ) {
327
- return;
328
- }
329
- ```
330
-
331
- ### Database Security
332
-
333
- **Use Prepared Statements**:
334
-
335
- ```php
336
- global $wpdb;
337
-
338
- // Prepared statement
339
- $results = $wpdb->get_results( $wpdb->prepare(
340
- "SELECT * FROM {$wpdb->prefix}table WHERE column = %s AND id = %d",
341
- $string_value,
342
- $int_value
343
- ) );
344
-
345
- // Never use direct queries
346
- // BAD: $wpdb->query( "SELECT * FROM table WHERE id = " . $_GET['id'] );
347
- ```
348
-
349
- ### File Security
350
-
351
- **Prevent Direct Access**:
352
-
353
- ```php
354
- // Add to all PHP files
355
- if ( ! defined( 'ABSPATH' ) ) {
356
- exit; // Exit if accessed directly
357
- }
358
- ```
359
-
360
- **Validate File Uploads**:
361
-
362
- ```php
363
- function plugin_name_validate_upload( $file ) {
364
- // Check file type
365
- $allowed_types = array( 'image/jpeg', 'image/png', 'image/gif' );
366
- if ( ! in_array( $file['type'], $allowed_types, true ) ) {
367
- return new WP_Error( 'invalid_type', __( 'Invalid file type', 'text-domain' ) );
368
- }
369
-
370
- // Check file size (5MB max)
371
- if ( $file['size'] > 5 * 1024 * 1024 ) {
372
- return new WP_Error( 'file_too_large', __( 'File too large', 'text-domain' ) );
373
- }
374
-
375
- return $file;
376
- }
377
- ```
378
-
379
- ### Security Checklist
380
-
381
- - [ ] All user input is sanitized
382
- - [ ] All output is escaped
383
- - [ ] Nonces are used for all forms
384
- - [ ] Capability checks are in place
385
- - [ ] Database queries use prepared statements
386
- - [ ] Direct file access is prevented
387
- - [ ] File uploads are validated
388
- - [ ] No eval() or exec() usage
389
- - [ ] No unserialize() on user input
390
- - [ ] No file_get_contents() on user input
391
- - [ ] HTTPS is used for external requests
392
- - [ ] API keys are stored securely (not in code)
393
-
394
- ## Performance Checklist
395
-
396
- ### Database Optimization
397
-
398
- **Optimize Queries**:
399
-
400
- ```php
401
- // Use WP_Query efficiently
402
- $args = array(
403
- 'post_type' => 'post',
404
- 'posts_per_page' => 10,
405
- 'no_found_rows' => true, // Skip pagination count
406
- 'update_post_meta_cache' => false, // Skip meta cache if not needed
407
- 'update_post_term_cache' => false, // Skip term cache if not needed
408
- );
409
- $query = new WP_Query( $args );
410
-
411
- // Avoid N+1 queries
412
- // BAD: Loop through posts and get meta for each
413
- // GOOD: Use update_post_meta_cache or get all meta at once
414
- ```
415
-
416
- **Use Transients for Caching**:
417
-
418
- ```php
419
- function plugin_name_get_expensive_data() {
420
- $cache_key = 'plugin_name_expensive_data';
421
- $data = get_transient( $cache_key );
422
-
423
- if ( false === $data ) {
424
- // Expensive operation
425
- $data = perform_expensive_operation();
426
-
427
- // Cache for 1 hour
428
- set_transient( $cache_key, $data, HOUR_IN_SECONDS );
429
- }
430
-
431
- return $data;
432
- }
433
- ```
434
-
435
- **Use Object Caching**:
436
-
437
- ```php
438
- function plugin_name_get_data( $id ) {
439
- $cache_key = 'plugin_name_data_' . $id;
440
- $data = wp_cache_get( $cache_key, 'plugin_name' );
441
-
442
- if ( false === $data ) {
443
- $data = get_data_from_database( $id );
444
- wp_cache_set( $cache_key, $data, 'plugin_name', 3600 );
445
- }
446
-
447
- return $data;
448
- }
449
- ```
450
-
451
- ### Asset Optimization
452
-
453
- **Conditional Loading**:
454
-
455
- ```php
456
- function plugin_name_enqueue_scripts() {
457
- // Only load on specific pages
458
- if ( is_singular( 'post' ) ) {
459
- wp_enqueue_script( 'plugin-name-script', plugins_url( 'js/script.js', __FILE__ ), array( 'jquery' ), '1.0.0', true );
460
- }
461
-
462
- // Only load in admin
463
- if ( is_admin() ) {
464
- wp_enqueue_style( 'plugin-name-admin', plugins_url( 'css/admin.css', __FILE__ ), array(), '1.0.0' );
465
- }
466
- }
467
- add_action( 'wp_enqueue_scripts', 'plugin_name_enqueue_scripts' );
468
- ```
469
-
470
- **Minify and Combine Assets**:
471
-
472
- ```php
473
- // Use .min versions in production
474
- $suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
475
- wp_enqueue_script( 'plugin-name-script', plugins_url( "js/script{$suffix}.js", __FILE__ ), array( 'jquery' ), '1.0.0', true );
476
- ```
477
-
478
- **Lazy Load Images**:
479
-
480
- ```php
481
- function plugin_name_add_lazy_loading( $content ) {
482
- if ( is_singular() ) {
483
- $content = str_replace( '<img ', '<img loading="lazy" ', $content );
484
- }
485
- return $content;
486
- }
487
- add_filter( 'the_content', 'plugin_name_add_lazy_loading' );
488
- ```
489
-
490
- ### Cron Job Optimization
491
-
492
- **Use WP-Cron Efficiently**:
493
-
494
- ```php
495
- // Schedule event
496
- if ( ! wp_next_scheduled( 'plugin_name_daily_task' ) ) {
497
- wp_schedule_event( time(), 'daily', 'plugin_name_daily_task' );
498
- }
499
-
500
- // Hook callback
501
- add_action( 'plugin_name_daily_task', 'plugin_name_do_daily_task' );
502
-
503
- function plugin_name_do_daily_task() {
504
- // Batch process large datasets
505
- $offset = get_option( 'plugin_name_batch_offset', 0 );
506
- $batch_size = 100;
507
-
508
- // Process batch
509
- $items = get_items( $offset, $batch_size );
510
- foreach ( $items as $item ) {
511
- process_item( $item );
512
- }
513
-
514
- // Update offset
515
- update_option( 'plugin_name_batch_offset', $offset + $batch_size );
516
- }
517
- ```
518
-
519
- ### Performance Checklist
520
-
521
- - [ ] Database queries are optimized
522
- - [ ] Transients are used for expensive operations
523
- - [ ] Object caching is implemented
524
- - [ ] Assets are loaded conditionally
525
- - [ ] Assets are minified
526
- - [ ] Images use lazy loading
527
- - [ ] Cron jobs are optimized
528
- - [ ] No queries in loops
529
- - [ ] Pagination is implemented for large datasets
530
- - [ ] External API calls are cached
531
-
532
- ## Accessibility Considerations
533
-
534
- ### Semantic HTML
535
-
536
- **Use Proper HTML Elements**:
537
-
538
- ```php
539
- // Good
540
- echo '<button type="button">' . esc_html__( 'Click Me', 'text-domain' ) . '</button>';
541
-
542
- // Bad
543
- echo '<div onclick="doSomething()">' . esc_html__( 'Click Me', 'text-domain' ) . '</div>';
544
- ```
545
-
546
- ### ARIA Labels
547
-
548
- **Add ARIA Labels for Screen Readers**:
549
-
550
- ```php
551
- echo '<button type="button" aria-label="' . esc_attr__( 'Close dialog', 'text-domain' ) . '">';
552
- echo '<span aria-hidden="true">&times;</span>';
553
- echo '</button>';
554
- ```
555
-
556
- ### Keyboard Navigation
557
-
558
- **Ensure Keyboard Accessibility**:
559
-
560
- ```php
561
- // Add tabindex for custom interactive elements
562
- echo '<div tabindex="0" role="button" onkeypress="handleKeyPress(event)">';
563
- echo esc_html__( 'Custom Button', 'text-domain' );
564
- echo '</div>';
565
- ```
566
-
567
- ### Form Labels
568
-
569
- **Always Label Form Fields**:
570
-
571
- ```php
572
- echo '<label for="plugin-name-field">' . esc_html__( 'Field Label', 'text-domain' ) . '</label>';
573
- echo '<input type="text" id="plugin-name-field" name="field_name" />';
574
- ```
575
-
576
- ### Color Contrast
577
-
578
- **Ensure Sufficient Color Contrast**:
579
-
580
- ```css
581
- /* WCAG AA requires 4.5:1 contrast ratio for normal text */
582
- .plugin-name-text {
583
- color: #333333; /* Dark gray on white background */
584
- background-color: #ffffff;
585
- }
586
-
587
- /* WCAG AAA requires 7:1 contrast ratio */
588
- .plugin-name-important {
589
- color: #000000; /* Black on white background */
590
- background-color: #ffffff;
591
- }
592
- ```
593
-
594
- ### Accessibility Checklist
595
-
596
- - [ ] Semantic HTML is used
597
- - [ ] ARIA labels are provided
598
- - [ ] Keyboard navigation works
599
- - [ ] Form fields have labels
600
- - [ ] Color contrast meets WCAG AA standards
601
- - [ ] Images have alt text
602
- - [ ] Focus indicators are visible
603
- - [ ] Skip links are provided
604
- - [ ] Headings are hierarchical
605
- - [ ] Error messages are descriptive
606
-
607
- ## Backward Compatibility
608
-
609
- ### WordPress Version Compatibility
610
-
611
- **Check WordPress Version**:
612
-
613
- ```php
614
- function plugin_name_check_version() {
615
- global $wp_version;
616
-
617
- if ( version_compare( $wp_version, '6.0', '<' ) ) {
618
- add_action( 'admin_notices', 'plugin_name_version_notice' );
619
- return false;
620
- }
621
-
622
- return true;
623
- }
624
-
625
- function plugin_name_version_notice() {
626
- echo '<div class="notice notice-error"><p>';
627
- echo esc_html__( 'Plugin Name requires WordPress 6.0 or higher.', 'text-domain' );
628
- echo '</p></div>';
629
- }
630
- ```
631
-
632
- ### PHP Version Compatibility
633
-
634
- **Check PHP Version**:
635
-
636
- ```php
637
- if ( version_compare( PHP_VERSION, '7.4', '<' ) ) {
638
- add_action( 'admin_notices', function() {
639
- echo '<div class="notice notice-error"><p>';
640
- echo esc_html__( 'Plugin Name requires PHP 7.4 or higher.', 'text-domain' );
641
- echo '</p></div>';
642
- } );
643
- return;
644
- }
645
- ```
646
-
647
- ### Deprecation Handling
648
-
649
- **Handle Deprecated Functions**:
650
-
651
- ```php
652
- function plugin_name_old_function() {
653
- _deprecated_function( __FUNCTION__, '2.0.0', 'plugin_name_new_function' );
654
- return plugin_name_new_function();
655
- }
656
-
657
- function plugin_name_new_function() {
658
- // New implementation
659
- }
660
- ```
661
-
662
- ### Database Schema Updates
663
-
664
- **Version Database Schema**:
665
-
666
- ```php
667
- function plugin_name_update_database() {
668
- $current_version = get_option( 'plugin_name_db_version', '1.0' );
669
-
670
- if ( version_compare( $current_version, '2.0', '<' ) ) {
671
- plugin_name_upgrade_to_2_0();
672
- update_option( 'plugin_name_db_version', '2.0' );
673
- }
674
- }
675
-
676
- function plugin_name_upgrade_to_2_0() {
677
- global $wpdb;
678
-
679
- // Add new column
680
- $wpdb->query( "ALTER TABLE {$wpdb->prefix}plugin_name_table ADD COLUMN new_column VARCHAR(255)" );
681
- }
682
- ```
683
-
684
- ### Backward Compatibility Checklist
685
-
686
- - [ ] Minimum WordPress version is specified
687
- - [ ] Minimum PHP version is specified
688
- - [ ] Version checks are in place
689
- - [ ] Deprecated functions use _deprecated_function()
690
- - [ ] Database schema updates are versioned
691
- - [ ] Settings migration is handled
692
- - [ ] Old hooks are maintained (with deprecation notices)
693
- - [ ] Breaking changes are documented
694
- - [ ] Upgrade path is tested
695
-
696
- ## Internationalization (i18n)
697
-
698
- ### Text Domain
699
-
700
- **Use Consistent Text Domain**:
701
-
702
- ```php
703
- // In plugin header
704
- /*
705
- * Text Domain: plugin-name
706
- * Domain Path: /languages
707
- */
708
-
709
- // In code
710
- __( 'Text', 'plugin-name' );
711
- _e( 'Text', 'plugin-name' );
712
- esc_html__( 'Text', 'plugin-name' );
713
- esc_html_e( 'Text', 'plugin-name' );
714
- ```
715
-
716
- ### Load Text Domain
717
-
718
- **Load Translations**:
719
-
720
- ```php
721
- function plugin_name_load_textdomain() {
722
- load_plugin_textdomain( 'plugin-name', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
723
- }
724
- add_action( 'plugins_loaded', 'plugin_name_load_textdomain' );
725
- ```
726
-
727
- ### Translatable Strings
728
-
729
- **Make All User-Facing Strings Translatable**:
730
-
731
- ```php
732
- // Simple string
733
- echo esc_html__( 'Hello World', 'plugin-name' );
734
-
735
- // String with context
736
- echo esc_html_x( 'Post', 'noun', 'plugin-name' );
737
-
738
- // Plural
739
- echo esc_html( sprintf(
740
- _n( '%d item', '%d items', $count, 'plugin-name' ),
741
- $count
742
- ) );
743
- ```
744
-
745
- ## Documentation Standards
746
-
747
- ### PHPDoc Comments
748
-
749
- **Document All Functions and Classes**:
750
-
751
- ```php
752
- /**
753
- * Process user data
754
- *
755
- * @since 1.0.0
756
- * @param array $data The user data to process.
757
- * @param bool $validate Whether to validate the data.
758
- * @return array|WP_Error Processed data or error.
759
- */
760
- function plugin_name_process_data( $data, $validate = true ) {
761
- // Implementation
762
- }
763
- ```
764
-
765
- ### Inline Comments
766
-
767
- **Add Explanatory Comments**:
768
-
769
- ```php
770
- // Check if user has permission
771
- if ( ! current_user_can( 'manage_options' ) ) {
772
- return;
773
- }
774
-
775
- // Process data in batches to avoid memory issues
776
- $batch_size = 100;
777
- for ( $i = 0; $i < count( $items ); $i += $batch_size ) {
778
- $batch = array_slice( $items, $i, $batch_size );
779
- process_batch( $batch );
780
- }
781
- ```
782
-
783
- ### README Documentation
784
-
785
- **Maintain Comprehensive README**:
786
-
787
- ```markdown
788
- # Plugin Name
789
-
790
- ## Description
791
- Brief description of what the plugin does.
792
-
793
- ## Installation
794
- 1. Upload plugin files
795
- 2. Activate plugin
796
- 3. Configure settings
797
-
798
- ## Usage
799
- How to use the plugin.
800
-
801
- ## Hooks
802
- List of available hooks and filters.
803
-
804
- ## Changelog
805
- Version history with changes.
806
- ```
807
-
808
- ## Testing Best Practices
809
-
810
- ### Write Tests First (TDD)
811
-
812
- ```php
813
- // Write test first
814
- public function test_sanitizes_email() {
815
- $input = 'test@EXAMPLE.com';
816
- $expected = 'test@example.com';
817
- $result = plugin_name_sanitize_email( $input );
818
- $this->assertEquals( $expected, $result );
819
- }
820
-
821
- // Then implement function
822
- function plugin_name_sanitize_email( $email ) {
823
- return sanitize_email( strtolower( $email ) );
824
- }
825
- ```
826
-
827
- ### Test Coverage
828
-
829
- **Aim for > 80% Code Coverage**:
830
-
831
- ```bash
832
- vendor/bin/phpunit --coverage-html coverage/
833
- ```
834
-
835
- ### Test Different Scenarios
836
-
837
- ```php
838
- public function test_handles_empty_input() {
839
- $result = plugin_name_process( '' );
840
- $this->assertWPError( $result );
841
- }
842
-
843
- public function test_handles_invalid_input() {
844
- $result = plugin_name_process( 'invalid' );
845
- $this->assertWPError( $result );
846
- }
847
-
848
- public function test_handles_valid_input() {
849
- $result = plugin_name_process( 'valid' );
850
- $this->assertNotWPError( $result );
851
- }
852
- ```
853
-
854
- ## Version Control Best Practices
855
-
856
- ### Git Workflow
857
-
858
- **Use Feature Branches**:
859
-
860
- ```bash
861
- git checkout -b feature/new-feature
862
- # Make changes
863
- git commit -m "feat: Add new feature"
864
- git push origin feature/new-feature
865
- ```
866
-
867
- ### Commit Messages
868
-
869
- **Use Conventional Commits**:
870
-
871
- ```
872
- feat: Add new feature
873
- fix: Fix bug in data processing
874
- docs: Update README
875
- style: Format code
876
- refactor: Refactor data processing
877
- test: Add tests for new feature
878
- chore: Update dependencies
879
- ```
880
-
881
- ### .gitignore
882
-
883
- **Ignore Unnecessary Files**:
884
-
885
- ```
886
- # .gitignore
887
- node_modules/
888
- vendor/
889
- .DS_Store
890
- *.log
891
- coverage/
892
- .phpunit.result.cache
893
- ```
894
-
895
- ## Release Checklist
896
-
897
- ### Pre-Release
898
-
899
- - [ ] All tests pass
900
- - [ ] Code coverage > 80%
901
- - [ ] Security audit complete
902
- - [ ] WPCS compliance verified
903
- - [ ] Documentation updated
904
- - [ ] Changelog updated
905
- - [ ] Version number updated
906
- - [ ] Translation files generated
907
-
908
- ### Release
909
-
910
- - [ ] Create git tag
911
- - [ ] Create release notes
912
- - [ ] Update WordPress.org SVN
913
- - [ ] Test in clean WordPress install
914
- - [ ] Monitor for issues
915
-
916
- ### Post-Release
917
-
918
- - [ ] Monitor support forums
919
- - [ ] Respond to user feedback
920
- - [ ] Track bug reports
921
- - [ ] Plan next release
922
-
923
- ## Resources
924
-
925
- - [WordPress Plugin Handbook](https://developer.wordpress.org/plugins/)
926
- - [WordPress Coding Standards](https://developer.wordpress.org/coding-standards/)
927
- - [WordPress Security Best Practices](https://developer.wordpress.org/plugins/security/)
928
- - [WCAG Guidelines](https://www.w3.org/WAI/WCAG21/quickref/)
929
- - [Semantic Versioning](https://semver.org/)
930
-
931
- ## Related Workflows
932
-
933
- - `development-workflow.md` - Feature development cycle
934
- - `testing-workflow.md` - Testing setup and execution
935
- - `submission-workflow.md` - WordPress.org submission
936
-
937
- ## Related Domain Rules
938
-
939
- - `domain-rules/wordpress-plugin/security-best-practices.md`
940
- - `domain-rules/wordpress-plugin/performance-optimization.md`
941
- - `domain-rules/wordpress-plugin/internationalization.md`
942
-
1
+ # WordPress Plugin Development Best Practices
2
+
3
+ ## Overview
4
+
5
+ This document provides comprehensive best practices for WordPress plugin development, covering code organization, naming conventions, security, performance, accessibility, and backward compatibility.
6
+
7
+ ## Code Organization
8
+
9
+ ### Directory Structure
10
+
11
+ **Standard Plugin Structure**:
12
+
13
+ ```
14
+ plugin-name/
15
+ ├── plugin-name.php # Main plugin file
16
+ ├── uninstall.php # Uninstall cleanup
17
+ ├── readme.txt # WordPress.org readme
18
+ ├── LICENSE # License file
19
+ ├── includes/ # Core plugin classes
20
+ │ ├── class-plugin-name.php
21
+ │ ├── class-activator.php
22
+ │ ├── class-deactivator.php
23
+ │ └── class-loader.php
24
+ ├── admin/ # Admin-specific functionality
25
+ │ ├── class-admin.php
26
+ │ ├── partials/ # Admin view templates
27
+ │ ├── css/
28
+ │ └── js/
29
+ ├── public/ # Public-facing functionality
30
+ │ ├── class-public.php
31
+ │ ├── partials/ # Public view templates
32
+ │ ├── css/
33
+ │ └── js/
34
+ ├── languages/ # Translation files
35
+ ├── assets/ # Plugin assets for WordPress.org
36
+ │ ├── banner-772x250.png
37
+ │ ├── banner-1544x500.png
38
+ │ ├── icon-128x128.png
39
+ │ └── icon-256x256.png
40
+ └── tests/ # PHPUnit tests
41
+ ├── bootstrap.php
42
+ ├── unit/
43
+ └── integration/
44
+ ```
45
+
46
+ ### File Organization Best Practices
47
+
48
+ **DO**:
49
+ - ✅ One class per file
50
+ - ✅ Group related functionality in subdirectories
51
+ - ✅ Separate admin and public functionality
52
+ - ✅ Keep templates in `partials/` directories
53
+ - ✅ Organize assets by type (css, js, images)
54
+
55
+ **DON'T**:
56
+ - ❌ Mix multiple classes in one file
57
+ - ❌ Put all code in main plugin file
58
+ - ❌ Mix admin and public code
59
+ - ❌ Hardcode HTML in PHP classes
60
+ - ❌ Put assets in root directory
61
+
62
+ ## Naming Conventions
63
+
64
+ ### File Naming
65
+
66
+ **PHP Files**:
67
+ ```
68
+ class-plugin-name.php # Class files (lowercase, hyphens)
69
+ class-admin.php
70
+ class-public.php
71
+ plugin-name-functions.php # Function files
72
+ ```
73
+
74
+ **Template Files**:
75
+ ```
76
+ admin-display.php # Admin templates
77
+ public-display.php # Public templates
78
+ settings-page.php
79
+ ```
80
+
81
+ **Asset Files**:
82
+ ```
83
+ plugin-name-admin.css # Prefixed with plugin name
84
+ plugin-name-public.js
85
+ plugin-name-icon.png
86
+ ```
87
+
88
+ ### Code Naming
89
+
90
+ **Classes**:
91
+ ```php
92
+ class Plugin_Name {} # Capitalized with underscores
93
+ class Plugin_Name_Admin {}
94
+ class Plugin_Name_Public {}
95
+ ```
96
+
97
+ **Functions**:
98
+ ```php
99
+ function plugin_name_activate() {} # Lowercase with underscores
100
+ function plugin_name_get_data() {}
101
+ function plugin_name_sanitize_input() {}
102
+ ```
103
+
104
+ **Variables**:
105
+ ```php
106
+ $plugin_name = 'value'; # Lowercase with underscores
107
+ $user_data = array();
108
+ $is_active = true;
109
+ ```
110
+
111
+ **Constants**:
112
+ ```php
113
+ define( 'PLUGIN_NAME_VERSION', '1.0.0' ); # Uppercase with underscores
114
+ define( 'PLUGIN_NAME_PATH', plugin_dir_path( __FILE__ ) );
115
+ ```
116
+
117
+ **Hooks**:
118
+ ```php
119
+ // Actions
120
+ do_action( 'plugin_name_before_save' );
121
+ do_action( 'plugin_name_after_save' );
122
+
123
+ // Filters
124
+ apply_filters( 'plugin_name_data', $data );
125
+ apply_filters( 'plugin_name_settings', $settings );
126
+ ```
127
+
128
+ ### Database Naming
129
+
130
+ **Tables**:
131
+ ```php
132
+ global $wpdb;
133
+ $table_name = $wpdb->prefix . 'plugin_name_items'; # Prefixed, lowercase, underscores
134
+ ```
135
+
136
+ **Options**:
137
+ ```php
138
+ get_option( 'plugin_name_settings' ); # Prefixed with plugin name
139
+ get_option( 'plugin_name_version' );
140
+ ```
141
+
142
+ **Post Meta**:
143
+ ```php
144
+ get_post_meta( $post_id, '_plugin_name_meta_key', true ); # Prefixed, leading underscore for hidden
145
+ ```
146
+
147
+ **User Meta**:
148
+ ```php
149
+ get_user_meta( $user_id, 'plugin_name_preference', true );
150
+ ```
151
+
152
+ **Transients**:
153
+ ```php
154
+ get_transient( 'plugin_name_cache_key' ); # Prefixed, max 172 characters
155
+ ```
156
+
157
+ ## WordPress Coding Standards
158
+
159
+ ### Indentation and Spacing
160
+
161
+ **Use Tabs for Indentation**:
162
+ ```php
163
+ function plugin_name_example() {
164
+ if ( $condition ) {
165
+ // Code here (indented with tab)
166
+ }
167
+ }
168
+ ```
169
+
170
+ **Space After Control Structures**:
171
+ ```php
172
+ if ( $condition ) { // Space after 'if', space inside parentheses
173
+ // Code
174
+ }
175
+
176
+ foreach ( $items as $item ) { // Space after 'foreach'
177
+ // Code
178
+ }
179
+ ```
180
+
181
+ **No Space Before Function Parentheses**:
182
+ ```php
183
+ function my_function( $param ) { // No space before (
184
+ // Code
185
+ }
186
+ ```
187
+
188
+ ### Braces and Brackets
189
+
190
+ **Opening Braces on Same Line**:
191
+ ```php
192
+ if ( $condition ) {
193
+ // Code
194
+ }
195
+
196
+ function my_function() {
197
+ // Code
198
+ }
199
+ ```
200
+
201
+ **Arrays**:
202
+ ```php
203
+ $array = array(
204
+ 'key1' => 'value1',
205
+ 'key2' => 'value2',
206
+ );
207
+ ```
208
+
209
+ ### Quotes
210
+
211
+ **Use Single Quotes for Strings**:
212
+ ```php
213
+ $string = 'Hello World';
214
+ $html = '<div class="wrapper">'; // Single quotes for HTML
215
+ ```
216
+
217
+ **Use Double Quotes for Interpolation**:
218
+ ```php
219
+ $name = 'John';
220
+ $greeting = "Hello, $name"; // Double quotes for variable interpolation
221
+ ```
222
+
223
+ ### Yoda Conditions
224
+
225
+ **Use Yoda Conditions for Comparisons**:
226
+ ```php
227
+ if ( 'value' === $variable ) { // Constant on left
228
+ // Code
229
+ }
230
+
231
+ if ( true === $is_active ) {
232
+ // Code
233
+ }
234
+ ```
235
+
236
+ ## Security Checklist
237
+
238
+ ### Input Validation and Sanitization
239
+
240
+ **Always Sanitize User Input**:
241
+
242
+ ```php
243
+ // Text fields
244
+ $text = sanitize_text_field( $_POST['text'] );
245
+
246
+ // Email
247
+ $email = sanitize_email( $_POST['email'] );
248
+
249
+ // URL
250
+ $url = esc_url_raw( $_POST['url'] );
251
+
252
+ // Integer
253
+ $number = absint( $_POST['number'] );
254
+
255
+ // Array
256
+ $array = array_map( 'sanitize_text_field', $_POST['array'] );
257
+
258
+ // HTML (allowed tags)
259
+ $html = wp_kses_post( $_POST['content'] );
260
+ ```
261
+
262
+ ### Output Escaping
263
+
264
+ **Always Escape Output**:
265
+
266
+ ```php
267
+ // HTML
268
+ echo esc_html( $text );
269
+
270
+ // Attributes
271
+ echo '<div class="' . esc_attr( $class ) . '">';
272
+
273
+ // URL
274
+ echo '<a href="' . esc_url( $url ) . '">';
275
+
276
+ // JavaScript
277
+ echo '<script>var data = ' . wp_json_encode( $data ) . ';</script>';
278
+
279
+ // Translation with escaping
280
+ echo esc_html__( 'Text', 'text-domain' );
281
+ ```
282
+
283
+ ### Nonce Verification
284
+
285
+ **Always Use Nonces for Forms**:
286
+
287
+ ```php
288
+ // Create nonce
289
+ wp_nonce_field( 'action_name', 'nonce_name' );
290
+
291
+ // Verify nonce
292
+ if ( ! isset( $_POST['nonce_name'] ) || ! wp_verify_nonce( $_POST['nonce_name'], 'action_name' ) ) {
293
+ wp_die( __( 'Security check failed', 'text-domain' ) );
294
+ }
295
+ ```
296
+
297
+ **Nonces for AJAX**:
298
+
299
+ ```php
300
+ // Create nonce for AJAX
301
+ wp_localize_script( 'script-handle', 'ajax_object', array(
302
+ 'ajax_url' => admin_url( 'admin-ajax.php' ),
303
+ 'nonce' => wp_create_nonce( 'ajax_nonce' ),
304
+ ) );
305
+
306
+ // Verify in AJAX handler
307
+ check_ajax_referer( 'ajax_nonce', 'nonce' );
308
+ ```
309
+
310
+ ### Capability Checks
311
+
312
+ **Always Check User Capabilities**:
313
+
314
+ ```php
315
+ // Admin actions
316
+ if ( ! current_user_can( 'manage_options' ) ) {
317
+ wp_die( __( 'Insufficient permissions', 'text-domain' ) );
318
+ }
319
+
320
+ // Post editing
321
+ if ( ! current_user_can( 'edit_post', $post_id ) ) {
322
+ return;
323
+ }
324
+
325
+ // Custom capability
326
+ if ( ! current_user_can( 'plugin_name_custom_capability' ) ) {
327
+ return;
328
+ }
329
+ ```
330
+
331
+ ### Database Security
332
+
333
+ **Use Prepared Statements**:
334
+
335
+ ```php
336
+ global $wpdb;
337
+
338
+ // Prepared statement
339
+ $results = $wpdb->get_results( $wpdb->prepare(
340
+ "SELECT * FROM {$wpdb->prefix}table WHERE column = %s AND id = %d",
341
+ $string_value,
342
+ $int_value
343
+ ) );
344
+
345
+ // Never use direct queries
346
+ // BAD: $wpdb->query( "SELECT * FROM table WHERE id = " . $_GET['id'] );
347
+ ```
348
+
349
+ ### File Security
350
+
351
+ **Prevent Direct Access**:
352
+
353
+ ```php
354
+ // Add to all PHP files
355
+ if ( ! defined( 'ABSPATH' ) ) {
356
+ exit; // Exit if accessed directly
357
+ }
358
+ ```
359
+
360
+ **Validate File Uploads**:
361
+
362
+ ```php
363
+ function plugin_name_validate_upload( $file ) {
364
+ // Check file type
365
+ $allowed_types = array( 'image/jpeg', 'image/png', 'image/gif' );
366
+ if ( ! in_array( $file['type'], $allowed_types, true ) ) {
367
+ return new WP_Error( 'invalid_type', __( 'Invalid file type', 'text-domain' ) );
368
+ }
369
+
370
+ // Check file size (5MB max)
371
+ if ( $file['size'] > 5 * 1024 * 1024 ) {
372
+ return new WP_Error( 'file_too_large', __( 'File too large', 'text-domain' ) );
373
+ }
374
+
375
+ return $file;
376
+ }
377
+ ```
378
+
379
+ ### Security Checklist
380
+
381
+ - [ ] All user input is sanitized
382
+ - [ ] All output is escaped
383
+ - [ ] Nonces are used for all forms
384
+ - [ ] Capability checks are in place
385
+ - [ ] Database queries use prepared statements
386
+ - [ ] Direct file access is prevented
387
+ - [ ] File uploads are validated
388
+ - [ ] No eval() or exec() usage
389
+ - [ ] No unserialize() on user input
390
+ - [ ] No file_get_contents() on user input
391
+ - [ ] HTTPS is used for external requests
392
+ - [ ] API keys are stored securely (not in code)
393
+
394
+ ## Performance Checklist
395
+
396
+ ### Database Optimization
397
+
398
+ **Optimize Queries**:
399
+
400
+ ```php
401
+ // Use WP_Query efficiently
402
+ $args = array(
403
+ 'post_type' => 'post',
404
+ 'posts_per_page' => 10,
405
+ 'no_found_rows' => true, // Skip pagination count
406
+ 'update_post_meta_cache' => false, // Skip meta cache if not needed
407
+ 'update_post_term_cache' => false, // Skip term cache if not needed
408
+ );
409
+ $query = new WP_Query( $args );
410
+
411
+ // Avoid N+1 queries
412
+ // BAD: Loop through posts and get meta for each
413
+ // GOOD: Use update_post_meta_cache or get all meta at once
414
+ ```
415
+
416
+ **Use Transients for Caching**:
417
+
418
+ ```php
419
+ function plugin_name_get_expensive_data() {
420
+ $cache_key = 'plugin_name_expensive_data';
421
+ $data = get_transient( $cache_key );
422
+
423
+ if ( false === $data ) {
424
+ // Expensive operation
425
+ $data = perform_expensive_operation();
426
+
427
+ // Cache for 1 hour
428
+ set_transient( $cache_key, $data, HOUR_IN_SECONDS );
429
+ }
430
+
431
+ return $data;
432
+ }
433
+ ```
434
+
435
+ **Use Object Caching**:
436
+
437
+ ```php
438
+ function plugin_name_get_data( $id ) {
439
+ $cache_key = 'plugin_name_data_' . $id;
440
+ $data = wp_cache_get( $cache_key, 'plugin_name' );
441
+
442
+ if ( false === $data ) {
443
+ $data = get_data_from_database( $id );
444
+ wp_cache_set( $cache_key, $data, 'plugin_name', 3600 );
445
+ }
446
+
447
+ return $data;
448
+ }
449
+ ```
450
+
451
+ ### Asset Optimization
452
+
453
+ **Conditional Loading**:
454
+
455
+ ```php
456
+ function plugin_name_enqueue_scripts() {
457
+ // Only load on specific pages
458
+ if ( is_singular( 'post' ) ) {
459
+ wp_enqueue_script( 'plugin-name-script', plugins_url( 'js/script.js', __FILE__ ), array( 'jquery' ), '1.0.0', true );
460
+ }
461
+
462
+ // Only load in admin
463
+ if ( is_admin() ) {
464
+ wp_enqueue_style( 'plugin-name-admin', plugins_url( 'css/admin.css', __FILE__ ), array(), '1.0.0' );
465
+ }
466
+ }
467
+ add_action( 'wp_enqueue_scripts', 'plugin_name_enqueue_scripts' );
468
+ ```
469
+
470
+ **Minify and Combine Assets**:
471
+
472
+ ```php
473
+ // Use .min versions in production
474
+ $suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
475
+ wp_enqueue_script( 'plugin-name-script', plugins_url( "js/script{$suffix}.js", __FILE__ ), array( 'jquery' ), '1.0.0', true );
476
+ ```
477
+
478
+ **Lazy Load Images**:
479
+
480
+ ```php
481
+ function plugin_name_add_lazy_loading( $content ) {
482
+ if ( is_singular() ) {
483
+ $content = str_replace( '<img ', '<img loading="lazy" ', $content );
484
+ }
485
+ return $content;
486
+ }
487
+ add_filter( 'the_content', 'plugin_name_add_lazy_loading' );
488
+ ```
489
+
490
+ ### Cron Job Optimization
491
+
492
+ **Use WP-Cron Efficiently**:
493
+
494
+ ```php
495
+ // Schedule event
496
+ if ( ! wp_next_scheduled( 'plugin_name_daily_task' ) ) {
497
+ wp_schedule_event( time(), 'daily', 'plugin_name_daily_task' );
498
+ }
499
+
500
+ // Hook callback
501
+ add_action( 'plugin_name_daily_task', 'plugin_name_do_daily_task' );
502
+
503
+ function plugin_name_do_daily_task() {
504
+ // Batch process large datasets
505
+ $offset = get_option( 'plugin_name_batch_offset', 0 );
506
+ $batch_size = 100;
507
+
508
+ // Process batch
509
+ $items = get_items( $offset, $batch_size );
510
+ foreach ( $items as $item ) {
511
+ process_item( $item );
512
+ }
513
+
514
+ // Update offset
515
+ update_option( 'plugin_name_batch_offset', $offset + $batch_size );
516
+ }
517
+ ```
518
+
519
+ ### Performance Checklist
520
+
521
+ - [ ] Database queries are optimized
522
+ - [ ] Transients are used for expensive operations
523
+ - [ ] Object caching is implemented
524
+ - [ ] Assets are loaded conditionally
525
+ - [ ] Assets are minified
526
+ - [ ] Images use lazy loading
527
+ - [ ] Cron jobs are optimized
528
+ - [ ] No queries in loops
529
+ - [ ] Pagination is implemented for large datasets
530
+ - [ ] External API calls are cached
531
+
532
+ ## Accessibility Considerations
533
+
534
+ ### Semantic HTML
535
+
536
+ **Use Proper HTML Elements**:
537
+
538
+ ```php
539
+ // Good
540
+ echo '<button type="button">' . esc_html__( 'Click Me', 'text-domain' ) . '</button>';
541
+
542
+ // Bad
543
+ echo '<div onclick="doSomething()">' . esc_html__( 'Click Me', 'text-domain' ) . '</div>';
544
+ ```
545
+
546
+ ### ARIA Labels
547
+
548
+ **Add ARIA Labels for Screen Readers**:
549
+
550
+ ```php
551
+ echo '<button type="button" aria-label="' . esc_attr__( 'Close dialog', 'text-domain' ) . '">';
552
+ echo '<span aria-hidden="true">&times;</span>';
553
+ echo '</button>';
554
+ ```
555
+
556
+ ### Keyboard Navigation
557
+
558
+ **Ensure Keyboard Accessibility**:
559
+
560
+ ```php
561
+ // Add tabindex for custom interactive elements
562
+ echo '<div tabindex="0" role="button" onkeypress="handleKeyPress(event)">';
563
+ echo esc_html__( 'Custom Button', 'text-domain' );
564
+ echo '</div>';
565
+ ```
566
+
567
+ ### Form Labels
568
+
569
+ **Always Label Form Fields**:
570
+
571
+ ```php
572
+ echo '<label for="plugin-name-field">' . esc_html__( 'Field Label', 'text-domain' ) . '</label>';
573
+ echo '<input type="text" id="plugin-name-field" name="field_name" />';
574
+ ```
575
+
576
+ ### Color Contrast
577
+
578
+ **Ensure Sufficient Color Contrast**:
579
+
580
+ ```css
581
+ /* WCAG AA requires 4.5:1 contrast ratio for normal text */
582
+ .plugin-name-text {
583
+ color: #333333; /* Dark gray on white background */
584
+ background-color: #ffffff;
585
+ }
586
+
587
+ /* WCAG AAA requires 7:1 contrast ratio */
588
+ .plugin-name-important {
589
+ color: #000000; /* Black on white background */
590
+ background-color: #ffffff;
591
+ }
592
+ ```
593
+
594
+ ### Accessibility Checklist
595
+
596
+ - [ ] Semantic HTML is used
597
+ - [ ] ARIA labels are provided
598
+ - [ ] Keyboard navigation works
599
+ - [ ] Form fields have labels
600
+ - [ ] Color contrast meets WCAG AA standards
601
+ - [ ] Images have alt text
602
+ - [ ] Focus indicators are visible
603
+ - [ ] Skip links are provided
604
+ - [ ] Headings are hierarchical
605
+ - [ ] Error messages are descriptive
606
+
607
+ ## Backward Compatibility
608
+
609
+ ### WordPress Version Compatibility
610
+
611
+ **Check WordPress Version**:
612
+
613
+ ```php
614
+ function plugin_name_check_version() {
615
+ global $wp_version;
616
+
617
+ if ( version_compare( $wp_version, '6.0', '<' ) ) {
618
+ add_action( 'admin_notices', 'plugin_name_version_notice' );
619
+ return false;
620
+ }
621
+
622
+ return true;
623
+ }
624
+
625
+ function plugin_name_version_notice() {
626
+ echo '<div class="notice notice-error"><p>';
627
+ echo esc_html__( 'Plugin Name requires WordPress 6.0 or higher.', 'text-domain' );
628
+ echo '</p></div>';
629
+ }
630
+ ```
631
+
632
+ ### PHP Version Compatibility
633
+
634
+ **Check PHP Version**:
635
+
636
+ ```php
637
+ if ( version_compare( PHP_VERSION, '7.4', '<' ) ) {
638
+ add_action( 'admin_notices', function() {
639
+ echo '<div class="notice notice-error"><p>';
640
+ echo esc_html__( 'Plugin Name requires PHP 7.4 or higher.', 'text-domain' );
641
+ echo '</p></div>';
642
+ } );
643
+ return;
644
+ }
645
+ ```
646
+
647
+ ### Deprecation Handling
648
+
649
+ **Handle Deprecated Functions**:
650
+
651
+ ```php
652
+ function plugin_name_old_function() {
653
+ _deprecated_function( __FUNCTION__, '2.0.0', 'plugin_name_new_function' );
654
+ return plugin_name_new_function();
655
+ }
656
+
657
+ function plugin_name_new_function() {
658
+ // New implementation
659
+ }
660
+ ```
661
+
662
+ ### Database Schema Updates
663
+
664
+ **Version Database Schema**:
665
+
666
+ ```php
667
+ function plugin_name_update_database() {
668
+ $current_version = get_option( 'plugin_name_db_version', '1.0' );
669
+
670
+ if ( version_compare( $current_version, '2.0', '<' ) ) {
671
+ plugin_name_upgrade_to_2_0();
672
+ update_option( 'plugin_name_db_version', '2.0' );
673
+ }
674
+ }
675
+
676
+ function plugin_name_upgrade_to_2_0() {
677
+ global $wpdb;
678
+
679
+ // Add new column
680
+ $wpdb->query( "ALTER TABLE {$wpdb->prefix}plugin_name_table ADD COLUMN new_column VARCHAR(255)" );
681
+ }
682
+ ```
683
+
684
+ ### Backward Compatibility Checklist
685
+
686
+ - [ ] Minimum WordPress version is specified
687
+ - [ ] Minimum PHP version is specified
688
+ - [ ] Version checks are in place
689
+ - [ ] Deprecated functions use _deprecated_function()
690
+ - [ ] Database schema updates are versioned
691
+ - [ ] Settings migration is handled
692
+ - [ ] Old hooks are maintained (with deprecation notices)
693
+ - [ ] Breaking changes are documented
694
+ - [ ] Upgrade path is tested
695
+
696
+ ## Internationalization (i18n)
697
+
698
+ ### Text Domain
699
+
700
+ **Use Consistent Text Domain**:
701
+
702
+ ```php
703
+ // In plugin header
704
+ /*
705
+ * Text Domain: plugin-name
706
+ * Domain Path: /languages
707
+ */
708
+
709
+ // In code
710
+ __( 'Text', 'plugin-name' );
711
+ _e( 'Text', 'plugin-name' );
712
+ esc_html__( 'Text', 'plugin-name' );
713
+ esc_html_e( 'Text', 'plugin-name' );
714
+ ```
715
+
716
+ ### Load Text Domain
717
+
718
+ **Load Translations**:
719
+
720
+ ```php
721
+ function plugin_name_load_textdomain() {
722
+ load_plugin_textdomain( 'plugin-name', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
723
+ }
724
+ add_action( 'plugins_loaded', 'plugin_name_load_textdomain' );
725
+ ```
726
+
727
+ ### Translatable Strings
728
+
729
+ **Make All User-Facing Strings Translatable**:
730
+
731
+ ```php
732
+ // Simple string
733
+ echo esc_html__( 'Hello World', 'plugin-name' );
734
+
735
+ // String with context
736
+ echo esc_html_x( 'Post', 'noun', 'plugin-name' );
737
+
738
+ // Plural
739
+ echo esc_html( sprintf(
740
+ _n( '%d item', '%d items', $count, 'plugin-name' ),
741
+ $count
742
+ ) );
743
+ ```
744
+
745
+ ## Documentation Standards
746
+
747
+ ### PHPDoc Comments
748
+
749
+ **Document All Functions and Classes**:
750
+
751
+ ```php
752
+ /**
753
+ * Process user data
754
+ *
755
+ * @since 1.0.0
756
+ * @param array $data The user data to process.
757
+ * @param bool $validate Whether to validate the data.
758
+ * @return array|WP_Error Processed data or error.
759
+ */
760
+ function plugin_name_process_data( $data, $validate = true ) {
761
+ // Implementation
762
+ }
763
+ ```
764
+
765
+ ### Inline Comments
766
+
767
+ **Add Explanatory Comments**:
768
+
769
+ ```php
770
+ // Check if user has permission
771
+ if ( ! current_user_can( 'manage_options' ) ) {
772
+ return;
773
+ }
774
+
775
+ // Process data in batches to avoid memory issues
776
+ $batch_size = 100;
777
+ for ( $i = 0; $i < count( $items ); $i += $batch_size ) {
778
+ $batch = array_slice( $items, $i, $batch_size );
779
+ process_batch( $batch );
780
+ }
781
+ ```
782
+
783
+ ### README Documentation
784
+
785
+ **Maintain Comprehensive README**:
786
+
787
+ ```markdown
788
+ # Plugin Name
789
+
790
+ ## Description
791
+ Brief description of what the plugin does.
792
+
793
+ ## Installation
794
+ 1. Upload plugin files
795
+ 2. Activate plugin
796
+ 3. Configure settings
797
+
798
+ ## Usage
799
+ How to use the plugin.
800
+
801
+ ## Hooks
802
+ List of available hooks and filters.
803
+
804
+ ## Changelog
805
+ Version history with changes.
806
+ ```
807
+
808
+ ## Testing Best Practices
809
+
810
+ ### Write Tests First (TDD)
811
+
812
+ ```php
813
+ // Write test first
814
+ public function test_sanitizes_email() {
815
+ $input = 'test@EXAMPLE.com';
816
+ $expected = 'test@example.com';
817
+ $result = plugin_name_sanitize_email( $input );
818
+ $this->assertEquals( $expected, $result );
819
+ }
820
+
821
+ // Then implement function
822
+ function plugin_name_sanitize_email( $email ) {
823
+ return sanitize_email( strtolower( $email ) );
824
+ }
825
+ ```
826
+
827
+ ### Test Coverage
828
+
829
+ **Aim for > 80% Code Coverage**:
830
+
831
+ ```bash
832
+ vendor/bin/phpunit --coverage-html coverage/
833
+ ```
834
+
835
+ ### Test Different Scenarios
836
+
837
+ ```php
838
+ public function test_handles_empty_input() {
839
+ $result = plugin_name_process( '' );
840
+ $this->assertWPError( $result );
841
+ }
842
+
843
+ public function test_handles_invalid_input() {
844
+ $result = plugin_name_process( 'invalid' );
845
+ $this->assertWPError( $result );
846
+ }
847
+
848
+ public function test_handles_valid_input() {
849
+ $result = plugin_name_process( 'valid' );
850
+ $this->assertNotWPError( $result );
851
+ }
852
+ ```
853
+
854
+ ## Version Control Best Practices
855
+
856
+ ### Git Workflow
857
+
858
+ **Use Feature Branches**:
859
+
860
+ ```bash
861
+ git checkout -b feature/new-feature
862
+ # Make changes
863
+ git commit -m "feat: Add new feature"
864
+ git push origin feature/new-feature
865
+ ```
866
+
867
+ ### Commit Messages
868
+
869
+ **Use Conventional Commits**:
870
+
871
+ ```
872
+ feat: Add new feature
873
+ fix: Fix bug in data processing
874
+ docs: Update README
875
+ style: Format code
876
+ refactor: Refactor data processing
877
+ test: Add tests for new feature
878
+ chore: Update dependencies
879
+ ```
880
+
881
+ ### .gitignore
882
+
883
+ **Ignore Unnecessary Files**:
884
+
885
+ ```
886
+ # .gitignore
887
+ node_modules/
888
+ vendor/
889
+ .DS_Store
890
+ *.log
891
+ coverage/
892
+ .phpunit.result.cache
893
+ ```
894
+
895
+ ## Release Checklist
896
+
897
+ ### Pre-Release
898
+
899
+ - [ ] All tests pass
900
+ - [ ] Code coverage > 80%
901
+ - [ ] Security audit complete
902
+ - [ ] WPCS compliance verified
903
+ - [ ] Documentation updated
904
+ - [ ] Changelog updated
905
+ - [ ] Version number updated
906
+ - [ ] Translation files generated
907
+
908
+ ### Release
909
+
910
+ - [ ] Create git tag
911
+ - [ ] Create release notes
912
+ - [ ] Update WordPress.org SVN
913
+ - [ ] Test in clean WordPress install
914
+ - [ ] Monitor for issues
915
+
916
+ ### Post-Release
917
+
918
+ - [ ] Monitor support forums
919
+ - [ ] Respond to user feedback
920
+ - [ ] Track bug reports
921
+ - [ ] Plan next release
922
+
923
+ ## Resources
924
+
925
+ - [WordPress Plugin Handbook](https://developer.wordpress.org/plugins/)
926
+ - [WordPress Coding Standards](https://developer.wordpress.org/coding-standards/)
927
+ - [WordPress Security Best Practices](https://developer.wordpress.org/plugins/security/)
928
+ - [WCAG Guidelines](https://www.w3.org/WAI/WCAG21/quickref/)
929
+ - [Semantic Versioning](https://semver.org/)
930
+
931
+ ## Related Workflows
932
+
933
+ - `development-workflow.md` - Feature development cycle
934
+ - `testing-workflow.md` - Testing setup and execution
935
+ - `submission-workflow.md` - WordPress.org submission
936
+
937
+ ## Related Domain Rules
938
+
939
+ - `domain-rules/wordpress-plugin/security-best-practices.md`
940
+ - `domain-rules/wordpress-plugin/performance-optimization.md`
941
+ - `domain-rules/wordpress-plugin/internationalization.md`
942
+