WordPress のプラグイン 「tweetable」を使って、投稿が公開されると同時に自動的につぶやかせるようにしていたものの、投稿された時につぶやきの文章が全くなくなっていたり、つぶやきの文章が途中で切れている事が何度かあった。
どうやら日本語に対応していない部分があるようで、何らかの文字に反応してつぶやきが欠けるように見える。
とりあえず、以下のような対処をして様子見。160行目にマルチバイトに対応していない関数を使っている所があったの、マルチバイト対応に変更。
tweetable.php と、mh_twitter_class.php 中を検索して、マルチバイト対応の関数に書き換える。
Before | After | 役割 |
strlen | mb_strlen | ストリングの長さを測る関数 |
substr | mb_substr | サブストリングを切り出す関数
mb_substr($message, 0, 100); で、message の0文字目から、100文目までを切り出して返す。
|
strrpos | mb_strrpos | 指定した文字が出る文字数を返す。
mb_strrpos($message,' ') であれば、messsage 内で、はじめに空白が出る所の文字数を返す。 |
もう一カ所、mh_twitter_class.php で以下の箇所がある。
//Shrink a tweet and accompanying URL down to fit in 140 chars.
public function fit_tweet($message, $url) {$message = $message." ";
$message = substr($message, 0, 100);
$message = substr($message, 0, strrpos($message,' ')); // ここが変。
if (strlen($message) > 100) { $message = $message."..."; }
return $message." ".$url;}
このコードは、つぶやいたメッセージと URL へのリンクを合体させて、100文字以内(※1) にトリミングするための関数だが、6行目の所で、最初に空白がある所でメッセージを切ってしまう。どうもマルチバイトというよりも、こちらが主な原因で、メッセージがスペースを入れたところで、切られてしまっていたようだ。
※1何故か100文字以上(例えば140文字)にしようとするとエラーになる。現因は追求できてない。
でも何でこういうコードに?・・・よくわからず。
とりあえず、以下のようにコードを変更した。
public function fit_tweet($message, $url) {
$message_length = mb_strlen($message);
$url_length = mb_strlen($url);
if ($message_length + $url_length > 140) {
$shorten_message_to = 100 - $url_length; // 何故か合計100文字辺りに限界がある。これ以上長くするとエラーになる。
$shorten_message_to = $shorten_message_to - 4; // ...と最後に付加するスペース分を引く。
$message = mb_substr($message, 0, $shorten_message_to); // メッセージから、(100- URLの長さ - 4文字)を切り出す。
$message = $message."...";// 省略した事を示す …. を付加。
}
return $message." ".$url; // message と url をスペース区切りで合体。}
何度かテストしてみたが、つぶやきが100文字以内に短く加工されてる以外は、今の所大丈夫そうだ。(何故140文字まで行けないのかは、今は特に困ってないので、困ったときに追いかける事にする)
文字列操作のマルチバイト関数への置き換えは、「つぶやきが欠ける事」に対する根本原因ではなさそうだが、これはこれで必要だと思うのと、今の所上手く動いているので、とりあえずこのままにしておく。