Custom WordPress theme powering 180c.fr, the website of 180°C, an independent French food magazine: editorial content, a recipe library, a WooCommerce store and paid subscriptions. It also serves the REST API used by the 180°C iOS and Android apps.
- Editor-driven layouts: classic PHP templates with an ACF Flexible Content page builder for the home page and landing pages.
- App-ready API:
180c/v1REST namespace (auth, favorites, recipes, push, newsletter) consumed by the native apps via JWT. - Native SEO: meta tags, JSON-LD (
Article,Recipe,Product,FAQPage,VideoObject), sitemap andllms.txt, without any SEO plugin. - Privacy by design: in-house consent banner; GA4 and Umami load only after consent.
- Push notifications: OneSignal for mobile and web, including automated sends on recipe publication.
- Hardening in code: rate limiting, security headers, and TOTP two-factor authentication for the admin account.
| Layer | Technology |
|---|---|
| CMS | WordPress 6.4+, PHP 8.3+ |
| Commerce | WooCommerce, WooCommerce Subscriptions, WooCommerce Memberships |
| Content model | ACF Pro, versioned as Local JSON in acf-json/ |
| Front end | Vite 6, Tailwind CSS v4 (CSS-first), vanilla ES modules, BEM |
| Integrations | Stripe, PayPal, Mailchimp, OneSignal, Simple JWT Login |
| Quality | PHPCS + WordPress Coding Standards, ESLint, Stylelint |
Requirements: PHP 8.3+, Composer, Node 24+, a local WordPress install with the plugins above.
cd wp-content/themes
git clone https://github.com/nearmint/180c-theme.git
cd 180c-theme
composer install
npm install
npm run buildThen activate 180°C in Appearance › Themes. ACF field groups sync from acf-json/.
npm run dev # Vite dev server
npm run build # production build to dist/
npm test # build + JS unit tests
composer lint # PHPCS / WPCS
npm run lint # ESLint + StylelintConventions:
- PHP functions and options are prefixed
_180c_; the text domain is180c. - One feature per file under
inc/, loaded frominc/bootstrap.php. - CSS follows strict BEM on top of design tokens.
- Commits follow Conventional Commits;
mainis merged with--no-ffonly.
Every push to main triggers .github/workflows/deploy.yml: PHP lint, build, artifact checks, then SFTP upload of the theme to production. lint.yml runs PHPCS on PHP 8.3 and 8.5 for main and develop.
inc/ PHP features: blocks, REST API, SEO, WooCommerce, auth, push, analytics
src/ CSS and JS sources, compiled by Vite
parts/ Template parts
woocommerce/ WooCommerce template overrides
acf-json/ ACF field groups (Local JSON)
mu-plugins/ Must-use plugin sources, installed manually (not deployed)
tools/ CI checks (REST argument validation)
Further reading: CLAUDE.md for architecture rules, mu-plugins/README.md for must-use plugins.