WordPress Trade Site Builder

SkillDB 作者 ipythoning v1.0.1

Interactive guide to deploy a production-ready WordPress site for international trade businesses. Triggers on "build a trade website", "deploy wordpress trade site", "set up B2B website", or similar requests.

源码 ↗

安装 / 下载方式

TotalClaw CLI推荐
totalclaw install skilldb:ipythoning~wordpress-trade-site
cURL直接下载,无需登录
curl -fsSL https://skills.taituai.com/api/skills/skilldb%3Aipythoning~wordpress-trade-site/file -o wordpress-trade-site.md
Git 仓库获取源码
git clone https://github.com/openclaw/skills/commit/9e3ae7e6424c02b631ae973b02d9e37a07497042
# WordPress Trade Site Builder

Deploy a production-ready WordPress trade site from scratch through 9 interactive phases. Based on the [wordpress-trade-starter](https://github.com/iPythoning/wordpress-trade-starter) template.

**Principle:** Automate everything possible. Only pause when user decisions or information are required. When errors occur, diagnose and fix them proactively — don't tell the user to go fix things themselves.

**Interaction:** Use `AskUserQuestion` for all user-facing questions. Report progress after each phase, then continue to the next.

**Data flow:** Information collected in each phase (business info, SSH details, domain, etc.) is reused in subsequent phases. Key data is labeled with variable names for reference.

---

## Phase 1: Collect Business Information

Before any technical work, understand the user's business needs.

AskUserQuestion (collect sequentially):

1. **Company name** — "What is your company name? (Both local language and English)"
   - Example: TitanPuls Technology Co., Ltd.
   - Record as `COMPANY_EN` (and `COMPANY_LOCAL` if provided)

2. **Main products** — "What products do you mainly sell? (Brief description)"
   - Example: Semi-trailers, construction machinery
   - Record as `PRODUCTS`

3. **Target markets** — "Which markets do you primarily target?" (multiSelect)
   - Africa
   - Middle East
   - Southeast Asia
   - Latin America
   - Europe
   - North America
   - Record as `TARGET_MARKETS`

4. **Languages** — "Which languages should your website support?" (multiSelect, recommend based on target markets)
   - English (Recommended)
   - Chinese
   - Russian
   - Spanish
   - French
   - Arabic
   - Record as `LANGUAGES`

5. **Contact info** — "How should customers reach you?"
   - WhatsApp number (with country code)
   - Business email
   - Record as `WHATSAPP` and `EMAIL`

Summary confirmation: Display collected information and AskUserQuestion to confirm correctness.

---

## Phase 2: Server Preparation

### 2a. Server status

AskUserQuestion: "Do you already have a Linux server?"
- **I have a server** — Collect SSH details
- **I need guidance** — Recommend datacenter locations and providers based on `TARGET_MARKETS`

**Purchase guidance** (if needed):

Recommend based on target market:
| Target Market | Recommended DC | Recommended Providers |
|--------------|----------------|----------------------|
| Europe/Africa | Germany/Netherlands | Contabo, Hetzner |
| North America | US East/West Coast | DigitalOcean, Vultr |
| Southeast Asia | Singapore | Vultr, Alibaba Cloud |
| Middle East | Dubai/Bahrain | AWS, Alibaba Cloud |
| Latin America | US Miami | DigitalOcean |

Recommended specs: 2 cores / 2GB RAM / 40GB SSD ($10-20/month). Tell user to continue after purchase.

### 2b. SSH connection

AskUserQuestion: "Please provide your server SSH details:"
- IP address → `SERVER_IP`
- SSH port (default 22) → `SSH_PORT`
- Username (usually root) → `SSH_USER`
- Authentication: password or SSH key

Verify connection:

```bash
ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no -p ${SSH_PORT} ${SSH_USER}@${SERVER_IP} "echo CONNECTION_OK && uname -a && free -m && df -h /"
```

- CONNECTION_OK → Continue
- Connection failed → Check IP/port/credentials, prompt user to correct

### 2c. Server initialization

Execute via SSH:

```bash
# System update
apt update && apt upgrade -y

# Set timezone
timedatectl set-timezone UTC

# Create swap (if RAM <= 2GB and no swap exists)
if [ $(free -m | awk '/^Mem:/{print $2}') -le 2048 ] && [ ! -f /swapfile ]; then
    fallocate -l 2G /swapfile
    chmod 600 /swapfile
    mkswap /swapfile
    swapon /swapfile
    echo '/swapfile none swap sw 0 0' >> /etc/fstab
fi

# Firewall
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable

# Essential tools
apt install -y curl git unzip htop
```

Verify: `ufw status` shows 22/80/443 open.

---

## Phase 3: Docker Deployment

### 3a. Install Docker

```bash
if ! command -v docker &>/dev/null; then
    curl -fsSL https://get.docker.com | sh
    systemctl enable docker && systemctl start docker
fi
docker compose version || apt-get install -y docker-compose-plugin
```

Verify: `docker compose version` outputs a version number.

### 3b. Clone template

```bash
cd /opt
git clone https://github.com/iPythoning/wordpress-trade-starter.git wordpress
cd /opt/wordpress
```

### 3c. Generate .env

AskUserQuestion: "Please provide the following:"
- Domain name (e.g. example.com) → `DOMAIN`
- MySQL root password (auto-generate recommended) → `MYSQL_ROOT_PASSWORD`
- MySQL user password (auto-generate recommended) → `MYSQL_PASSWORD`

If user chooses auto-generation:
```bash
MYSQL_ROOT_PASSWORD=$(openssl rand -base64 16)
MYSQL_PASSWORD=$(openssl rand -base64 16)
```

Write .env:
```bash
cat > /opt/wordpress/.env << EOF
MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=${MYSQL_PASSWORD}
DOMAIN=${DOMAIN}
EMAIL=${EMAIL}
EOF
```

**Important:** Display the generated passwords to the user and remind them to save securely.

### 3d. Configure Nginx

```bash
sed -i "s/YOUR_DOMAIN/${DOMAIN}/g" /opt/wordpress/nginx.conf
```

### 3e. Start containers

```bash
cd /opt/wordpress
docker compose up -d
```

Verify:
```bash
docker compose ps
# Confirm all three containers (db, wordpress, nginx) are running/healthy
```

Wait for WordPress to be ready:
```bash
for i in $(seq 1 30); do
    curl -sf http://localhost > /dev/null 2>&1 && break
    sleep 2
done
```

- All 3 containers running → Continue
- db unhealthy → Check `docker compose logs db`, common cause is password format issues
- wordpress not starting → Check `docker compose logs wordpress`

---

## Phase 4: SSL Certificate

### 4a. Choose method

AskUserQuestion: "Which SSL certificate method?"
- **Let's Encrypt (Recommended)** — Free, auto-renewal, requires domain A record pointing to server IP
- **Cloudflare Origin Certificate** — For users already using Cloudflare proxy

### 4b-A. Let's Encrypt

Prerequisite: Domain A records must point to `SERVER_IP`. If not configured, guide the user to add in their DNS panel:
- `DOMAIN` → A → `SERVER_IP`
- `www.DOMAIN` → A → `SERVER_IP`

```bash
# Stop nginx to free port 80
cd /opt/wordpress && docker compose stop nginx

apt install -y certbot
certbot certonly --standalone -d ${DOMAIN} -d www.${DOMAIN} --email ${EMAIL} --agree-tos --non-interactive

mkdir -p /opt/wordpress/ssl
cp /etc/letsencrypt/live/${DOMAIN}/fullchain.pem /opt/wordpress/ssl/
cp /etc/letsencrypt/live/${DOMAIN}/privkey.pem /opt/wordpress/ssl/

# Auto-renewal cron
(crontab -l 2>/dev/null; echo "0 3 * * * certbot renew --quiet --pre-hook 'cd /opt/wordpress && docker compose stop nginx' --post-hook 'cp /etc/letsencrypt/live/${DOMAIN}/fullchain.pem /opt/wordpress/ssl/ && cp /etc/letsencrypt/live/${DOMAIN}/privkey.pem /opt/wordpress/ssl/ && cd /opt/wordpress && docker compose start nginx'") | crontab -

# Restart nginx
docker compose start nginx
```

### 4b-B. Cloudflare Origin Certificate

Guide the user through Cloudflare Dashboard:
1. SSL/TLS → Origin Server → Create Certificate
2. Choose RSA, 15-year validity
3. Copy Certificate and Private Key

```bash
mkdir -p /opt/wordpress/ssl
# User pastes certificate content
cat > /opt/wordpress/ssl/fullchain.pem << 'EOF'
<user pastes certificate here>
EOF
cat > /opt/wordpress/ssl/privkey.pem << 'EOF'
<user pastes private key here>
EOF
```

### 4c. Verify HTTPS

```bash
docker compose restart nginx
curl -I https://${DOMAIN} 2>/dev/null | head -5
```

- HTTP/2 200 → Success
- Connection failed → Check DNS resolution, certificate paths, nginx logs

---

## Phase 5: WordPress Initialization

### 5a. Setup wizard

Tell the user to open `https://${DOMAIN}/wp-admin/install.php` in their browser and fill in:
- Site Title: `COMPANY_EN`
- Username: suggest avoiding "admin" (security)
- Password: strong password
- Email: `EMAIL`

AskUserQuestion: "Have you completed the WordPress setup wizard?"

### 5b. Insta