Home > WordPress > ブログにタグをつけるUltimate Tag Warrior

ブログにタグをつけるUltimate Tag Warrior

WordPressで流行ってるので、そろそろ導入してみる。タグを自分でつけるのは 面倒だなぁと思っていたけど、とりあえずカテゴリをタグに追加してくれるみたいだし、 なんとかなるかなぁ。「Ultimate Tag Warrior」という名前のプラグインなのだが、 名前が仰々しいので今まで敬遠してきたという理由も無きにしもあらず(笑)。

僕は自分でタグを作るのがとても苦手というかそもそも慣れていないので、できれば はてなダイアリーの様に自動でタグを出してくれると嬉しい。んで、UTWにはそもそも 「タグの提案」という機能がついていて、Yahoo.comのAPIサービスを使ってキーワードを 提案してくれる。とてもすばらしいのだが、残念ながら英語のみ。そこで、 Yahoo.co.jpが提供している日本語形態素解析APIを利用することを考えて、ちょっとだけハックしてみた。

とりあえずこの機能を記述しているのはultimate-tag-warrior-ajax.php。この100行目付近に Yahoo.comを利用した場合の記述があるので、これをベースにYahoo.co.jp版に書き換え。 ただし、日本語形態素解析ではキーワードということではなく、単純に品詞に分解してくれるだけなので 切り取られたものを全てタグの提案にしていると、助詞とかまで入ってくる。その辺を考慮して、

$keywordAPISite = "api.jlp.yahoo.co.jp";
$keywordAPIUrl = "/MAService/V1/parse";
$pattern = "/(<surface>)(.*?)&lt;\/surface>/i";
$appID = "wp-UltimateTagWarrior";
$bypost = true;
$data = "appid=" . $appID . "&amp;results=uniq&amp;response=surface&amp;filter=9" . "&amp;sentence=" . $content;
という感じにしてみた。とりあえず名詞は羅列されるのでひとまず使えそう。理想的にははてなの 自動リンクAPIを使ってみたい。

色々いじくっていたらはてなキーワードもできました。

りょーちさんが公開されているはてなキーワード自動リンクAPIのPHPでの使い方を参考に させて頂きました。りょーちさんには本当に感謝いたします。すばらしいです。 APIの形が限られていて、さらに自分にコーディング能力が無いのでちょっとごちゃごちゃしていますが、 難しいことはしていません。ただのツギハギです。ちょっとプログラムをいじったことが あればすぐ分かると思います。

まず、りょーちさんのソースからRPC.phpを頂き、UTWフォルダの中にXMLフォルダを作り RPC.phpを放り込む。これはAPIに合うように形を整えるのに必要なようです。 続いて、それを使うのと文字コードをUTFに合わせるために、ultimate-tag-warrior-ajax.phpの 最初の方に以下の行を追加。

mb_internal_encoding('utf-8');
require_once "./XML/RPC.php";
続いて、$serviceでのswitch文にcase “hatena”を追加。この中ではてなのAPIに合わせた形に 整えます。ソースは以下。
case "hatena":
$pattern = "/(<a class=\"HATENA_CLASS\"[^>]+>)(.<em>?)(&lt;\/a>)/i";
$hatena = true;
$content = mb_convert_encoding( $content, 'utf8', mb_internal_encoding() );
$params = new XML_RPC_Value(array(
    "body"     => new XML_RPC_Value( $content , "string" ),
    "score"    => new XML_RPC_Value( HATENA_SCORE , "int" ),
    /</em>
    "cname"    => new XML_RPC_Value( array(
        new XML_RPC_Value( "book" , "string" ),
        new XML_RPC_Value( "comic" , "string" ),
        new XML_RPC_Value( "web" , "string" )
    ), "array"),
    */
    "a_class"  => new XML_RPC_Value(HATENA_CLASS, "string")
), "struct");
$msg = new XML_RPC_Message("hatena.setKeywordLink", array($params));
$client = new XML_RPC_Client( "/xmlrpc" , "d.hatena.ne.jp", 80 );</p>

<p>break;

$hatenaは後で使うフラグです。続いて、その下の方にあるif ($bypost) {… から始まるif文の2番目に次の分岐を加えます。

} else if ($hatena){
    // 実際にメッセージを送信してみる
    $response = $client->send($msg);
    if (!$response->faultCode()) {
    // 失敗しなければ(成功すれば)
    $n = $response->value();
    $n = $n->scalarval();
    $n = strtr( $n, array('<'=>'<', '>'=>'>', '"e;'=>'"' ) );
    // UTF-8から内部エンコーディングに変換して結果を返す
    $xml= mb_convert_encoding( $n ,mb_internal_encoding(),'utf-8' );
    }
} else if (function_exists('curl_exec')) {...
ここで実際にはてなに本文を送信して、キーワードにアンカータグが付いた文を戻してもらい $xmlに格納しておきます。UTWではこの後の処理で、$patternにマッチする部分を タグとして取り出すようになっているので、a_classで与えたクラス名の 付いたアンカータグに挟まれた部分をタグと認識して見事表示してくれます。

でもこれだけでは実際に投稿画面にははてなのボタンは現れません。 そこで、もう2つのファイルをハックします。細かい解説が面倒なので 変更した辺りのソースを貼っておきます。まずはultimate-tag-warrior-actions.php。 ultimate_display_tag_widget関数の最後の方をちょっと変更。

$suggestions1 .='<input type="button" onClick="askYahooForKeywords()" value="'.__("Yahoo", $lzndomain) . '"/>';
$suggestions1 .='</p>

<div id="yahooSuggestedTags"></div>

<p>';
$suggestions2 .='<input type="button" onClick="askHatenaForKeywords()" value="'.__("Hatena", $lzndomain) . '"/>';
$suggestions2 .='</p>

<div id="hatenaSuggestedTags"></div>

<p>';
echo '<input type="hidden" name="utw-verify-key" id="utw-verify-key" value="' . wp_create_nonce('utw') . '" />';
echo '</p>

<fieldset id="tagsdiv" class="dbx-box">' . '<h3 class="dbx-handle">'.__("Tags (comma separated list)", $lzndomain) .'</h3><div class="dbx-content">' . $widget . '</div></fieldset>

<p>';
echo '</p>

<fieldset id="tagsdiv" class="dbx-box">' . '<h3 class="dbx-handle">'.__('Yahoo!', $lzndomain) .'</h3><div class="dbx-content">' . $suggestions1 . '</div></fieldset>

<p>';
echo '</p>

<fieldset id="tagsdiv" class="dbx-box">' . '<h3 class="dbx-handle">'.__('Hatena Keyword', $lzndomain) .'</h3><div class="dbx-content">' . $suggestions2 . '</div></fieldset>

<p>';
それからultimate-tag-warrior-ajax-js.phpの最後に以下の関数を追加。
function askHatenaForKeywords() {
    var http = createRequestObject();
    try {
        http.open('POST','<?php echo $ajaxurl ?>?action=requestKeywords&amp;service=hatena&amp;content=' + document.getElementById("content").value);
        http.onreadystatechange = function () {
            if(http.readyState == 4){
                document.getElementById("hatenaSuggestedTags").innerHTML = http.responseText;
            }
        };
        http.send(escape(document.getElementById('content').value));
    } catch (ex) {
        alert("Something done went wrong:" + ex);
    }
}

ふぅ疲れた。これでボタンがYahooとHatenaの二つになるはずです。押してみればはてなキーワードに なる言葉がタグとして提案され、クリックすると追加されます。ただ、このままだと本文が長くなった時に ロリポップのApacheに蹴られてしまいます。もう少し工夫が必要。実際この記事は長すぎてダメ。

URLが長すぎる問題については上のサイトで補完。細かいこと書くの疲れました。 サイトはフランス語ですが分かると思いますので、やりたい人はやってください。←投げやりwww

と、いうわけで、1日かけてタグを登録する準備ができました。これで、 「記事を書く→タグの提案をしてもらう→適当にクリックしてタグを付ける」という [tegaki]面倒くさがりでも飽きないタグ付けが[/tegaki] [tegaki]できそうです。ヤター![/tegaki]

コメント:2

りょーち 07-09-12 (水) 15:30

こんにちは。りょーちと申します。
トラックバックいただいたよーなのでお邪魔してみました。

なんだかすごい難しそうなことをされてますねー(すごいです)。
私の紹介いたしましたはてなキーワードのリンク方法も、元々はどこかのサイトを参考にしたものです。
さらに XML/RPC.php は PEARから取得したものです。

WordPress も結構面白そうですね。
何かの折に参考にさせていただきます。

ではでは。

riywo 07-09-12 (水) 15:37

>りょーちさん

コメントありがとうございます。りょーちさんの
ソースがあったおかげで上手くいってます、ホント
感謝です。PHPの勉強にもなりました。

またちょこちょこお邪魔させてもらいますので
よろしくお願いします。m(_ _)m

コメントフォーム
Remember personal info

トラックバック:0

このエントリーのトラックバックURL
http://blog.riywo.com/2007/09/12/065830/trackback
Listed below are links to weblogs that reference
ブログにタグをつけるUltimate Tag Warrior from As a Futurist...

Home > WordPress > ブログにタグをつけるUltimate Tag Warrior

Banners
クリエイティブ・コモンズ・ライセンス track feed
Author
Feeds

Return to page top