إعداد بيئة تطوير محلية متكاملة لووردبريس باستخدام Docker وWP‑CLI

شخص يستخدم الحاسوب مع شعار ووردبريس

مقدمة
تطوير مواقع ووردبريس محليًا قد يبدو بسيطًا لكنه يتضمن تحديات عملية: توافق إصدار PHP، إدارة قواعد البيانات، مزامنة الملفات، أداة سطر الأوامر لإدارة الووردبريس، وإعداد بيئة تشبه الإنتاج للاختبار. استخدام Docker مع WP‑CLI يوفر حلًا معيارياً ومتنقلاً وقابلاً لإعادة الاستخدام، يسرّع العمل الجماعي ويقلل مفاجآت بيئة الإنتاج.

التحديات الحقيقية التي يواجهها المطورون

  • اختلاف إصدارات PHP/ملحقاته بين المطورين وخوادم الإنتاج.
  • تعقيد إعداد بيئة متكاملة (nginx/php-fpm/mysql/redis/mailhog) يدوياً.
  • مزامنة مجلدات themes/plugins مع الحفاظ على أداء جيد (خصوصاً على macOS/Windows).
  • تنفيذ أوتوماتيكي لإجراءات ما بعد التثبيت مثل إنشاء قواعد البيانات، إضافة مستخدمين، وتفعيل الإضافات.
  • تصحيح الأخطاء (Xdebug) وقياس الأداء محلياً بطريقة مشابهة للإنتاج.

المكونات الأساسية لحل متكامل

  • Docker + Docker Compose لإدارة الخدمات كحاويات.
  • PHP-FPM (نسخة محددة) وnginx كسيرفر ويب عكسي.
  • قاعدة بيانات MySQL أو MariaDB مع Healthcheck.
  • WP‑CLI لإدارة ووردبريس من سطر الأوامر (تنصيب، استيراد، إضافات).
  • Redis أو Memcached للتخزين المؤقت عند الحاجة.
  • MailHog أو Mailcatcher لاختبار البريد محلياً.
  • Xdebug للـ debugging وprofiling.

نموذج عملي: docker-compose.yml متكامل

شرح موجز: التكوين أدناه يعتمد على Compose v3.8، يفصل nginx/php-fpm/mysql/wp-cli ويمكّن الربط بمجلد المشروع المحلي (bind mount) لـ wp-content لتطوير الثيمات والإضافات. استخدم ملف .env لتخزين المتغيرات الحساسة.

version: "3.8"

services:

  db:
    image: mysql:8.0
    container_name: wp_db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppass
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping","-h","localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  php:
    build:
      context: ./docker/php
      dockerfile: Dockerfile
    container_name: wp_php
    restart: unless-stopped
    volumes:
      - ./wp-content:/var/www/html/wp-content:delegated
      - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
      - ./composer:/var/www/.composer
    environment:
      XDEBUG_MODE: debug
      XDEBUG_CONFIG: client_host=host.docker.internal

  nginx:
    image: nginx:stable-alpine
    container_name: wp_nginx
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
      - ./wp-content:/var/www/html/wp-content:ro
    depends_on:
      db:
        condition: service_healthy
      php:
        condition: service_started

  wpcli:
    image: wp-cli/wp-cli:latest
    container_name: wp_cli
    volumes:
      - ./wp-content:/var/www/html/wp-content
      - ./wp-config.php:/var/www/html/wp-config.php
    entrypoint: ["sleep", "infinity"]

  mailhog:
    image: mailhog/mailhog
    container_name: mailhog
    ports:
      - "8025:8025"

volumes:
  db_data:

ملف Dockerfile للـ PHP (مع Xdebug وComposer)

FROM wordpress:6.4-php8.1-fpm

# تثبيت أدوات مطلوبة و Xdebug
RUN apt-get update && apt-get install -y \
    git unzip libzip-dev \
    && pecl install xdebug \
    && docker-php-ext-enable xdebug \
    && docker-php-ext-install pdo_mysql zip

# تثبيت Composer (إن لم يكن موجودًا)
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

# إعداد مستخدم وملكية ليتوافق مع أذونات المضيف
RUN usermod -u 1000 www-data

WORKDIR /var/www/html

ملف nginx افتراضي (default.conf)

server {
    listen 80;
    server_name localhost;
    root /var/www/html;

    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass wp_php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_read_timeout 300;
    }

    location ~* \.(css|js|png|jpg|jpeg|gif|svg|ico)$ {
        expires 30d;
        access_log off;
    }
}

تهيئة وتشغيل ووردبريس باستخدام WP‑CLI

  • طريقة تشغيل سريعة: رفع الخدمات ثم الدخول لحاوية wpcli للتنفيذ.
# تشغيل الخدمات
docker-compose up -d

# تحميل ملفات ووردبريس (داخل الحاوية wpcli)
docker-compose exec wpcli wp core download --path=/var/www/html

# إنشاء ملف config
docker-compose exec wpcli wp config create --dbname=wordpress --dbuser=wpuser --dbpass=wppass --dbhost=db --path=/var/www/html --skip-check

# إنشاء قاعدة البيانات (إذا لزم)
docker-compose exec wpcli wp db create --path=/var/www/html

# تثبيت ووردبريس
docker-compose exec wpcli wp core install --url="http://localhost:8080" --title="My Local WP" --admin_user="admin" --admin_password="adminpass" --admin_email="[email protected]" --path=/var/www/html

أمثلة عملية مفيدة

  • تثبيت وتفعيل إضافة:
    docker-compose exec wpcli wp plugin install woocommerce --activate --path=/var/www/html
  • استيراد نسخة احتياطية من قاعدة بيانات:
    docker-compose exec -T wpcli wp db import /var/www/html/wp-content/backup.sql
  • تشغيل بحث واستبدال (مثال عند نقله بين نطاقات):
    docker-compose exec wpcli wp search-replace 'old.dev' 'local.test' --skip-columns=guid --path=/var/www/html

رسومات توضيحية (مخطط شبكي بسيط)

[Browser] --> [nginx (host:8080)]
                |
                v
             [php-fpm]
                |
                v
             [MySQL] <-- [wpcli]  (wpcli يتكلم مع ملفات المشروع وDB)
                ^
                +-- [MailHog] (SMTP catch)
                +-- [Redis] (optional cache)

نصائح أداء واعتبارات عملية

  • على macOS/Windows قد تكون bind mounts بطيئة. استخدم delegated/consistent أو أدوات مثل Mutagen أو docker-sync عند الحاجة.
  • استعمل OPCache وتأكد من تكوينه في بيئة التطوير (مع القدرة على إعادة التحميل عند تغيير الكود).
  • لا تترك Xdebug مفعلًا دائمًا — شغّله عند الحاجة لتقليل التأثير على الأداء.
  • استخدم healthcheck للـ DB وdepends_on مع شرط الصحة لتفادي أخطاء التزامن.
  • حافظ على فصل ملف wp-content (themes/plugins/uploads) لتسهيل التطوير والمزامنة مع نظام التحكم بالنسخ.
  • تعيين UID/GID لمطابقة المستخدم المحلي يمنع مشاكل أذونات الملفات.

تحليل أداء مختصر

تأثيرات شائعة:

  • bind mounts: يمكن أن يقلل الأداء بنسبة كبيرة على Docker Desktop؛ الحلول: استخدام delegated/consistent، تقليل المواقع المربوطة، أو استخدام أدوات مزامنة.
  • PHP-FPM + OPCache: يقلل زمن الاستجابة ويقرب الأداء من بيئة الإنتاج.
  • قاعدة بيانات داخل حاوية: أداء جيد للتطوير، لكن لا تستخدمها كنسخة إنتاجية دون نسخ احتياطي مناسب.

دمج مع CI/CD واختبارات

  • يمكن استخدام نفس ملفات docker-compose لتشغيل اختبارات الوحدة/التكامل في GitHub Actions أو GitLab CI (مثلاً استخدام خدمات مؤقتة أو تشغيل قواعد بيانات). راجع: https://docs.github.com/actions
  • استخدام WP‑CLI في الـ CI لتنفيذ migrations، تثبيت الإضافات، واستيراد قواعد البيانات الاختبارية.

روابط ومصادر موثوقة

  • Docker Docs: https://docs.docker.com/
  • Docker Compose: https://docs.docker.com/compose/
  • WordPress Docker Hub: https://hub.docker.com/_/wordpress
  • WP‑CLI: https://wp-cli.org/
  • Xdebug: https://xdebug.org/
  • MailHog: https://github.com/mailhog/MailHog
  • Redis: https://redis.io/
  • ملاحظات أداء Docker Desktop: https://docs.docker.com/desktop/

خاتمة وتحدي عملي

الآن: قم بتشغيل المثال أعلاه، نفّذ تثبيت ووردبريس عبر WP‑CLI، ثم جرّب تثبيت إضافة ثقيلة (مثل WooCommerce) وقيّم زمن استجابة الصفحة قبل وبعد تفعيل OPCache وXdebug. إذا واجهت أخطاء أذونات أو بطء في المزامنة على نظامك—شارك رسالة الخطأ وسأرشدك للحل خطوة بخطوة.

هل تود مثالاً مُخصصاً يتضمن Redis للتخزين المؤقت أو إعداد Xdebug مع VS Code؟

شارك المقال

اترك أول تعليق