Come ha detto @ tom-j-nowell in commento a OP, il multisito può renderlo più semplice.
Le prestazioni e la sicurezza non sono realmente un problema per il multisito (almeno, non più di quanto lo siano per le installazioni regolari), ma sono d'accordo sul fatto che il multisito può talvolta costituire un problema, poiché molti plug-in (personalizzati o di terze parti) potrebbero non funziona correttamente su più siti o forse perché desideri mantenere completamente separati gli utenti di diversi siti Web.
Detto ciò, ciò che vuoi ottenere non è poi così difficile.
Quello che devi cambiare tra l'installazione è:
- cartella dei plugin
- cartella temi
- impostazioni del database
Quella configurazione può essere fatta usando le costanti nelwp-config.php
tuo unico problema è come cambiarle in base all'URL.
La variabile del server 'SERVER_NAME'
dovrebbe funzionare per te, almeno se il tuo server web è configurato correttamente.
Ad esempio, è possibile creare una cartella denominata /conf
allo stesso livello di wp-config.php
file e /WordPress
cartella.
In quella cartella è possibile aggiungere alcuni file:
branch1.domain.com.conf
branch2.domain.com.conf
branch3.domain.com.conf
dentro ognuno di essi puoi fare qualcosa del genere
$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 );
Questo cambierà su ogni file di configurazione in base al "ramo".
Dopodiché, nel tuo unico wp-config.php
puoi fare qualcosa del genere:
$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);
Ciò che accade sopra è che in base al nome del server si carica un file di configurazione diverso (se trovato) e se il file di configurazione non definisce nessuna delle impostazioni di configurazione predefinite (o se il file non viene trovato) sono impostate per impostazione predefinita.
La cosa bella è che per aggiungere un nuovo ramo, devi solo creare la cartella del ramo e fornire un .conf
nome dopo il nuovo dominio del ramo, e hai finito, non c'è nulla da cambiare sul lato WP.
La linea:
$host = getenv('WORDPRESS_HOST') ?: $_SERVER['SERVER_NAME'];
è dove ottengo il nome di dominio. Come prima opzione sto usando una variabile d'ambiente, perché ci sono possibilità $_SERVER['SERVER_NAME']
che non funzionino in un contesto da riga di comando, come ad esempio quando si usa l'interfaccia della riga di comando di WP. In tali situazioni è possibile impostare una variabile di ambiente per forzare WP a utilizzare le impostazioni da un ramo specifico.
Nota che nei file di configurazione specifici del ramo sto cambiando WP_CONTENT_DIR
e che imposterà automaticamente la cartella plugin e temi nelle relative sottocartelle /plugins
e /themes
rami.
Un possibile problema qui è se si desidera condividere la /uploads
cartella (dove vengono caricati i file).
Per impostazione predefinita, quella cartella è una sottocartella della directory del contenuto, quindi utilizzando il flusso di lavoro sopra sarà una /uploads
sottocartella di ogni cartella radice del ramo.
Se questo non è un problema per te, basta andare con esso, altrimenti la soluzione più semplice sarebbe quella di rendere /uploads
in ogni cartella del ramo un collegamento simbolico alla cartella dei caricamenti reali che desideri condividere.