PHPackages                             artetecha/wordpress-upsun-starter - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. artetecha/wordpress-upsun-starter

ActiveProject

artetecha/wordpress-upsun-starter
=================================

A deploy-ready Composer WordPress for Upsun, pre-wired with the upsun-wp mu-plugin: environment awareness, safe preview clones, deploy migrations, router-cache friendliness, and a wp upsun CLI.

0.1.1(1mo ago)01MITShellPHP &gt;=8.2CI failing

Since Jul 13Pushed 1mo agoCompare

[ Source](https://github.com/artetecha/wordpress-upsun-starter)[ Packagist](https://packagist.org/packages/artetecha/wordpress-upsun-starter)[ Docs](https://upsun.artetecha.com/)[ RSS](/packages/artetecha-wordpress-upsun-starter/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (7)Versions (7)Used By (0)

wordpress-upsun-starter
=======================

[](#wordpress-upsun-starter)

A deploy-ready, Composer-managed WordPress for [Upsun](https://upsun.com), pre-wired with the [upsun-wp mu-plugin](https://github.com/artetecha/upsun-wp)— environment awareness, router-cache friendliness, safe preview clones, deploy migrations, Upsun-specific health checks, and a `wp upsun` CLI.

**Plugin site &amp; docs: [upsun.artetecha.com](https://upsun.artetecha.com/)**

What you get
------------

[](#what-you-get)

- **Composer owns everything**: WordPress core (`johnpbloch/wordpress-core`), plugins and themes from [wpackagist](https://wpackagist.org), the filesystem read-only in production. Redis object cache pre-wired (service, drop-in, per-environment key prefix).
- **The upsun-wp plugin, correctly installed**: staged into `composer-mu-plugins/` and copied into the build by `postbuild` (Composer's alphabetical install order would otherwise let the core extraction delete it), loader shim in place, migrations directory wired. Pinned at `^1.0`, whose [public API is frozen](https://github.com/artetecha/upsun-wp/blob/main/docs/api-reference.md#deprecation-policy)— every `1.x` release is a safe `composer update`, and the filters you write in `mu-plugins/site-config.php` keep working.
- **Safe previews out of the box**: every non-production environment intercepts outbound mail, forces WooCommerce Stripe into test mode, pauses webhooks, and sends noindex — with a sanitize flow triggered from the post\_deploy hook after every clone and data sync. Declare your sanitization policy in one line ([scripts/post-deploy.sh](scripts/post-deploy.sh)).
- **Deploy migrations**: ordered, once-per-database PHP files in [migrations/](migrations/README.md), applied by `wp upsun migrate`; a failure aborts the deploy before traffic.
- **Observability**: an "Upsun" dashboard in wp-admin, Upsun-specific Site Health checks, and `wp upsun doctor` / `cache-check` / `mounts` / `relationships --health` for self-service diagnosis.

Quickstart
----------

[](#quickstart)

1. **Get the code** — "Use this template" on GitHub (or `composer create-project artetecha/wordpress-upsun-starter my-site`).
2. **Create the Upsun project**: ```
    upsun project:create --title my-site
    git remote add upsun    # or use the GitHub integration
    git push upsun main
    ```

    The first deploy builds everything; WordPress itself isn't installed yet.
3. **Install WordPress once**: ```
    upsun ssh 'cd wordpress && wp core install \
      --url="$(echo $PLATFORM_ROUTES | base64 -d | php -r "foreach (json_decode(file_get_contents(\"php://stdin\"), true) as \$u => \$r) if ((\$r[\"type\"] ?? \"\") === \"upstream\") { echo \$u; break; }")" \
      --title="My Site" --admin_user=admin --admin_email=you@example.com'
    ```

    (or just pass `--url=https:///` by hand). The generated admin password is printed once — store it.
4. **Verify**: `upsun ssh 'cd wordpress && wp upsun doctor'` — all checks should pass — and open `/wp-admin` → the "Upsun" menu.

Branch away: every environment is a full clone of production, already protected by the preview safeguards.

Where things go
---------------

[](#where-things-go)

```
.upsun/config.yaml   App, services (MariaDB + Redis), routes + cache cookies
composer.json        The site manifest; postbuild copies config + mu-plugins
wp-config.php        Upsun-aware config (relationships via config-reader)
mu-plugins/          Your site code + site-config.php (plugin filter tuning)
migrations/          Once-per-database deploy migrations
scripts/             deploy.sh, post-deploy.sh + vendor-update.sh (premium updates)
private-packages/    Vendored premium plugins/themes (Composer path packages)
wordpress/           Build output - gitignored, never edit by hand

```

Site-specific behavior belongs in [mu-plugins/site-config.php](mu-plugins/site-config.php)via the plugin's filters — never by forking the plugin. If you change the route cache cookies in `.upsun/config.yaml`, mirror them there too.

Vendoring premium plugins
-------------------------

[](#vendoring-premium-plugins)

Premium plugins and themes can't self-update on a read-only filesystem, so they're committed as Composer **path packages** under `private-packages/`(`plugins//` and `themes//`, each a full source tree plus a generated `composer.json`). The two `path` repositories and this convention are already wired in `composer.json`.

**Onboard one** with the upsun-wp CLI, from a checkout that has the plugin installed:

```
wp upsun vendor learnpress-stripe --to=private-packages/plugins --vendor=private-plugin
# then require it pinned to "*", so the vendored composer.json owns the version:
composer require "private-plugin/learnpress-stripe:*"
```

**Keep them current** with `scripts/vendor-update.sh`, which drives the engine on a licensed Upsun environment so the authenticated download is resolved from the site's own state (the WordPress update transient, or a vendor's DB registration) — the license token never leaves the container:

```
UPSUN_PROJECT= scripts/vendor-update.sh check          # pending updates
UPSUN_PROJECT= scripts/vendor-update.sh update   # re-vendor in place, then commit
```

Running Eduma / thim-core / LearnPress? Nothing extra to require — upsun-wp 0.6+ ships a built-in ThimPress fetcher that auto-detects thim-core.

Automate it with [.github/workflows/vendor-update.yml](.github/workflows/vendor-update.yml): a scheduled job that opens one `vendor/` PR per available update (each human-merged, since merging deploys production). Its header documents the one-time repo variables/secrets (`UPSUN_PROJECT`, `UPSUN_CLI_TOKEN`, `BOT_PAT`).

Local development
-----------------

[](#local-development)

Off Upsun the plugin fully no-ops. Point `wp-config-local.php` (project root, gitignored) at your local database and serve `wordpress/` however you prefer.

License
-------

[](#license)

MIT © [Vince Russo](https://artetecha.com)

###  Health Score

36

—

LowBetter than 79% of packages

Maintenance92

Actively maintained with recent releases

Popularity1

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity40

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

2

Last Release

48d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/6cf500d2b83cf83c3b70e9acc14802022af87bc6191da159c7f3d6af3cc09d22?d=identicon)[vincenzo](/maintainers/vincenzo)

---

Top Contributors

[![vincenzo](https://avatars.githubusercontent.com/u/76583?v=4)](https://github.com/vincenzo "vincenzo (12 commits)")

### Embed Badge

![Health badge](/badges/artetecha-wordpress-upsun-starter/health.svg)

```
[![Health](https://phpackages.com/badges/artetecha-wordpress-upsun-starter/health.svg)](https://phpackages.com/packages/artetecha-wordpress-upsun-starter)
```

###  Alternatives

[johnpbloch/wordpress

WordPress is open source software you can use to create a beautiful website, blog, or app.

64410.0M946](/packages/johnpbloch-wordpress)[helsingborg-stad/municipio

A bootstrap theme for creating municipality sites.

4028.8k10](/packages/helsingborg-stad-municipio)[october/rain

October Rain Library

1611.7M109](/packages/october-rain)[drupal/recommended-project

Project template for Drupal projects with a relocated document root

1623.0M1](/packages/drupal-recommended-project)[pressbooks/pressbooks

Pressbooks is an open source book publishing tool built on a WordPress multisite platform. Pressbooks outputs books in multiple formats, including PDF, EPUB, web, and a variety of XML flavours, using a theming/templating system, driven by CSS.

45945.2k1](/packages/pressbooks-pressbooks)[mediawiki/maps

Adds various mapping features to MediaWiki

84157.7k3](/packages/mediawiki-maps)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
