二つのWordPressを合体した時のことをサルにもわかるようにメモしとく！

# はじめに

サーバーのWordPressの移行を頼まれたのですが、WordPress初めて、サーバーの知識不足で苦労しました。
通常はあまりないことなので、忘れないように記録として残しておきます。

# １．要件

下記が別々のサーバーで動いていいるサイトの結合

中途採用のページだけがまだ利用中。
http://www.hogehoge.jp/recruit/

採用ページの下に中途採用のフォルダとして参照可能する。
https://www.newhogehoge.com/recruit/career/

実際のフォルダは前記の通りでなくて仮想的なものでよい。

# ２．環境条件について

4つのサーバーがあります。

- http://www.hogehoge.jp **①**
- http://www.hogehoge.com
- https://www.newhogehoge.jp
- https://www.newhogehoge.com **②**  
  今回は**①**のサーバーを廃止して**②**のサーバーに統合します。

## 旧環境

- サーバー：レンタルサーバー(SSL無し)
- OS：FreeBSD 8.4-RELEASE-p11
- FTP：使用可能 /html公開するルートディレクトリ
- SSH：利用不可
- PHP：Version 5.2.8 (system()関数利用可能)
- CMS：WordPress Version 
- DB：MySql 5.0
- DB接続ツール：不明なので自分でphpMyAdmin phpMyAdmin 5.5インストール
- DB接続名は、WordPressの wp-config.php より取得
- WordPress バージョン：3.4 マルチサイト
  マルチサイトかどうかはDBのテーブルにｘｘｘｘとｘｘｘｘがあるかどうかで判別可能
  もちろん、他の方法もある。

## フォルダ構成

```
    html
      →wp_admin(ディレクトリ)
      →wp-content(ディレクトリ)
      →wp_include(ディレクトリ)
      →wp-login.php
      →wp-index.php 以下は内容
          define('WP_USE_THEMES', true);
          require('./wp-blog-header.php');
      ** →.htaccess 以下は内容 **
      AddHandler x-httpd-php528 .php
      Options +FollowSymLinks
      suPHP_ConfigPath /home/aa142qrutc/
      
      DirectoryIndex index.php index.html index.cgi
      AddDefaultCharset UTF-8
      AddType "text/html; charset=utf-8" html
      AddType "text/html; charset=utf-8" htm

      RewriteEngine On
      RewriteBase /
      RewriteCond %{QUERY_STRING} ^s=&a=&v=&m=&g=&c=280&b=&b_name1=%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B(.*)$
      RewriteRule ^shops/$ https://www.hogehoge.jp/search?shop=&prefecture=&stockholder_benefit=on [R=301,L]
      
      RewriteEngine On
      RewriteBase /
      RewriteCond %{QUERY_STRING} ^s=&a=&v=&m=&g=&c=280&b=&b_name1=検索する(.*)$
      RewriteRule ^shops/$ https://www.hogehoge.jp/search?shop=&prefecture=&stockholder_benefit=on [R=301,L]
      
      # ニュースのアーカイブリダイレクト
      RewriteEngine On
      RewriteBase /
      RewriteCond %{QUERY_STRING} ^y=(.*)$
      RewriteRule ^news/$ https://www.hogehoge.jp/features/archives/%1/? [R=301,L]
      
      RewriteEngine On
      RewriteBase /
      
      ## For https://www.hogehoge.jp/
      RewriteRule ^nabefair/$ https://www.hogehoge.jp/event/nabefair/ [R=301,L]
      RewriteRule ^event/$ https://www.hogehoge.jp/features/categories/pickup/ [R=301,L]
      以下ずらずらと別のサイトにリダイレクト
      
      # uploaded files
      RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]
      
      # add a trailing slash to /wp-admin
      RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
      
      RewriteCond %{REQUEST_FILENAME} -f [OR]
      RewriteCond %{REQUEST_FILENAME} -d
      RewriteRule ^ - [L]
      RewriteRule  ^[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*) $1 [L]
      RewriteRule  ^[_0-9a-zA-Z-]+/(.*\.php)$ $1 [L]
      RewriteRule . index.php [L]

```

## 新環境

- サーバー：レンタルサーバー(SSL有り)
- OS：10.1-RELEASE-p41
- FTP：使用可能 /html公開するルートディレクトリ
- SSH：利用不可
- PHP：Version 5.5.23 (system()関数利用可能)
- CMS：WordPress Version 
- DB：MySql 5.5.42
- DB接続ツール：コントロールパネル＋phpMyadmin利用可能(V4.4 100MBインポート可能に拡張)
- DB接続名は、WordPressの wp-config.php より取得
- WordPress バージョン：4.9.3 シングルサイト
  マルチサイトかどうかはDBのテーブルにｘｘｘｘとｘｘｘｘがあるかどうかで判別可能
  今回の件は、旧サーバーにテスト用のサイトを構築していたためマルチサイトになっていたと思われます。
  DBは別々になっていましたがなんでだろう？疑問は残りました。
- その他
  xxx.com/recruit/ というフォルダはなく、WP側で管理している。
- フォルダ構成

```
　　html
　　　→wp
　　　　　　index.html
　　　　　　　内容
　　　　　　　　define('WP_USE_THEMES', true);
　　　　　　　　require( dirname( __FILE__ ) . '/wp/wp-blog-header.php' );
　　　　　　→wp_admin(ディレクトリ)
　　　　　　→wp-content(ディレクトリ)
　　　　　　→wp_include(ディレクトリ)
　　　　　　→wp-login.php
　　　　　　→wp-index.php 以下は内容
　　　　　　　　define('WP_USE_THEMES', true);
　　　　　　　　require('./wp-blog-header.php');
　　　　　　** →.htaccess 以下は内容 **
　　　　　　　　Options +SymLinksIfOwnerMatch
　　　　　　　　
　　　　　　　　# Enforce SSL access
　　　　　　　　
　　　　　　　　<IfModule mod_rewrite.c>
　　　　　　　　    RewriteEngine on
　　　　　　　　    RewriteCond %{HTTPS} off
　　　　　　　　    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
　　　　　　　　</IfModule>
　　　　　　　　
　　　　　　　　#-------------------------------------------------
　　　　　　　　# Access Restriction
　　　　　　　　
　　　　　　　　<Files "xmlrpc.php">
　　　　　　　　	order deny,allow
　　　　　　　　	deny from all
　　　　　　　　</Files>
　　　　　　　　
　　　　　　　　<Files "wp-login.php">
　　　　　　　　	AuthName "Input ID & Password"
　　　　　　　　	AuthType Basic
　　　　　　　　	AuthUserFile /usr/home/user001/.htpasswd
　　　　　　　　	Require valid-user
　　　　　　　　</Files>
　　　　　　　　
　　　　　　　　#-------------------------------------------------
　　　　　　　　
　　　　　　　　# BEGIN WordPress
　　　　　　　　<IfModule mod_rewrite.c>
　　　　　　　　RewriteEngine On
　　　　　　　　RewriteBase /
　　　　　　　　RewriteRule ^index\.php$ - [L]
　　　　　　　　RewriteCond %{REQUEST_FILENAME} !-f
　　　　　　　　RewriteCond %{REQUEST_FILENAME} !-d
　　　　　　　　RewriteRule . /index.php [L]
　　　　　　　　</IfModule>
　　　　　　　　
　　　　　　　　# END WordPress

```

# ３．基本的に行う作業（順不同）

- 新サイトWebルート直下に以下を作成

```
recruitフォルダとcareerフォルダを作成
　　/html/recruit/
　　/html/recruit/career
index.phpファイルを作成する。フォルダが参照されたら上位リクルートサイトに移動するように編集。
　　内容
　　　define('WP_USE_THEMES', true);
　　　require( dirname( __FILE__ ) . '/../wp/wp-blog-header.php' );
```

- 既存サイトのfunctions.phpを修正（リダイレクトループの回避）

/www/html/wp/wp-content/themes/production/functions.php
最後の行に（リダイレクトループしちゃうので・・・）
remove_filter('template_redirect', 'redirect_canonical');


------------------------------
例.修正前
------------------------------

```
<?php
/*
 * functionsフォルダにあるファイルをすべて読み込む
*/
foreach (glob(TEMPLATEPATH."/functions/*.php") as $file) {
    require_once $file;
}
```

------------------------------
例.修正後
------------------------------

```
<?php
/*
 * functionsフォルダにあるファイルをすべて読み込む
*/
foreach (glob(TEMPLATEPATH."/functions/*.php") as $file) {
    require_once $file;
}
remove_filter('template_redirect', 'redirect_canonical');
```

------------------------------


- 引っ越しするサイト(=旧環境)DBのテーブル内容３つを修正

- wp_site
　　domain：ddnew.gluesd.work
　　path：/recruit/career/
- wp_blogse
　　domain：ddnew.gluesd.work
　　path：/recruit/career/
- wp_options  

```
    
    optionname項目がsiteurlのレコードのURL
    https://www.hogehoge.com
       →https://www.newhogehoge.com/recruit/career
    同、homeレコードも同様に設定
    https://www.hogehoge.com
       →https://www.newhogehoge.com/recruit/career
    同、fileupload_url
    https://www.newhogehoge.com/wp-content/uploads
       →https://www.newhogehoge.com/recruit/career/wp-content/uploads
```

・移行するしたサイトのDB接続情報を修正

ファイル：wp-config.php

```
define('DOMAIN_CURRENT_SITE', 'www.newhogehoge.com');
define('PATH_CURRENT_SITE', '/recruit/career/');
```

DBの設定は新サイトにあるものをコピーして、ＤＢ名だけ変えるのが吉。

- テンプレートの修正

```
   /www/ddnew/recruit/career/wp-content/themes/hogehote
   archive-recruit.php
     →/html/recruit/career/index.php
   にコピーします。
   これは、WPが制御してarchive-recruit.phpを開いていたものを、フォルダ名で開ける？？？？？
```

- 今回独特の変更

一覧から選択した時に、詳細が表示されなかったのでCSSを修正
/www/ddnew/recruit/career/wp-content/themes/common/css/recruit/recruit.css

601行目をコメントアウト

```
#recruit_detail{
/*      visibility: hidden; */
        position: relative;
```

- .htaccessの修正

careerの下の.htaccess

```
RewriteRule ^/recruit/career/r/$ /recruit/career/ [R=302,L]
```
を追加します


## 以上です。ご意見、アドバイス、間違いを発見したら教えて頂けると嬉しいです。

最初は色々と試行錯誤しましたが、解決できずに経験豊富な上司に助けてもらいました。
というか、全部やって貰った感じです。
おまけに、簡易手順書迄作って貰ってしまって。。。感謝です。


## おまけ

おまけとして苦しんだりつまずいたりしたところを残しておきます。

- 旧サイトでDBアクセスする方法がなくて、phpMyadminの古いものを探してきて入れました。環境との相性があるんですね。
- 新サーバーがにphpMyAdminが100MBまでのインポートを対応していてくれたので助かりました。
- 一番はまったのは、SSLです。WPとの相性があるらしく、VMで作成したFreeBSD 10.3では動作してくれませんでした。古いWPなら大丈夫との話もありましたが、そういうわけにはいきませんね。
- ディレクトリにアクセス権限付けるのを忘れてインターナルサーバーエラーが出た。ログを見たらSSLのエラーログに載っていた。なんでSSLなんだろう。
- sqldumpが使えなかったので、PHPでそれを実行できるようにしました。バージョンが古いのかもしれませんが、phpMyAdminではサイズに関係なくダンプが切れてしまいとても悩みました。
サンプルソースです。サーバーの状況を調べたり、圧縮したり色々役に立ちました。
ただ、普通のレンタルサーバーだと制限があるかと思います。

```
    <?php
        //echo exec('whoami');
        //phpinfo();
        echo "\n <pre> --- command --- \n";
        //var_dump( system('ls', $ret) );
        //var_dump( $ret );
        //set_time_limit(0);
        //$cmd = 'apache -v';

        $cmd = 'pwd';
        var_dump( system($cmd, $ret) );
        var_dump( $ret );

        //$cmd = 'ls *.sql';
        //var_dump( system($cmd, $ret) );
        //var_dump( $ret );
        /*
        $cmd = 'zip -r /var/www/vhosts/crosshotel.com/server_migration201803/httpdocs/aaaa.zip /var/www/vhosts/crosshotel.com/httpdocs/aaaa';
        var_dump( system($cmd, $ret) );
        var_dump( $ret );
        */
        echo "\n  --- command --- \n</pre>";
    ?>
```

- 新サーバーにsellinuxがどうも入っているらしく、.htaccessが読めないと言われる。どうもファイルやディレクトリに権限を与えすぎるとダメらしい。
- .htaccess に Options +FollowSymLinksが入っていた。コメントアウトした。
- ソースがそのまま表示されちゃう。
  いろいろやったんで、何が理由だったのかわからなくなっちゃいました。
- Fatal error？困った
   Fatal error: Call to undefined function get_stylesheet_directory() in /usr/home/chz3019002/html/recruit/career/index.php on line 2
   これは単に、コピー先間違えただけなんだけど、結構気が付けなかったです。

## ちょっとだけ便利に

ちょっとだけ便利なPHPを作成したのでここに残しておきます。
前節で作ったPHPでのコマンド実行を多少使いやすくしただけですけど、最近Teratermの使えないレンタルサーバーへの移行も頼まれたりするので、汎用的に作ってみました。
危険なので使い終わったら削除は必須。

** index.html **

```

<!DOCTYPE HTML>
<html lang="ja">
    <head>
        <meta charset="utf-8"/>
        <meta http-equiv="Pragma" content="no-cache" />
        <meta http-equiv="cache-control" content="no-cache" />
        <meta http-equiv="expires" content="0" />
        <title>command exec</title>
    </head>
    <frameset rows="50,*">
        <frame src="exec.html" name="command" title="command">
        <frame src="" name="response" title="respons">
    </frameset>
</html>

```

**exec.php**

```
<!DOCTYPE HTML>
<html lang="ja">
    <head>
        <meta charset="<?php echo $_POST["charset"]; ?>">
        <meta http-equiv="Pragma" content="no-cache" />
        <meta http-equiv="cache-control" content="no-cache" />
        <meta http-equiv="expires" content="0" />
    </head>
<body>
<?php
//set_time_limit(5);

echo "\n <pre> ---------- \n";

$cmd = $_POST["command"];
echo 'input command => '.$cmd."\n\n";

system($cmd, $ret);
var_dump( $ret );

echo "\n  ---------- \n</pre>";

?>

</body>
</html>

```

**exec.html**

```

<!DOCTYPE HTML>
<html lang="ja">
    <head>
        <meta charset="utf-8"/>
        <meta http-equiv="Pragma" content="no-cache" />
        <meta http-equiv="cache-control" content="no-cache" />
        <meta http-equiv="expires" content="0" />
        <title>
            line command execcute
        </title>
    </head>
    <body>
        <form method="post" action="exec.php" target="response">
            <p>command <input type="text" width= 150 name="command" size=60 />　<input type="submit" value=" exec ">　
             <select name="charset">
                <option value="utf-8">utf-8</option>
                <option value="Shift_JIS">Shift_JIS</option>
                <option value="EUC-JP">EUC-JP</option>
                <option value="iso-8859-15">iso-8859-15</option>
            </select>

        </form>
    </body>
</html>

```
説明するのがおっくうなので、各ファイルにコピペして動かしてみてください。
１行で終わるコマンドならいけるかなと思います。

ご要望あればそのうち説明を書きますね。
それでは。