Cooper Bold Logo Wrangler
WordPress plugin: balanced partner logo strips using Sanity Labs Logo Soup
by Cooper Bold · github.com/cooperbold/cooper-bold-logo-soup · website
Install
The author publishes release zips, so WP-CLI can install straight from GitHub:
wp plugin install https://github.com/cooperbold/cooper-bold-logo-soup/releases/download/v1.1.6/cooper-bold-logo-soup-1.1.6.zipWordPress plugin that wraps @sanity-labs/logo-soup for harmonious partner/client logo displays. Built for sites like RapidSOS and distributed as a free Cooper Bold plugin.
What it does
Cooper Bold Logo Wrangler normalizes logo visuals so mixed brand assets look balanced together. It measures each image, detects visual weight and density, and scales logos to a harmonious strip. It is not a scrolling marquee.
Plugin architecture
| Layer | Choice |
|---|---|
| Normalization engine | @sanity-labs/logo-soup (MIT) |
| Block editor | Gutenberg block built with @wordpress/scripts |
| Frontend | React hydration via src/view.js + dynamic PHP render |
| Shortcode | [logo_wrangler] sharing the same renderer and view script |
| Asset loading | View script enqueued only when block/shortcode renders |
The React component is bundled rather than ported to vanilla JS to preserve upstream behavior with minimal maintenance.
Requirements
- WordPress 6.4+
- PHP 7.4+
- Node.js 18+ (development builds only)
Install
Site install (built assets included)
- Copy the plugin folder to
wp-content/plugins/cooper-bold-logo-wrangler/. - Activate Cooper Bold Logo Wrangler in Plugins.
Development
cd wp-content/plugins/cooper-bold-logo-wrangler
npm install
npm run build # production
npm run start # watch mode
Local testing with wp-env
Requires Docker Desktop (or another Docker engine wp-env can use).
Path with spaces: @wordpress/env breaks when the repo directory name contains spaces. This checkout uses a no-spaces symlink in .wp-env.json. On your machine, create the same link once (adjust if your clone lives elsewhere):
ln -sfn "/path/to/Cooper Bold Logo Wrangler WP Plugin" "/path/to/cooper-bold-logo-wrangler-wp-plugin"
Or clone the repo into a directory without spaces and set "plugins": [ "." ] in .wp-env.json.
npm ci
npm run build
npm run wp-env:start
- Site: http://localhost:8888
- Admin: http://localhost:8888/wp-admin — user
admin, passwordpassword - Activate Cooper Bold Logo Wrangler on the Plugins screen, then create a page and insert the Cooper Bold Logo Wrangler block to smoke-test the strip.
Stop the environment:
npm run wp-env:stop
Reset containers and volumes: npm run wp-env:clean.
Usage
Logo Collections (recommended)
- In wp-admin, open Cooper Bold Logo Wrangler → Add New.
- Name the collection (e.g. "Homepage Partners"), add logos from the Media Library, and tune normalization settings.
- Publish the collection.
- Copy the shortcode from the collection editor or list table, or pick the collection in the block sidebar.
[logo_wrangler collection="homepage-partners"]
[logo_wrangler id="123"]
Collections are the primary workflow for Bricks and other page builders — no hand-built logo URL strings.
Gutenberg block
- Insert the Cooper Bold Logo Wrangler block (
cooper-bold/logo-wrangler). - Choose a collection from the sidebar, or click Add logos for a one-off strip.
- Adjust normalization and layout in the block sidebar (manual mode only).
Shortcode
[logo_wrangler collection="homepage-partners"]
[logo_wrangler id="123" gap="32"]
Legacy inline logos still work:
[logo_wrangler logos="/wp-content/uploads/acme.svg|Acme,/wp-content/uploads/globex.svg|Globex" gap="28" base_size="48"]
Shortcode attributes
| Attribute | Default | Description |
|---|---|---|
collection |
(empty) | Collection slug (from the collection post slug) |
id |
(empty) | Collection post ID |
logos |
(empty) | Comma-separated url\|alt\|link chunks (legacy / one-off) |
base_size |
collection default | Target logo height in px |
scale_factor |
collection default | Normalization strength (0–1) |
contrast_threshold |
collection default | Background detection sensitivity |
density_aware |
collection default | Adjust for visual density |
density_factor |
collection default | Density adjustment strength |
crop_to_content |
collection default | Crop to detected content bounds |
background_color |
collection default | CSS color for measurement context |
align_by |
collection default | bounds, visual-center, visual-center-x, visual-center-y |
gap |
collection default | Spacing between logos in px |
class |
(empty) | Extra CSS class on the wrapper |
When collection or id is set, logos and defaults come from the collection. Explicit shortcode attributes override collection settings.
RapidSOS example
Create a Logo Collection in wp-admin for partner logos, then drop the shortcode into a Bricks Shortcode element:
[logo_wrangler collection="rapidsos-partners"]
Optional overrides: [logo_wrangler collection="rapidsos-partners" base_size="40" gap="32" class="rapidsos-partner-logos"]
Project layout
cooper-bold-logo-wrangler.php # Plugin bootstrap
includes/ # PHP classes (assets, collections, renderer, shortcode)
admin/ # Collection editor JS/CSS (wp-admin)
src/block/ # Gutenberg block source
src/view.js # Frontend React mount script
build/ # Compiled JS/CSS (generated)
readme.txt # WordPress.org readme
Releasing to WordPress.org
Deployments run automatically from main when you push a semver tag (v1.0.0, v1.0.1, …) or publish a GitHub Release (not a pre-release). The workflow uses 10up/action-wordpress-plugin-deploy and respects .distignore so dev scaffolding never ships to SVN.
Before the plugin is approved
The workflow is safe to merge before WordPress.org grants SVN access. Until approval, runs will fail at the SVN step — that is expected. After approval, add the secrets below and cut a tag to deploy.
New plugin submission: WordPress.org plugin developer handbook.
GitHub secrets (repository → Settings → Secrets and variables → Actions)
| Secret | Value |
|---|---|
SVN_USERNAME |
Your WordPress.org username |
SVN_PASSWORD |
A WordPress.org application password (not your login password) |
Do not commit these values. Each secret is write-once in GitHub; you cannot view them again after saving.
Cut a release
- Bump the version in three places so they stay aligned:
cooper-bold-logo-wrangler.phpplugin headerVersion:andCB_LW_VERSIONreadme.txtStable tag:and changelog sectionsrc/block/block.jsonversion(rebuild updatesbuild/block/block.json)
- Commit on
main:git commit -m "chore: release 1.0.1" - Tag and push:
git tag v1.0.1 git push origin main git push origin v1.0.1 - Watch Actions → Deploy to WordPress.org on GitHub.
Tag convention: v + semver (v1.0.0). The tag name becomes the WordPress.org plugin version tag in SVN.
What ships to WordPress.org
Included: cooper-bold-logo-wrangler.php, includes/, build/, readme.txt, LICENSE.
Excluded (via .distignore): src/, node_modules/, AI/wiki docs, .cursor/, SimpleMem, npm manifests, and other dev-only files. CI runs npm ci && npm run build before deploy so build/ is fresh even though compiled assets are also committed on main.
WordPress.org assets (banners, icons, screenshots)
Add images under .wordpress-org/ in the repo root. The deploy action copies that folder to the SVN assets/ directory (not plugin trunk). See 10up’s asset-update action to refresh readme/assets between tagged releases.
WordPress.org release
Automated deploy runs on tags matching v* (see .github/workflows/deploy.yml). Before the first deploy:
- Complete docs/WORDPRESS-ORG-SUBMISSION.md — submit the plugin ZIP, pass review, receive SVN access.
- Add GitHub repository secrets
SVN_USERNAMEandSVN_PASSWORD(wordpress.org application password). - Tag from
mainafternpm run build:
git tag -a v1.0.0 -m "Release 1.0.0"
git push origin v1.0.0
Pre-approval: The first listing requires manual WordPress.org review. Automated SVN deploy only works after your plugin is approved and secrets are set.
Build a local submission ZIP (respects .distignore):
./scripts/build-release-zip.sh
Plugin Check: On a staging site, install the Plugin Check plugin and scan the release ZIP before tagging.
License
- Plugin: GPL-2.0-or-later (WordPress.org compatible)
- Upstream
@sanity-labs/logo-souplibrary: MIT (GPL-compatible)
Credits
- Sanity Labs Logo Soup
- The Logo Soup Problem — background on the normalization approach
Releases
1 release. Each count is every asset in that release; expand a row for the breakdown.