このエントリーをはてなブックマークに追加

Memo

過去記事をツイートするWPプラグインTweetilyで長いタイトルが「…」になるのを防ぐ方法

2015/03/09
Memo

for_wordpress

ブログを長いことやっていると、過去記事が膨大になってきますよね。Twitterで古い記事をツイートするとアクセスアップにも繋がるので、過去記事をツイートしてくれるWordPressプラグイン「Tweetily」を導入してみました。

しかし、このプラグインには問題が。タイトルが長すぎるとタイトル部分が「…」になってしまうのです。この解決方法を見つけたので、シェアしておきますね。

WordPressプラグイン「Tweetily」とは?

過去記事を定期的にツイートしてくれるプラグインです。
最新記事は何日から過去記事として扱うか、何日前までの記事をツイートするか、など設定ができます。
「この記事 or カテゴリはツイートしない」など細かい設定も可能です。

このプラグインを導入する前は、古い記事の取得方法が分からなかったので、cronを使ってfeedから取得した記事をツイートしていました。
(参考:TwitterでWPの情報を定期ツイートさせるためにやったこと

このプラグインのおかげで、過去2年分の記事をランダムツイート出来るようになりました。
しかしこのプラグイン、更新がもう1年以上されていません。wpのバージョンによっては使えない場合もあるようですが、現在の最新版ver.4.1.1では動いています。

使い方や設定はこちらの記事がとても参考になりました。
参考:Tweetily – Twitterで過去記事をランダムに自動投稿できるWordPressプラグイン – ネタワン

長いタイトルが省略されてしまう?

このプラグインを使ってみてしばらく、時々こんなツイートが出てきました。

ツイートされている記事のタイトルは「WordPressでURLからスクリーンショットを撮って記事に貼り、自分のサーバーにも保存する方法」で49文字。確かにちょっと長い。文字をツイートするタイミングで何か変換が上手くいっていないようなので、調べてみました。

長いタイトルでも文字数の範囲でツイートできるようにする

まずは問題のある部分を確認。「top-core.php」というファイルの403行目「set_tweet_length()」でツイートする文字列を作っているようです。

//Shrink a tweet and accompanying URL down to 140 chars.
function set_tweet_length($message, $url, $twitter_hashtags="", $hashtag_length=0) {

    $tags = $twitter_hashtags;
    $message_length = strlen($message);
    $url_length = strlen($url);
    //$cur_length = strlen($tags);
    if ($hashtag_length == 0)
        $hashtag_length = strlen($tags);

    if ($twitter_hashtags != "") {
        if (strlen($tags) > $hashtag_length) {
            $tags = substr($tags, 0, $hashtag_length);
            $tags = substr($tags, 0, strrpos($tags, ' '));
        }
        $hashtag_length = strlen($tags);
    }

    if ($message_length + $url_length + $hashtag_length > 140) {


        $shorten_message_to = 140 - $url_length - $hashtag_length;
        $shorten_message_to = $shorten_message_to - 4;
//$message = $message." ";
        if (strlen($message) > $shorten_message_to) {
            $message = substr($message, 0, $shorten_message_to);
            $message = substr($message, 0, strrpos($message, ' '));
        }
        $message = $message . "...";
    }
    return $message . " " . $url . " " . $tags;
}

内容をみていくと、テキスト(オプションでタイトル前後に追加する文字列も含んでいる)と、URL、ハッシュタグの合計バイト数が140バイト以下なら、テキストを省略するようです(420行目)
そして、426行目。URLとハッシュタグのバイト数を除いた数よりもテキストのバイト数が多い場合に、テキストを改変しようとしています。

140からURLとハッシュタグの数、あと4(これはあとで追加する半角スペースなどの分かな?)を引いて、ツイートできる文字数を求めています($shorten_message_to)
そして、substr()を使って、ツイートできる文字数分取り出しているんですが、問題はその後。ツイートできる文字数分取り出されたテキストから、さらに「 (半角スペース)」のある位置でテキストを取り出そうとしています。strrpos($message, ' ')の部分ですね。

これは多分、英語圏の場合タイトルに半角スペースが入るので、そこでテキストを区切るようにしたかったんだと思います。そうした方が綺麗ですからね。

しかし、実はこの部分が問題で、日本語の場合半角スペースが入ることは稀なため、この部分が「半角スペースが見つからない=false」を返してしまっているんです。
そのため、substr()もエラー = false ⇒ $message が false に ⇒ false となった $message に ‘…’ が追加される ⇒ $message = ‘…’ という結果に…。

解決方法

今回は以下のように変更して対処しました。

//Shrink a tweet and accompanying URL down to 140 chars.
function set_tweet_length($message, $url, $twitter_hashtags="", $hashtag_length=0) {

    $tags = $twitter_hashtags;
    $message_length = mb_strlen($message);
    $url_length = mb_strlen($url);
    //$cur_length = strlen($tags);
    if ($hashtag_length == 0)
        $hashtag_length = mb_strlen($tags);

    if ($twitter_hashtags != "") {
        if (strlen($tags) > $hashtag_length) {
            $tags = mb_substr($tags, 0, $hashtag_length);
            //$tags = substr($tags, 0, strrpos($tags, ' '));
        }
        $hashtag_length = mb_strlen($tags);
    }

    if ($message_length + $url_length + $hashtag_length > 140) {


        $shorten_message_to = 140 - $url_length - $hashtag_length;
        $shorten_message_to = $shorten_message_to - 4;
//$message = $message." ";
        if ($message_length > $shorten_message_to) {
            $message = mb_substr($message, 0, $shorten_message_to);
            //$message = substr($message, 0, strrpos($message, ' '));
        }
        $message = $message . "...";
    }
    return $message . " " . $url . " " . $tags;
}

まずは、バイト数ではなく文字数でカウントするように、strlen()の部分をmb_strlen()に変更します。mb_strlen()は半角も全角も1文字としてカウントしてくれる関数です。そしてエラーになるstrrpos()を含む部分をコメントアウトしています。

\これだけです/

日本語が主な場合はこれで大丈夫だと思います。英語がメインの場合はstrrpos()の部分に条件分岐などを追加した方がよいと思いますが、ちょっと面倒なので今回は割愛します。

SEO的には32文字前後のタイトルが良いと言われているので、最近の記事は意識していますが、過去の記事は意識してないものも多いですからね。Tweetilyを使っている方で気になっている方はぜひお試しください。
あ、修正する場合はかならずファイルのバックアップをとってから行ってくださいね。

Category : MemoTags : , ,

関連記事

コメントを残す




About

中の人:Mei Koutsuki (@mei331)
神奈川でweb作ったり、お洋服つくったりしてる黒いひつじさん。ロリィタ系webクリエイター。12年9月に一児の母となり、自宅で子育てしながらお仕事してます。
>> もっと詳しく