web-dev-qa-db-ja.com

をロードするための最良の方法は何ですか WP 私のマルチサイトWordpressインストールのサブドメインの環境?

WP multisiteのサブフォルダをインストールしました。「domain.com」としましょう。

"sub1.domain.com"、 "sub2.domain.com"、... "subN.domain.com"など、domain.comのサブドメインにWP環境を読み込む必要があります。これらのサブドメインはWPブログには対応していません。しかし、私はログインしたユーザー、データベースなどにアクセスする必要があります。

特定のサブドメインに必要なものを表示するphpファイルをロードするようにワイルドカードサブドメインを設定しました。そのファイルの最初の部分に "wp-load.php"を含めます。問題は、$ _SERVER ['HTTP_Host']がメインサイトのドメインではなくサブドメインであるため、 "ms-settings.php"の99行目付近でサイトのメインページにリダイレクトされることです。

では、どうすればWP環境をブログ以外のサブドメインに正しくロードできますか?

私はうまくいくプロトタイプを持っています、しかし私は私がやっていることの副作用について心配しているので、コアに精通している誰かが体重を量ることができるならばそれは素晴らしいことです。

私がしていることは "wp-load"をインクルードする前に$ current_siteと$ current_blogのグローバルを適切に事前設定することです。それから、 "ms-settings"はこれらを作成しようとせず、サブドメインを検出してフロントページにリダイレクトするコードパスにヒットしません。

私は今(例えば 'get_userdata'を使用して)メンバー情報と$ wpdbにアクセスすることができます。

これは合理的な方法のようですか?

5
Greg

選択したいサイトを選択させるには、定義を使用します。

これらの4つを定義して、$ current_site値を正しく設定できます。DOMAIN_CURRENT_SITE、PATH_CURRENT_SITE、SITE_ID_CURRENT_SITE、BLOG_ID_CURRENT_SITE。

Ms-load.phpでwpmu_current_site()関数をチェックすると、それを使って$ current_siteグローバルを作成していることがわかります。

手動で$ current_blogグローバルを設定する必要があるかもしれません。わからない。試してみてください。

現実的には、wp-load.phpを呼び出す前に、次のようなものを追加するだけです。

define( 'DOMAIN_CURRENT_SITE', 'example.com' );
define( 'PATH_CURRENT_SITE', '/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );

もちろん、あなたのメインのexample.comサイトに正しい値を設定してください。

これらをサブドメインのphpファイル自体に入れたくない場合は、wp-config.phpファイルまたはsunrise.phpファイルのどちらかでこのようなことを実行できます(wp-config.phpファイルでSUNRISEをtrueに定義した場合)。 config.phpももちろん)。

if ( $_SERVER['HTTP_Host'] == 'sub1.example.com' || 
     $_SERVER['HTTP_Host'] == 'sub2.example.com') {
    define( 'DOMAIN_CURRENT_SITE', 'example.com' );
    define( 'PATH_CURRENT_SITE', '/' );
    define( 'SITE_ID_CURRENT_SITE', 1 );
    define( 'BLOG_ID_CURRENT_SITE', 1 );
}

これは、sunriseファイルのロードが目的としているもので、このようなものを手動でオーバーライドできる場所を確保するためのものです。 wp-config.phpよりsunrise.phpを使用する利点(これも有効です)は、テストやデバッグなどの目的で、sunriseを他の場所で簡単にオン/オフにできることです。

3
Otto

Wordpress Muドメインマッピング pluginを試してみることもできます。

更新

実際には、サブドメインのphpファイルの先頭にwp-blog-header.phpを含めることがあなたの要求にぴったり合うので、テンプレート関数も読み込むことができます。

    include(dirname(__FILE__) . "/../path_to_my_blog/wp-blog-header.php");

wp-load.phpをインクルードした後に wp_redirect を実行することもできます。

2
konus

私はこの質問で尋ねたのと同じことを試みていたので、wp-load.phpをインクルードする前に$ _SERVER変数を偽装するまでリダイレクトを回避できませんでした。

define('WP_USE_THEMES', false);
define( 'DOMAIN_CURRENT_SITE', $siteRow['domain'] );
define( 'PATH_CURRENT_SITE', '/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', $siteRow['wp_blog_id'] );

$_SERVER = array(
    "HTTP_Host" => $siteRow['domain'],
    "SERVER_NAME" => $siteRow['domain'],
    "REQUEST_URI" => "/",
    "REQUEST_METHOD" => "GET"
);

$ siteRow配列は私自身のサイト設定です、あなたが必要とするもので変数を更新してください。リダイレクトせず、すべてのWP機能を自由に使用できます。楽しい。

0
Dunhamzzz

私は現在DOMAIN_CURRENT_SITEを設定するためにswitchステートメントを使用しています

ライブサーバーにデプロイしたときに動作するように設定しました。私の開発マシンでローカルに作業しているときにも、スイッチはDOMAIN_CURRENT_SITEを設定します。 (つまり、すべての.devトップレベルドメイン)

Switchステートメントの後に、変更しないがMULTISITE関連の他のものを定義します。

switch ($_SERVER['SERVER_NAME']) {
    case 'sub1.mydomain.com':
    case 'sub2.mydomain.com':
    case 'community.mydomain.com':
        define('DOMAIN_CURRENT_SITE', 'community.mydomain.com');
        break;
    case 'sub1.mydomain.dev':
    case 'sub2.mydomain.dev':
    case 'community.mydomain.dev':
        define('DOMAIN_CURRENT_SITE', 'community.mydomain.dev');
        break;
    default:
        define('DOMAIN_CURRENT_SITE', 'community.mydomain.com');
        break;
}

define('WP_ALLOW_MULTISITE', true);
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', true);
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);

もちろん、このwp-config.phpファイルにはそれ以上の設定がありますが、WP MULTISITEインストールに固有のものではないため、それらを含めませんでした。

注:ローカルで作業する場合(最新のsqlファイルをダウンロードした後。データベースで大量の検索置換操作を行う必要がありますが、具体的な質問とは無関係ですが、以下のwp-cli.orgのスニペットは残します)

wp search-replace 'community.mydomain.com' 'community.mydomain.dev' --network --dry-run
wp search-replace 'sub1.mydomain.com' 'sub1.mydomain.dev' --network --dry-run
wp search-replace 'sub2.mydomain.com' 'sub2.mydomain.dev' --network --dry-run
0
andxyz