昨日、試行錯誤してタイトルがスケープされて「post_name」に格納されるとき、文字数制限が半角200文字だから、タイトルの最初の全角23文字が同じ時、うまくいかないのではないか、と書きました。
確かに違うタイトルなのに同じタイトルとして認識されているのは最初の23文字が一緒だからなんだけれど、「今日買った CD」というエントリーの読み込みに失敗しているに気づき、これはWordPressのシステム的に2バイト文字に対応できていないところがあるんだな、と思いまして、調べてみました。
まず、1バイト文字の場合同じ記事を投稿しても、「post_name」には、
・WordPress
・WordPress-1
・WordPress-2
というように「-数字」という形に整形され、「post_name」が重複しないような工夫がされているようです。
でも2バイト文字である日本語ではそれが正常に動作していない。
もう少し調べてみると、WordPressのフォーラムにこんな記事を見つけました。
→新規投稿が出来ません
ここによると、「-数字」を付与するため重複がないかチェックしている部分のPHPで無限ループに陥っているようでした。解決策も提示してくださっていて、WordPress 2.5.1 だと「wp-includes/post.php」の1284行目から1293行目にある部分を下記の用に変更すると、同じタイトルの記事も投稿できるようになるみたいです。
if ($post_name_check || in_array($post_name, $wp_rewrite->feeds) ) { $suffix = 2; do { $alt_post_name = substr($post_name, 0, 200-(strlen($suffix)+1)). "-$suffix"; <span style="color:#FF3265;">$alt_post_name = urldecode ($alt_post_name); //★追加</span> // expected_slashed ($alt_post_name, $post_name, $post_type) $post_name_check = $wpdb->get_var($wpdb->prepare("SELECT post_name FROM $wpdb->posts WHERE post_name = '$alt_post_name' AND post_type = '$post_type' AND ID != %d AND post_parent = %d LIMIT 1", $post_ID, $post_parent)); $suffix++; } while ($post_name_check); $post_name =<span style="color:#FF3265;">urlencode(</span>$alt_post_name<span style="color:#FF3265;">)</span>; <span style="color:#FF3265;">//★変更</span> }
インポートも同じルーチンを使っているに違いないと思ったわたしは、この部分を修正して再度インポートを行った。そうしたら、快調に進む。けれど、また途中で止まってしまう。でもまたインポートと開始すると止まってしまう。
これはどうやらデータが大きすぎるからなようで、いくつかに分割したらうまくいきました。わたしの環境だと1MB以下に分割するのがよさそう。PHPのメモリの関係かしら?
ちなみに、エントリータイトルが被っていた「今日買った」の2つめの記事では「post_name」が「 CD%E4%BB%8A%E6%97%A5%E8%B2%B7%E3%81%A3%E3%81%9F-cd-2」のようになっていてきちんと「-数字」となっていました。
MT形式に限らず、インポートする際は「wp-includes/post.php」の中を書き換えてからの方がよいでしょう。

