ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

ติดตั้ง WordPress Multisite สำหรับหลายเว็บในระบบเดียว
Home ติดตั้ง WordPress Multisite สำหรับหลายเว็บในระบบเดียว

ติดตั้ง WordPress Multisite สำหรับหลายเว็บในระบบเดียว

Multisite ทำให้ WordPress หนึ่งชุดให้บริการหลายเว็บได้ โดยใช้ไฟล์ ปลั๊กอิน และธีมร่วมกัน เหมาะกับองค์กรที่มีเว็บหลายสาขา สถาบันการศึกษาที่มีเว็บหลายคณะ หรือธุรกิจที่มีหลายแบรนด์

ก่อนตัดสินใจต้องรู้ข้อจำกัด ปลั๊กอินและธีมต้องติดตั้งจากส่วนกลางเท่านั้น หากเว็บหนึ่งต้องการปลั๊กอินที่ชนกับอีกเว็บจะทำไม่ได้ และการกู้คืนเว็บเดียวจากข้อมูลสำรองยุ่งยากกว่าการติดตั้งแยกกันมาก หากเว็บแต่ละแห่งแตกต่างกันมาก การติดตั้งแยกอาจเหมาะกว่า

สิ่งที่ต้องเตรียม

  • WordPress ที่ติดตั้งเรียบร้อยและยังไม่มีเนื้อหามาก
  • สิทธิ์แก้ไฟล์ wp-config.php และคอนฟิกเว็บเซิร์ฟเวอร์
  • Wildcard DNS หากเลือกแบบซับโดเมน
  • สำรองข้อมูลก่อนเสมอ การเปลี่ยนเป็น Multisite ย้อนกลับยาก

ขั้นตอนที่ 1: เลือกรูปแบบ

  • ซับโดเมน เช่น sale.example.com เหมาะเมื่อแต่ละเว็บเป็นหน่วยงานอิสระ ต้องตั้ง Wildcard DNS และใบรับรอง SSL แบบ Wildcard
  • ซับโฟลเดอร์ เช่น example.com/sale/ ตั้งค่าง่ายกว่า ใช้ใบรับรองเดิมได้ แต่ URL ยาวและแยก SEO ได้น้อยกว่า

เลือกแล้วเปลี่ยนภายหลังยากมาก ตัดสินใจให้รอบคอบตั้งแต่ต้น หากไม่แน่ใจและเว็บทั้งหมดเป็นขององค์กรเดียวกัน ซับโดเมนมักยืดหยุ่นกว่าในระยะยาว

ขั้นตอนที่ 2: เปิดโหมด Multisite

nano /var/www/example.com/wp-config.php

เพิ่มก่อน /* That's all, stop editing! */

define('WP_ALLOW_MULTISITE', true);

รีเฟรชหน้าหลังบ้าน จะเห็นเมนูใหม่ที่ Tools แล้ว Network Setup

ก่อนดำเนินการต่อ ระบบจะขอให้ปิดปลั๊กอินทั้งหมดก่อน

cd /var/www/example.com
wp plugin deactivate --all

ขั้นตอนที่ 3: ติดตั้งเครือข่าย

ในหน้า Network Setup เลือกรูปแบบที่ตัดสินใจไว้ ตั้งชื่อเครือข่ายและอีเมลผู้ดูแล แล้วกด Install

ระบบจะแสดงโค้ดสองชุดให้เพิ่มเอง ชุดแรกลงใน wp-config.php

define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', true);
define('DOMAIN_CURRENT_SITE', 'example.com');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);

ชุดที่สองลงใน .htaccess สำหรับ Apache หรือแปลงเป็นกฎของ Nginx

# Nginx สำหรับ Multisite แบบซับโฟลเดอร์
if (!-e $request_filename) {
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;
    rewrite ^(/[^/]+)?(/wp-.*) $2 last;
    rewrite ^(/[^/]+)?(/.*\.php) $2 last;
}
sudo nginx -t && sudo systemctl reload nginx

ล็อกอินใหม่หลังบันทึก จะเห็นเมนู My Sites แล้ว Network Admin

ขั้นตอนที่ 4: ตั้ง DNS และ SSL สำหรับซับโดเมน

# Wildcard A Record
*.example.com.  IN  A  203.0.113.10
dig +short test.example.com

ขอใบรับรอง Wildcard ซึ่งต้องยืนยันผ่าน DNS

sudo certbot certonly --dns-cloudflare \
  --dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
  -d 'example.com' -d '*.example.com' \
  --agree-tos -m [email protected]
server {
    listen 443 ssl;
    server_name example.com *.example.com;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    root /var/www/example.com;
    # ...
}

ขั้นตอนที่ 5: เพิ่มเว็บใหม่

# ผ่าน WP-CLI ซึ่งเร็วกว่าและทำซ้ำได้
wp site create --slug=sale --title="ฝ่ายขาย" [email protected]

wp site list --fields=blog_id,url,registered
wp site list --field=url

สั่งงานกับเว็บใดเว็บหนึ่งด้วย --url

wp --url=sale.example.com option get blogname
wp --url=sale.example.com plugin list
wp site list --field=url | xargs -I% wp --url=% core update-db

ขั้นตอนที่ 6: จัดการปลั๊กอินและธีม

ใน Multisite มีสองระดับ

  • Network Activate เปิดใช้กับทุกเว็บพร้อมกัน ผู้ดูแลเว็บย่อยปิดไม่ได้
  • ให้สิทธิ์เปิดเอง ติดตั้งจากส่วนกลางแล้วให้แต่ละเว็บเลือกเปิดเอง
wp plugin activate wordpress-seo --network
wp plugin activate contact-form-7 --url=sale.example.com

# ธีมต้องเปิดให้ใช้ในเครือข่ายก่อน เว็บย่อยจึงจะเลือกได้
wp theme enable twentytwentyfour --network

ผู้ดูแลเว็บย่อยติดตั้งปลั๊กอินเองไม่ได้ ต้องให้ผู้ดูแลเครือข่ายติดตั้งให้ ซึ่งเป็นทั้งข้อดีด้านความปลอดภัยและข้อจำกัดด้านความคล่องตัว

ขั้นตอนที่ 7: ใช้โดเมนของตัวเองสำหรับเว็บย่อย

WordPress รุ่นใหม่รองรับในตัวแล้ว ไม่ต้องใช้ปลั๊กอิน

# ชี้ DNS ของโดเมนใหม่มาที่เซิร์ฟเวอร์เดียวกันก่อน
wp site list --fields=blog_id,url
wp db query "UPDATE wp_blogs SET domain='newbrand.co.th', path='/' WHERE blog_id=2;"
wp --url=newbrand.co.th option update siteurl 'https://newbrand.co.th'
wp --url=newbrand.co.th option update home 'https://newbrand.co.th'

เพิ่มโดเมนใหม่ใน server_name ของ Nginx และขอใบรับรองเพิ่ม

sudo certbot --nginx -d newbrand.co.th --expand

ขั้นตอนที่ 8: สำรองและกู้คืนเว็บเดียว

นี่คือจุดที่ Multisite ยุ่งยากกว่าการติดตั้งแยก เพราะข้อมูลของทุกเว็บอยู่ในฐานข้อมูลเดียวกัน

# ตารางของเว็บที่ blog_id = 2 จะขึ้นต้นด้วย wp_2_
wp db tables --all-tables | grep '^wp_2_'

# ส่งออกเฉพาะเว็บนั้น
wp db export site2.sql --tables=$(wp db tables 'wp_2_*' --all-tables --format=csv)

# ไฟล์อัปโหลดของเว็บนั้น
tar czf site2-uploads.tar.gz wp-content/uploads/sites/2

อย่าลืมว่าตาราง wp_users และ wp_usermeta ใช้ร่วมกันทั้งเครือข่าย จึงกู้แยกไม่ได้

ปัญหาที่พบบ่อย

เข้าหลังบ้านของเว็บย่อยแล้ววนกลับ

กฎ rewrite ไม่ถูกต้อง ตรวจคอนฟิกตามขั้นตอนที่ 3 และล้างคุกกี้ของเบราว์เซอร์แล้วลองใหม่

ซับโดเมนใหม่เปิดไม่ได้

ตรวจ Wildcard DNS ด้วย dig +short newsite.example.com และตรวจว่า server_name ของ Nginx มี *.example.com และใบรับรองครอบคลุม

อัปโหลดไฟล์ไม่ได้บนเว็บย่อย

ตรวจสิทธิ์ของโฟลเดอร์ wp-content/uploads/sites/ และตรวจโควตาพื้นที่ต่อเว็บที่ตั้งไว้ใน Network Settings

อยากแยกเว็บย่อยออกมาเป็นเว็บเดี่ยว

ใช้เครื่องมือส่งออกในตัวที่ Tools แล้ว Export บนเว็บย่อยนั้น แล้วนำเข้าในการติดตั้งใหม่ วิธีนี้ย้ายเนื้อหาได้แต่ไม่ย้ายการตั้งค่าของปลั๊กอิน ต้องตั้งใหม่

ต้องการโฮสติ้งที่รองรับ WordPress Multisite พร้อม SSL Wildcard ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security