Skip to content

WordPress Plugin

Loopress ships as a single WordPress plugin, built in two editions from the same codebase. Both are free:

Loopress Full is not a paid upgrade. It is distributed outside WordPress.org because the directory guidelines forbid installing code from Packagist and deploying PHP into another plugin, see About WordPress.org-hosted plugins. Installing Loopress Full deactivates Loopress Light automatically: it is a full replacement, not an add-on, and the two editions never run side by side.

Feature Loopress Light Loopress Full
Distribution WordPress.org directory loopress.dev
Automatic updates ✓ (via WordPress.org) ✓ (via GitHub Releases)
ACF sync (field groups, post types, taxonomies, options pages) ✓ ✓
lps acf pull / push / list ✓ ✓
Form sync (WPForms) ✓ ✓
lps form pull / push / list ✓ ✓
Menu sync (nav menus and the active theme’s menu locations) ✓ ✓
lps menu pull / push / list / diff ✓ ✓
Custom post types declared as JSON files ✓ ✓
lps cpt pull / push / list / rm / diff ✓ ✓
Taxonomies declared as JSON files (never their terms) ✓ ✓
lps taxonomy pull / push / list / rm / diff ✓ ✓
Post meta keys declared as JSON files (never their values) ✓ ✓
lps meta pull / push / list / rm / diff ✓ ✓
User roles declared as JSON files (never which users have them) ✓ ✓
lps role pull / push / list / rm / diff ✓ ✓
Option tracking (individual wp_options rows you choose) ✓ ✓
lps option add / pull / push / list / remove / diff ✓ ✓
Theme styles (block theme Global Styles, through WordPress core’s own REST API) ✓ ✓
Snippet sync (Code Snippets / WPCode) ✓
lps snippet pull / push / list ✓
Custom API routes (deploy REST endpoints from PHP files) ✓
lps api pull / push / list ✓
Hooks (WordPress actions, filters and cron jobs deployed from PHP files) ✓
lps hook pull / push / list / rm ✓
Dynamic blocks (server-rendered block.json + render.php folders, placed with wp:loopress/<slug>) ✓
lps block pull / push / list / rm ✓
Static pages (hand-written HTML pages rendered by the theme) ✓
lps page push / list / diff ✓
Block patterns (HTML files, included in pages, templates and parts with wp:pattern) ✓
lps pattern pull / push / list / rm / diff ✓
Single-page apps (ship a built Vue, React or Svelte bundle, mount with a shortcode) ✓
lps app pull / push / list / remove ✓
Plugin and theme lockfile (pin WordPress.org plugins and themes, install via Composer + WPackagist) ✓
lps plugin / lps theme pull / add (WordPress core routes, or loopress.json only) ✓ ✓
lps plugin / lps theme push / status ✓
Composer dependency management (Packagist search, install, remove, update) ✓
Security audit (known CVEs, abandoned packages) ✓
Platform diagnostics (PHP version mismatches) ✓
lps composer push / pull ✓
Crash reporting (opt-in, Sentry) ✓
Anonymous usage statistics (opt-out) ✓
  • ACF sync: field groups, post types, taxonomies, and options pages as JSON with lps acf pull/push. Requires ACF active on the site, options pages require ACF PRO
  • Form sync: pull and push WPForms forms as JSON with lps form pull/push
  • Menu sync: nav menus and the active theme’s menu locations with lps menu pull/push
  • Custom post types: post types declared as cpt/<slug>.json files, registered by the plugin, with lps cpt pull/push
  • Taxonomies: taxonomies declared as taxonomies/<slug>.json files, attached to post types, with lps taxonomy pull/push. Terms stay content
  • Post meta: meta keys declared per post type as meta/<post-type>.json files, with their type, default and REST exposure, with lps meta pull/push. Values stay content
  • Roles: custom user roles and their capabilities declared as roles/<slug>.json files, with lps role pull/push. Which users have them stays content
  • Option tracking: the individual wp_options rows you choose, with lps option add/pull/push
  • Theme styles: the active block theme’s Global Styles with lps theme style pull/push, through WordPress core’s own REST API
  • REST API for the CLI: everything runs over loopress/v1, restricted to the manage_options capability (administrator role)

Everything in Loopress Light, plus:

  • Snippet sync: pull the site’s snippets as files with lps snippet pull, push edits back with lps snippet push, for whichever of Code Snippets or WPCode is active
  • Hooks: WordPress actions, filters and cron jobs deployed from PHP files with lps hook push
  • Dynamic blocks: server-rendered blocks with their own CSS and JS, one block.json + render.php folder each, deployed with lps block push
  • Custom API routes: REST API endpoints as plain PHP files with lps api push, each file becomes one route
  • Static pages: hand-written HTML files pushed as WordPress pages with lps page push, rendered inside the active theme and locked against edits in wp-admin, plus block templates and parts in a child theme
  • Block patterns: groups of blocks as patterns/<slug>.html files with lps pattern push, referenced from pages, templates and parts so one change updates them all
  • Single-page apps: a pre-built Vue, React or Svelte bundle shipped with lps app push and mounted in any page with a shortcode
  • Plugin and theme lockfile: pin WordPress.org plugins and themes in loopress.json and install the identical set on every environment with lps plugin push / lps theme version push, via Composer and WPackagist
  • Dependency management: search, install, remove and update Composer packages from Packagist in the admin, or sync composer.json with lps composer push/pull
  • Security audit: surfaces known CVEs and abandoned packages among your installed dependencies
  • Platform diagnostics: catches PHP version mismatches before they cause a broken install
  • Crash reporting: opt-in banner to send Loopress’s own errors to Sentry so bugs get fixed faster, no data from your theme, other plugins, or site visitors is included. The Settings tab lets you change your answer anytime, or reset all Loopress settings to default
  • Usage statistics: at most twice a day, an anonymous ping tells Loopress the site is active. It carries a random identifier generated by the plugin, the Loopress, WordPress and PHP versions, the site language, its timezone, and its environment type (wp_get_environment_type()). Never the site URL, an email address, content, or the plugin list, and the IP address is not stored. On by default and announced in a wp-admin notice right after activation, with Keep it on and Turn it off buttons. Change your answer anytime under Settings → Send anonymous usage statistics. Loopress Light never sends it

Loopress Full stores your project’s Composer dependencies in wp-content/loopress/, separate from the plugin itself, so they survive plugin updates.

Plugins listed on the WordPress.org Plugin Directory go through a review by the WordPress.org plugins team before their first release, and every update is scanned afterward. In exchange, a hosted plugin gets:

  • Discoverability: found by searching Plugins → Add New from inside any WordPress admin, no external download needed
  • Automatic updates: WordPress checks WordPress.org for new versions and can update the plugin in place, the same as any other installed plugin
  • A trust signal: install counts, ratings, and a public source history are visible to anyone considering the plugin

The tradeoff is a strict set of guidelines, and Loopress ran into two of them:

  • Rule 8 forbids a plugin from sending or installing executable code from a third-party system, which includes package registries such as Packagist. That is exactly what Loopress Full’s Composer dependency management does, so it cannot be hosted on WordPress.org regardless of implementation quality.
  • Separately, the review team classified snippet sync itself, REST endpoints that let arbitrary PHP/JS/CSS be submitted remotely and stored in another plugin (Code Snippets or WPCode) for later execution, as a remote code-deployment mechanism. This holds regardless of the authentication and capability checks in front of those endpoints: they establish who is allowed to call the endpoint, not whether the code submitted through it is safe. Every submission of Loopress Light that shipped snippet sync was rejected on this basis, and a subsequent appeal was rejected too, explicitly and finally.

Loopress Light no longer ships snippet sync as a result: it covers only configuration stored as plain data (ACF, forms, menus, custom post types, taxonomies, post meta, roles, options), with no executable-code angle, and is published on the WordPress.org directory in that form. Theme styles go through WordPress core’s own REST API, so they work with either edition.

This is why the plugin ships as two editions instead of one: Loopress Light is on the WordPress.org directory, installed and updated in place like any other plugin from there. Loopress Full carries both rejected capabilities (Composer and snippet sync), so it is downloaded directly from loopress.dev, but it still updates itself through the normal Plugins page: it checks GitHub Releases for a newer loopress-full.zip and, once found, WordPress downloads and installs it the same way it would a WordPress.org-hosted plugin.

  • WordPress 6.2+
  • PHP 8.2+
  • manage_options capability (administrator role)
  1. In your WordPress admin, go to Plugins → Add New and search for Loopress Light
  2. Click Install Now, then Activate, then find Loopress in the sidebar

Or install it from the WordPress.org page. Either way, updates arrive automatically like any other directory plugin.

  1. Download loopress-full.zip using the button above
  2. In your WordPress admin, go to Plugins → Add New → Upload Plugin
  3. Upload and activate the plugin, then find Loopress in the sidebar

Installing Loopress Full deactivates Loopress Light automatically. From then on, updates show up on Plugins like any other plugin, since Loopress Full checks GitHub Releases for a newer loopress-full.zip and lets WordPress install it in place. The check runs at most twice a day; to look right away, click Check for updates in the header of the Loopress page, or Check again on Dashboard → Updates.

Both editions add a Loopress page to the WordPress admin, with the site’s environment type (production, staging…) shown next to its title. Loopress Light has the first two tabs below; Loopress Full has all five:

  • Overview (the default): what was pushed to this site from your repository, see Push history and drift. Above it, every issue the other tabs raise, so none waits for its tab to be opened: webserver configuration, Composer platform problems and security advisories, code files that failed to load, and Loopress declarations skipped because a theme or plugin registered the same slug first
  • Config: the configuration Loopress syncs, read-only: ACF field groups, post types, taxonomies and options pages, menus, every post type and taxonomy on the site with its source, registered meta keys, every role with its number of users, and forms, each with the command that pulls it. A resource whose plugin isn’t active says so (for example “ACF is not active”).
  • Code: the code deployed with the CLI, read-only: API routes (with a gear to change their namespace), hooks with each cron’s next run, and single-page apps with a copyable shortcode
  • Dependencies: the Composer Admin UI to search, install and remove packages, with the security audit and platform diagnostics shown only when they find something
  • Settings: the API routes namespace, crash reporting, anonymous usage statistics, and a reset of every Loopress setting

Platform and webserver checks also appear in Tools → Site Health.

Administrators also get a Loopress link in the WordPress top bar, on wp-admin and on the site itself. Hovering it shows the plugin version, the environment type, and the last push.

Every successful lps <resource> push (not a dry run) tells the plugin it happened, once per command. The Overview tab lists each pushed resource with:

  • Last push: when, by which WordPress user, and through which application password (its name, e.g. “CI”), so a push from CI is told apart from one from a laptop
  • Status: In sync, or Changed since when the resource changed on the site after that push, outside the CLI (an edit in wp-admin, WP-CLI, another plugin). Run lps diff to see what changed, then pull to keep the change or push again to undo it. Options and theme styles show Not tracked: Loopress can’t fingerprint them.

The last 50 pushes are kept. Before the first push, the tab shows how to connect the CLI, with this site’s URL ready to copy.

Once a resource has been pushed to a site, its own WordPress screens (ACF field groups, post types and taxonomies, Appearance → Menus, WPForms, Code Snippets or WPCode) show a Managed by Loopress notice: changes made there are overwritten by the next push, so make them in the repository instead.

A CLI older than this feature simply doesn’t report its pushes; the rest of the plugin works the same.