5.3 KiB
name, category, description
| name | category | description |
|---|---|---|
| woocommerce-headless-setup | devops | Deploy WordPress + WooCommerce via Docker, automatically configure HTTPS with Caddy, and programmatically generate WooCommerce REST API keys without accessing the WP Admin UI. |
Headless WooCommerce Setup & API Key Generation
This skill provides a fully automated, UI-free method to deploy a secure WooCommerce store and extract its REST API credentials (Consumer Key & Secret). This is especially useful when spinning up stores for ERP integrations (like AtomK) or testing, completely bypassing the need for brittle browser automation (Playwright/DrissionPage).
1. Docker Compose Stack
Use Caddy for zero-config HTTPS.
Pitfall: When using the official wordpress:cli image alongside the wordpress image, you might encounter a no matching entries in passwd file error if you specify user: xfs. Use user: "33:33" (the www-data user/group) to ensure WP-CLI has the correct permissions to write to the shared /var/www/html volume.
# docker-compose.yml
services:
caddy:
image: caddy:latest
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
depends_on:
- wordpress
db:
image: mariadb:10.6
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: secretrootpassword
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppassword
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress:latest
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppassword
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
depends_on:
- db
wpcli:
image: wordpress:cli
user: "33:33"
command: tail -f /dev/null
volumes:
- wp_data:/var/www/html
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppassword
WORDPRESS_DB_NAME: wordpress
depends_on:
- db
- wordpress
volumes:
caddy_data:
caddy_config:
db_data:
wp_data:
# Caddyfile
example.com {
reverse_proxy wordpress:80
}
2. Automated Installation via WP-CLI
Once containers are running (docker compose up -d), execute the installation:
# Install WordPress Core
docker compose exec wpcli wp core install \
--url=https://example.com \
--title="My Store" \
--admin_user=admin \
--admin_password="password123!" \
--admin_email=admin@example.com \
--skip-email
# Install WooCommerce and Theme
docker compose exec wpcli wp plugin install woocommerce --activate
docker compose exec wpcli wp theme install storefront --activate
3. Programmatic API Key Generation
Generating WooCommerce API keys usually requires clicking through the web UI. You can completely bypass this by injecting the keys directly into the database using a PHP script executed via wp eval-file.
Create create_wc_key.php:
<?php
// Ensure this runs in WP context
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $wpdb;
$username = 'admin'; // MUST match your --admin_user
$user = get_user_by( 'login', $username );
if ( ! $user ) { die("User not found\n"); }
// Generate WooCommerce API key pair
$consumer_key = 'ck_' . wc_rand_hash();
$consumer_secret = 'cs_' . wc_rand_hash();
$data = array(
'user_id' => $user->ID,
'description' => 'Auto-generated API Key',
'permissions' => 'read_write',
'consumer_key' => wc_api_hash( $consumer_key ),
'consumer_secret' => $consumer_secret,
'truncated_key' => substr( $consumer_key, -7 )
);
$wpdb->insert(
$wpdb->prefix . 'woocommerce_api_keys',
$data,
array('%d', '%s', '%s', '%s', '%s', '%s')
);
echo "CONSUMER_KEY:" . $consumer_key . "\n";
echo "CONSUMER_SECRET:" . $consumer_secret . "\n";
Execution
The file must be accessible inside the container's file system (e.g., mapped via the wp_data volume).
# Copy into the shared docker volume
sudo cp create_wc_key.php /var/lib/docker/volumes/<project>_wp_data/_data/
# Execute via wp-cli
docker compose exec wpcli wp eval-file create_wc_key.php
4. Programmatic Application Password Generation
If you need a standard WordPress Application Password (e.g., for REST API integration that isn't WooCommerce-specific), you can generate one instantly via WP-CLI:
# Outputs only the raw password (e.g., kYdQ y7ei zea7 fwaL 8Cg6 qEEd)
docker compose exec wpcli wp user application-password create admin "My App Name" --porcelain
Pitfalls & Lessons Learned
- Local Port Conflicts: If running on a VM, an existing web server (like Nginx/Apache) might be binding ports 80/443. Check with
sudo lsof -i :80. Stop and disable it (sudo systemctl stop nginx && sudo systemctl disable nginx) before starting Caddy. - Background Startup: When running
docker compose up -din automation, ensure it is run as a background task (background=true) or it will hang the execution context. - Avoid UI Automation for Setup: Bypassing the WordPress Admin UI for configuration is vastly superior, significantly faster, and far more stable than trying to use headless browsers to click through setup wizards.