MTからWPに移行してタグがおかしくなっていた記事をリペアした件。

WS2014-01-20_02_07_40
Movable Type 4.38(MTOS)からWordPress 3.8(WP)に移行した結果、古い記事で上のように画像やリンクがおかしくなって表示されなくなっている記事が多数ありました。

これは、MTOSからエクスポートしたデータをWPにインポートした時にタグの間に改行コードが入ってしまい、タグが正常に動いていないために発生しています。

インポートするときに改行コードについて無効にするプラグインやソースの主スエイを行ってインポートすれば良かったものと思われますが、と思ったのですが、今、インポートデータを確認したら、どうやら、インポートしたデータに改行が含まれていたようでうです。

—–
EXTENDED BODY:
<p><a href=
"http://blog.kumacchi.com/2007/05/file_20070601T220008906.jpg"
   target="_blank"
   rel="lightbox"><img title="感じるマンゴー"
     height="320"
     alt="感じるマンゴー"
     src=
     "http://blog.kumacchi.com/2007/05/img_20070601T220007750.jpg"
     width="240" /></a></p>

<p>お味はというとネクターにナタデココの粒粒がはいっているというとわかるでしょうか?そんな感じです。
ネクターとナタデココが好きな人にはお勧めです。ネクターは本家のネクターより少し薄味の様に思います。</p>
—–

今更後の祭りなので、見つける度に手動で修正をしていたのですが、きりがないのでプログラムで修正してみました。

WS2014-01-20_02_07_53 
結果、上のように直りました。一応大丈夫なようです。これで様子を見てみようと思います。おかしなところがあったら教えて下さいw。

一応、修正に利用したスクリプトをのせておきますので、同様の問題でお困りの方はどうぞ。ただし何か問題があっても責任取れませんので、必ずデータベースのバックアップを取った上で実行して下さい。

DBのバックアップと復元は下の様に行います。実際スクリプトのバクで一旦データを壊したので、バックアップから復元していますw。バックアップはしっかり取りましょう。バックアップとらないでスクリプト実行しても責任持てません。

#バックアップ
mysqldump –add-drop-table -u <DB_ID> -p<DB_PASSWORD> <DB_NAME> > blog_20140120.sql

#復元
mysql -u <DB_ID> -p<DB_PASSWORD> <DB_NAME> < blog_20140120.sql

スプリクトにはDB_NAMEとDB_IDとDB_PWの部分にそれぞれ、DB名とユーザーIDとパスワードを指定してあげる必要があります。

■repair.pl

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode qw/from_to decode_utf8 encode_utf8 is_utf8/;
use DBI;

my ($hst,$hst2,$retval,$ref,$count);

my $dbh = DBI->connect(‘DBI:mysql:<DB_NAME>:localhost’, ‘<DB_ID>’, ‘<DB_PW>’,{PrintError=>0,AutoCommit=>0});
unless($dbh){die $DBI::errstr;}
$dbh->do("set names utf8");

$hst = $dbh->prepare(‘SELECT COUNT(*) FROM wp_posts’);
unless($hst){ &dberror("104:",$dbh,$hst);    }

$retval = $hst->execute();
unless($retval){ &dberror("66105:",$dbh,$hst); }

$ref = $hst->fetch();
$count  = $ref->[0] || 0;
$hst->finish;

$hst = $dbh->prepare(‘SELECT post_content,post_type,ID FROM wp_posts’);
unless($hst){ &dberror("104:",$dbh,$hst);    }

$retval = $hst->execute();
unless($retval){ &dberror("66105:",$dbh,$hst); }

$count=0;
while($ref = $hst->fetch()){
    $count++;
    my $post_content = is_utf8_decode($ref->[0] || ”);
    my $ID = $ref->[2] || die "not id";

    if($ref->[1] ne ‘post’){
        print "[$count] ID=$ID skip…\n";
        next;   
    }

    while($post_content =~ s/<[^>]*?(?:\x0a|\x0d)[^<]*?>/xxx($&)/egs){
    }

    print "[$count] ID=$ID proc…\n";
    $hst2 = $dbh->prepare(‘UPDATE wp_posts SET post_content=? WHERE ID=?’);
    unless($hst2){ &dberror("104:",$dbh,$hst2);    }

    $retval = $hst2->execute($post_content,$ID);
    unless($retval){ &dberror("66105:",$dbh,$hst2); }

    $hst2->finish;
}

$dbh->commit;

undef $hst if($hst);
undef $hst2 if($hst2);

$dbh->disconnect;

exit(0);

sub xxx{
my $str = shift;
$str =~ s/(\x0a|\x0d)/ /gs;
$str;
}

#====================================================================
#    dberror
#====================================================================
sub dberror{
    my $msg = shift;
    my $dbh = shift;
    my $hst = shift;

    my $errstr = $dbh->errstr;
    $dbh->rollback;
    if($hst) { $hst->finish; undef $hst; }
    $dbh->disconnect;
    die "$msg$errstr\n";
#    debug_print("$msg$errstr\n");
#    error("data base error [$msg$errstr]");
}

#———————————————————-
#    decode_utf8
#———————————————————-
sub is_utf8_decode{
    (is_utf8($_[0])) ? $_[0] : decode_utf8($_[0]);
}

とりあえず、気になっていたところを直せて良かったです。

タグ : , ,