[WordPress] WordPress のDB上のサイトURLを一気に変換」への8件のフィードバック

      • あ、なるほど。maybe_serializeとかも使えないかも。それだけ、読み込むって手もあるけど。

  1. こんにちは、便利なスクリプトをありがとうございます。実際に使ってみたところ下記のようなエラーが出たケースがありましたので報告させていただきます。
    Catchable fatal error: Object of class __PHP_Incomplete_Class could not be converted to string in /path/to/replace-siteurl.php on line 180

    気になってデバッグしてみたところ“Google XML Sitemaps”というプラグインのwp_optionテーブルに保存されている値が原因でした。エラーになる流れは以下のようです。

    “Google XML Sitemaps”の“sm_cpages”オプションはプラグイン自前のクラスオブジェクトがそのままシリアライズされたものが保存されている
     ↓
    replace_siteurl.phpがURLを書き換えるために“sm_cpages”オプションの値をアンシリアライズ
     ↓
    “Google XML Sitemaps”のクラスが読み込まれていないのでオブジェクトを復元できず、“__PHP_Incomplete_Class_Name”のオブジェクトが返される
     ↓
    “__PHP_Incomplete_Class_Name”のオブジェクトはis_object関数でfalseが返される
     ↓
    180行目(deep_replaceメソッドのstr_replace)でfatal error

    これに関しては“Google XML Sitemaps”の値の保存の仕方が悪いせいだと思いますが、せめてfatal errorは回避したいのでdeep_replaceメソッドを以下のように変更してみました。(本当は警告とか出す処理も挟むべきだと思うのですがとりあえず…)

        private function deep_replace($origin, $replaced, $datas) {
            if ( is_array($datas) || is_object($datas) ) {
                foreach ( $datas as &$data ) {
                    if ( is_array($data) || is_object($data) ) {
                        $data = $this->deep_replace($origin, $replaced, $data);
    +              } elseif ( !is_object($data) && 'object' === gettype($data) ) {
    +                  continue;
                    } else {
                        $data = str_replace($origin, $replaced, $data);
                    }
                }
            }
            return $datas;
        }
    • うーん、wp-load.php インクルードしてるので “Google XML Sitemaps” の独自オブジェクトもアンシリアライズ&シリアライズできるはずなんですが….
      Google XML Sitemaps が無効になっていませんか?有効にすれば、通るかもしれません。

      …いや、違うか。後で回避方法考えますね。

      • 確認したところGoogle XML Sitemapsは有効化された状態でした。
        Google XML Sitemapsを調べてみたところアンシリアライズ時に定義されているべきクラスは、プラグインロード時には読み込まれず特定のメソッドを実行した後に読み込まれる構造になっていました。

  2. ピンバック: WordPress のDB上のサイトURLを一気に変換 | dogmap.jp

  3. Gatespace's Blog でリブログ& コメント:
    をかもとさんのWordPress用サイトURL変更スクリプト。
    ローカルのMAMPで実行するときはあらかじめ、wp-config.phpの define(‘DB_HOST’, ‘localhost’); と define(‘DB_HOST’, ‘:/Applications/MAMP/tmp/mysql/mysql.sock’); に変更しておこう!

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中