Ich bin dabei, eine WordPress-Entwicklung in einer Mehrpersonen-Teamumgebung in Angriff zu nehmen. (3 oder mehr Personen, die gleichzeitig an derselben Codebasis arbeiten und sich jeweils lokal entwickeln)
Bei anderen CMS, mit denen wir gearbeitet haben, hat jeder seine Installationen auf dieselbe Datenbank gerichtet. Aufgrund der Funktionsweise dieses CMS/dieser Datenbank können wir alle denselben Inhalt in unsere Installationen (unter verschiedenen URLs) einspeisen gleiche Datenbank ohne große Probleme (außer dass gelegentlich Upload-Ordner synchronisiert werden müssen)
Meine Frage ist, was uns bei WordPress davon abhält, denselben Ansatz zu verwenden, und wie können wir diese Probleme lösen?
z.B. Drei Kopien von WordPress, die alle von derselben Datenbank ausgeführt werden.
http: //dev.local/developer-a/
http: //dev.local/developer-b/
http: //dev.local/developer-c/
usw
Ich hoffe, es versteht sich von selbst, dass dies nur vor dem Start in einer Entwicklungsumgebung geschehen wird.
wp_posts
- und wp_options
-Tabellen, wie es scheint)Derzeit habe ich die Anfänge einer Lösung für das erste Problem in Kraft. Ich füge folgendes in eine Datei in meinem mu-plugins Ordner ein.
Der Code filtert im Wesentlichen den Inhalt der Posts beim Ein- und Aussteigen aus der Datenbank, indem jede Instanz der URL durch ein eindeutiges Token ersetzt wird.
<?php
define('PORTABILITY_TOKEN', '{_portable_}');
function portability_remove_home($content)
{
$content = str_replace(get_option('home'), PORTABILITY_TOKEN, $content);
return $content;
}
add_filter('content_save_pre', 'portability_remove_home');
function portability_add_home($content)
{
$content = str_replace(PORTABILITY_TOKEN, get_option('home'), $content);
return $content;
}
add_filter('the_content', 'portability_add_home');
add_filter('the_editor_content', 'portability_add_home');
Ich habe die Optionen home und siteurl über PHP unter Verwendung der Umgebung eingestellt, in der WordPress installiert ist, um sie zu bearbeiten. (Auch dies ist nur für die Entwicklung gedacht.) Dies bedeutet, dass der Inhalt von WordPresses-Posts bei jeder einzelnen Installation so aussieht, als würde er auf dieser URL ausgeführt, wenn er beim Client eingeht.
<?php
if (!defined('WP_HOME'))
{
// define WP_HOME (aka url of install) based on environment.
// IF THIS ISN'T WORKING, DEFINE IT EARLIER.
define('WP_HOME', 'http://' . $_SERVER['HTTP_Host'] . str_replace($_SERVER['DOCUMENT_ROOT'], '', dirname(__FILE__) ) );
}
if (!defined('WP_SITEURL'))
{
// Assumes WordPress is in a separate directory called 'wp', relative to WP_HOME.
// IF IT'S DIFFERENT, DEFINE IT EARLIER.
define('WP_SITEURL', WP_HOME . '/wp');
}
Das zweite und dritte Problem scheinen mit den entsprechenden Symlinks lösbar zu sein (alle entwickeln sich auf demselben Computer).
Kann ich den Umgang mit den unterschiedlichen URLs trotzdem verbessern? Gibt es irgendetwas, das ich verpasst habe, das die URL in die Datenbank fest codiert?
Gibt es irgendwelche Fallstricke, auf die ich beim Symlinking achten sollte?
Irgendwelche anderen Probleme, an die sich irgendjemand denken kann?
Mir ist klar, dass diese Fragen sehr spezifisch sind. Wenn etwas unklar ist, kommentiere dies und ich werde es ändern/klären.
Vielen Dank.
Ich werde Frage 2 beantworten und mir bewusst sein, dass einige Werte in der Datenbank in serialisierten Arrays gespeichert sind. Wenn sich beispielsweise die Länge Ihrer URL-Zeichenfolge ändert und sie sich in einem serialisierten Array befindet, müssen Sie den Index dafür aktualisieren.
Mit this PHP script können Sie alle Werte in serialisierten Arrays aktualisieren oder über die Befehlszeile in Ihrem eigenen Skript ausführen
Frage 1: Sie haben URLs, die an mehr Stellen in die Datenbank eingehen und aus dieser herauskommen als nur in den Inhalt der Posts. Ich habe URLs in *_postmeta
, *_comments
und *_options
gefunden (zusätzlich zu den von Ihnen definierten). Dies zählt nicht die Plugin-Aktivität und Benutzerdefiniertes Metafeld Aktivität.
Frage 2: Ich werde auch manchmal Plugins für die Bequemlichkeit symlinken, und die meiste Zeit funktioniert es. Manchmal nicht. Ich kann Ihnen die genauen Bedingungen, die ein Problem verursachen, nicht sagen, aber Javascript scheint ein Faktor zu sein.
Frage 3: Ich würde Ärger mit der *_options
-Tabelle erwarten, wenn überhaupt. Dinge wie aktivierte Plugins und das aktive Thema bleiben dort erhalten, unter anderem sind viele Informationen ziemlich webseitenspezifisch.