web-dev-qa-db-de.com

Wie kann ich eine WordPress-Datenbank portabel und URL-unabhängig machen?

Problem

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.

Hauptprobleme

  1. Verweise auf bestimmte URLs in der Datenbank (wp_posts- und wp_options-Tabellen, wie es scheint)
  2. Wenn eine Person ein Plugin installiert, wird es von der anderen Person nicht installiert und es treten Probleme mit der Parallelität in der Datenbank auf
  3. Upload-Ordner synchron halten

Aktuelle Lösung

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).

Aktuelle Fragen

  1. 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?

  2. Gibt es irgendwelche Fallstricke, auf die ich beim Symlinking achten sollte?

  3. 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.

9
navitronic

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

2
davemac

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.

1
s_ha_dum