web-dev-qa-db-ja.com

WordPressデータベースをポータブルにし、URLに依存しないようにするにはどうすればよいですか。

問題

私は、マルチパーソンチーム環境でのWordPress開発に着手しようとしています。 (3人以上が同じコードベースで同時に作業し、それぞれが現地で開発している)

私たちが協力してきた他のCMSでは、誰もが自分のインストールを同じデータベースに向けていたし、そのCMS /データベースがどのように働いていたかによって同じデータベースをあまり問題なく(アップロードフォルダを同期する必要がある場合を除く)

私の質問は、WordPressで、私たちがこの同じアプローチを使うことを妨げるものは何ですか、そして私たちはどうやってこれらの問題を解決できるのでしょうか?

例えば。 WordPressの3つのコピーはすべて同じデータベースから実行されています。

http://dev.local/developer-a/
http://dev.local/developer-b/
http://dev.local/developer-c/

言うまでもありませんが、これは発売前の開発環境に限られます。

主な問題

  1. データベース内の特定のURLへの参照(wp_postsテーブルとwp_optionsテーブルのようです)
  2. ある人がプラグインをインストールした場合、他の人はそれを持っていないでしょうし、データベースで並行性の問題を引き起こすでしょう
  3. アップロードフォルダの同期を維持する

現在のソリューション

現在、私は最初の問題に対する解決策の始まりを定めています。私はmu-pluginsフォルダの中のファイルに以下を置きます。

このコードは、URLのインスタンスを一意のトークンで置き換えることによって、データベースに出入りする投稿コンテンツを本質的にフィルタリングします。

<?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');

私はそれらを解決するためにWordPressがインストールされている場所の環境を使用してphp経由でhomeとsiteurlのオプションを設定しました。 (繰り返しますが、これは開発のみを目的としています)つまり、個々のインストールに対して、WordPressの投稿コンテンツはクライアントに届くまでにそのURLで実行されているように見えます。

<?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');
}

2番目と3番目の問題は適切なシンボリックリンクで解決できるようです(すべて同じマシン上で開発中)。

実際の質問

  1. とにかく、異なるURLの扱いを改善できますか? URLをデータベースにハードコーディングするために見逃したことはありますか?

  2. シンボリックリンクについて知っておくべきことはありますか?

  3. 誰もが考えることができる他の問題はありますか?

私はこれらの質問が非常に具体的であることを理解しています、もし何か不明なことがあれば、これについてコメントし、私は修正/明確化します。

ありがとう。

9
navitronic

私は質問2に答えます。データベース内のいくつかの値は直列化された配列に格納されていることに注意してください。たとえば、URL文字列の長さが変わり、それが直列化された配列になっている場合は、それに対するインデックスを更新する必要があります。

this PHP script を使用して、直列化された配列内のすべての値を更新することも、独自のスクリプトでコマンドラインから実行することもできます。

2
davemac

質問1:投稿コンテンツだけでなく、URLがデータベースに出入りする場所が増えました。 (あなたが定義したものに加えて)*_postmeta*_comments、および*_optionsにURLが見つかりました。これはプラグインのアクティビティや カスタムメタフィールド のアクティビティはカウントしません。

質問2:便利のためにプラグインをシンボリックリンクすることもありますが、ほとんどの場合はうまくいきます。時にはそうではありません。問題を引き起こす正確な条件をあなたに言うことはできませんが、Javascriptが要因のようです。

質問3:*_optionsテーブルに問題があるとしたら問題ないと思います。アクティブ化されたプラグインやアクティブなテーマのようなものはそこに保存されています。

1
s_ha_dum