WordPress-Multisite für lokale und Remote-Entwicklung
Veröffentlicht: 2021-07-19Es ist gängige Praxis, bei der Entwicklung für das Web lokale und Remoteumgebungen zu verwenden. Bei einzelnen WordPress-Seiten funktioniert dies problemlos. Multisite-WordPress-Installationen komplizieren die Angelegenheit jedoch erheblich.
Auf der Suche nach einer Lösung für das Installationsproblem von WordPress Multisite sind wir auf eine Reihe von Artikeln gestoßen, die von John Russel bei Laubster Boy geschrieben wurden. In diesen Artikeln zeigte er einen Weg auf, um dieses Problem für Remote-Entwicklungs- und Produktionsumgebungen zu lösen, was ziemlich nahe an unseren Wünschen war. Mit einigen Modifikationen haben wir es geschafft, die Dinge mehr oder weniger zu sortieren. Seitdem haben jedoch bestimmte Updates von WordPress diese Lösung gebrochen und wir mussten das Problem erneut aufgreifen.
In diesem Artikel zeige ich Ihnen, wie wir dieses Problem mit verschiedenen Ressourcen und ein wenig Bastelei gelöst haben.
Absicht
Wir möchten in der Lage sein, eine lokale Installation der Site und eine Remote-Installation der Site zu hosten, die beide von derselben (entfernten) Datenbank ausgeführt werden.
Problem
WordPress-Multisite-Setups leiten immer zur Basisinstallation weiter, in diesem Fall: remote. Dies macht es schwierig, an einer Entwicklungscodebasis zu arbeiten, die die Remote-Site exakt widerspiegelt.
Um dies zu umgehen, müssen Sie zwei Installationen ausführen, die unterschiedliche Datenbanken verwenden. Dies kann zu verwirrenden Konflikten und Synchronisationsproblemen führen, da bei jeder Bearbeitung sowohl der Code als auch die Datenbanken zusammengeführt werden müssen.
Lösung
Wir werden das WPMU Domain Mapping Plugin verwenden.
Beachten Sie, dass einige Dateien dieses Plugins direkt bearbeitet werden. Denken Sie also daran, wenn Sie das Plugin aus irgendeinem Grund aktualisieren!
Bei diesem Vorgang wird davon ausgegangen, dass Sie eine WordPress-Multisite-Installation in Ihren Remote- und lokalen Umgebungen haben.
Die folgenden Schritte werden jeweils nach local und remote getrennt, da es wichtig ist, an jedem Ort unterschiedliche Versionen derselben Dateien zu haben.
Nachdem die Hintergrundeinrichtung abgeschlossen ist, können wir mit den Schritten fortfahren!
Verzeichnisstruktur für lokale und entfernte WordPress-Multisite
Als Referenz sieht die Dateistruktur für dieses Setup sowohl in lokalen als auch in Remoteumgebungen wie folgt aus:
+-- wp-config.php | +-- .htaccess | +-- wp-Inhalt | | | +-- sunrise.php | | | +-- Plugins | | | +-- wordpress-mu-domain-mapping | | | +-- Changelog.txt | | | +-- domain_mapping.php | | | +-- readme.txt | | | +-- sunrise.php | | | +-- wordpress-mu-domain-mapping.php
1. Fernbedienung
Dieser Abschnitt enthält Details zu Remote-Dateien und -Einstellungen.
1.1 wp-config.php
Dies sollte auf dem Remote-Server nicht geändert werden.
1.2 WordPress MU-Domain-Zuordnung (Remote!)
Laden Sie das WordPress MU Domain Mapping- Plugin von hier herunter:
https://en-gb.wordpress.org/plugins/wordpress-mu-domain-mapping/
Auf Remote-Site installieren und "Netzwerk aktivieren", damit es auf allen Sites aktiv ist.
1.3 sonnenaufgang.php
Kopieren Sie die Datei sunrise.php aus dem WordPress-mu-domain-mapping- Plugin direkt in das wp-content- Verzeichnis, sodass sie sich hier befindet:
/wp-content/sunrise.php
1.4 Remote-Bearbeitungen beenden
Sie sind nun mit der Bearbeitung der Remote-Site fertig. Besuchen Sie ein paar Seiten, um sicherzustellen, dass Sie nichts kaputt gemacht haben, und wir sind hier fertig.
2. Lokal
Dieser Abschnitt zeigt, was auf localhost zu tun ist. Ein Teil des Codes ist dupliziert, aber der Vollständigkeit halber wird alles angezeigt.
2.1 wp-config.php
Kopieren Sie den Code von unten und fügen Sie ihn in Ihre Datei wp-config.php ein. Sie können es dann mit den Details aus Ihrer entfernten wp-config.php (Datenbank usw.) aktualisieren.
Sie müssen dies mit Ihren Datenbankdetails usw. aktualisieren, aber wir werden am Ende ein Dokument erhalten, das dem unten in „ Codelisting 1: wp-config.php “ ähnelt .
Code-Listing 1: wp-config.php
<?phpdefine( 'UMWELT', 'Entwicklung' );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );
define( 'WP_DEBUG', true );/* MySQL-Einstellungen */
/** Der Name der Datenbank für WordPress */
define( 'DB_NAME', 'mysite_db');/** MySQL-Datenbank-Benutzername */
define( 'DB_USER', 'mysite_user');/** MySQL-Datenbankkennwort */
define('DB_PASSWORD', '************');/** MySQL-Hostname */
define( 'DB_HOST', 'example.com');/** Datenbankzeichensatz, der beim Erstellen von Datenbanktabellen verwendet wird. */
define( 'DB_CHARSET', 'utf8' );/** Der Datenbanksortiertyp. Ändern Sie dies im Zweifelsfall nicht. */
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_';
/* Multisite */
define( 'WP_ALLOW_MULTISITE', true );
define( 'MULTISITE', true );
define( 'SUBDOMAIN_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', ” );// WPMU hat DB-Sachen geteilt
define( 'SONNENAUFGANG', 'an' );
define( 'WP_PRODUCTION_DOMAIN', 'example.com');
define( 'WP_DEVELOPMENT_DOMAIN', 'mysite-local-domain');/* Das ist alles, hör auf zu bearbeiten! Viel Spaß beim Bloggen. */
/** Absoluter Pfad zum WordPress-Verzeichnis. */
if ( ! definiert( 'ABSPATH' ) ) {
define('ABSPATH', dirname(__FILE__) .'/');
}/** Richtet WordPress-Variablen und enthaltene Dateien ein. */
require_once( ABSPATH . 'wp-settings.php' );
2.2 WordPress MU-Domain-Zuordnung (lokal!)
Fügen Sie dasselbe Plugin zur lokalen Site hinzu. Sie könnten denken, dass dies laut Remote-Site der Fall ist, aber Sie liegen falsch!
Öffnen Sie die Datei domain_mapping.php in Ihrem bevorzugten Editor und bearbeiten Sie die Zeilen 708 und 709, damit die ganze if-Anweisung wie folgt aussieht:
Code-Auflistung 2: domain_mapping.php
if ( $url && $url != unrailingslashit( $protocol . $current_blog->domain . $current_blog->path ) ) {
$redirect = get_site_option('dm_301_redirect') ? '301' : '302';
if ( ( definiert ( 'VHOST' ) && konstant( "VHOST" ) != 'ja' ) || ( definiert( 'SUBDOMAIN_INSTALL' ) && konstant( 'SUBDOMAIN_INSTALL' ) == false ) ) {
$_SERVER[ 'REQUEST_URI' ] = str_replace( $current_blog->path, '/', $_SERVER[ 'REQUEST_URI' ] );
}
// header( "Speicherort: {$url}{$_SERVER[ 'REQUEST_URI' ]}", true, $redirect );
// Ausfahrt;
}
2.3 sunrise.php
Kopieren Sie zunächst die Datei sunrise.php aus dem WordPress-mu-domain-mapping-Plugin in das wp-content-Verzeichnis. Möglicherweise befindet sich hier bereits eine sunrise.php-Datei. Keine Sorge – überschreiben Sie es einfach.
Von hier kopieren:
/wp-content/plugins/wordpress-mu-domain-mapping/sunrise.php
Bis hierhin:
/wp-content/sunrise.php
Bearbeiten Sie als Nächstes diese neue Datei sunrise.php und fügen Sie Zeilen um Zeile 40 hinzu, sodass sie wie der folgende Code aussieht:
Code-Auflistung 3: sunrise.php
<?php if ( ! define( 'SUNRISE_LOADED' ) ) { define( 'SUNRISE_LOADED', 1 ); } if ( define( 'COOKIE_DOMAIN' ) ) { die( 'Die Konstante “COOKIE_DOMAIN” ist definiert (wahrscheinlich in wp-config.php). Bitte entfernen oder kommentieren Sie diese define() Zeile.' ); } $wpdb->dmtable = $wpdb->base_prefix . 'Domänenzuordnung';
$dm_domain = $_SERVER['HTTP_HOST'];if ( ( $nowww = preg_replace( '|^www.|', , $dm_domain ) ) != $dm_domain ) {
$where = $wpdb->prepare( 'Domäne IN (%s,%s)', $dm_domain, $nowww );
} sonst {
$where = $wpdb->prepare( 'domain = %s', $dm_domain );
}$wpdb->unterdrücke_fehler();
$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->path = '/';
$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) HINZUGEFÜGTER MULITISITE-CODE
*/// Filtert die angezeigte/ausgegebene Domain 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 );Funktion dev_pre_url_filter() {
global $wpdb, $path, $switched;
$url;
$switched_path;
$blog_id = get_current_blog_id();if ( ! $switched ) {
$url = is_ssl() ? 'https://': 'http://';
$url .= WP_DEVELOPMENT_DOMAIN;
if ( ! is_main_site() ) {
$url .= rtrim( $pfad, '/' );
}$url zurückgeben;
} sonst {
$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( $switched_path, '/' );$url zurückgeben;
}
}Funktion dev_content_filter( $post_content ) {
global $wpdb;$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->Pfad;if ( $original_url !== null ) {
$post_content = str_replace( $original_url . '/', $original_url, $post_content );
$post_content = str_replace( $original_url, $dev_url, $post_content );
}
// Ändere alle URLs so, dass sie auf das Staging verweisen (Bilder, Anker, alles innerhalb des Post-Inhalts)
$post_content = str_replace( WP_PRODUCTION_DOMAIN, WP_DEVELOPMENT_DOMAIN, $post_content );
// Ändern Sie die URLs für „Uploads“ so, dass sie auf die Produktion verweisen, damit die Bilder sichtbar sind
$post_content = str_replace( WP_DEVELOPMENT_DOMAIN . $blog_details->path . 'wp-content/uploads', WP_PRODUCTION_DOMAIN . $blog_details->path . 'wp-content/uploads', $post_content );$post_content zurückgeben;
}/*
* Filtert die content_url-Funktion – sucht speziell nach content_url('upload')-Aufrufen, bei denen der Pfad Uploads in der Zeichenfolge enthält
*
* Hinzugefügt, damit MU-Plugins content_url auf DEV und PROD verwenden können
*/
Funktion dev_content_url_filter( $url, $path ) {
if ( ! empty( $path ) && strpos( $path, 'uploads' ) !== false ) {
return str_replace( WP_DEVELOPMENT_DOMAIN, WP_PRODUCTION_DOMAIN, $url );
}$url zurückgeben;
}Funktion 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'] );geben $param zurück;
}/*
* Ersatz für /wp-includes/ms-load.php get_site_by_path
*/
Funktion dev_get_site_by_path( $_site, $_domain, $_path, $_segments, $_paths ) {
global $wpdb, $pfad;// Damit es eine mögliche Übereinstimmung in der Datenbank gibt, setze $_domain auf WP_PRODUCTION_DOMAIN
$_domain = WP_PRODUCTION_DOMAIN;// Suche nach einer Site, die der Domain und dem ersten Pfadsegment entspricht
$site = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain = %s und path = %s", $_domain, $_paths[0] ) );
$aktueller_Pfad = $_Pfade[0];if ( $site === null ) {
// Speziell für den Hauptblog – wenn eine Seite nicht gefunden wird, dann den Hauptblog laden
$site = $wpdb->get_row( $wpdb->prepare( “SELECT * FROM $wpdb->blogs WHERE domain = %s und path = %s”, $_domain, '/') );
$aktueller_Pfad = '/';
}// Pfad so setzen, dass er mit dem ersten Segment übereinstimmt
$pfad = $aktueller_Pfad;geben $site zurück;
}add_filter( 'pre_get_site_by_path', 'dev_get_site_by_path', 1, 5 );
3. .htaccess (lokal)
Fügen Sie Folgendes in Ihre .htaccess- Datei ein (beachten Sie, dass das lokale Verzeichnis aus der letzten Zeile index.php RewriteRule entfernt wurde):
Codelisting 4: .htaccess
# BEGIN WordPress
<IfModule mod_rewrite.c>;
RewriteEngine Ein
RewriteBase /
RewriteRule ^index.php$ – [L]# einen nachgestellten Schrägstrich zu /wp-admin hinzufügen
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]RewriteCond %{REQUEST_FILENAME} -f [ODER]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ – [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*.php)$ $1 [L]
RewriteRule . /index.php [L]
</IfModule>;# ENDE WordPress
4. Virtuelle Hosts
Richten Sie virtuelle Hosts so ein, dass Sie den in wp-config.php (oben) angegebenen Wert für WP_DEVELOPMENT_DOMAIN in die Browser-Adressleiste eingeben und zur Site gelangen können. Normalerweise würden Sie localhost eingeben, aber dies überschreibt dies.
Im Beispielcode (oben) wurde der virtuelle Host so eingestellt, dass er „price-buckland“ in die Adressleiste nimmt und direkt zum Verzeichnis mit WordPress führt.
Der Prozess zum Hinzufügen virtueller Hosts in einer MAMP-Umgebung ist wie folgt:
1) Im Terminal:
$ sudo vi /etc/hosts
2) Fügen Sie die folgende Zeile hinzu und ersetzen Sie sie entsprechend für die Adresse, die Sie in Ihren Browser eingeben möchten:
127.0.0.1 mysite-local-domain
3) Als nächstes möchten wir virtuelle Hosts für Ihre lokale Umgebung aktivieren, also öffnen Sie die folgende Datei zum Bearbeiten:
$ sudo vi /Applications/MAMP/conf/apache/httpd.conf
Finden Sie diese Zeilen:
# virtuelle Hosts Host # /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf einschließen
Und kommentieren Sie die Zeile "Einschließen" wie folgt:
# virtuelle Hosts Host Fügen Sie /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf ein
4) Bearbeiten Sie nun die folgende Datei:
$ sudo vi /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
Und fügen Sie zwei Einträge hinzu – erstens, um 'localhost' in Ihrem Browser zuzulassen und zweitens, um den neuen virtuellen Host hinzuzufügen, sodass Sie eine benutzerdefinierte Domain in Ihren Browser eingeben und Ihren lokalen Server erreichen können:
DocumentRoot "/Benutzer/Benutzername/htdocs/"
Servername localhost
DocumentRoot "/Benutzer/Benutzername/htdocs/mysite-local-directory"
ServerName mysite-local-domain
5) Starten Sie den Apache-Server neu. In meinem Fall MAMP, aber über die Befehlszeile ausführen:
apachectl Neustart
Wenn alles gut gelaufen ist, sollten Sie jetzt über ein funktionierendes Setup verfügen, mit dem Sie eine lokal gehostete WordPress-Installation programmieren können, die eine Remote-Datenbank verwendet.
Sie sollten auch in der Lage sein, Ihre Änderungen auf den Remote-Server zu übertragen und eine exakte Kopie auf der Remote-Site anzuzeigen.
Fehlerbehebung, Vorbehalte und Fallstricke!
Leider können viele (viele) Dinge schief gehen. Hier sind einige Symptome und Dinge, die Sie ausprobieren sollten:
- Admin-Seiten sind in Ordnung, aber ich kann keine internen Frontend-Seiten besuchen!
- .htaccess fehlt entweder oder wurde nicht initialisiert. Fügen Sie die Datei hinzu und speichern Sie Ihre Permalinks erneut.
- Mehr folgt bald!
Wenn Sie an Ihrer lokalen Website arbeiten, gehen Sie zu:
Meine Websites > Netzwerkadministrator > Dashboard
Es führt Sie zum entfernten Standort, dh:
example.com/wp-admin/network
Dies ist möglicherweise nicht das, was Sie möchten, aber Sie können direkt in die Adressleiste eingeben und in der lokalen Umgebung bleiben, dh:
mysite-local/wp-admin/netzwerk
Fazit
Wenn alles gut gelaufen ist, sollten Sie jetzt über ein funktionierendes Setup verfügen, mit dem Sie eine lokal gehostete WordPress-Installation programmieren können, die eine Remote-Datenbank verwendet.
Sie sollten auch in der Lage sein, Ihre Änderungen auf den Remote-Server zu übertragen und eine exakte Kopie auf der Remote-Site anzuzeigen.
Lassen Sie uns in den Kommentaren unten wissen, wie Sie dieser Schritt-für-Schritt-Anleitung zu WordPress-Multisite für die lokale und Remote-Entwicklung gefolgt sind!
Wenn Sie Hilfe bei Ihrer Webentwicklung benötigen, zögern Sie nicht, uns zu kontaktieren.
