Howtos for The Rest of Us

Skills

WordPress Plugin Standards

File Header

<?php
/**
 * Plugin Name:       My Plugin
 * Plugin URI:        https://github.com/user/my-plugin
 * Description:       Does one thing well.
 * Version:           1.0.0
 * Requires PHP:      8.1
 * Author:            Your Name
 * License:           MIT
 * Text Domain:       my-plugin
 */

declare(strict_types=1);

Structure

my-plugin/
├── my-plugin.php          # Plugin header + bootstrap
├── includes/              # PHP classes
│   ├── class-admin.php
│   └── class-frontend.php
├── assets/                # Built assets (commit dist, not src)
│   ├── css/
│   ├── js/
│   └── img/
├── languages/             # .pot / .po / .mo files
└── readme.txt             # WordPress.org readme

Naming

Hooks

/**
 * Fires after a save sync completes.
 *
 * @param int    $save_id  The save file ID.
 * @param string $status   Result status: success | error
 */
do_action("myplugin_after_sync", $save_id, $status);

Security

Database

i18n

add_action("plugins_loaded", function () {
    load_plugin_textdomain("my-plugin", false, dirname(plugin_basename(__FILE__)) . "/languages");
});

Performance

Testing

Deployment