[WP]インポート時の不具合

サーバー移転が完了しました。
結局そのままNEXTSPACEさんからお借りすることになりました。

面倒なことは一切なくコンパネからポチるだけで支払い完了でおしまいでした。
今は少し重いですが、それはもうちょっと長い目でみようと思います。


Wordpress の移行に関してはDBを引っ越すだけで簡単に終わるんですけど、「折角引っ越すんだし、余分なpost_idが増えちゃって気持ち悪いから、この際まっさらにしよっかなー」と思い立ち、Wordpress のエクスポート→インポートを使ってデータ移行をしました。


この悪魔のささやきのせいで、本当に悪夢のような移転となってしまったのです(´Д`;)



まず、標準のインポートでは「カテゴリのスラッグを修正した場合はインポートしたときに同名カテゴリが増殖する」現象に陥ります。
このバグ、もう1年以上前から報告されているのに何故か一向に修正されません。
おそらく英語圏ではカテゴリ名=スラッグが同じになる場合がほとんどで、そういう困った現象に陥ることがあまりないため重要視されていないんでしょう。

そう、これは大抵日本語名のカテゴリが自動的にエンコされて「%e~~」と長ったらしい意味不明なスラッグになってしまった人が、それがいやでスラッグを修正しちゃった場合に起こるわけです。


まーね。増えてもね。削除すりゃいいのよね。
でもさー、それじゃやっぱりidが無駄に増えてみっともないじゃないの!(idなんて普段見えないんだから気にしなければ済むことだけど)


そんなわけで、まずまともにインポートするために、「/wp-admin/import/wordpress.php」を修正してやらなければなりません。
経緯はWordpress フォーラムの「インポートすると同じ名前のカテゴリが増殖する」をご覧になるとわかるかと思います。

ですが、mizube様の投稿にある修正ではまだ不具合が残ります。
こちらの修正では、複数のカテゴリに登録してある記事は、最初の1つのみしか登録されず、またタグは同様に増殖バグが残っています。
なので、タグの記述も修正し、かつ、複数のカテゴリ(タグ)を取り込むようにしなければなりません。

v2.8.5
394行あたり
        preg_match_all('|<category domain="tag">(.*?)</category>|is', $post, $tags);
        $tags = $tags[1];
↓
        preg_match_all('|<category domain="tag" nicename="([0-9a-z%\-_]*?)">(.*?)</category>|is', $post, $match_tags);
        $tag_nicenames  = $match_tags[1];
        $tags = $match_tags[2];

403行あたり
        preg_match_all('|<category>(.*?)</category>|is', $post, $categories);
        $categories = $categories[1];
↓
        preg_match_all('|<category domain="category" nicename="([0-9a-z%\-_]*?)">(.*?)</category>|is', $post, $match_cats);
        $nicenames  = $match_cats[1];
        $categories = $match_cats[2];

461行あたり
            // Add categories.
            if (count($categories) > 0) {
                $post_cats = array();
                foreach ($categories as $category) {
                    if ( '' == $category )
                        continue;
                    $slug = sanitize_term_field('slug', $category, 0, 'category', 'db');
                    $cat = get_term_by('slug', $slug, 'category');
                    $cat_ID = 0;
                    if ( ! empty($cat) )
                        $cat_ID = $cat->term_id;
                    if ($cat_ID == 0) {
                        $category = $wpdb->escape($category);
                        $cat_ID = wp_insert_category(array('cat_name' => $category));
                        if ( is_wp_error($cat_ID) )
                            continue;
                    }
                    $post_cats[] = $cat_ID;
                }
                wp_set_post_categories($post_id, $post_cats);
            }
            // Add tags.
            if (count($tags) > 0) {
                $post_tags = array();
                foreach ($tags as $tag) {
                    if ( '' == $tag )
                        continue;
                    $slug = sanitize_term_field('slug', $tag, 0, 'post_tag', 'db');
                    $tag_obj = get_term_by('slug', $slug, 'post_tag');
                    $tag_id = 0;
                    if ( ! empty($tag_obj) )
                        $tag_id = $tag_obj->term_id;
                    if ( $tag_id == 0 ) {
                        $tag = $wpdb->escape($tag);
                        $tag_id = wp_insert_term($tag, 'post_tag');
                        if ( is_wp_error($tag_id) )
                            continue;
                        $tag_id = $tag_id['term_id'];
                    }
                    $post_tags[] = intval($tag_id);
                }
                wp_set_post_tags($post_id, $post_tags);
            }
↓
            // Add categories.
            $c = count($categories);
            if ($c > 0) {
                $post_cats = array();
                for ($i = 0; $i < $c; $i++ ) {
                    if ( '' == $categories[$i] || '' == $nicenames[$i] )
                        continue;
                    $cat = get_term_by('slug', $nicenames[$i], 'category');
                    if ( empty($cat) || $cat->name != $categories[$i] ) {
                        $slug = sanitize_term_field('slug', $categories[$i], 0, 'category', 'db');
                        $cat = get_term_by('slug', $slug, 'category');
                    }
                    $cat_ID = 0;
                    if ( ! empty($cat) )
                        $cat_ID = $cat->term_id;
                    if ($cat_ID == 0) {
                        $category = $wpdb->escape($categories[$i]);
                        $cat_ID = wp_insert_category(array('cat_name' => $category));
                        if ( is_wp_error($cat_ID) )
                            continue;
                    }
                    $post_cats[] = $cat_ID;
                }
                wp_set_post_categories($post_id, $post_cats);
            }
            // Add tags.
            $c = count($tags);
            if ($c > 0) {
                $post_tags = array();
                for ($i = 0; $i < $c; $i++ ) {
                    if ( '' == $tags[$i] || '' == $tag_nicenames[$i] )
                        continue;
                    $tag_obj = get_term_by('slug', $tag_nicenames[$i], 'post_tag');
                    if ( empty($tag_obj) || $tag_obj->name != $tags[$i] ) {
                        $slug = sanitize_term_field('slug', $tags[$i], 0, 'post_tag', 'db');
                        $tag_obj = get_term_by('slug', $slug, 'post_tag');
                    }
                    $tag_id = 0;
                    if ( ! empty($tag_obj) )
                        $tag_id = $tag_obj->term_id;
                    if ( $tag_id == 0 ) {
                        $tag = $wpdb->escape($tags[$i]);
                        $tag_id = wp_insert_term($tag, 'post_tag');
                        if ( is_wp_error($tag_id) )
                            continue;
                        $tag_id = $tag_id['term_id'];
                    }
                    $post_tags[] = intval($tag_id);
                }
                wp_set_post_tags($post_id, $post_tags);
            }


これで無事インポートできるようになったので、改めてインポート用のデータを掃除しました。
まず、imageが登録されている部分を綺麗さっぱり削除して本文のみにします。
続いて画像を表示させているコードを統一します。
と、いうのも過去の画像はFlexible Uploadというプラグインで記述していたので、最近のWordpress 本体にあるメディアライブラリとは違ったコードで書かれているのです。
これを秀丸マクロを組んで一気に書き換えました。

そうして綺麗にしたデータをインポートしたら、今度はFlashUploderというプラグインで、画像を一気にメディアライブラリに登録していきます。

ですが、登録はされるものの、この時点では記事との紐付けが出来ていませんし、画像の並びも登録日時も希望通りではありません。
(登録はアルファベット順、登録日時は現在日)
なので、データベースからpostのみエクスポートし、また秀丸のマクロで紐付けと日付の変更(参照している記事の公開日)に変更してやります。

このデータをインポートして、やっと今まで通りの見た目になりました。
……そう、ここまでやって見た目は同じ。
あくまでも自己満足の世界さ!( ゜Д゜)y─┛~~


でも自己満足でも、色々調べてそれなりにお勉強になりました。
画像は今までと同じように表示されてはいますが、実はCSSでドロップシャドウをつけるように変更しています。
(今までは影用の画像をバックグラウンドで表示)
また、画像にウォーターマーク画像を被せるプラグインを作りました。

ウォーターマークをつけてみた

実際運用したら、割とウザかったのでやめましたけど(´Д`;)
これは、ウォーターマーク用の画像を工夫すればいいだけだと思います。
今はやる気が出ないので、当分お蔵入りですね。
このプラグインの副産物で、「画像を挿入したときにのタグの整形」をするようにしました。
標準だとclassにやたらと長い用途不明の記述が入るのですが、それを除き、さらにdivタグで囲った形で出力されるようにします。


さらに、テーマを変更しても採用したいCSSを自動で読み込むプラグインを作りました。
サーバー移転でPHPが5になったので、Ktai~が使えるようになったし、テーマを変えてもこのCSSだけは使いたい!ってものを放り込むようにしています。
(たとえば、上記のソースコード用のCSSとか、レシピ用のCSSとかです)


それにしても奥が深いな、Wordpress !
いろいろやれる。しかも簡単!
来月か、再来月にはもう新バージョンが出るようだし、この先が楽しみです。

Comment »

コメントはまだありません。

コメントする