Both WordPress and Contensio have plugins and themes — that's table stakes. What matters is how clean the API is, how safely plugins install, and whether they can extend the admin without forking the core. Contensio's plugin system is Laravel-native, with a modern extension API that doesn't require plugins to monkey-patch anything.
Two install paths, one destination
Composer
For developers — install from Packagist, commit to your composer.json, CI-friendly, version-locked.
composer require contensio/plugin-social-connect
ZIP upload
For non-technical users — download a release ZIP, upload it in the admin, enable. Same plugin, same result.
Auto-migrations on enable
Plugins that ship database tables declare migrations. When an admin clicks Enable, Contensio runs those migrations automatically — no CLI step required. If a migration fails, the plugin stays enabled with a warning, and you can fix and retry. Disable + re-enable is safe and idempotent.
The Hook system
Plugins extend the admin UI by registering Hooks — named extension points in core views. A plugin can inject a sign-in button onto the login page, a section on the user profile, a card on the settings hub — without editing a single core file.
// Inside a plugin's service provider
Hook::add('login.after_form', function () {
return view('social-connect::partials.login-buttons', [
'providers' => Providers::enabled(),
])->render();
});
Core views render hooks with {!! Hook::render('login.after_form') !!}.
Multiple plugins can register for the same hook — their output is concatenated in priority order.
If a plugin throws, it's caught and logged — other plugins keep working.
Sidebar navigation placement
Plugins declare where their admin links appear in plugin.json. Three placements:
- root — top-level sidebar link, alongside Dashboard / Pages / Posts
- tools — nested under the collapsible "Tools" dropdown
- appearance — nested under Appearance (next to Themes / Menus)
A plugin can register multiple entries — a Shop plugin might ship a root-level "Shop" link plus a tools-level "Order export" link, both declared in the same menu block.
Themes
Themes ship Blade layouts, CSS, JS, and optional customization schemas. Three discovery
sources: bundled, local (themes/ directory), and Composer-installed. The active
theme's views land under the theme:: namespace, so switching themes swaps the
presentation layer cleanly.
Compared to WordPress
WordPress
- ✗Filters + actions everywhere; debugging is a scavenger hunt
- ✗Plugins often need manual migration commands
- ✗Conflicts between plugins are frequent and silent
Contensio
- ✓Named Hook points in the core — documented, typed
- ✓Migrations run on enable
- ✓A failing plugin is isolated, logged, doesn't crash the admin