OOP WordPress Plugin Template
This is an object-oriented singleton pattern for WordPress plugins. Best for medium to large plugins that need organized, maintainable architecture.
Features
✅ Singleton pattern (single instance) ✅ Complete plugin header ✅ ABSPATH security check ✅ Class-based organization ✅ Custom post type and taxonomy ✅ Admin settings page with separate view template ✅ AJAX handlers (logged-in and public) ✅ REST API endpoints ✅ Proper activation/deactivation hooks ✅ Uninstall script for cleanup ✅ Internationalization ready ✅ Conditional asset loading ✅ Security best practices
Installation
- Copy this folder to
wp-content/plugins/ - Rename folder and files to match your plugin name
- Find and replace the following:
My_OOP_Plugin→ Your_Plugin_Class_NameMy OOP Plugin→ Your plugin namemy-oop-plugin→ your-plugin-slugmyop_→ yourprefix_MYOP_→ YOURPREFIX_https://example.com→ Your websiteYour Name→ Your name
- Activate in WordPress admin
Structure
my-oop-plugin/
├── my-oop-plugin.php # Main plugin file with class
├── uninstall.php # Cleanup on uninstall
├── README.md # This file
├── views/ # Template files
│ └── admin-settings.php # Settings page template
├── assets/ # CSS/JS files (create as needed)
│ ├── css/
│ │ ├── admin-style.css
│ │ └── style.css
│ └── js/
│ ├── admin-script.js
│ └── script.js
└── languages/ # Translation files (create as needed)
Class Structure
Singleton Pattern
My_OOP_Plugin::get_instance(); // Get single instance
Key Methods
Initialization:
__construct()- Private constructor, sets up plugindefine_constants()- Define plugin constantsinit_hooks()- Register WordPress hooksinit()- Initialize functionality oninithook
Post Types & Taxonomies:
register_post_types()- Register custom post typesregister_taxonomies()- Register custom taxonomies
Admin:
add_admin_menu()- Add admin menu pagesrender_settings_page()- Render settings pagesave_settings()- Handle form submissionget_settings()- Get plugin settings
Assets:
admin_enqueue_scripts()- Load admin assetsenqueue_scripts()- Load frontend assets
AJAX:
ajax_handler()- Handle logged-in AJAX requestsajax_handler_nopriv()- Handle public AJAX requestsprocess_ajax_data()- Process AJAX data
REST API:
register_rest_routes()- Register REST endpointsrest_permission_check()- Check permissionsrest_get_books()- GET /wp-json/myop/v1/booksrest_get_book()- GET /wp-json/myop/v1/books/{id}
Lifecycle:
activate()- Run on plugin activationdeactivate()- Run on plugin deactivation
Included Examples
Custom Post Type & Taxonomy
- "Books" post type with Gutenberg support
- "Genres" hierarchical taxonomy
Settings Page
- Located in Settings → OOP Plugin
- Separate view template (views/admin-settings.php)
- Multiple field types (text, number, checkbox)
- Nonce verification and sanitization
AJAX Handlers
- Logged-in:
wp_ajax_myop_action - Public:
wp_ajax_nopriv_myop_action - Nonce verification and capability checking
REST API
GET /wp-json/myop/v1/books- List all booksGET /wp-json/myop/v1/books/{id}- Get single book- Permission callbacks
- Validation and sanitization
Extending the Plugin
Add a New Method
/**
* Your custom method
*
* @param string $param Parameter description
* @return mixed
*/
private function custom_method( $param ) {
// Your code here
}
Add a New Hook
Add to init_hooks():
add_action( 'hook_name', array( $this, 'method_name' ) );
Add a New REST Endpoint
Add to register_rest_routes():
register_rest_route(
'myop/v1',
'/endpoint',
array(
'methods' => 'GET',
'callback' => array( $this, 'rest_endpoint_handler' ),
'permission_callback' => array( $this, 'rest_permission_check' ),
)
);
Security Checklist
- ABSPATH check at top of file
- Private constructor (singleton)
- Prevent cloning and unserializing
- Nonces for all forms
- Capability checks (current_user_can)
- Input sanitization (sanitize_text_field, absint)
- Output escaping (esc_html, esc_attr)
- AJAX nonce verification (check_ajax_referer)
- REST API permission callbacks
- REST API argument validation
- Conditional asset loading
Advantages of OOP Pattern
✅ Organization - Related code grouped in methods ✅ Maintainability - Easy to find and modify functionality ✅ Encapsulation - Private methods protect internal logic ✅ Singleton - Prevents multiple instances ✅ Scalability - Easy to extend with new methods ✅ Testing - Methods can be tested individually
When to Use OOP vs Simple
Use OOP when:
- Plugin has 10+ functions
- Need organized, maintainable code
- Multiple developers working on plugin
- Plugin will grow over time
- Need private/protected methods
Use Simple when:
- Plugin has <10 functions
- Simple, focused functionality
- One-person project
- Unlikely to grow significantly
Distribution & Auto-Updates
Enabling GitHub Auto-Updates
You can provide automatic updates from GitHub without submitting to WordPress.org:
1. Install Plugin Update Checker library:
cd your-plugin/
git submodule add https://github.com/YahnisElsts/plugin-update-checker.git
2. Add to init_hooks() method:
/**
* Include and initialize update checker
*/
private function init_updater() {
$updater_path = plugin_dir_path( __FILE__ ) . 'plugin-update-checker/plugin-update-checker.php';
if ( ! file_exists( $updater_path ) ) {
return;
}
require $updater_path;
$updateChecker = YahnisElsts\PluginUpdateChecker\v5\PucFactory::buildUpdateChecker(
'https://github.com/yourusername/your-plugin/',
__FILE__,
'your-plugin-slug'
);
$updateChecker->setBranch( 'main' );
$updateChecker->getVcsApi()->enableReleaseAssets();
}
Then call it in init_hooks():
private function init_hooks() {
// Existing hooks...
// Initialize auto-updates
$this->init_updater();
}
3. For private repos, add token to wp-config.php:
define( 'YOUR_PLUGIN_GITHUB_TOKEN', 'ghp_xxxxxxxxxxxxx' );
Then update init_updater():
if ( defined( 'MYOP_GITHUB_TOKEN' ) ) {
$updateChecker->setAuthentication( MYOP_GITHUB_TOKEN );
}
4. Create releases:
# Update version in plugin header
git add my-oop-plugin.php
git commit -m "Bump version to 1.0.1"
git tag 1.0.1
git push origin main
git push origin 1.0.1
# Create GitHub Release with pre-built ZIP
Resources
- Complete Guide: See
references/github-auto-updates.md - Implementation Examples: See
examples/github-updater.php - Plugin Update Checker: https://github.com/YahnisElsts/plugin-update-checker
Resources
License
GPL v2 or later