เราสามารถใช้การติดตั้ง WordPress เดียวสำหรับฐานข้อมูลหลายโดเมนและไดเรกทอรีเนื้อหา


10

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

นี่คือสิ่งที่ฉันคิดเกี่ยวกับ:

.
|_____branch1 // for branch1.domain.com
|  |_____themes
|  |_____plugins
|
|_____branch2 // for branch2.domain.com
|  |_____themes
|  |_____plugins
|
|_____branch3 // for branch3.domain.com
|  |_____themes
|  |_____plugins
|
|_____index.php
|_____WordPress
|_____wp-config.php

อย่างที่คุณเห็นแต่ละโดเมนมีฐานข้อมูลและไดเรกทอรีเนื้อหา แต่มีเพียงหนึ่งอินสแตนซ์ WordPress ตอนนี้ธีมปลั๊กอินและฐานข้อมูลมีขนาดเล็กลงและเป็นอิสระ จากนั้นจะง่ายกว่าในการดูแลรักษา ...

แต่มันเป็นไปได้? หากคุณเคยประสบปัญหาเดียวกันนี้มาก่อนโปรดแบ่งปันความคิดของคุณ! ผมขอขอบคุณความช่วยเหลือของคุณ.


1
เหตุใดจึงมีการตัดไซต์หลายไซต์ออกเป็นไปได้ การทำสิ่งนี้จะเกี่ยวข้องกับการสร้างระบบที่มีความเปราะบางซึ่งจะบำรุงรักษาได้น้อยกว่าหลายไซต์มีประสิทธิภาพการทำงานช้ากว่าหลายไซต์และการรักษาความปลอดภัยที่แย่กว่าหลายไซต์ การติดตั้ง WordPress ที่ใหญ่ที่สุดบางตัวเป็นการติดตั้งแบบหลายไซต์และมันเป็นรหัสเดียวกันทั้งหมดที่ทำงานบนไซต์มาตรฐานแบบเดียว
Tom J Nowell

ฉันจัดการหลายไซต์ WP หลายไซต์รวมถึงไซต์ย่อยที่มีไซต์ย่อยมากกว่า 500 ไซต์ ประสิทธิภาพจะเหมือนกันไม่ว่าคุณจะใช้หนึ่งอินสแตนซ์ multisite หรือ 500 WP เว้นแต่ว่าคุณมี 500 อินสแตนซ์บน VMs และฐานข้อมูลแยกต่างหาก การบำรุงรักษาแย่มากด้วยหลายไซต์? ลองรักษา 500 เว็บไซต์เดียว
user42826

@TomJNowell ฉันไม่แน่ใจว่าการติดตั้งที่ใหญ่ที่สุดโดยใช้ฐานข้อมูลเดียวเท่านั้น แต่ฉันคิดว่านี่และวิดีโอนี้อาจนำเราไปสู่หน้าเดียวกัน ส่วนใหญ่เราใช้ WordPress สำหรับ CRM และความเป็นส่วนตัวของผู้ใช้เป็นสิ่งสำคัญมาก
SarahCoding

@ user42826 ปัจจุบัน บริษัท ของฉันไม่มีเว็บไซต์จำนวนมาก ฉันยังไม่สามารถแปลงไซต์ปัจจุบันเป็นหลายไซต์และสร้างมาตรฐานได้ และฮาร์ดแวร์และสิ่งอื่น ๆ อาจแตกต่างจากคุณ ดังนั้นฉันแค่ต้องการถามเกี่ยวกับสถาปัตยกรรมการติดตั้งที่ดีที่สุดในกรณีของฉัน เท่าที่ฉันรู้ไซต์หลายไซต์ทำงานกับโดเมนย่อย แต่ไม่สามารถทำงานกับโดเมนอื่นได้
SarahCoding

หลายไซต์ทำงานกับโดเมนที่ต่างกัน เราใช้โดเมนหลัก * .domain.com และโดเมนอื่นสองสาม www.domain2.com และ www.domain3.com เราใช้ปลั๊กอินการทำแผนที่ WP Domain เพื่อให้ได้หลายโดเมน แต่จากสิ่งที่ฉันได้ยิน WP core รองรับการทำแผนที่หลายโดเมนในตอนนี้
user42826

คำตอบ:


10

ดังที่@ tom-j-nowellกล่าวไว้ในความคิดเห็นของ OP แล้วเว็บไซต์หลายรายการสามารถทำให้สิ่งนี้ง่ายขึ้น

ประสิทธิภาพและความปลอดภัยไม่ใช่ปัญหาสำหรับหลายไซต์ (อย่างน้อยไม่เกินกว่าสำหรับการติดตั้งปกติ) แต่ฉันยอมรับว่าบางครั้ง Multisite อาจเป็นปัญหาได้เนื่องจากปลั๊กอินจำนวนมาก (กำหนดเองหรือบุคคลที่สาม) อาจไม่ ทำงานอย่างถูกต้องกับหลายไซต์หรืออาจเป็นเพราะคุณต้องการให้ผู้ใช้แยกเว็บไซต์ต่าง ๆ ออกจากกันอย่างสมบูรณ์

ที่กล่าวถึงสิ่งที่คุณต้องการบรรลุไม่ใช่เรื่องยาก

สิ่งที่คุณต้องเปลี่ยนระหว่างการติดตั้งคือ:

  • โฟลเดอร์ปลั๊กอิน
  • โฟลเดอร์ธีม
  • การตั้งค่าฐานข้อมูล

การกำหนดค่าเหล่านั้นสามารถทำได้โดยใช้ค่าคงที่ในwp-config.phpปัญหาเดียวของคุณคือวิธีเปลี่ยนค่าตาม URL

ตัวแปรเซิร์ฟเวอร์'SERVER_NAME'ควรใช้งานได้อย่างน้อยถ้าเว็บเซิร์ฟเวอร์ของคุณได้รับการกำหนดค่าอย่างเหมาะสม

ตัวอย่างเช่นคุณสามารถสร้างโฟลเดอร์ชื่อ/confที่ระดับเดียวกันของwp-config.phpไฟล์และ/WordPressโฟลเดอร์

ในโฟลเดอร์นั้นคุณสามารถเพิ่มไฟล์:

  • branch1.domain.com.conf
  • branch2.domain.com.conf
  • branch3.domain.com.conf

ภายในแต่ละอันคุณสามารถทำอะไรได้บ้าง

$branch = 'branch1';
$base_dir = dirname( __DIR__) . "/{$branch}";

defined( 'WP_CONTENT_DIR' ) or define( 'WP_CONTENT_DIR', $base_dir );

// be sure WP understand URLs correctly
defined( 'DB_HOME' ) or define( 'DB_HOME', "{$branch}.example.com" );
defined('WP_SITEURL') or define('WP_SITEURL', "{$branch}.example.com/WordPress");

// adjust DB settings  as needed
defined( 'DB_NAME' ) or define( 'DB_NAME', $branch );
defined( 'DB_USER' ) or define( 'DB_USER', $branch );
defined( 'DB_PASSWORD' ) or define( 'DB_PASSWORD', '********' );

unset( $base_dir, $branch );

สิ่งนี้จะเปลี่ยนแปลงในแต่ละไฟล์การกำหนดค่าตาม "สาขา"

หลังจากนั้นในเอกลักษณ์ของwp-config.phpคุณคุณสามารถทำสิ่งที่ชอบ:

$defaults_conf = [
  'WP_CONTENT_DIR' => __DIR__ . '/branch1',
  'DB_HOST'        => 'localhost',
  'DB_NAME'        => 'branch1',
  'DB_USER'        => 'branch1',
  'DB_PASSWORD'    => '********',
];

$host = getenv('WORDPRESS_HOST') ?: $_SERVER['SERVER_NAME'];

if ($host && file_exists(__DIR__."/conf/{$host}.conf")) {
  require __DIR__."/conf/{$host}.conf";
}

array_walk($defaults_conf, function($value, $name) {
   defined($name) or define($name, $value);
});

unset($defaults_conf, $host);

สิ่งที่เกิดขึ้นข้างต้นนั้นขึ้นอยู่กับชื่อเซิร์ฟเวอร์ที่คุณโหลดไฟล์การกำหนดค่าที่แตกต่างกัน (หากพบ) และหากไฟล์การกำหนดค่าไม่ได้กำหนดค่าเริ่มต้นใด ๆ (หรือหากไม่พบไฟล์)

สิ่งที่ดีคือการเพิ่มสาขาใหม่คุณเพียงแค่สร้างโฟลเดอร์สาขาและระบุ.confชื่อหลังจากโดเมนสาขาใหม่และคุณทำเสร็จแล้วไม่มีอะไรเปลี่ยนแปลงด้าน WP

เส้น:

 $host = getenv('WORDPRESS_HOST') ?: $_SERVER['SERVER_NAME'];

คือที่ที่ฉันได้รับชื่อโดเมน เป็นตัวเลือกแรกฉันใช้ตัวแปรสภาพแวดล้อมเนื่องจากมีโอกาสที่$_SERVER['SERVER_NAME']จะไม่สามารถใช้บริบทบรรทัดคำสั่งได้เช่นเราเมื่อใช้ WP CLI ในสถานการณ์เหล่านั้นคุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมเพื่อบังคับให้ WP ใช้การตั้งค่าจากสาขาเฉพาะ

โปรดทราบว่าในไฟล์กำหนดค่าเฉพาะสาขาฉันกำลังเปลี่ยนWP_CONTENT_DIRและจะตั้งค่าโฟลเดอร์ปลั๊กอินและธีมเป็นโฟลเดอร์ย่อยที่เกี่ยวข้อง/pluginsและ/themesอัตโนมัติ

ปัญหาที่เป็นไปได้ที่นี่คือถ้าคุณต้องการแบ่งปัน/uploadsโฟลเดอร์ (ที่อัปโหลดไฟล์)

โดยค่าเริ่มต้นโฟลเดอร์นั้นเป็นโฟลเดอร์ย่อยของ dir เนื้อหาดังนั้นการใช้เวิร์กโฟลว์ด้านบนมันจะเป็น/uploadsโฟลเดอร์ย่อยของแต่ละโฟลเดอร์รูทสาขา

หากนั่นไม่ใช่ปัญหาสำหรับคุณมากกว่าที่จะไปกับมันมิฉะนั้นทางออกที่ง่ายที่สุดคือการสร้าง/uploadssymlink ไปยังโฟลเดอร์อัพโหลดจริงที่คุณต้องการแชร์ในแต่ละโฟลเดอร์สาขา


ขอบคุณ! ผมชอบความคิดของคุณแม้ว่าจะไม่น่าเชื่อถือ$_SERVER['SERVER_NAME'] /uploadsdir ไม่ใช่ปัญหา ฉันมีการทดสอบยังมี WP CLI ถ้าเราผ่านใน--urlพารามิเตอร์สำหรับแต่ละเว็บไซต์ก็ทำงานตามปกติ :)
SarahCoding

1
@ ฉันพูดในคำตอบ: "ตัวแปรเซิร์ฟเวอร์ 'SERVER_NAME' ควรใช้งานได้อย่างน้อยถ้าเว็บเซิร์ฟเวอร์ของคุณได้รับการกำหนดค่าอย่างถูกต้อง" หมายความว่าคุณต้องกำหนดค่าเซิร์ฟเวอร์ของคุณอย่างถูกต้อง :) ที่จริงแล้วตราบใดที่คุณติดตั้งserver_nameใน nginx หรือServerNameใน Apache หรืออะไรก็ตามที่เหมาะกับเว็บเซิร์ฟเวอร์ของคุณ$_SERVER['SERVER_NAME']ก็จะใช้งานได้ แม้ว่า WP CLI อาจทำงานโดยใช้--urlพารามิเตอร์เครื่องมือบรรทัดคำสั่งอื่น ๆ อาจมีปัญหาหากคุณไม่ใช้ตัวแปรสภาพแวดล้อม WP CLI "mocks" URL ของคำร้องขอในบริบท CLI คำสั่งอื่นอาจไม่ทำ
gmazzap

1
แน่นอนฉันจะทำให้แน่ใจว่าSERVER_NAMEมีการกำหนดค่าอย่างถูกต้อง เกี่ยวกับ env vars ฉันใช้phpdotenvเพื่อแก้ไข ปัจจุบันดูเหมือนว่าทุกอย่างจะทำงานได้ดี :)
SarahCoding

0

นี่เป็นไปได้ด้วย symlinking และการวางแผน ฉันทำสิ่งสกปรกบนอินเทอร์เน็ตเพื่อสิ่งเดียวกัน ในที่สุดรวบรวมทุกสิ่งและทำให้มันทำงานได้

ฉันใช้งานเว็บไซต์ไม่กี่แห่งพวกเขาทั้งหมดแชร์ธีมและโฟลเดอร์ปลั๊กอินเดียวกัน โฟลเดอร์เดียวกันใช้ได้กับไซต์หลายไซต์และไซต์เดียว แต่คุณต้องระวังเกี่ยวกับปลั๊กอินบางตัวซึ่งสามารถเป็นได้หลายไซต์ / ไซต์เดียวเท่านั้นและต้องแปลก

ฉันสร้างไดเรกทอรีเช่น master-tnp / themes และ master-tnp / plugin จากนั้น symlink ไปยังไดเรกทอรี wordpress ของคุณโดยใช้คำสั่ง ln -s

ข้อผิดพลาดอยู่ในการกำหนดค่าเซิร์ฟเวอร์เช่นกัน ตรวจสอบให้แน่ใจว่ามีการตั้งค่า directive คำสั่ง symlink

หากคุณต้องการใช้การติดตั้ง WordPress ครั้งเดียวฉันได้รวบรวมคำแนะนำโดยละเอียดเกี่ยวกับวิธีการที่ฉันทำในhttps://vaish.co/multiple-sites-single-wordpress-directory

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.