Multisito WordPress per lo sviluppo locale e remoto

Pubblicato: 2021-07-19

È pratica comune utilizzare ambienti locali e remoti durante lo sviluppo per il web. Nel caso di singoli siti WordPress questo funziona bene. Tuttavia, le installazioni di WordPress multisito complicano notevolmente le cose.

Durante la ricerca di una soluzione al problema delle installazioni di WordPress multisito, ci siamo imbattuti in una serie di articoli scritti da John Russel su Laubster Boy. In questi articoli, ha indicato un modo per risolvere questo problema per gli ambienti di sviluppo e produzione remoti, che era abbastanza vicino a ciò che volevamo. Con qualche modifica, siamo riusciti a sistemare le cose più o meno. Tuttavia, da allora, alcuni aggiornamenti di WordPress hanno interrotto quella soluzione e abbiamo dovuto rivisitare il problema.

In questo articolo, ti mostrerò come abbiamo risolto questo problema utilizzando varie risorse e un po' di armeggiare.

intento

Vogliamo essere in grado di ospitare un'installazione locale del sito e un'installazione remota del sito che eseguono entrambe lo stesso database (remoto).

Problema

Le configurazioni multisito di WordPress reindirizzano sempre all'installazione di base, in questo caso: remota. Ciò rende difficile lavorare su una base di codice di sviluppo che rispecchi esattamente il sito remoto.

Per aggirare questo problema, è necessario eseguire due installazioni che utilizzano database diversi. Ciò può portare a conflitti confusi e problemi di sincronizzazione, poiché con ogni modifica, sia il codice che i database devono essere uniti.

Soluzione

Utilizzeremo il plugin WPMU Domain Mapping.

Nota che un paio di file di questo plugin verranno modificati direttamente, quindi è importante ricordarlo se aggiorni il plugin per qualsiasi motivo!

Questo processo presuppone che tu abbia un'installazione multisito di WordPress sui tuoi ambienti remoti e locali.

I seguenti passaggi per ciascuno saranno separati da locale e remoto, poiché è importante avere versioni diverse degli stessi file in ogni posizione.

Quindi, una volta completata l'impostazione dello sfondo, procediamo con i passaggi!

Struttura di directory per WordPress multisito locale e remoto

Per riferimento, la struttura dei file per questa configurazione, sia in ambiente locale che remoto, sarà la seguente:

 +-- wp-config.php
|
+-- .htaccess
|
+-- wp-content
| |
| +-- sunrise.php
| |
| +-- plugin
| |
| +-- wordpress-mu-mapping-dominio
| |
| +-- Registro modifiche.txt
| |
| +-- mappa_dominio.php
| |
| +-- leggimi.txt
| |
| +-- sunrise.php
| |
| +-- wordpress-mu-domain-mapping.php

1. Remoto

Questa sezione fornisce dettagli sui file e le impostazioni remoti.

1.1 wp-config.php

Questo non dovrebbe essere modificato sul server remoto.

1.2 Mappatura del dominio MU di WordPress (remoto!)

Scarica il plugin WordPress MU Domain Mapping da qui:

https://en-gb.wordpress.org/plugins/wordpress-mu-domain-mapping/

Installa su sito remoto e "attiva rete" in modo che sia attivo su tutti i siti.

1.3 sunrise.php

Copia il file sunrise.php dal plugin wordpress-mu-domain-mapping direttamente nella directory wp-content , in modo che si trovi qui:

/wp-content/sunrise.php

1.4 Fine delle modifiche da remoto

Ora hai finito con la modifica del sito remoto. Visita alcune pagine per assicurarti di non aver rotto nulla e qui abbiamo finito.

2. Locale

Questa sezione mostra cosa dovrebbe essere fatto su localhost. Parte del codice è duplicato, ma tutto viene mostrato per completezza.

2.1 wp-config.php

Copia il codice dal basso e incollalo nel tuo file wp-config.php. Puoi quindi aggiornarlo con i dettagli dal tuo wp-config.php remoto (database, ecc.)

Dovrai aggiornarlo con i dettagli del tuo database, ecc., ma finiremo con un documento simile a quello mostrato di seguito in " Elenco codici 1: wp-config.php ".

Codice 1: wp-config.php


<?php

define( 'AMBIENTE', 'sviluppo' );
define( 'WP_DEBUG_LOG', vero);
define( 'WP_DEBUG_DISPLAY', vero);
define( 'WP_DEBUG', vero);

/* Impostazioni MySQL */

/** Il nome del database per WordPress */
define( 'DB_NAME', 'mysite_db' );

/** Nome utente del database MySQL */
define( 'DB_USER', 'mysite_user' );

/** Password del database MySQL */
define( 'DB_PASSWORD', '***********' );

/** Nome host MySQL */
define( 'DB_HOST', 'esempio.com' );

/** Database Charset da utilizzare nella creazione di tabelle di database. */
define( 'DB_CHARSET', 'utf8' );

/** Il tipo di fascicolazione database. Non cambiarlo in caso di dubbio. */
define( 'DB_COLLATE', ” );

define( 'AUTH_KEY', '***********' );
define( 'SECURE_AUTH_KEY', '***********' );
define( 'LOGGED_IN_KEY', '***********' );
define( 'NONCE_KEY', '***********' );
define( 'AUTH_SALT', '***********' );
define( 'SECURE_AUTH_SALT', '***********' );
define( 'LOGGED_IN_SALT', '***********' );
define( 'NONCE_SALT', '***********' );

$table_prefix = 'wp_';

/* Multisito */
define( 'WP_ALLOW_MULTISITE', true );
define( 'MULTISITO', true );
define( 'SOTTODOMINIO_INSTALL', false );
define( 'DOMAIN_CURRENT_SITE', 'example.com' );
define( 'PATH_CURRENT_SITE', '/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );

define( 'ADMIN_COOKIE_PATH', '/' );
define( 'COOKIEPATH', ” );
define( 'SITECOOKIEPATH', ” );

// Roba del DB condiviso da WPMU
define( 'ALBA', 'acceso' );
define( 'WP_PRODUCTION_DOMAIN', 'esempio.com' );
define( 'WP_DEVELOPMENT_DOMAIN', 'mysite-local-domain' );

/* Questo è tutto, smetti di modificare! Buon blog. */

/** Percorso assoluto della directory di WordPress. */
if ( ! define( 'ABSPATH' ) ) {
define( 'ABSPATH', dirname( __FILE__ ). '/' );
}

/** Imposta le variabili di WordPress e i file inclusi. */
require_once(ABSPATH . 'wp-settings.php' );

2.2 Mappatura del dominio MU di WordPress (locale!)

Aggiungi lo stesso plugin al sito locale. Potresti pensare che sia così, come per il sito remoto, ma ti sbaglieresti!

Apri il file domain_mapping.php nel tuo editor preferito e modifica le righe 708 e 709 in modo che l'intera istruzione if assomigli a questa:

Codice 2: domain_mapping.php


if ( $url && $url != untrailingslashit( $protocol . $current_blog->domain . $current_blog->path ) ) {
$redirect = get_site_option('dm_301_redirect')? '301' : '302';
if ( ( define( 'VHOST' ) && constant( “VHOST” ) != 'yes' ) || (defined( 'SUBDOMAIN_INSTALL' ) && constant( 'SUBDOMAIN_INSTALL' ) == false ) ) {
$_SERVER[ 'REQUEST_URI' ] = str_replace( $current_blog->path, '/', $_SERVER[ 'REQUEST_URI' ] );
}
// header( “Location: {$url}{$_SERVER[ 'REQUEST_URI' ]}”, true, $redirect );
// Uscita;
}

2.3 sunrise.php

Per prima cosa, copia il file sunrise.php dal plugin wordpress-mu-domain-mapping nella directory wp-content. Potrebbe esserci già un file sunrise.php qui. Non preoccuparti, sovrascrivilo.

Copia da qui:

/wp-content/plugins/wordpress-mu-domain-mapping/sunrise.php

A qui:

/wp-content/sunrise.php

Quindi, modifica questo nuovo file sunrise.php, aggiungendo linee intorno alla riga 40, in modo che assomigli al codice seguente:

Codice 3: sunrise.php


<?php if ( ! define( 'SUNRISE_LOADED' ) ) { define( 'SUNRISE_LOADED', 1 ); } if (defined( 'COOKIE_DOMAIN' ) ) { die( 'La costante “COOKIE_DOMAIN” è definita (probabilmente in wp-config.php). Per favore rimuovi o commenta quella riga define().' ); } $wpdb->dmtable = $wpdb->base_prefix . 'mapping_dominio';
$dm_domain = $_SERVER['HTTP_HOST'];

if ( ( $nowww = preg_replace( '|^www.|', ”, $dm_domain ) ) != $dm_domain ) {
$dove = $wpdb->prepare( 'dominio IN (%s,%s)', $dm_domain, $nowww );
} altro {
$dove = $wpdb->prepare( 'domain = %s', $dm_domain );
}

$wpdb->suppress_errors();
$domain_mapping_id = $wpdb->get_var( “SELECT blog_id FROM {$wpdb->dmtable} WHERE {$where} ORDER BY CHAR_LENGTH(domain) DESC LIMIT 1” );
$wpdb->suppress_errors( false );
if ( $domain_mapping_id ) {
$current_blog = $wpdb->get_row( “SELECT * FROM {$wpdb->blogs} WHERE blog_id = '$domain_mapping_id' LIMIT 1” );
$current_blog->domain = $dm_domain;
$current_blog->percorso = '/';
$blog_id = $domain_mapping_id;
$site_id = $current_blog->site_id;

define( 'COOKIE_DOMAIN', $dm_domain );

$current_site = $wpdb->get_row( “SELECT * from {$wpdb->site} WHERE id = '{$current_blog->site_id}' LIMIT 0,1” );
$current_site->blog_id = $wpdb->get_var( “SELECT blog_id FROM {$wpdb->blogs} WHERE domain='{$current_site->domain}' AND path='{$current_site->path}'” );
if ( function_exists( 'get_site_option' ) ) {
$current_site->site_name = get_site_option( 'site_name' );
} elseif ( function_exists( 'get_current_site_name' ) ) {
$current_site = get_current_site_name( $current_site);
}

define( 'DOMAIN_MAPPING', 1 );
}

/*
* 1) AGGIUNTO CODICE MULTISITO
*/

// Filtra il dominio che viene visualizzato/emesso in HTML
add_filter( 'pre_option_home', 'dev_pre_url_filter', 1 );
add_filter( 'pre_option_siteurl', 'dev_pre_url_filter', 1 );
add_filter( 'the_content', 'dev_content_filter', 100 );
add_filter( 'content_url', 'dev_content_url_filter', 100, 2 );
add_filter('post_thumbnail_html', 'dev_content_filter', 100);
add_filter( 'wp_get_attachment_link', 'dev_content_filter', 100 );
add_filter( 'wp_get_attachment_url', 'dev_content_filter', 100 );
add_filter( 'upload_dir', 'dev_upload_dir_filter', 10 );

function dev_pre_url_filter() {
globale $wpdb, $percorso, $commutato;
$url;
$percorso_commutato;
$blog_id = get_current_blog_id();

if (! $cambiato) {
$url = is_ssl() ? 'https://': 'http://';
$url .= WP_DEVELOPMENT_DOMAIN;
if ( ! is_main_site() ) {
$url .= rtrim( $percorso, '/' );
}

restituisce $url;
} altro {
$switched_path = $wpdb->get_var( “SELECT path FROM {$wpdb->blogs} WHERE blog_id = {$blog_id} ORDER BY CHAR_LENGTH(path) DESC LIMIT 1” );
$url = is_ssl() ? 'https://': 'http://';
$url .= WP_DEVELOPMENT_DOMAIN;
$url .= rtrim( $percorso_commutato, '/' );

restituisce $url;
}
}

function dev_content_filter( $post_content ) {
$wpdb globale;

$blog_details = get_blog_details();
$original_url = $wpdb->get_var( “SELECT domain FROM {$wpdb->dmtable} WHERE blog_id = {$blog_details->blog_id} ORDER BY CHAR_LENGTH(domain) DESC LIMIT 1” );
$dev_url = WP_DEVELOPMENT_DOMAIN . $blog_details->percorso;

if ( $ original_url !== null ) {
$post_content = str_replace( $ original_url . '/', $ original_url, $post_content );
$post_content = str_replace( $original_url, $dev_url, $post_content);
}
// Cambia tutti gli URL in modo che puntino allo staging (immagini, ancore, qualsiasi cosa all'interno del contenuto del post)
$post_content = str_replace( WP_PRODUCTION_DOMAIN, WP_DEVELOPMENT_DOMAIN, $post_content);
// Modifica gli URL per "caricamenti" in modo che puntino alla produzione in modo che le immagini siano visibili
$post_content = str_replace( WP_DEVELOPMENT_DOMAIN . $blog_details->path . 'wp-content/uploads', WP_PRODUCTION_DOMAIN . $blog_details->path . 'wp-content/uploads', $post_content );

restituisce $post_content;
}

/*
* Filtra la funzione content_url, cercando in particolare le chiamate content_url('upload') in cui il percorso ha caricamenti nella stringa
*
* Aggiunto in modo che i plug-in MU possano utilizzare content_url su DEV e PROD
*/
function dev_content_url_filter( $url, $percorso ) {
if ( ! empty( $percorso ) && strpos( $percorso, 'caricamenti' ) !== false ) {
return str_replace( WP_DEVELOPMENT_DOMAIN, WP_PRODUCTION_DOMAIN, $url );
}

restituisce $url;
}

function dev_upload_dir_filter( $param ) {
$param['url'] = str_replace( WP_DEVELOPMENT_DOMAIN, WP_PRODUCTION_DOMAIN, $param['url'] );
$param['baseurl'] = str_replace( WP_DEVELOPMENT_DOMAIN, WP_PRODUCTION_DOMAIN, $param['baseurl'] );

restituisce $param;
}

/*
* Sostituzione per /wp-includes/ms-load.php get_site_by_path
*/
function dev_get_site_by_path( $_site, $_domain, $_path, $_segments, $_paths ) {
globale $wpdb, $percorso;

// In modo che ci sia una possibile corrispondenza nel database, imposta $_domain come WP_PRODUCTION_DOMAIN
$_dominio = WP_PRODUCTION_DOMAIN;

// Cerca un sito che corrisponda al dominio e al primo segmento di percorso
$site = $wpdb->get_row( $wpdb->prepare( “SELECT * FROM $wpdb->blogs WHERE domain = %s and path = %s”, $_domain, $_paths[0] ) );
$current_path = $_paths[0];

if ( $sito === null ) {
// Specificamente per il blog principale: se non viene trovato un sito, carica il blog principale
$site = $wpdb->get_row( $wpdb->prepare( “SELECT * FROM $wpdb->blogs WHERE domain = %s and path = %s”, $_domain, '/' ) );
$percorso_corrente = '/';
}

// Imposta il percorso in modo che corrisponda al primo segmento
$percorso = $percorso_corrente;

restituire $sito;
}

add_filter( 'pre_get_site_by_path', 'dev_get_site_by_path', 1, 5);

3. .htaccess (locale)

Inserisci quanto segue nel tuo file .htaccess (nota che la directory locale è stata rimossa dalla riga index.php RewriteRule finale):

Lista codici 4: .htaccess


# INIZIA WordPress
<IfModule mod_rewrite.c>;
Riscrivi motore acceso
Riscrivi Base /
RewriteRule ^index.php$ – [L]

# aggiungi una barra finale a /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

RiscriviCond %{REQUEST_FILENAME} -f [OR]
RiscriviCond %{REQUEST_FILENAME} -d
Riscrivi regola ^ – [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*.php)$ $1 [L]
RewriteRule . /index.php [L]
</IfModulo>;

# FINE WordPress

4. Host virtuali

Imposta host virtuali in modo da poter digitare il valore fornito in wp-config.php (sopra) per WP_DEVELOPMENT_DOMAIN nella barra degli indirizzi del browser e accedere al sito. Normalmente digiteresti localhost, ma questo lo sovrascriverà.

Nel codice di esempio (sopra), l'host virtuale è stato impostato per prendere "price-buckland" nella barra degli indirizzi e diretto alla directory contenente WordPress.

Il processo per l'aggiunta di host virtuali in un ambiente MAMP è il seguente:

1) Nel terminale:

 $ sudo vi /etc/hosts

2) Aggiungi la seguente riga, sostituendo a seconda dei casi l'indirizzo che vuoi digitare nel tuo browser:

 127.0.0.1 mysite-local-domain

3) Successivamente, vogliamo attivare host virtuali per il tuo ambiente locale, quindi apri il seguente file per la modifica:

 $ sudo vi /Applicazioni/MAMP/conf/apache/httpd.conf

Trova queste righe:

 # Host virtuali
# Includi /Applicazioni/MAMP/conf/apache/extra/httpd-vhosts.conf

E decommenta la riga "Includi", in questo modo:

 # Host virtuali
Includi /Applicazioni/MAMP/conf/apache/extra/httpd-vhosts.conf

4) Ora modifica il seguente file:

 $ sudo vi /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf

E aggiungi due voci: in primo luogo per consentire "localhost" nel tuo browser e, in secondo luogo, per aggiungere il nuovo host virtuale, consentendoti di digitare un dominio personalizzato nel tuo browser e raggiungere il tuo server locale:

 DocumentRoot "/Utenti/nomeutente/htdocs/"
    ServerName localhost


    DocumentRoot "/Users/username/htdocs/mysite-local-directory"
    NomeServer mysite-local-domain

5) Riavvia il server Apache. Nel mio caso, MAMP, ma dalla riga di comando esegui:

 apachectl riavvio

Se tutto è andato bene, ora dovresti avere una configurazione funzionante che ti consente di codificare un'installazione di WordPress ospitata localmente, che utilizza un database remoto.

Dovresti anche essere in grado di inviare le tue modifiche al server remoto e vedere una copia esatta sul sito remoto.

Risoluzione dei problemi, avvertenze e trucchi!

Sfortunatamente, molte (molte) cose possono andare storte. Ecco alcuni sintomi e cose da provare:

    1. Le pagine di amministrazione vanno bene, ma non riesco a visitare nessuna pagina front-end interna!
    2. .htaccess è mancante o non è stato inizializzato. Aggiungi il file e salva nuovamente i tuoi permalink.
    3. Maggiori informazioni tra breve!

Quando lavori sul tuo sito locale, se vai su:

 I miei siti > Amministratore di rete > Dashboard

Ti porterà al sito remoto, ad esempio:

 esempio.com/wp-admin/network

Questo potrebbe non essere quello che desideri, ma puoi digitare direttamente nella barra degli indirizzi e rimanere nell'ambiente locale, ad esempio:

mysite-local/wp-admin/network

Conclusione

Se tutto è andato bene, ora dovresti avere una configurazione funzionante che ti consente di codificare un'installazione di WordPress ospitata localmente, che utilizza un database remoto.

Dovresti anche essere in grado di inviare le tue modifiche al server remoto e vedere una copia esatta sul sito remoto.

Facci sapere come hai seguito questa guida passo passo al multisito WordPress per lo sviluppo locale e remoto nei commenti qui sotto!


Se hai bisogno di aiuto con il tuo sviluppo web non esitare a contattarci.