IsuDev Library self-updates
Reusable Gutenberg blocks and tools by IsuDev. Server-rendered, modular, toggleable from the admin.
by IsuDev · github.com/isudevelopment/isudev-library · website
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/isudevelopment/isudev-library/archive/refs/heads/main.zipShips its own WordPress updater (Plugin Update Checker), so new versions show up under Dashboard → Updates.
Reusable, server-rendered Gutenberg blocks and tools. One place instead of copying blocks from project to project.
- Self-contained. No runtime dependency on a theme, on
t2, or on any other plugin.build/ships with the repo, so no build step is needed to install it. - Always server-rendered. Every block renders in PHP.
- Toggleable. Enable or disable blocks from the admin panel, or pin them in
code via
isudev.json.
Requirements
WordPress 6.7+, PHP 7.4+. Node 22.22.2 for development only.
Blocks
| Block | Description |
|---|---|
isudev/site-header |
Accessibility-first site header: logo, disclosure navigation, mobile drawer, actions slot. |
isudev/read-more |
A linked card: title, optional image, badge and supporting text. Links to a post, a page or an external URL. |
isudev/social-share |
A container for social share buttons, with an optional prefix. |
isudev/social-share-network |
A single share button — one of twelve networks — nested inside isudev/social-share. |
isudev/toggle-blocks |
A collapsible toggle: a button that shows or hides any inner blocks. |
isudev/image-step-guide |
A container for step-by-step content, with an image alongside inner blocks for each step. |
isudev/image-step-guide-step |
A single step — an image and editable content — nested inside isudev/image-step-guide. |
isudev/agenda-accordion |
A WAI-ARIA accordion container: any number of collapsible items. |
isudev/agenda-accordion-item |
A single accordion item — a trigger and collapsible content — nested inside isudev/agenda-accordion. |
isudev/bento-grid |
A responsive CSS grid layout: any number of resizable cards. |
isudev/bento-card |
A single card, resizable by drag — nested inside isudev/bento-grid. |
isudev/selling-points |
A container for selling points in a responsive grid, with optional reveal-on-scroll. |
isudev/selling-point |
A single point — icon, image, badge, title, description and link — nested inside isudev/selling-points. |
isudev/google-reviews |
Reviews from WP Google Review Slider, as a card grid or a carousel. |
isudev/google-reviews-header |
A Google account's rating, logo and a review button. |
isudev/google-reviews-badge |
A compact Google rating badge linking to the account's Maps profile. |
Each block ships a README.md in its own directory: every setting, where to find
it, what a theme can lock, and what to check when the block does not render.
Deeper theme-side documentation lives in guides/.
Extensions
Quality-of-life features that are not blocks — an admin column, a post type rename, a plugin integration. Each is toggled from IsuDev Library → Extensions, and every one is off until someone turns it on: a block only appears when an editor inserts it, but an extension changes the admin or the front end the moment it loads.
| Extension | Category | Needs |
|---|---|---|
| Last edited column | Admin experience | — |
| Show template name | Admin experience | — |
| Site logo in General settings | Admin experience | — |
| Disable posts | Content | — |
| Rename posts to articles | Content | — |
| Skip links | Accessibility | — |
| Gravity Forms block wrapper | Plugin integrations | Gravity Forms |
| Lock the Gravity Forms block theme | Plugin integrations | Gravity Forms |
An extension whose required plugin is inactive cannot be enabled at all; the panel shows it as unavailable rather than letting it be switched on to do nothing.
Each ships a README.md in its own directory: what it changes, every filter it
offers, and what to check when it appears to do nothing.
extensions/README.md is the guide to writing a new one.
Configuration
Everything works on sensible defaults with no configuration. To override
per-project, add an optional isudev.json to your theme (child overrides
parent). See isudev.json.example.
This plugin reads only the library key and never writes to the file, so the
same isudev.json is safe to share with other isudev-* plugins.
{
"library": {
"isudev/site-header": { "enabled": true }
}
}
Extensions are pinned the same way, under their own extensions key — they are
keyed by slug rather than by block name, because an extension has no block name:
{
"library": {
"extensions": {
"skip-links": { "enabled": true },
"disable-posts": { "enabled": false }
}
}
}
enabled set in isudev.json wins over the admin panel and locks the toggle,
for blocks and extensions alike.
In v1 a block entry accepts enabled and variations. Per-block default
attributes are read by Config\get_block_config(), but no block consumes them
yet — see the CHANGELOG's "Not in v1" list.
Variations
Register extra variations of a block from isudev.json. Each gets a
_namespace attribute, so render.php can vary markup and classes per
variation. See isudev.json.example.
Filters
| Filter | Purpose |
|---|---|
isudev_library/settings/show_admin |
Whether the current user sees the panel. Also gates the REST endpoints. |
isudev_library/settings/capability |
Capability for the menu and REST. Default manage_options. |
isudev_library/config |
The library subtree after extraction. |
isudev_library/config/raw |
The whole decoded isudev.json. |
isudev_library/config/inherit_from_parent |
Whether to inherit from the parent theme. Default true. |
isudev_library/icons |
Icon definitions containing complete inline SVG markup or image URLs. |
isudev_library/icon |
Rendered inline SVG or image markup. |
isudev_library/site_header/regions |
Header regions before assembly. |
isudev_library/site_header/output |
Final header markup. |
isudev_library/site_header/menu_args |
wp_nav_menu args for the header. |
Each extension adds its own filters under
isudev_library/extensions/<slug>/…, documented with examples in that
extension's README — see the Extensions table above.
Code-only mode — no panel, configuration lives entirely in isudev.json:
add_filter( 'isudev_library/settings/show_admin', '__return_false' );
Development
nvm use
npm install && composer install
npm run build
npm run test:php
npm run lint:js && npm run lint:css && composer run lint:php
WP_ADMIN_USER=... WP_ADMIN_PASS=... npm run test:e2e
Never run npm start in automated work — use the one-shot npm run build.
Releasing
Releases are cut from a tag and published as a GitHub release. The plugin updates itself from that release's zip, so the artifact is the product:
# Bump the version in isudev-library.php, package.json and package-lock.json,
# add the CHANGELOG.md section, npm run build, commit and push main. Then:
git tag v1.12.0 && git push origin v1.12.0
The workflow refuses to publish a release whose tag disagrees with the plugin
header, that has no CHANGELOG.md section, or whose zip is missing runtime code
or carrying development files.
Self-updates are active only for installs that carry a bundled vendor/ — that
is how the plugin tells a release-zip install from a Composer-managed one, where
Composer owns the version instead.
Adding a block
- Create
src/blocks/<slug>/withblock.json(apiVersion: 3,"render": "file:./render.php"),index.js,render.php. - Add
block.phpreturning a descriptor — seesrc/blocks/site-header/block.php. npm run build. The loader picks it up; the panel lists it automatically.
Block directory names must be globally unique: the generated
build/blocks-manifest.php is keyed by directory basename.
Adding an extension
- Create
extensions/<slug>/withextension.php(a descriptor that registers nothing),hooks.php(every hook inside aboot()function) and aREADME.md. - No build step — extensions ship no JavaScript. The panel lists it automatically.
Read extensions/README.md first: it documents every
descriptor key, why hooks may never be registered at the top level of a file, and
the conventions tools/check.php enforces.
License
GPL-2.0-or-later.