{"slug":"wordpress-plugin-development","title":"WordPress Plugin Development","tags":["development","plugin","activation-hook","database"],"agent_summary":"Plugin file header, activation/deactivation hooks, custom database table creation, and admin settings page pattern for WordPress plugin development.","trigger_phrases":["wordpress plugin development","create wordpress plugin","plugin activation hook","wordpress plugin boilerplate","wp plugin from scratch"],"runnable":true,"markdown":"\nStructure WordPress plugins for maintainability. Use activation hooks for setup, always prevent direct access, and store plugin-specific data in custom tables or options.\n\n## Plugin Header\n\n```php\n<?php\n/**\n * Plugin Name: My Custom Plugin\n * Plugin URI: https://example.com/plugin\n * Description: What this plugin does in one sentence.\n * Version: 1.0.0\n * Author: Your Name\n * Author URI: https://example.com\n * License: GPL v2 or later\n * Text Domain: my-plugin\n * Domain Path: /languages\n */\n\n// Prevent direct access\nif (!defined('ABSPATH')) {\n    exit;\n}\n\n// Plugin constants\ndefine('MYPLUGIN_VERSION', '1.0.0');\ndefine('MYPLUGIN_PATH', plugin_dir_path(__FILE__));\ndefine('MYPLUGIN_URL', plugin_dir_url(__FILE__));\ndefine('MYPLUGIN_BASENAME', plugin_basename(__FILE__));\n```\n\n## Activation and Deactivation Hooks\n\n```php\nregister_activation_hook(__FILE__, 'myplugin_activate');\nfunction myplugin_activate() {\n    myplugin_create_tables();\n    flush_rewrite_rules();\n    // Set default options\n    add_option('myplugin_settings', [\n        'enabled' => true,\n        'version' => MYPLUGIN_VERSION,\n    ]);\n}\n\nregister_deactivation_hook(__FILE__, 'myplugin_deactivate');\nfunction myplugin_deactivate() {\n    flush_rewrite_rules();\n}\n```\n\n## Create Custom Database Table\n\n```php\nfunction myplugin_create_tables() {\n    global $wpdb;\n    $table_name      = $wpdb->prefix . 'myplugin_leads';\n    $charset_collate = $wpdb->get_charset_collate();\n\n    $sql = \"CREATE TABLE {$table_name} (\n        id mediumint(9) NOT NULL AUTO_INCREMENT,\n        created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,\n        name varchar(100) NOT NULL,\n        email varchar(100) NOT NULL,\n        message text,\n        status varchar(20) DEFAULT 'new',\n        PRIMARY KEY (id)\n    ) {$charset_collate};\";\n\n    require_once ABSPATH . 'wp-admin/includes/upgrade.php';\n    dbDelta($sql);\n}\n```\n\n## Admin Settings Page\n\n```php\nfunction myplugin_admin_menu() {\n    add_options_page(\n        __('My Plugin Settings', 'my-plugin'),\n        __('My Plugin', 'my-plugin'),\n        'manage_options',\n        'myplugin-settings',\n        'myplugin_settings_page'\n    );\n}\nadd_action('admin_menu', 'myplugin_admin_menu');\n\nfunction myplugin_settings_page() {\n    if (!current_user_can('manage_options')) {\n        return;\n    }\n    // Render settings form\n    echo '<div class=\"wrap\"><h1>' . esc_html(get_admin_page_title()) . '</h1></div>';\n}\n```\n\n## File Structure\n\n```\nmy-plugin/\n├── my-plugin.php          # Main plugin file (header here)\n├── includes/\n│   ├── class-admin.php    # Admin functionality\n│   ├── class-frontend.php # Frontend functionality\n│   └── class-database.php # DB operations\n├── assets/\n│   ├── css/\n│   └── js/\n└── languages/             # Translations (.pot file)\n```\n","html":"<p>Structure WordPress plugins for maintainability. Use activation hooks for setup, always prevent direct access, and store plugin-specific data in custom tables or options.</p>\n<h2>Plugin Header</h2>\n<pre><code class=\"language-php\">&#x3C;?php\n/**\n * Plugin Name: My Custom Plugin\n * Plugin URI: https://example.com/plugin\n * Description: What this plugin does in one sentence.\n * Version: 1.0.0\n * Author: Your Name\n * Author URI: https://example.com\n * License: GPL v2 or later\n * Text Domain: my-plugin\n * Domain Path: /languages\n */\n\n// Prevent direct access\nif (!defined('ABSPATH')) {\n    exit;\n}\n\n// Plugin constants\ndefine('MYPLUGIN_VERSION', '1.0.0');\ndefine('MYPLUGIN_PATH', plugin_dir_path(__FILE__));\ndefine('MYPLUGIN_URL', plugin_dir_url(__FILE__));\ndefine('MYPLUGIN_BASENAME', plugin_basename(__FILE__));\n</code></pre>\n<h2>Activation and Deactivation Hooks</h2>\n<pre><code class=\"language-php\">register_activation_hook(__FILE__, 'myplugin_activate');\nfunction myplugin_activate() {\n    myplugin_create_tables();\n    flush_rewrite_rules();\n    // Set default options\n    add_option('myplugin_settings', [\n        'enabled' => true,\n        'version' => MYPLUGIN_VERSION,\n    ]);\n}\n\nregister_deactivation_hook(__FILE__, 'myplugin_deactivate');\nfunction myplugin_deactivate() {\n    flush_rewrite_rules();\n}\n</code></pre>\n<h2>Create Custom Database Table</h2>\n<pre><code class=\"language-php\">function myplugin_create_tables() {\n    global $wpdb;\n    $table_name      = $wpdb->prefix . 'myplugin_leads';\n    $charset_collate = $wpdb->get_charset_collate();\n\n    $sql = \"CREATE TABLE {$table_name} (\n        id mediumint(9) NOT NULL AUTO_INCREMENT,\n        created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,\n        name varchar(100) NOT NULL,\n        email varchar(100) NOT NULL,\n        message text,\n        status varchar(20) DEFAULT 'new',\n        PRIMARY KEY (id)\n    ) {$charset_collate};\";\n\n    require_once ABSPATH . 'wp-admin/includes/upgrade.php';\n    dbDelta($sql);\n}\n</code></pre>\n<h2>Admin Settings Page</h2>\n<pre><code class=\"language-php\">function myplugin_admin_menu() {\n    add_options_page(\n        __('My Plugin Settings', 'my-plugin'),\n        __('My Plugin', 'my-plugin'),\n        'manage_options',\n        'myplugin-settings',\n        'myplugin_settings_page'\n    );\n}\nadd_action('admin_menu', 'myplugin_admin_menu');\n\nfunction myplugin_settings_page() {\n    if (!current_user_can('manage_options')) {\n        return;\n    }\n    // Render settings form\n    echo '&#x3C;div class=\"wrap\">&#x3C;h1>' . esc_html(get_admin_page_title()) . '&#x3C;/h1>&#x3C;/div>';\n}\n</code></pre>\n<h2>File Structure</h2>\n<pre><code>my-plugin/\n├── my-plugin.php          # Main plugin file (header here)\n├── includes/\n│   ├── class-admin.php    # Admin functionality\n│   ├── class-frontend.php # Frontend functionality\n│   └── class-database.php # DB operations\n├── assets/\n│   ├── css/\n│   └── js/\n└── languages/             # Translations (.pot file)\n</code></pre>\n"}