WordPressのトラックバックの保存形式を改善する

WordPressのトラックバックの保存形式が気持ち悪い」ので気持ち悪くないようにしてみます。

記事の要約(excerpt)に...が追加される問題については、WordPressでトラックバックの受信を処理する/wp-trackback.phpを見てみると、アクションやフィルタが処理される前に行われているのでコアの修正が必要でした。...を追加する場合に、excerptのバイト数をチェックしてから切り詰めるように改善しました。(使用しているのはWordPress 2.2.3 日本語版です。)

/wp-trackback.php(79行目~)
    if ( function_exists('mb_strcut') ) { // For international trackbacks
        // $excerpt = mb_strcut($excerpt, 0, 252, get_option('blog_charset')) . '...';
        $excerpt = (strlen($excerpt) > 255) ? mb_strcut($excerpt, 0, 252, get_option('blog_charset')) . '...' : $excerpt;  // 変更
        // $title = mb_strcut($title, 0, 250, get_option('blog_charset')) . '...';
        $title = (strlen($title) > 250) ? mb_strcut($title, 0, 250, get_option('blog_charset')) . '...' : $title;  // 変更
    } else {
        $excerpt = (strlen($excerpt) > 255) ? substr($excerpt, 0, 252) . '...' : $excerpt;
        $title = (strlen($title) > 250) ? substr($title, 0, 250) . '...' : $title;
    }

記事のタイトル(title)がexcerptと同じフィールドに保存される問題についてはいくつかの方法を思いつきました。一つはコアを修正して、titleとブログ名(blog_name)を結合したものをtitleとして保存する方法です。

/wp-trackback.php(79行目~)
    $title = $title . ' - ' . $blog_name;  // 追加

    if ( function_exists('mb_strcut') ) { // For international trackbacks
        // $excerpt = mb_strcut($excerpt, 0, 252, get_option('blog_charset')) . '...';
        $excerpt = (strlen($excerpt) > 255) ? mb_strcut($excerpt, 0, 252, get_option('blog_charset')) . '...' : $excerpt;  // 変更
        // $title = mb_strcut($title, 0, 250, get_option('blog_charset')) . '...';
        $title = (strlen($title) > 250) ? mb_strcut($title, 0, 250, get_option('blog_charset')) . '...' : $title;  // 変更
    } else {
        $excerpt = (strlen($excerpt) > 255) ? substr($excerpt, 0, 252) . '...' : $excerpt;
        $title = (strlen($title) > 250) ? substr($title, 0, 250) . '...' : $title;
    }

    $comment_post_ID = (int) $tb_id;
    // $comment_author = $blog_name;
    $comment_author = $title;  // 変更
    $comment_author_email = '';
    $comment_author_url = $tb_url;
    // $comment_content = "<strong>$title</strong>\n\n$excerpt";
    $comment_content = $excerpt;  // 変更
    $comment_type = 'trackback';

この方法のメリットは、とにかく簡単に変更できることとテーマでの扱いが簡単なことです。デメリットは、コアの修正箇所が増えることと標準とは異なる形式のデータになることです。

もう一つ思いついたのはWordPressのフィルタで処理する方法です。通常、テーマでコメントを取得・表示する際にはget_comment_text()やcomment_text()を使います(comment_text()はget_comment_text()のラッパー関数です)。そこで、get_comment_textをフックとしたフィルタを追加して、そのフィルタ関数で$comment->comment_content(wp_commentsテーブルのcomment_contentフィールドの値が入ってくる)の内容をトラックバックの記事名と記事の要約に分ける方法です。

実際には、トラックバックもコメントの一部として扱われるため、テーマのfunctions.phpにトラックバックを取得するための専用の関数を用意することになります。<strong></strong>に囲まれた部分がトラックバックの記事名となるので、正規表現なりでパースして返してやります。さらに、テーマ側ではget_comment_type()を使ってコメントの種類別に処理を分けて、トラックバックの場合には専用のテーマ関数を呼び出すようにします。この方法のメリットはコアやデータの形式を変更する必要がないことです。デメリットはとにかく面倒なことです。

結局、titleがexcerptと同じフィールドに保存される問題については、どちらの方法もしっくりこないので今回はそのままにしておくことにしました。

コメント (2)

  • MEGU
  • 2008-01-07 01:34

こんにちは。
ぬぬ?ハードコーティングされているのですね。
(あぁ。コーティングしてしまいました 笑。【コーディング】ですね)。

spanの連呼とかdivの連呼とかもイヤ…(笑)。

こんばんは。
標準のテンプレートタグだと柔軟性が低いので、ところどころテーマ用に修正したものに置き換えてます :x
MODxのスニペット+チャンク+プレイスホルダがほしいです(笑

ブログは作らなきゃいけないところがたくさんあって大変ですね。
力尽きてきたので後は少しづつ直そうかなあと思ってきました(笑

コメントフォーム

トラックバック (0)

この記事へのトラックバックはまだありません。

この記事のトラックバックURI
http://dxd8.com/archives/18/trackback/
この記事のURI
http://dxd8.com/archives/18/