@mytechtoday/augment-extensions 0.7.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,874 +1,874 @@
1
- # WordPress Plugin Admin Interface
2
-
3
- ## Overview
4
-
5
- This document covers creating admin interfaces for WordPress plugins, including settings pages, meta boxes, admin notices, list tables, and dashboard widgets.
6
-
7
- ---
8
-
9
- ## Settings Pages
10
-
11
- ### Adding a Top-Level Menu
12
-
13
- ```php
14
- <?php
15
- add_action('admin_menu', 'my_plugin_add_admin_menu');
16
-
17
- function my_plugin_add_admin_menu() {
18
- add_menu_page(
19
- 'My Plugin Settings', // Page title
20
- 'My Plugin', // Menu title
21
- 'manage_options', // Capability
22
- 'my-plugin', // Menu slug
23
- 'my_plugin_settings_page', // Callback function
24
- 'dashicons-admin-generic', // Icon
25
- 20 // Position
26
- );
27
- }
28
-
29
- function my_plugin_settings_page() {
30
- // Check user capabilities
31
- if (!current_user_can('manage_options')) {
32
- return;
33
- }
34
-
35
- ?>
36
- <div class="wrap">
37
- <h1><?php echo esc_html(get_admin_page_title()); ?></h1>
38
- <form action="options.php" method="post">
39
- <?php
40
- settings_fields('my_plugin_options');
41
- do_settings_sections('my-plugin');
42
- submit_button('Save Settings');
43
- ?>
44
- </form>
45
- </div>
46
- <?php
47
- }
48
- ```
49
-
50
- ### Adding a Submenu Page
51
-
52
- ```php
53
- <?php
54
- add_action('admin_menu', 'my_plugin_add_submenu');
55
-
56
- function my_plugin_add_submenu() {
57
- // Add to Settings menu
58
- add_options_page(
59
- 'My Plugin Settings', // Page title
60
- 'My Plugin', // Menu title
61
- 'manage_options', // Capability
62
- 'my-plugin', // Menu slug
63
- 'my_plugin_settings_page' // Callback
64
- );
65
-
66
- // Or add to Tools menu
67
- add_management_page(
68
- 'My Plugin Tools',
69
- 'My Plugin',
70
- 'manage_options',
71
- 'my-plugin-tools',
72
- 'my_plugin_tools_page'
73
- );
74
- }
75
- ```
76
-
77
- ### Settings API Implementation
78
-
79
- ```php
80
- <?php
81
- add_action('admin_init', 'my_plugin_settings_init');
82
-
83
- function my_plugin_settings_init() {
84
- // Register setting
85
- register_setting(
86
- 'my_plugin_options', // Option group
87
- 'my_plugin_settings', // Option name
88
- 'my_plugin_sanitize_settings' // Sanitize callback
89
- );
90
-
91
- // Add settings section
92
- add_settings_section(
93
- 'my_plugin_section_general', // Section ID
94
- 'General Settings', // Title
95
- 'my_plugin_section_callback', // Callback
96
- 'my-plugin' // Page slug
97
- );
98
-
99
- // Add settings fields
100
- add_settings_field(
101
- 'my_plugin_field_api_key', // Field ID
102
- 'API Key', // Title
103
- 'my_plugin_field_api_key_cb', // Callback
104
- 'my-plugin', // Page slug
105
- 'my_plugin_section_general', // Section ID
106
- array(
107
- 'label_for' => 'api_key',
108
- 'class' => 'my_plugin_row'
109
- )
110
- );
111
-
112
- add_settings_field(
113
- 'my_plugin_field_enabled',
114
- 'Enable Feature',
115
- 'my_plugin_field_enabled_cb',
116
- 'my-plugin',
117
- 'my_plugin_section_general',
118
- array('label_for' => 'enabled')
119
- );
120
- }
121
-
122
- function my_plugin_section_callback($args) {
123
- ?>
124
- <p>Configure your plugin settings below.</p>
125
- <?php
126
- }
127
-
128
- function my_plugin_field_api_key_cb($args) {
129
- $options = get_option('my_plugin_settings');
130
- $value = isset($options['api_key']) ? $options['api_key'] : '';
131
- ?>
132
- <input
133
- type="text"
134
- id="<?php echo esc_attr($args['label_for']); ?>"
135
- name="my_plugin_settings[<?php echo esc_attr($args['label_for']); ?>]"
136
- value="<?php echo esc_attr($value); ?>"
137
- class="regular-text"
138
- />
139
- <p class="description">Enter your API key from the provider.</p>
140
- <?php
141
- }
142
-
143
- function my_plugin_field_enabled_cb($args) {
144
- $options = get_option('my_plugin_settings');
145
- $checked = isset($options['enabled']) ? $options['enabled'] : false;
146
- ?>
147
- <input
148
- type="checkbox"
149
- id="<?php echo esc_attr($args['label_for']); ?>"
150
- name="my_plugin_settings[<?php echo esc_attr($args['label_for']); ?>]"
151
- value="1"
152
- <?php checked($checked, 1); ?>
153
- />
154
- <label for="<?php echo esc_attr($args['label_for']); ?>">
155
- Enable this feature
156
- </label>
157
- <?php
158
- }
159
-
160
- function my_plugin_sanitize_settings($input) {
161
- $sanitized = array();
162
-
163
- // Sanitize API key
164
- if (isset($input['api_key'])) {
165
- $sanitized['api_key'] = sanitize_text_field($input['api_key']);
166
- }
167
-
168
- // Sanitize checkbox
169
- $sanitized['enabled'] = isset($input['enabled']) ? 1 : 0;
170
-
171
- return $sanitized;
172
- }
173
- ```
174
-
175
- ### Object-Oriented Settings Page
176
-
177
- ```php
178
- <?php
179
- class My_Plugin_Admin {
180
- private $plugin_name;
181
- private $version;
182
-
183
- public function __construct($plugin_name, $version) {
184
- $this->plugin_name = $plugin_name;
185
- $this->version = $version;
186
- }
187
-
188
- public function add_admin_menu() {
189
- add_menu_page(
190
- 'My Plugin',
191
- 'My Plugin',
192
- 'manage_options',
193
- $this->plugin_name,
194
- array($this, 'display_settings_page'),
195
- 'dashicons-admin-generic'
196
- );
197
- }
198
-
199
- public function register_settings() {
200
- register_setting(
201
- $this->plugin_name . '_options',
202
- $this->plugin_name . '_settings',
203
- array($this, 'sanitize_settings')
204
- );
205
-
206
- add_settings_section(
207
- $this->plugin_name . '_section',
208
- 'General Settings',
209
- array($this, 'section_callback'),
210
- $this->plugin_name
211
- );
212
-
213
- add_settings_field(
214
- 'api_key',
215
- 'API Key',
216
- array($this, 'api_key_field'),
217
- $this->plugin_name,
218
- $this->plugin_name . '_section'
219
- );
220
- }
221
-
222
- public function display_settings_page() {
223
- if (!current_user_can('manage_options')) {
224
- return;
225
- }
226
-
227
- include_once plugin_dir_path(__FILE__) . 'partials/admin-display.php';
228
- }
229
-
230
- public function section_callback() {
231
- echo '<p>Configure your plugin settings.</p>';
232
- }
233
-
234
- public function api_key_field() {
235
- $options = get_option($this->plugin_name . '_settings');
236
- $value = isset($options['api_key']) ? $options['api_key'] : '';
237
-
238
- printf(
239
- '<input type="text" name="%s[api_key]" value="%s" class="regular-text" />',
240
- esc_attr($this->plugin_name . '_settings'),
241
- esc_attr($value)
242
- );
243
- }
244
-
245
- public function sanitize_settings($input) {
246
- $sanitized = array();
247
-
248
- if (isset($input['api_key'])) {
249
- $sanitized['api_key'] = sanitize_text_field($input['api_key']);
250
- }
251
-
252
- return $sanitized;
253
- }
254
- }
255
-
256
- // Hook it up
257
- $admin = new My_Plugin_Admin('my-plugin', '1.0.0');
258
- add_action('admin_menu', array($admin, 'add_admin_menu'));
259
- add_action('admin_init', array($admin, 'register_settings'));
260
- ```
261
-
262
- ---
263
-
264
- ## Meta Boxes
265
-
266
- ### Adding a Meta Box
267
-
268
- ```php
269
- <?php
270
- add_action('add_meta_boxes', 'my_plugin_add_meta_box');
271
-
272
- function my_plugin_add_meta_box() {
273
- add_meta_box(
274
- 'my_plugin_meta_box', // Meta box ID
275
- 'My Plugin Settings', // Title
276
- 'my_plugin_meta_box_callback', // Callback
277
- 'post', // Post type (or array of post types)
278
- 'side', // Context (normal, side, advanced)
279
- 'default' // Priority (high, default, low)
280
- );
281
- }
282
-
283
- function my_plugin_meta_box_callback($post) {
284
- // Add nonce for security
285
- wp_nonce_field('my_plugin_save_meta_box', 'my_plugin_meta_box_nonce');
286
-
287
- // Get current value
288
- $value = get_post_meta($post->ID, '_my_plugin_field', true);
289
-
290
- ?>
291
- <label for="my_plugin_field">Custom Field:</label>
292
- <input
293
- type="text"
294
- id="my_plugin_field"
295
- name="my_plugin_field"
296
- value="<?php echo esc_attr($value); ?>"
297
- class="widefat"
298
- />
299
- <?php
300
- }
301
-
302
- // Save meta box data
303
- add_action('save_post', 'my_plugin_save_meta_box');
304
-
305
- function my_plugin_save_meta_box($post_id) {
306
- // Check nonce
307
- if (!isset($_POST['my_plugin_meta_box_nonce'])) {
308
- return;
309
- }
310
-
311
- if (!wp_verify_nonce($_POST['my_plugin_meta_box_nonce'], 'my_plugin_save_meta_box')) {
312
- return;
313
- }
314
-
315
- // Check autosave
316
- if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
317
- return;
318
- }
319
-
320
- // Check permissions
321
- if (!current_user_can('edit_post', $post_id)) {
322
- return;
323
- }
324
-
325
- // Sanitize and save
326
- if (isset($_POST['my_plugin_field'])) {
327
- $value = sanitize_text_field($_POST['my_plugin_field']);
328
- update_post_meta($post_id, '_my_plugin_field', $value);
329
- }
330
- }
331
- ```
332
-
333
- ### Object-Oriented Meta Box
334
-
335
- ```php
336
- <?php
337
- class My_Plugin_Meta_Box {
338
- public function __construct() {
339
- add_action('add_meta_boxes', array($this, 'add_meta_box'));
340
- add_action('save_post', array($this, 'save_meta_box'));
341
- }
342
-
343
- public function add_meta_box() {
344
- $post_types = array('post', 'page', 'custom_post_type');
345
-
346
- foreach ($post_types as $post_type) {
347
- add_meta_box(
348
- 'my_plugin_meta_box',
349
- 'My Plugin Settings',
350
- array($this, 'render_meta_box'),
351
- $post_type,
352
- 'normal',
353
- 'high'
354
- );
355
- }
356
- }
357
-
358
- public function render_meta_box($post) {
359
- wp_nonce_field('my_plugin_meta_box', 'my_plugin_meta_box_nonce');
360
-
361
- $project_url = get_post_meta($post->ID, '_project_url', true);
362
- $project_date = get_post_meta($post->ID, '_project_date', true);
363
-
364
- ?>
365
- <table class="form-table">
366
- <tr>
367
- <th><label for="project_url">Project URL</label></th>
368
- <td>
369
- <input
370
- type="url"
371
- id="project_url"
372
- name="project_url"
373
- value="<?php echo esc_url($project_url); ?>"
374
- class="regular-text"
375
- />
376
- </td>
377
- </tr>
378
- <tr>
379
- <th><label for="project_date">Project Date</label></th>
380
- <td>
381
- <input
382
- type="date"
383
- id="project_date"
384
- name="project_date"
385
- value="<?php echo esc_attr($project_date); ?>"
386
- />
387
- </td>
388
- </tr>
389
- </table>
390
- <?php
391
- }
392
-
393
- public function save_meta_box($post_id) {
394
- // Verify nonce
395
- if (!isset($_POST['my_plugin_meta_box_nonce'])) {
396
- return;
397
- }
398
-
399
- if (!wp_verify_nonce($_POST['my_plugin_meta_box_nonce'], 'my_plugin_meta_box')) {
400
- return;
401
- }
402
-
403
- // Check autosave
404
- if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
405
- return;
406
- }
407
-
408
- // Check permissions
409
- if (!current_user_can('edit_post', $post_id)) {
410
- return;
411
- }
412
-
413
- // Save project URL
414
- if (isset($_POST['project_url'])) {
415
- update_post_meta(
416
- $post_id,
417
- '_project_url',
418
- esc_url_raw($_POST['project_url'])
419
- );
420
- }
421
-
422
- // Save project date
423
- if (isset($_POST['project_date'])) {
424
- update_post_meta(
425
- $post_id,
426
- '_project_date',
427
- sanitize_text_field($_POST['project_date'])
428
- );
429
- }
430
- }
431
- }
432
-
433
- new My_Plugin_Meta_Box();
434
- ```
435
-
436
- ---
437
-
438
- ## Admin Notices
439
-
440
- ### Basic Admin Notice
441
-
442
- ```php
443
- <?php
444
- add_action('admin_notices', 'my_plugin_admin_notice');
445
-
446
- function my_plugin_admin_notice() {
447
- ?>
448
- <div class="notice notice-success is-dismissible">
449
- <p>Settings saved successfully!</p>
450
- </div>
451
- <?php
452
- }
453
- ```
454
-
455
- ### Notice Types
456
-
457
- ```php
458
- <?php
459
- function my_plugin_show_notices() {
460
- // Success notice
461
- ?>
462
- <div class="notice notice-success is-dismissible">
463
- <p>Success message</p>
464
- </div>
465
-
466
- <!-- Error notice -->
467
- <div class="notice notice-error">
468
- <p>Error message</p>
469
- </div>
470
-
471
- <!-- Warning notice -->
472
- <div class="notice notice-warning">
473
- <p>Warning message</p>
474
- </div>
475
-
476
- <!-- Info notice -->
477
- <div class="notice notice-info">
478
- <p>Info message</p>
479
- </div>
480
- <?php
481
- }
482
- ```
483
-
484
- ### Conditional Admin Notices
485
-
486
- ```php
487
- <?php
488
- add_action('admin_notices', 'my_plugin_conditional_notice');
489
-
490
- function my_plugin_conditional_notice() {
491
- // Only show on plugin settings page
492
- $screen = get_current_screen();
493
- if ($screen->id !== 'toplevel_page_my-plugin') {
494
- return;
495
- }
496
-
497
- // Check if settings are configured
498
- $settings = get_option('my_plugin_settings');
499
- if (empty($settings['api_key'])) {
500
- ?>
501
- <div class="notice notice-warning">
502
- <p>
503
- <strong>My Plugin:</strong>
504
- Please configure your API key in
505
- <a href="<?php echo admin_url('admin.php?page=my-plugin'); ?>">settings</a>.
506
- </p>
507
- </div>
508
- <?php
509
- }
510
- }
511
- ```
512
-
513
- ### Dismissible Notices with Transients
514
-
515
- ```php
516
- <?php
517
- add_action('admin_notices', 'my_plugin_dismissible_notice');
518
-
519
- function my_plugin_dismissible_notice() {
520
- // Check if notice was dismissed
521
- if (get_transient('my_plugin_notice_dismissed')) {
522
- return;
523
- }
524
-
525
- ?>
526
- <div class="notice notice-info is-dismissible" data-notice="my-plugin-welcome">
527
- <p>Welcome to My Plugin! <a href="#">Get started</a></p>
528
- </div>
529
-
530
- <script>
531
- jQuery(document).ready(function($) {
532
- $(document).on('click', '.notice[data-notice="my-plugin-welcome"] .notice-dismiss', function() {
533
- $.post(ajaxurl, {
534
- action: 'my_plugin_dismiss_notice',
535
- nonce: '<?php echo wp_create_nonce('my_plugin_dismiss_notice'); ?>'
536
- });
537
- });
538
- });
539
- </script>
540
- <?php
541
- }
542
-
543
- // Handle AJAX dismiss
544
- add_action('wp_ajax_my_plugin_dismiss_notice', 'my_plugin_handle_dismiss_notice');
545
-
546
- function my_plugin_handle_dismiss_notice() {
547
- check_ajax_referer('my_plugin_dismiss_notice', 'nonce');
548
-
549
- set_transient('my_plugin_notice_dismissed', true, WEEK_IN_SECONDS);
550
-
551
- wp_send_json_success();
552
- }
553
- ```
554
-
555
- ---
556
-
557
- ## List Tables
558
-
559
- ### Custom List Table
560
-
561
- ```php
562
- <?php
563
- if (!class_exists('WP_List_Table')) {
564
- require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
565
- }
566
-
567
- class My_Plugin_List_Table extends WP_List_Table {
568
- public function __construct() {
569
- parent::__construct(array(
570
- 'singular' => 'item',
571
- 'plural' => 'items',
572
- 'ajax' => false
573
- ));
574
- }
575
-
576
- public function get_columns() {
577
- return array(
578
- 'cb' => '<input type="checkbox" />',
579
- 'title' => 'Title',
580
- 'author' => 'Author',
581
- 'date' => 'Date',
582
- 'status' => 'Status'
583
- );
584
- }
585
-
586
- public function get_sortable_columns() {
587
- return array(
588
- 'title' => array('title', false),
589
- 'date' => array('date', true)
590
- );
591
- }
592
-
593
- public function column_default($item, $column_name) {
594
- switch ($column_name) {
595
- case 'title':
596
- case 'author':
597
- case 'date':
598
- case 'status':
599
- return $item[$column_name];
600
- default:
601
- return print_r($item, true);
602
- }
603
- }
604
-
605
- public function column_cb($item) {
606
- return sprintf(
607
- '<input type="checkbox" name="items[]" value="%s" />',
608
- $item['id']
609
- );
610
- }
611
-
612
- public function column_title($item) {
613
- $actions = array(
614
- 'edit' => sprintf(
615
- '<a href="?page=%s&action=edit&item=%s">Edit</a>',
616
- $_REQUEST['page'],
617
- $item['id']
618
- ),
619
- 'delete' => sprintf(
620
- '<a href="?page=%s&action=delete&item=%s">Delete</a>',
621
- $_REQUEST['page'],
622
- $item['id']
623
- )
624
- );
625
-
626
- return sprintf(
627
- '%1$s %2$s',
628
- $item['title'],
629
- $this->row_actions($actions)
630
- );
631
- }
632
-
633
- public function get_bulk_actions() {
634
- return array(
635
- 'delete' => 'Delete',
636
- 'export' => 'Export'
637
- );
638
- }
639
-
640
- public function prepare_items() {
641
- $columns = $this->get_columns();
642
- $hidden = array();
643
- $sortable = $this->get_sortable_columns();
644
-
645
- $this->_column_headers = array($columns, $hidden, $sortable);
646
-
647
- // Get data
648
- $data = $this->get_data();
649
-
650
- // Pagination
651
- $per_page = 20;
652
- $current_page = $this->get_pagenum();
653
- $total_items = count($data);
654
-
655
- $this->set_pagination_args(array(
656
- 'total_items' => $total_items,
657
- 'per_page' => $per_page,
658
- 'total_pages' => ceil($total_items / $per_page)
659
- ));
660
-
661
- $this->items = array_slice($data, (($current_page - 1) * $per_page), $per_page);
662
- }
663
-
664
- private function get_data() {
665
- // Get data from database
666
- global $wpdb;
667
- $table_name = $wpdb->prefix . 'my_plugin_data';
668
-
669
- return $wpdb->get_results(
670
- "SELECT * FROM $table_name ORDER BY date DESC",
671
- ARRAY_A
672
- );
673
- }
674
- }
675
-
676
- // Display list table
677
- function my_plugin_list_page() {
678
- $list_table = new My_Plugin_List_Table();
679
- $list_table->prepare_items();
680
-
681
- ?>
682
- <div class="wrap">
683
- <h1>My Plugin Items</h1>
684
- <form method="post">
685
- <?php $list_table->display(); ?>
686
- </form>
687
- </div>
688
- <?php
689
- }
690
- ```
691
-
692
- ---
693
-
694
- ## Dashboard Widgets
695
-
696
- ### Adding a Dashboard Widget
697
-
698
- ```php
699
- <?php
700
- add_action('wp_dashboard_setup', 'my_plugin_add_dashboard_widget');
701
-
702
- function my_plugin_add_dashboard_widget() {
703
- wp_add_dashboard_widget(
704
- 'my_plugin_dashboard_widget', // Widget ID
705
- 'My Plugin Stats', // Title
706
- 'my_plugin_dashboard_widget_render' // Callback
707
- );
708
- }
709
-
710
- function my_plugin_dashboard_widget_render() {
711
- // Get stats
712
- $total_items = wp_count_posts('my_custom_post_type')->publish;
713
- $recent_items = get_posts(array(
714
- 'post_type' => 'my_custom_post_type',
715
- 'posts_per_page' => 5
716
- ));
717
-
718
- ?>
719
- <div class="my-plugin-dashboard-widget">
720
- <p><strong>Total Items:</strong> <?php echo esc_html($total_items); ?></p>
721
-
722
- <h4>Recent Items</h4>
723
- <ul>
724
- <?php foreach ($recent_items as $item) : ?>
725
- <li>
726
- <a href="<?php echo get_edit_post_link($item->ID); ?>">
727
- <?php echo esc_html($item->post_title); ?>
728
- </a>
729
- </li>
730
- <?php endforeach; ?>
731
- </ul>
732
- </div>
733
- <?php
734
- }
735
- ```
736
-
737
- ---
738
-
739
- ## Admin Columns
740
-
741
- ### Adding Custom Columns to Post List
742
-
743
- ```php
744
- <?php
745
- // Add column
746
- add_filter('manage_post_posts_columns', 'my_plugin_add_custom_column');
747
-
748
- function my_plugin_add_custom_column($columns) {
749
- $columns['my_custom_field'] = 'Custom Field';
750
- return $columns;
751
- }
752
-
753
- // Populate column
754
- add_action('manage_post_posts_custom_column', 'my_plugin_populate_custom_column', 10, 2);
755
-
756
- function my_plugin_populate_custom_column($column, $post_id) {
757
- if ($column === 'my_custom_field') {
758
- $value = get_post_meta($post_id, '_my_custom_field', true);
759
- echo esc_html($value);
760
- }
761
- }
762
-
763
- // Make column sortable
764
- add_filter('manage_edit-post_sortable_columns', 'my_plugin_sortable_column');
765
-
766
- function my_plugin_sortable_column($columns) {
767
- $columns['my_custom_field'] = 'my_custom_field';
768
- return $columns;
769
- }
770
- ```
771
-
772
- ---
773
-
774
- ## Best Practices
775
-
776
- ### Settings Pages
777
-
778
- ✅ Check user capabilities (`current_user_can()`)
779
- ✅ Use Settings API for options
780
- ✅ Sanitize all input
781
- ✅ Use nonces for form submissions
782
- ✅ Provide helpful descriptions
783
- ✅ Group related settings
784
- ✅ Use appropriate input types
785
-
786
- ### Meta Boxes
787
-
788
- ✅ Always use nonces
789
- ✅ Check autosave
790
- ✅ Verify user permissions
791
- ✅ Sanitize input based on type
792
- ✅ Use `update_post_meta()` not direct DB queries
793
- ✅ Prefix meta keys with underscore for private fields
794
-
795
- ### Admin Notices
796
-
797
- ✅ Use appropriate notice types
798
- ✅ Make notices dismissible when appropriate
799
- ✅ Show notices only on relevant pages
800
- ✅ Provide actionable information
801
- ✅ Don't overwhelm users with notices
802
-
803
- ### Security
804
-
805
- ✅ Always check capabilities
806
- ✅ Use nonces for all forms
807
- ✅ Sanitize input, escape output
808
- ✅ Use `wp_verify_nonce()` before processing
809
- ✅ Check `DOING_AUTOSAVE` in save hooks
810
- ✅ Validate data types
811
-
812
- ---
813
-
814
- ## Common Patterns
815
-
816
- ### Tabbed Settings Page
817
-
818
- ```php
819
- <?php
820
- function my_plugin_settings_page() {
821
- $active_tab = isset($_GET['tab']) ? $_GET['tab'] : 'general';
822
-
823
- ?>
824
- <div class="wrap">
825
- <h1>My Plugin Settings</h1>
826
-
827
- <h2 class="nav-tab-wrapper">
828
- <a href="?page=my-plugin&tab=general" class="nav-tab <?php echo $active_tab == 'general' ? 'nav-tab-active' : ''; ?>">
829
- General
830
- </a>
831
- <a href="?page=my-plugin&tab=advanced" class="nav-tab <?php echo $active_tab == 'advanced' ? 'nav-tab-active' : ''; ?>">
832
- Advanced
833
- </a>
834
- <a href="?page=my-plugin&tab=help" class="nav-tab <?php echo $active_tab == 'help' ? 'nav-tab-active' : ''; ?>">
835
- Help
836
- </a>
837
- </h2>
838
-
839
- <form method="post" action="options.php">
840
- <?php
841
- if ($active_tab == 'general') {
842
- settings_fields('my_plugin_general');
843
- do_settings_sections('my-plugin-general');
844
- } elseif ($active_tab == 'advanced') {
845
- settings_fields('my_plugin_advanced');
846
- do_settings_sections('my-plugin-advanced');
847
- } else {
848
- // Help tab content
849
- echo '<p>Help content here</p>';
850
- }
851
-
852
- if ($active_tab != 'help') {
853
- submit_button();
854
- }
855
- ?>
856
- </form>
857
- </div>
858
- <?php
859
- }
860
- ```
861
-
862
- ---
863
-
864
- ## Summary
865
-
866
- | Component | Purpose | Key Functions |
867
- |-----------|---------|---------------|
868
- | Settings Pages | Plugin configuration | `add_menu_page()`, `register_setting()` |
869
- | Meta Boxes | Post/page custom fields | `add_meta_box()`, `update_post_meta()` |
870
- | Admin Notices | User notifications | `admin_notices` hook |
871
- | List Tables | Custom data tables | `WP_List_Table` class |
872
- | Dashboard Widgets | Dashboard info | `wp_add_dashboard_widget()` |
873
- | Admin Columns | Custom list columns | `manage_{post_type}_posts_columns` |
874
-
1
+ # WordPress Plugin Admin Interface
2
+
3
+ ## Overview
4
+
5
+ This document covers creating admin interfaces for WordPress plugins, including settings pages, meta boxes, admin notices, list tables, and dashboard widgets.
6
+
7
+ ---
8
+
9
+ ## Settings Pages
10
+
11
+ ### Adding a Top-Level Menu
12
+
13
+ ```php
14
+ <?php
15
+ add_action('admin_menu', 'my_plugin_add_admin_menu');
16
+
17
+ function my_plugin_add_admin_menu() {
18
+ add_menu_page(
19
+ 'My Plugin Settings', // Page title
20
+ 'My Plugin', // Menu title
21
+ 'manage_options', // Capability
22
+ 'my-plugin', // Menu slug
23
+ 'my_plugin_settings_page', // Callback function
24
+ 'dashicons-admin-generic', // Icon
25
+ 20 // Position
26
+ );
27
+ }
28
+
29
+ function my_plugin_settings_page() {
30
+ // Check user capabilities
31
+ if (!current_user_can('manage_options')) {
32
+ return;
33
+ }
34
+
35
+ ?>
36
+ <div class="wrap">
37
+ <h1><?php echo esc_html(get_admin_page_title()); ?></h1>
38
+ <form action="options.php" method="post">
39
+ <?php
40
+ settings_fields('my_plugin_options');
41
+ do_settings_sections('my-plugin');
42
+ submit_button('Save Settings');
43
+ ?>
44
+ </form>
45
+ </div>
46
+ <?php
47
+ }
48
+ ```
49
+
50
+ ### Adding a Submenu Page
51
+
52
+ ```php
53
+ <?php
54
+ add_action('admin_menu', 'my_plugin_add_submenu');
55
+
56
+ function my_plugin_add_submenu() {
57
+ // Add to Settings menu
58
+ add_options_page(
59
+ 'My Plugin Settings', // Page title
60
+ 'My Plugin', // Menu title
61
+ 'manage_options', // Capability
62
+ 'my-plugin', // Menu slug
63
+ 'my_plugin_settings_page' // Callback
64
+ );
65
+
66
+ // Or add to Tools menu
67
+ add_management_page(
68
+ 'My Plugin Tools',
69
+ 'My Plugin',
70
+ 'manage_options',
71
+ 'my-plugin-tools',
72
+ 'my_plugin_tools_page'
73
+ );
74
+ }
75
+ ```
76
+
77
+ ### Settings API Implementation
78
+
79
+ ```php
80
+ <?php
81
+ add_action('admin_init', 'my_plugin_settings_init');
82
+
83
+ function my_plugin_settings_init() {
84
+ // Register setting
85
+ register_setting(
86
+ 'my_plugin_options', // Option group
87
+ 'my_plugin_settings', // Option name
88
+ 'my_plugin_sanitize_settings' // Sanitize callback
89
+ );
90
+
91
+ // Add settings section
92
+ add_settings_section(
93
+ 'my_plugin_section_general', // Section ID
94
+ 'General Settings', // Title
95
+ 'my_plugin_section_callback', // Callback
96
+ 'my-plugin' // Page slug
97
+ );
98
+
99
+ // Add settings fields
100
+ add_settings_field(
101
+ 'my_plugin_field_api_key', // Field ID
102
+ 'API Key', // Title
103
+ 'my_plugin_field_api_key_cb', // Callback
104
+ 'my-plugin', // Page slug
105
+ 'my_plugin_section_general', // Section ID
106
+ array(
107
+ 'label_for' => 'api_key',
108
+ 'class' => 'my_plugin_row'
109
+ )
110
+ );
111
+
112
+ add_settings_field(
113
+ 'my_plugin_field_enabled',
114
+ 'Enable Feature',
115
+ 'my_plugin_field_enabled_cb',
116
+ 'my-plugin',
117
+ 'my_plugin_section_general',
118
+ array('label_for' => 'enabled')
119
+ );
120
+ }
121
+
122
+ function my_plugin_section_callback($args) {
123
+ ?>
124
+ <p>Configure your plugin settings below.</p>
125
+ <?php
126
+ }
127
+
128
+ function my_plugin_field_api_key_cb($args) {
129
+ $options = get_option('my_plugin_settings');
130
+ $value = isset($options['api_key']) ? $options['api_key'] : '';
131
+ ?>
132
+ <input
133
+ type="text"
134
+ id="<?php echo esc_attr($args['label_for']); ?>"
135
+ name="my_plugin_settings[<?php echo esc_attr($args['label_for']); ?>]"
136
+ value="<?php echo esc_attr($value); ?>"
137
+ class="regular-text"
138
+ />
139
+ <p class="description">Enter your API key from the provider.</p>
140
+ <?php
141
+ }
142
+
143
+ function my_plugin_field_enabled_cb($args) {
144
+ $options = get_option('my_plugin_settings');
145
+ $checked = isset($options['enabled']) ? $options['enabled'] : false;
146
+ ?>
147
+ <input
148
+ type="checkbox"
149
+ id="<?php echo esc_attr($args['label_for']); ?>"
150
+ name="my_plugin_settings[<?php echo esc_attr($args['label_for']); ?>]"
151
+ value="1"
152
+ <?php checked($checked, 1); ?>
153
+ />
154
+ <label for="<?php echo esc_attr($args['label_for']); ?>">
155
+ Enable this feature
156
+ </label>
157
+ <?php
158
+ }
159
+
160
+ function my_plugin_sanitize_settings($input) {
161
+ $sanitized = array();
162
+
163
+ // Sanitize API key
164
+ if (isset($input['api_key'])) {
165
+ $sanitized['api_key'] = sanitize_text_field($input['api_key']);
166
+ }
167
+
168
+ // Sanitize checkbox
169
+ $sanitized['enabled'] = isset($input['enabled']) ? 1 : 0;
170
+
171
+ return $sanitized;
172
+ }
173
+ ```
174
+
175
+ ### Object-Oriented Settings Page
176
+
177
+ ```php
178
+ <?php
179
+ class My_Plugin_Admin {
180
+ private $plugin_name;
181
+ private $version;
182
+
183
+ public function __construct($plugin_name, $version) {
184
+ $this->plugin_name = $plugin_name;
185
+ $this->version = $version;
186
+ }
187
+
188
+ public function add_admin_menu() {
189
+ add_menu_page(
190
+ 'My Plugin',
191
+ 'My Plugin',
192
+ 'manage_options',
193
+ $this->plugin_name,
194
+ array($this, 'display_settings_page'),
195
+ 'dashicons-admin-generic'
196
+ );
197
+ }
198
+
199
+ public function register_settings() {
200
+ register_setting(
201
+ $this->plugin_name . '_options',
202
+ $this->plugin_name . '_settings',
203
+ array($this, 'sanitize_settings')
204
+ );
205
+
206
+ add_settings_section(
207
+ $this->plugin_name . '_section',
208
+ 'General Settings',
209
+ array($this, 'section_callback'),
210
+ $this->plugin_name
211
+ );
212
+
213
+ add_settings_field(
214
+ 'api_key',
215
+ 'API Key',
216
+ array($this, 'api_key_field'),
217
+ $this->plugin_name,
218
+ $this->plugin_name . '_section'
219
+ );
220
+ }
221
+
222
+ public function display_settings_page() {
223
+ if (!current_user_can('manage_options')) {
224
+ return;
225
+ }
226
+
227
+ include_once plugin_dir_path(__FILE__) . 'partials/admin-display.php';
228
+ }
229
+
230
+ public function section_callback() {
231
+ echo '<p>Configure your plugin settings.</p>';
232
+ }
233
+
234
+ public function api_key_field() {
235
+ $options = get_option($this->plugin_name . '_settings');
236
+ $value = isset($options['api_key']) ? $options['api_key'] : '';
237
+
238
+ printf(
239
+ '<input type="text" name="%s[api_key]" value="%s" class="regular-text" />',
240
+ esc_attr($this->plugin_name . '_settings'),
241
+ esc_attr($value)
242
+ );
243
+ }
244
+
245
+ public function sanitize_settings($input) {
246
+ $sanitized = array();
247
+
248
+ if (isset($input['api_key'])) {
249
+ $sanitized['api_key'] = sanitize_text_field($input['api_key']);
250
+ }
251
+
252
+ return $sanitized;
253
+ }
254
+ }
255
+
256
+ // Hook it up
257
+ $admin = new My_Plugin_Admin('my-plugin', '1.0.0');
258
+ add_action('admin_menu', array($admin, 'add_admin_menu'));
259
+ add_action('admin_init', array($admin, 'register_settings'));
260
+ ```
261
+
262
+ ---
263
+
264
+ ## Meta Boxes
265
+
266
+ ### Adding a Meta Box
267
+
268
+ ```php
269
+ <?php
270
+ add_action('add_meta_boxes', 'my_plugin_add_meta_box');
271
+
272
+ function my_plugin_add_meta_box() {
273
+ add_meta_box(
274
+ 'my_plugin_meta_box', // Meta box ID
275
+ 'My Plugin Settings', // Title
276
+ 'my_plugin_meta_box_callback', // Callback
277
+ 'post', // Post type (or array of post types)
278
+ 'side', // Context (normal, side, advanced)
279
+ 'default' // Priority (high, default, low)
280
+ );
281
+ }
282
+
283
+ function my_plugin_meta_box_callback($post) {
284
+ // Add nonce for security
285
+ wp_nonce_field('my_plugin_save_meta_box', 'my_plugin_meta_box_nonce');
286
+
287
+ // Get current value
288
+ $value = get_post_meta($post->ID, '_my_plugin_field', true);
289
+
290
+ ?>
291
+ <label for="my_plugin_field">Custom Field:</label>
292
+ <input
293
+ type="text"
294
+ id="my_plugin_field"
295
+ name="my_plugin_field"
296
+ value="<?php echo esc_attr($value); ?>"
297
+ class="widefat"
298
+ />
299
+ <?php
300
+ }
301
+
302
+ // Save meta box data
303
+ add_action('save_post', 'my_plugin_save_meta_box');
304
+
305
+ function my_plugin_save_meta_box($post_id) {
306
+ // Check nonce
307
+ if (!isset($_POST['my_plugin_meta_box_nonce'])) {
308
+ return;
309
+ }
310
+
311
+ if (!wp_verify_nonce($_POST['my_plugin_meta_box_nonce'], 'my_plugin_save_meta_box')) {
312
+ return;
313
+ }
314
+
315
+ // Check autosave
316
+ if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
317
+ return;
318
+ }
319
+
320
+ // Check permissions
321
+ if (!current_user_can('edit_post', $post_id)) {
322
+ return;
323
+ }
324
+
325
+ // Sanitize and save
326
+ if (isset($_POST['my_plugin_field'])) {
327
+ $value = sanitize_text_field($_POST['my_plugin_field']);
328
+ update_post_meta($post_id, '_my_plugin_field', $value);
329
+ }
330
+ }
331
+ ```
332
+
333
+ ### Object-Oriented Meta Box
334
+
335
+ ```php
336
+ <?php
337
+ class My_Plugin_Meta_Box {
338
+ public function __construct() {
339
+ add_action('add_meta_boxes', array($this, 'add_meta_box'));
340
+ add_action('save_post', array($this, 'save_meta_box'));
341
+ }
342
+
343
+ public function add_meta_box() {
344
+ $post_types = array('post', 'page', 'custom_post_type');
345
+
346
+ foreach ($post_types as $post_type) {
347
+ add_meta_box(
348
+ 'my_plugin_meta_box',
349
+ 'My Plugin Settings',
350
+ array($this, 'render_meta_box'),
351
+ $post_type,
352
+ 'normal',
353
+ 'high'
354
+ );
355
+ }
356
+ }
357
+
358
+ public function render_meta_box($post) {
359
+ wp_nonce_field('my_plugin_meta_box', 'my_plugin_meta_box_nonce');
360
+
361
+ $project_url = get_post_meta($post->ID, '_project_url', true);
362
+ $project_date = get_post_meta($post->ID, '_project_date', true);
363
+
364
+ ?>
365
+ <table class="form-table">
366
+ <tr>
367
+ <th><label for="project_url">Project URL</label></th>
368
+ <td>
369
+ <input
370
+ type="url"
371
+ id="project_url"
372
+ name="project_url"
373
+ value="<?php echo esc_url($project_url); ?>"
374
+ class="regular-text"
375
+ />
376
+ </td>
377
+ </tr>
378
+ <tr>
379
+ <th><label for="project_date">Project Date</label></th>
380
+ <td>
381
+ <input
382
+ type="date"
383
+ id="project_date"
384
+ name="project_date"
385
+ value="<?php echo esc_attr($project_date); ?>"
386
+ />
387
+ </td>
388
+ </tr>
389
+ </table>
390
+ <?php
391
+ }
392
+
393
+ public function save_meta_box($post_id) {
394
+ // Verify nonce
395
+ if (!isset($_POST['my_plugin_meta_box_nonce'])) {
396
+ return;
397
+ }
398
+
399
+ if (!wp_verify_nonce($_POST['my_plugin_meta_box_nonce'], 'my_plugin_meta_box')) {
400
+ return;
401
+ }
402
+
403
+ // Check autosave
404
+ if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
405
+ return;
406
+ }
407
+
408
+ // Check permissions
409
+ if (!current_user_can('edit_post', $post_id)) {
410
+ return;
411
+ }
412
+
413
+ // Save project URL
414
+ if (isset($_POST['project_url'])) {
415
+ update_post_meta(
416
+ $post_id,
417
+ '_project_url',
418
+ esc_url_raw($_POST['project_url'])
419
+ );
420
+ }
421
+
422
+ // Save project date
423
+ if (isset($_POST['project_date'])) {
424
+ update_post_meta(
425
+ $post_id,
426
+ '_project_date',
427
+ sanitize_text_field($_POST['project_date'])
428
+ );
429
+ }
430
+ }
431
+ }
432
+
433
+ new My_Plugin_Meta_Box();
434
+ ```
435
+
436
+ ---
437
+
438
+ ## Admin Notices
439
+
440
+ ### Basic Admin Notice
441
+
442
+ ```php
443
+ <?php
444
+ add_action('admin_notices', 'my_plugin_admin_notice');
445
+
446
+ function my_plugin_admin_notice() {
447
+ ?>
448
+ <div class="notice notice-success is-dismissible">
449
+ <p>Settings saved successfully!</p>
450
+ </div>
451
+ <?php
452
+ }
453
+ ```
454
+
455
+ ### Notice Types
456
+
457
+ ```php
458
+ <?php
459
+ function my_plugin_show_notices() {
460
+ // Success notice
461
+ ?>
462
+ <div class="notice notice-success is-dismissible">
463
+ <p>Success message</p>
464
+ </div>
465
+
466
+ <!-- Error notice -->
467
+ <div class="notice notice-error">
468
+ <p>Error message</p>
469
+ </div>
470
+
471
+ <!-- Warning notice -->
472
+ <div class="notice notice-warning">
473
+ <p>Warning message</p>
474
+ </div>
475
+
476
+ <!-- Info notice -->
477
+ <div class="notice notice-info">
478
+ <p>Info message</p>
479
+ </div>
480
+ <?php
481
+ }
482
+ ```
483
+
484
+ ### Conditional Admin Notices
485
+
486
+ ```php
487
+ <?php
488
+ add_action('admin_notices', 'my_plugin_conditional_notice');
489
+
490
+ function my_plugin_conditional_notice() {
491
+ // Only show on plugin settings page
492
+ $screen = get_current_screen();
493
+ if ($screen->id !== 'toplevel_page_my-plugin') {
494
+ return;
495
+ }
496
+
497
+ // Check if settings are configured
498
+ $settings = get_option('my_plugin_settings');
499
+ if (empty($settings['api_key'])) {
500
+ ?>
501
+ <div class="notice notice-warning">
502
+ <p>
503
+ <strong>My Plugin:</strong>
504
+ Please configure your API key in
505
+ <a href="<?php echo admin_url('admin.php?page=my-plugin'); ?>">settings</a>.
506
+ </p>
507
+ </div>
508
+ <?php
509
+ }
510
+ }
511
+ ```
512
+
513
+ ### Dismissible Notices with Transients
514
+
515
+ ```php
516
+ <?php
517
+ add_action('admin_notices', 'my_plugin_dismissible_notice');
518
+
519
+ function my_plugin_dismissible_notice() {
520
+ // Check if notice was dismissed
521
+ if (get_transient('my_plugin_notice_dismissed')) {
522
+ return;
523
+ }
524
+
525
+ ?>
526
+ <div class="notice notice-info is-dismissible" data-notice="my-plugin-welcome">
527
+ <p>Welcome to My Plugin! <a href="#">Get started</a></p>
528
+ </div>
529
+
530
+ <script>
531
+ jQuery(document).ready(function($) {
532
+ $(document).on('click', '.notice[data-notice="my-plugin-welcome"] .notice-dismiss', function() {
533
+ $.post(ajaxurl, {
534
+ action: 'my_plugin_dismiss_notice',
535
+ nonce: '<?php echo wp_create_nonce('my_plugin_dismiss_notice'); ?>'
536
+ });
537
+ });
538
+ });
539
+ </script>
540
+ <?php
541
+ }
542
+
543
+ // Handle AJAX dismiss
544
+ add_action('wp_ajax_my_plugin_dismiss_notice', 'my_plugin_handle_dismiss_notice');
545
+
546
+ function my_plugin_handle_dismiss_notice() {
547
+ check_ajax_referer('my_plugin_dismiss_notice', 'nonce');
548
+
549
+ set_transient('my_plugin_notice_dismissed', true, WEEK_IN_SECONDS);
550
+
551
+ wp_send_json_success();
552
+ }
553
+ ```
554
+
555
+ ---
556
+
557
+ ## List Tables
558
+
559
+ ### Custom List Table
560
+
561
+ ```php
562
+ <?php
563
+ if (!class_exists('WP_List_Table')) {
564
+ require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
565
+ }
566
+
567
+ class My_Plugin_List_Table extends WP_List_Table {
568
+ public function __construct() {
569
+ parent::__construct(array(
570
+ 'singular' => 'item',
571
+ 'plural' => 'items',
572
+ 'ajax' => false
573
+ ));
574
+ }
575
+
576
+ public function get_columns() {
577
+ return array(
578
+ 'cb' => '<input type="checkbox" />',
579
+ 'title' => 'Title',
580
+ 'author' => 'Author',
581
+ 'date' => 'Date',
582
+ 'status' => 'Status'
583
+ );
584
+ }
585
+
586
+ public function get_sortable_columns() {
587
+ return array(
588
+ 'title' => array('title', false),
589
+ 'date' => array('date', true)
590
+ );
591
+ }
592
+
593
+ public function column_default($item, $column_name) {
594
+ switch ($column_name) {
595
+ case 'title':
596
+ case 'author':
597
+ case 'date':
598
+ case 'status':
599
+ return $item[$column_name];
600
+ default:
601
+ return print_r($item, true);
602
+ }
603
+ }
604
+
605
+ public function column_cb($item) {
606
+ return sprintf(
607
+ '<input type="checkbox" name="items[]" value="%s" />',
608
+ $item['id']
609
+ );
610
+ }
611
+
612
+ public function column_title($item) {
613
+ $actions = array(
614
+ 'edit' => sprintf(
615
+ '<a href="?page=%s&action=edit&item=%s">Edit</a>',
616
+ $_REQUEST['page'],
617
+ $item['id']
618
+ ),
619
+ 'delete' => sprintf(
620
+ '<a href="?page=%s&action=delete&item=%s">Delete</a>',
621
+ $_REQUEST['page'],
622
+ $item['id']
623
+ )
624
+ );
625
+
626
+ return sprintf(
627
+ '%1$s %2$s',
628
+ $item['title'],
629
+ $this->row_actions($actions)
630
+ );
631
+ }
632
+
633
+ public function get_bulk_actions() {
634
+ return array(
635
+ 'delete' => 'Delete',
636
+ 'export' => 'Export'
637
+ );
638
+ }
639
+
640
+ public function prepare_items() {
641
+ $columns = $this->get_columns();
642
+ $hidden = array();
643
+ $sortable = $this->get_sortable_columns();
644
+
645
+ $this->_column_headers = array($columns, $hidden, $sortable);
646
+
647
+ // Get data
648
+ $data = $this->get_data();
649
+
650
+ // Pagination
651
+ $per_page = 20;
652
+ $current_page = $this->get_pagenum();
653
+ $total_items = count($data);
654
+
655
+ $this->set_pagination_args(array(
656
+ 'total_items' => $total_items,
657
+ 'per_page' => $per_page,
658
+ 'total_pages' => ceil($total_items / $per_page)
659
+ ));
660
+
661
+ $this->items = array_slice($data, (($current_page - 1) * $per_page), $per_page);
662
+ }
663
+
664
+ private function get_data() {
665
+ // Get data from database
666
+ global $wpdb;
667
+ $table_name = $wpdb->prefix . 'my_plugin_data';
668
+
669
+ return $wpdb->get_results(
670
+ "SELECT * FROM $table_name ORDER BY date DESC",
671
+ ARRAY_A
672
+ );
673
+ }
674
+ }
675
+
676
+ // Display list table
677
+ function my_plugin_list_page() {
678
+ $list_table = new My_Plugin_List_Table();
679
+ $list_table->prepare_items();
680
+
681
+ ?>
682
+ <div class="wrap">
683
+ <h1>My Plugin Items</h1>
684
+ <form method="post">
685
+ <?php $list_table->display(); ?>
686
+ </form>
687
+ </div>
688
+ <?php
689
+ }
690
+ ```
691
+
692
+ ---
693
+
694
+ ## Dashboard Widgets
695
+
696
+ ### Adding a Dashboard Widget
697
+
698
+ ```php
699
+ <?php
700
+ add_action('wp_dashboard_setup', 'my_plugin_add_dashboard_widget');
701
+
702
+ function my_plugin_add_dashboard_widget() {
703
+ wp_add_dashboard_widget(
704
+ 'my_plugin_dashboard_widget', // Widget ID
705
+ 'My Plugin Stats', // Title
706
+ 'my_plugin_dashboard_widget_render' // Callback
707
+ );
708
+ }
709
+
710
+ function my_plugin_dashboard_widget_render() {
711
+ // Get stats
712
+ $total_items = wp_count_posts('my_custom_post_type')->publish;
713
+ $recent_items = get_posts(array(
714
+ 'post_type' => 'my_custom_post_type',
715
+ 'posts_per_page' => 5
716
+ ));
717
+
718
+ ?>
719
+ <div class="my-plugin-dashboard-widget">
720
+ <p><strong>Total Items:</strong> <?php echo esc_html($total_items); ?></p>
721
+
722
+ <h4>Recent Items</h4>
723
+ <ul>
724
+ <?php foreach ($recent_items as $item) : ?>
725
+ <li>
726
+ <a href="<?php echo get_edit_post_link($item->ID); ?>">
727
+ <?php echo esc_html($item->post_title); ?>
728
+ </a>
729
+ </li>
730
+ <?php endforeach; ?>
731
+ </ul>
732
+ </div>
733
+ <?php
734
+ }
735
+ ```
736
+
737
+ ---
738
+
739
+ ## Admin Columns
740
+
741
+ ### Adding Custom Columns to Post List
742
+
743
+ ```php
744
+ <?php
745
+ // Add column
746
+ add_filter('manage_post_posts_columns', 'my_plugin_add_custom_column');
747
+
748
+ function my_plugin_add_custom_column($columns) {
749
+ $columns['my_custom_field'] = 'Custom Field';
750
+ return $columns;
751
+ }
752
+
753
+ // Populate column
754
+ add_action('manage_post_posts_custom_column', 'my_plugin_populate_custom_column', 10, 2);
755
+
756
+ function my_plugin_populate_custom_column($column, $post_id) {
757
+ if ($column === 'my_custom_field') {
758
+ $value = get_post_meta($post_id, '_my_custom_field', true);
759
+ echo esc_html($value);
760
+ }
761
+ }
762
+
763
+ // Make column sortable
764
+ add_filter('manage_edit-post_sortable_columns', 'my_plugin_sortable_column');
765
+
766
+ function my_plugin_sortable_column($columns) {
767
+ $columns['my_custom_field'] = 'my_custom_field';
768
+ return $columns;
769
+ }
770
+ ```
771
+
772
+ ---
773
+
774
+ ## Best Practices
775
+
776
+ ### Settings Pages
777
+
778
+ ✅ Check user capabilities (`current_user_can()`)
779
+ ✅ Use Settings API for options
780
+ ✅ Sanitize all input
781
+ ✅ Use nonces for form submissions
782
+ ✅ Provide helpful descriptions
783
+ ✅ Group related settings
784
+ ✅ Use appropriate input types
785
+
786
+ ### Meta Boxes
787
+
788
+ ✅ Always use nonces
789
+ ✅ Check autosave
790
+ ✅ Verify user permissions
791
+ ✅ Sanitize input based on type
792
+ ✅ Use `update_post_meta()` not direct DB queries
793
+ ✅ Prefix meta keys with underscore for private fields
794
+
795
+ ### Admin Notices
796
+
797
+ ✅ Use appropriate notice types
798
+ ✅ Make notices dismissible when appropriate
799
+ ✅ Show notices only on relevant pages
800
+ ✅ Provide actionable information
801
+ ✅ Don't overwhelm users with notices
802
+
803
+ ### Security
804
+
805
+ ✅ Always check capabilities
806
+ ✅ Use nonces for all forms
807
+ ✅ Sanitize input, escape output
808
+ ✅ Use `wp_verify_nonce()` before processing
809
+ ✅ Check `DOING_AUTOSAVE` in save hooks
810
+ ✅ Validate data types
811
+
812
+ ---
813
+
814
+ ## Common Patterns
815
+
816
+ ### Tabbed Settings Page
817
+
818
+ ```php
819
+ <?php
820
+ function my_plugin_settings_page() {
821
+ $active_tab = isset($_GET['tab']) ? $_GET['tab'] : 'general';
822
+
823
+ ?>
824
+ <div class="wrap">
825
+ <h1>My Plugin Settings</h1>
826
+
827
+ <h2 class="nav-tab-wrapper">
828
+ <a href="?page=my-plugin&tab=general" class="nav-tab <?php echo $active_tab == 'general' ? 'nav-tab-active' : ''; ?>">
829
+ General
830
+ </a>
831
+ <a href="?page=my-plugin&tab=advanced" class="nav-tab <?php echo $active_tab == 'advanced' ? 'nav-tab-active' : ''; ?>">
832
+ Advanced
833
+ </a>
834
+ <a href="?page=my-plugin&tab=help" class="nav-tab <?php echo $active_tab == 'help' ? 'nav-tab-active' : ''; ?>">
835
+ Help
836
+ </a>
837
+ </h2>
838
+
839
+ <form method="post" action="options.php">
840
+ <?php
841
+ if ($active_tab == 'general') {
842
+ settings_fields('my_plugin_general');
843
+ do_settings_sections('my-plugin-general');
844
+ } elseif ($active_tab == 'advanced') {
845
+ settings_fields('my_plugin_advanced');
846
+ do_settings_sections('my-plugin-advanced');
847
+ } else {
848
+ // Help tab content
849
+ echo '<p>Help content here</p>';
850
+ }
851
+
852
+ if ($active_tab != 'help') {
853
+ submit_button();
854
+ }
855
+ ?>
856
+ </form>
857
+ </div>
858
+ <?php
859
+ }
860
+ ```
861
+
862
+ ---
863
+
864
+ ## Summary
865
+
866
+ | Component | Purpose | Key Functions |
867
+ |-----------|---------|---------------|
868
+ | Settings Pages | Plugin configuration | `add_menu_page()`, `register_setting()` |
869
+ | Meta Boxes | Post/page custom fields | `add_meta_box()`, `update_post_meta()` |
870
+ | Admin Notices | User notifications | `admin_notices` hook |
871
+ | List Tables | Custom data tables | `WP_List_Table` class |
872
+ | Dashboard Widgets | Dashboard info | `wp_add_dashboard_widget()` |
873
+ | Admin Columns | Custom list columns | `manage_{post_type}_posts_columns` |
874
+