ローカルおよびリモート開発用のWordPressマルチサイト

公開: 2021-07-19

Web用に開発するときは、ローカル環境とリモート環境を使用するのが一般的な方法です。 単一のWordPressサイトの場合、これは問題なく機能します。 ただし、マルチサイトのWordPressのインストールは、問題を大幅に複雑にします。

WordPressマルチサイトインストールの問題の解決策を探しているときに、ジョンラッセルがラウブスターボーイで書いた一連の記事に出くわしました。 これらの記事で、彼はリモート開発および実稼働環境でこの問題を解決する方法を示しました。これは、私たちが望んでいたものにかなり近いものでした。 いくつかの変更を加えて、私たちは物事を多かれ少なかれソートすることができました。 ただし、それ以降、WordPressの特定の更新によりその解決策が破られ、問題を再検討する必要がありました。

この記事では、さまざまなリソースと少しの調整を使用して、この問題をどのように解決したかを示します。

意図

同じ(リモート)データベースで実行されるサイトのローカルインストールとサイトのリモートインストールをホストできるようにする必要があります。

問題

WordPressマルチサイトのセットアップは、常に基本インストール(この場合はリモート)にリダイレクトされます。 これにより、リモートサイトを正確にミラーリングする開発コードベースでの作業が困難になります。

これを回避するには、異なるデータベースを使用する2つのインストールを実行する必要があります。 これは、編集のたびにコードとデータベースの両方をマージする必要があるため、混乱を招く競合や同期の問題につながる可能性があります。

解決

WPMUドメインマッピングプラグインを利用します。

このプラグインのいくつかのファイルは直接編集されるため、何らかの理由でプラグインを更新する場合は、これを覚えておくことが重要です。

このプロセスは、リモート環境とローカル環境にWordPressマルチサイトがインストールされていることを前提としています。

それぞれの場所に同じファイルの異なるバージョンを配置することが重要であるため、それぞれの次の手順はローカルとリモートで分けられます。

それでは、バックグラウンドセットアップが完了したら、手順を進めましょう。

ローカルおよびリモートのWordPressマルチサイトのディレクトリ構造

参考までに、このセットアップのファイル構造は、ローカル環境とリモート環境の両方で次のようになります。

 + -wp-config.php
|
+-。htaccess
|
+ -wp-content
| |
| + -sunrise.php
| |
| +-プラグイン
| |
| + -wordpress-mu-domain-mapping
| |
| + -Changelog.txt
| |
| + -domain_mapping.php
| |
| + -readme.txt
| |
| + -sunrise.php
| |
| + -wordpress-mu-domain-mapping.php

1.リモート

このセクションでは、リモートファイルと設定の詳細について説明します。

1.1 wp-config.php

これは、リモートサーバーでは変更しないでください。

1.2 WordPress MUドメインマッピング(リモート!)

ここからWordPressMUドメインマッピングプラグインをダウンロードします。

https://en-gb.wordpress.org/plugins/wordpress-mu-domain-mapping/

リモートサイトにインストールして「ネットワークアクティベート」し、すべてのサイトでアクティブになるようにします。

1.3 sunrise.php

sunrise.phpファイルをwordpress-mu-domain-mappingプラグインから直接wp-contentディレクトリにコピーして、次の場所に配置します。

/wp-content/sunrise.php

1.4リモート編集の終了

これで、リモートサイトの編集は完了です。 何も壊れていないことを確認するためにいくつかのページにアクセスしてください。これで完了です。

2.ローカル

このセクションでは、ローカルホストで何をすべきかを示します。 一部のコードは重複していますが、完全を期すためにすべてが示されています。

2.1 wp-config.php

以下からコードをコピーして、wp-config.phpファイルに貼り付けます。 次に、リモートのwp-config.php(データベースなど)からの詳細で更新できます。

データベースの詳細などでこれを更新する必要がありますが、最終的には以下の「コードリスト1:wp-config.php 」に示すようなドキュメントになります。

コードリスト1:wp-config.php


<?php

define( '環境'、 '開発');
define( 'WP_DEBUG_LOG'、true);
define( 'WP_DEBUG_DISPLAY'、true);
define( 'WP_DEBUG'、true);

/ * MySQL設定* /

/ ** WordPressのデータベースの名前* /
define( 'DB_NAME'、 'mysite_db');

/ ** MySQLデータベースのユーザー名* /
define( 'DB_USER'、 'mysite_user');

/ ** MySQLデータベースのパスワード* /
define( 'DB_PASSWORD'、 '***********');

/ ** MySQLホスト名* /
define( 'DB_HOST'、 'example.com');

/ **データベーステーブルの作成に使用するデータベース文字セット。 * /
define( 'DB_CHARSET'、 'utf8');

/ **データベース照合タイプ。 疑わしい場合はこれを変更しないでください。 * /
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_';

/ *マルチサイト* /
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共有DBのもの
define( 'SUNRISE'、 'on');
define( 'WP_PRODUCTION_DOMAIN'、 'example.com');
define( 'WP_DEVELOPMENT_DOMAIN'、 'mysite-local-domain');

/ *以上です、編集をやめてください! 幸せなブログ。 * /

/ ** WordPressディレクトリへの絶対パス。 * /
if(!defined( 'ABSPATH')){
define( 'ABSPATH'、dirname(__ FILE __)。 '/');
}

/ ** WordPressの変数とインクルードファイルを設定します。 * /
require_once(ABSPATH。'wp-settings.php ');

2.2 WordPress MUドメインマッピング(ローカル!)

同じプラグインをローカルサイトに追加します。 リモートサイトによると、それはそれだと思うかもしれませんが、あなたは間違っているでしょう!

お気に入りのエディターでファイルdomain_mapping.phpを開き、行708と709を編集して、ifステートメント全体が次のようになるようにします。

コードリスト2:domain_mapping.php


if($ url && $ url!= untrailingslashit($ protocol。$ current_blog-> domain。$ current_blog-> path)){
$ redirect = get_site_option( 'dm_301_redirect')? '301': '302';
if((defined( 'VHOST')&& constant(“ VHOST”)!= 'yes')||(defined( 'SUBDOMAIN_INSTALL')&& constant( 'SUBDOMAIN_INSTALL')== false)){
$ _SERVER ['REQUEST_URI'] = str_replace($ current_blog-> path、 '/'、$ _SERVER ['REQUEST_URI']);
}
// header(“ Location:{$ url} {$ _ SERVER ['REQUEST_URI']}”、true、$ redirect);
// 出口;
}

2.3 sunrise.php

まず、sunrise.phpファイルをwordpress-mu-domain-mappingプラグインからwp-contentディレクトリにコピーします。 ここにはすでにsunrise.phpファイルがあるかもしれません。 心配しないでください–上書きするだけです。

ここからコピー:

/wp-content/plugins/wordpress-mu-domain-mapping/sunrise.php

ここへ:

/wp-content/sunrise.php

次に、この新しいsunrise.phpファイルを編集して、40行目の周りに行を追加し、次のコードのようにします。

コードリスト3:sunrise.php


<?php if(!defined( 'SUNRISE_LOADED')){define( 'SUNRISE_LOADED'、1); } if(defined( 'COOKIE_DOMAIN')){die( '定数「COOKIE_DOMAIN」が定義されています(おそらくwp-config.phpにあります)。そのdefine()行を削除またはコメントアウトしてください。'); } $ wpdb-> dmtable = $ wpdb-> base_prefix。 'domain_mapping';
$ dm_domain = $ _SERVER ['HTTP_HOST'];

if(($ nowww = preg_replace( '| ^ www。|'、”、$ dm_domain))!= $ dm_domain){
$ where = $ wpdb-> prepare( 'domain IN(%s、%s)'、$ dm_domain、$ nowww);
} そうしないと {
$ where = $ wpdb-> prepare( 'domain =%s'、$ dm_domain);
}

$ wpdb-> suppress_errors();
$ 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)追加されたマルチサイトコード
* /

//表示/出力されるドメインを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);

関数dev_pre_url_filter(){
グローバル$ wpdb、$ path、$ switched;
$ url;
$ switched_pa​​th;
$ blog_id = get_current_blog_id();

if(!$ switched){
$ url = is_ssl()? 'https://': 'http://';
$ url。= WP_DEVELOPMENT_DOMAIN;
if(!is_main_site()){
$ url。= rtrim($ path、 '/');
}

$ urlを返します。
} そうしないと {
$ switched_pa​​th = $ 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_pa​​th、 '/');

$ urlを返します。
}
}

function dev_content_filter($ post_content){
グローバル$ 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-> path;

if($ original_url!== null){
$ post_content = str_replace($ original_url。 '/'、$ original_url、$ post_content);
$ post_content = str_replace($ original_url、$ dev_url、$ post_content);
}
//すべてのURLをステージングを指すように変更します(画像、アンカー、投稿コンテンツ内のすべて)
$ post_content = str_replace(WP_PRODUCTION_DOMAIN、WP_DEVELOPMENT_DOMAIN、$ post_content);
//「アップロード」のURLを本番環境を指すように変更して、画像が表示されるようにします
$ 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を返します。
}

/ *
* content_url関数をフィルタリングします–特に、パスの文字列にアップロードがあるcontent_url( 'upload')呼び出しを探します
*
* MUプラグインがDEVおよびPRODでcontent_urlを使用できるように追加されました
* /
関数dev_content_url_filter($ url、$ path){
if(!empty($ path)&& strpos($ path、 'uploads')!== false){
str_replace(WP_DEVELOPMENT_DOMAIN、WP_PRODUCTION_DOMAIN、$ url);を返します。
}

$ urlを返します。
}

function 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']);

$ paramを返します。
}

/ *
* /wp-includes/ms-load.phpget_site_by_pathの代わり
* /
function dev_get_site_by_path($ _site、$ _domain、$ _path、$ _segments、$ _paths){
グローバル$ wpdb、$ path;

//データベースに一致する可能性があるように、$ _domainをWP_PRODUCTION_DOMAINに設定します
$ _domain = WP_PRODUCTION_DOMAIN;

//ドメインと最初のパスセグメントに一致するサイトを検索します
$ site = $ wpdb-> get_row($ wpdb-> prepare(“ SELECT * FROM $ wpdb-> blogs WHERE domain =%s and path =%s”、$ _domain、$ _paths [0]));
$ current_path = $ _paths [0];

if($ site === null){
//特にメインブログ用–サイトが見つからない場合は、メインブログをロードします
$ site = $ wpdb-> get_row($ wpdb-> prepare(“ SELECT * FROM $ wpdb-> blogs WHERE domain =%s and path =%s”、$ _domain、 '/'));
$ current_path = '/';
}

//最初のセグメントに一致するようにパスを設定します
$ path = $ current_path;

$ siteを返します。
}

add_filter( 'pre_get_site_by_path'、 'dev_get_site_by_path'、1、5);

3. .htaccess(ローカル)

以下を.htaccessファイルに挿入します(ローカルディレクトリが最終的なindex.php RewriteRule行から削除されていることに注意してください)。

コードリスト4:.htaccess


#WordPressを始める
<IfModule mod_rewrite.c>;
RewriteEngineオン
RewriteBase /
RewriteRule ^ index.php $ – [L]

#末尾のスラッシュを/ wp-adminに追加します
RewriteRule ^ wp-admin $ wp-admin / [R = 301、L]

RewriteCond%{REQUEST_FILENAME} -f [または]
RewriteCond%{REQUEST_FILENAME} -d
RewriteRule ^ – [L]
RewriteRule ^(wp-(content | admin | contains)。*)$ 1 [L]
RewriteRule ^(。*。php)$ $ 1 [L]
RewriteRule。 /index.php [L]
</ IfModule>;

#WordPressを終了

4.仮想ホスト

WP_DEVELOPMENT_DOMAINのwp-config.php(上記)で指定された値をブラウザーのアドレスバーに入力してサイトにアクセスできるように、仮想ホストを設定します。 通常はlocalhostと入力しますが、これはそれを上書きします。

サンプルコード(上記)では、仮想ホストはアドレスバーで「price-buckland」を取得し、WordPressを含むディレクトリに直接移動するように設定されています。

MAMP環境に仮想ホストを追加するプロセスは次のとおりです。

1)ターミナル内:

 $ sudo vi / etc / hosts

2)次の行を追加し、ブラウザに入力するアドレスを適宜置き換えます。

 127.0.0.1mysite-local-domain

3)次に、ローカル環境の仮想ホストをアクティブ化するため、次のファイルを開いて編集します。

 $ sudo vi /Applications/MAMP/conf/apache/httpd.conf

これらの行を見つけます:

 #仮想ホスト
#/ Applications / MAMP / conf / apache / extra /httpd-vhosts.confを含める

そして、次のように「含める」行のコメントを解除します。

 #仮想ホスト
/Applications/MAMP/conf/apache/extra/httpd-vhosts.confを含めます

4)次のファイルを編集します。

 $ sudo vi /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf

そして、2つのエントリを追加します。1つはブラウザで「localhost」を許可し、もう1つは新しい仮想ホストを追加して、ブラウザにカスタムドメインを入力し、ローカルサーバーにアクセスできるようにします。

 DocumentRoot "/ Users / username / htdocs /"
    ServerName localhost


    DocumentRoot "/ Users / username / htdocs / mysite-local-directory"
    ServerNamemysite-local-domain

5)Apacheサーバーを再起動します。 私の場合、MAMPですが、コマンドラインから次のコマンドを実行します。

 apachectl restart

すべてがうまくいけば、リモートデータベースを使用するローカルでホストされているWordPressインストールをコーディングできる作業セットアップができているはずです。

また、変更をリモートサーバーにプッシュして、リモートサイトで正確なコピーを確認できる必要があります。

トラブルシューティング、警告、および落とし穴!

残念ながら、多くの(多くの)ことがうまくいかない可能性があります。 ここにいくつかの症状と試すべきことがあります:

    1. 管理ページは問題ありませんが、内部のフロントエンドページにアクセスできません。
    2. .htaccessがないか、初期化されていません。 ファイルを追加し、パーマリンクを再保存します。
    3. もっとすぐに来ます!

ローカルサイトで作業する場合、次の場所に移動すると、次のようになります。

 個人用サイト>ネットワーク管理者>ダッシュボード

リモートサイトに移動します。つまり、次のようになります。

 example.com/wp-admin/network

これはあなたが望むものではないかもしれませんが、アドレスバーに直接入力してローカル環境にとどまることができます。

mysite-local / wp-admin / network

結論

すべてがうまくいけば、リモートデータベースを使用するローカルでホストされているWordPressインストールをコーディングできる作業セットアップができているはずです。

また、変更をリモートサーバーにプッシュして、リモートサイトで正確なコピーを確認できる必要があります。

以下のコメントで、ローカルおよびリモート開発用のWordPressマルチサイトのこのステップバイステップガイドをどのように実行したかをお知らせください。


Web開発についてサポートが必要な場合は、遠慮なくお問い合わせください。