SiamCafe · Blog
WordPress Block Theme Remote Work Setup
บทความ

WordPress Block Theme Remote Work Setup

เผยแพร่ 28 พฤษภาคม 2569

WordPress Block Theme Remote Work Setup คืออะไร

WordPress Block Theme Remote Work Setup

WordPress Block Theme คือ theme รุ่นใหม่ที่ใช้ Full Site Editing (FSE) ด้วย block-based templates ให้ความยืดหยุ่นในการออกแบบเว็บไซต์โดยไม่ต้องเขียน code Remote Work Setup คือการจัดสภาพแวดล้อมการทำงานสำหรับทีมที่ทำงานจากระยะไกล การรวมสองแนวคิดนี้ช่วยให้ทีม WordPress developers และ content creators ทำงานร่วมกันได้อย่างมีประสิทธิภาพจากทุกที่ ด้วย version control, staging environments, collaboration tools และ automated deployment pipelines

Remote Development Environment

# remote_dev.py — WordPress remote development setup
import json

class RemoteDevSetup:
    ENVIRONMENTS = {
        "local": {
            "name": "Local Development",
            "tools": ["LocalWP (Local by Flywheel)", "DDEV", "wp-env", "Docker"],
            "purpose": "พัฒนาและทดสอบบนเครื่องตัวเอง",
            "sync": "Git push → staging/production",
        },
        "staging": {
            "name": "Staging Environment",
            "tools": ["WP Engine Staging", "Kinsta Staging", "Custom VPS"],
            "purpose": "ทดสอบก่อน deploy production",
            "sync": "Git merge → auto-deploy staging",
        },
        "production": {
            "name": "Production",
            "tools": ["Managed WordPress hosting", "VPS + CI/CD"],
            "purpose": "เว็บไซต์จริงที่ users เข้าใช้",
            "sync": "Approved merge → deploy production",
        },
    }

    DOCKER_SETUP = """
# docker-compose.yml — WordPress dev environment
version: '3.8'
services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DEBUG: 1
    volumes:
      - ./wp-content/themes/my-block-theme:/var/www/html/wp-content/themes/my-block-theme
      - ./wp-content/plugins:/var/www/html/wp-content/plugins

  db:
    image: mariadb:10.11
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
      MYSQL_ROOT_PASSWORD: rootpassword
    volumes:
      - db_data:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin
    ports:
      - "8081:80"
    environment:
      PMA_HOST: db

volumes:
  db_data:
"""

    def show_environments(self):
        print("=== Development Environments ===\n")
        for key, env in self.ENVIRONMENTS.items():
            print(f"[{env['name']}]")
            print(f"  Tools: {', '.join(env['tools'][:3])}")
            print(f"  Purpose: {env['purpose']}")
            print()

    def show_docker(self):
        print("=== Docker Setup ===")
        print(self.DOCKER_SETUP[:500])

dev = RemoteDevSetup()
dev.show_environments()
dev.show_docker()

Version Control & Collaboration

# git_workflow.py — Git workflow for WordPress teams
import json

class GitWorkflow:
    WORKFLOW = {
        "branching": {
            "name": "Git Branching Strategy",
            "branches": {
                "main": "Production-ready code (protected)",
                "develop": "Integration branch (staging)",
                "feature/*": "New features (feature/add-hero-block)",
                "fix/*": "Bug fixes (fix/header-spacing)",
                "release/*": "Release preparation",
            },
        },
    }

    GITIGNORE = """
# .gitignore — WordPress Block Theme
# WordPress core (don't track)
wp-admin/
wp-includes/
wp-*.php
index.php
license.txt
readme.html

# Uploads (large files)
wp-content/uploads/

# Plugins (manage via composer or separately)
wp-content/plugins/*
!wp-content/plugins/custom-plugin/

# Keep our theme
!wp-content/themes/my-block-theme/

# Dependencies
node_modules/
vendor/

# Environment
.env
.env.local
wp-config-local.php

# Build artifacts
wp-content/themes/my-block-theme/build/
"""

    THEME_STRUCTURE = """
    my-block-theme/
    ├── style.css              # Theme metadata
    ├── theme.json             # Global styles & settings
    ├── functions.php          # Theme functions
    ├── templates/
    │   ├── index.html         # Default template
    │   ├── single.html        # Single post
    │   ├── page.html          # Page template
    │   ├── archive.html       # Archive
    │   ├── 404.html           # 404 page
    │   └── search.html        # Search results
    ├── parts/
    │   ├── header.html        # Header template part
    │   ├── footer.html        # Footer template part
    │   └── sidebar.html       # Sidebar
    ├── patterns/
    │   ├── hero.php           # Hero pattern
    │   └── cta.php            # Call to action
    ├── assets/
    │   ├── css/
    │   └── js/
    └── package.json           # Build tools
    """

    def show_workflow(self):
        print("=== Git Branching ===\n")
        for branch, desc in self.WORKFLOW["branching"]["branches"].items():
            print(f"  [{branch}] {desc}")

    def show_gitignore(self):
        print(f"\n=== .gitignore ===")
        print(self.GITIGNORE[:400])

    def show_structure(self):
        print(f"\n=== Theme Structure ===")
        print(self.THEME_STRUCTURE)

git = GitWorkflow()
git.show_workflow()
git.show_gitignore()
git.show_structure()

CI/CD Pipeline

WordPress Block Theme Remote Work Setup
# cicd.py — CI/CD for WordPress block theme
import json

class WordPressCICD:
    GITHUB_ACTION = """
# .github/workflows/deploy.yml
name: Deploy WordPress Theme
on:
  push:
    branches: [main]
    paths: ['wp-content/themes/my-block-theme/**']

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
      
      - name: Install & Build
        working-directory: wp-content/themes/my-block-theme
        run: |
          npm ci
          npm run build
          npm run lint
      
      - name: PHP Lint
        run: |
          find wp-content/themes/my-block-theme -name '*.php' -exec php -l {} \\;

  deploy-staging:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/develop'
    steps:
      - uses: actions/checkout@v4
      - name: Deploy to Staging
        run: |
          rsync -avz --delete \\
            wp-content/themes/my-block-theme/ \\
            }@}:/var/www/staging/wp-content/themes/my-block-theme/

  deploy-production:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v4
      - name: Deploy to Production
        run: |
          rsync -avz --delete \\
            wp-content/themes/my-block-theme/ \\
            }@}:/var/www/html/wp-content/themes/my-block-theme/
      
      - name: Clear Cache
        run: |
          ssh }@} 'wp cache flush'
"""

    def show_action(self):
        print("=== GitHub Actions Deploy ===")
        print(self.GITHUB_ACTION[:600])

    def deployment_options(self):
        print(f"\n=== Deployment Options ===")
        options = [
            {"method": "rsync + SSH", "complexity": "Low", "best_for": "VPS, dedicated server"},
            {"method": "Git Deploy (WP Engine)", "complexity": "Low", "best_for": "Managed WP hosting"},
            {"method": "GitHub Actions + rsync", "complexity": "Medium", "best_for": "Custom CI/CD"},
            {"method": "Buddy.works", "complexity": "Low", "best_for": "Visual CI/CD pipeline"},
            {"method": "DeployHQ", "complexity": "Low", "best_for": "Simple FTP/SFTP deploy"},
        ]
        for opt in options:
            print(f"  [{opt['method']}] Complexity: {opt['complexity']} | Best for: {opt['best_for']}")

cicd = WordPressCICD()
cicd.show_action()
cicd.deployment_options()

Collaboration Tools

# collaboration.py — Remote team collaboration
import json

class RemoteCollaboration:
    TOOLS = {
        "communication": {
            "name": "Communication",
            "tools": [
                {"name": "Slack", "use": "Daily communication, channels per project"},
                {"name": "Google Meet/Zoom", "use": "Daily standup, code reviews"},
                {"name": "Loom", "use": "Async video updates, demos"},
            ],
        },
        "project_management": {
            "name": "Project Management",
            "tools": [
                {"name": "Linear / Jira", "use": "Task tracking, sprints"},
                {"name": "Notion", "use": "Documentation, wiki, SOPs"},
                {"name": "Figma", "use": "Design collaboration, prototypes"},
            ],
        },
        "development": {
            "name": "Development",
            "tools": [
                {"name": "GitHub / GitLab", "use": "Code hosting, PRs, code reviews"},
                {"name": "VS Code Live Share", "use": "Pair programming remotely"},
                {"name": "LocalWP", "use": "Local WordPress development"},
            ],
        },
        "content": {
            "name": "Content Collaboration",
            "tools": [
                {"name": "Google Docs", "use": "Content drafting, review"},
                {"name": "WordPress Multisite", "use": "Content staging per author"},
                {"name": "WP Approval Workflow", "use": "Content approval process"},
            ],
        },
    }

    DAILY_ROUTINE = {
        "morning": ["Check Slack messages", "Review PR notifications", "Daily standup (15 min)"],
        "work": ["Feature development", "Code reviews", "Content updates", "Testing"],
        "sync": ["Async updates via Loom/Slack", "PR review discussions"],
        "end": ["Push changes", "Update task board", "Document decisions"],
    }

    def show_tools(self):
        print("=== Collaboration Tools ===\n")
        for key, category in self.TOOLS.items():
            print(f"[{category['name']}]")
            for tool in category["tools"][:2]:
                print(f"  • {tool['name']}: {tool['use']}")
            print()

    def show_routine(self):
        print("=== Daily Routine ===")
        for phase, tasks in self.DAILY_ROUTINE.items():
            print(f"  [{phase}] {' → '.join(tasks[:2])}")

collab = RemoteCollaboration()
collab.show_tools()
collab.show_routine()

Database & Content Sync

# db_sync.py — Database and content synchronization
import json

class DBSync:
    STRATEGIES = {
        "wp_cli": {
            "name": "WP-CLI Search & Replace",
            "command": "wp search-replace 'staging.example.com' 'example.com' --all-tables",
            "use": "เปลี่ยน domain เมื่อ migrate ระหว่าง environments",
        },
        "db_migrate": {
            "name": "WP Migrate DB Pro",
            "command": "Plugin-based migration (push/pull database)",
            "use": "Sync database ระหว่าง local ↔ staging ↔ production",
        },
        "wp_cli_export": {
            "name": "WP-CLI Export/Import",
            "command": "wp export --dir=/tmp/exports && wp import /tmp/exports/*.xml",
            "use": "Export/import content (posts, pages, media)",
        },
    }

    SYNC_SCRIPT = """
# sync_env.sh — Environment sync script
#!/bin/bash
# Sync production DB to local dev

# 1. Export production DB
ssh prod-server "wp db export /tmp/prod-backup.sql --path=/var/www/html"

# 2. Download
scp prod-server:/tmp/prod-backup.sql ./backups/

# 3. Import to local
wp db import ./backups/prod-backup.sql

# 4. Search & Replace URLs
wp search-replace 'https://example.com' 'http://localhost:8080' --all-tables

# 5. Flush cache
wp cache flush
wp rewrite flush

echo "Sync complete!"
"""

    CONTENT_WORKFLOW = """
    Content Workflow (Remote Team):
    
    [Writer] → Draft in Google Docs
         ↓
    [Editor] → Review & approve
         ↓
    [Content Manager] → Paste to WordPress (staging)
         ↓
    [Designer] → Add images, format blocks
         ↓
    [QA] → Review on staging URL
         ↓
    [Publisher] → Deploy to production
    """

    def show_strategies(self):
        print("=== DB Sync Strategies ===\n")
        for key, strat in self.STRATEGIES.items():
            print(f"[{strat['name']}]")
            print(f"  Command: {strat['command']}")
            print(f"  Use: {strat['use']}")
            print()

    def show_script(self):
        print("=== Sync Script ===")
        print(self.SYNC_SCRIPT[:400])

    def show_workflow(self):
        print("=== Content Workflow ===")
        print(self.CONTENT_WORKFLOW)

sync = DBSync()
sync.show_strategies()
sync.show_script()
sync.show_workflow()

FAQ - คำถามที่พบบ่อย

Q: Block Theme กับ Classic Theme ทีม remote ใช้อันไหนดี?

A: Block Theme: content creators แก้ไขได้เอง ไม่ต้องรอ developer, ลด bottleneck Classic Theme: developers control มากกว่า, mature ecosystem สำหรับ remote team: Block Theme ดีกว่า เพราะ content team ทำงานได้อิสระ developer focus ที่ custom blocks และ patterns แทน

Q: Database sync ระหว่าง environments ทำอย่างไร?

A: ใช้ WP-CLI: wp db export → scp → wp db import → wp search-replace Plugin: WP Migrate DB Pro (ง่ายที่สุด) สำคัญ: อย่า sync production → local โดยไม่ backup ก่อน Content: ใช้ WordPress export/import (XML) สำหรับ content only

Q: ทีม remote กี่คนถึงควรใช้ CI/CD?

A: ตั้งแต่ 2 คนขึ้นไป CI/CD ช่วยลด conflicts และ human errors ทีม 1 คน: manual deploy ก็พอ (rsync/FTP) ทีม 2-5 คน: GitHub Actions + auto deploy ทีม 5+ คน: full CI/CD + staging + code review mandatory

Q: ใช้ Multisite สำหรับ staging ดีไหม?

A: ไม่แนะนำ Multisite ซับซ้อน, shared database = risky ดีกว่า: แยก staging เป็น separate WordPress installation ใช้ managed hosting ที่มี staging built-in (WP Engine, Kinsta) หรือ Docker-based local dev + staging server แยก