昨日、試行錯誤してタイトルがスケープされて「 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 」の中を書き換えてからの方がよいでしょう。