解決:WordPressでトラックバックが送信できない

WordPressでトラックバックが送信できないの記事の続きです。

あれからコードを追って、ネックになっている場所を突き止めました。
んで、たぶん解決したと思うので以下にメモしておきたいと思います。

環境

  • さくらインターネット
  • WordPress 2.8.4

起こっていた現象
  • yahooブログにはトラックバックできた
  • fc2ブログにはトラックバックできなかった

解決までにたどった道のり
  1. ソースを追ってトラックバックのURLをリクエストしている場所、そのレスポンスを受け取っている場所を突き止めた
  2. デバッグコードを埋め込んでレスポンスをテキスト出力して内容を確認
  3. デバッグコードを埋め込んだ場所は後述。

トラックバックやピングバックを行っているソース
  • wp-includes/comment.php

現象と対処法
  1. 「公開」ボタンを押下した後、「トラックバック送信」フォームにURLが残ったままになっている場合
  2. →たぶん受信側(相手)の応答が遅くてタイムアウトしている場合が多かった。でも成功したときも残っている場合があるんですよねぇ。よく分からないねぇ・・・。
     comment.phpのfunction trackbackの以下の部分をいじり、waitする時間を長くします。
      「$options[‘timeout’] = 4;」
     ↓
     「$options[‘timeout’] = 60;」
     ※60という数字は適当です(^.^;

  3. 「公開」ボタンを押下した後、「トラックバック送信」フォームにURLが残っていない場合(送信済みトラックバックとして扱われている場合)
  4. →httpリクエストは送信されています(トラックバックPingは飛んでいる)が、何らかの理由で受信側がトラックバックをはねています。たぶん。

    例えばこんな事象を確認しました。

    • fc2ブログなどの場合、言及リンク(トラックバック送信先の記事に対するハイパーリンク)が無いとスパム扱いになります。
      (参考:fc2の公式発表
    • ちなみに、この事象はfc2以外にもlivedoorのブログでもそうらしいです。おそらく他にもあるでしょう。念のため、言及リンクを入れてのテストをした方が無難です。

    • 本文が短すぎたり、「ああああ」など、スパム扱いされそうなエントリーである場合。また、ユーザが任意で設定した特定のキーワードを含むエントリーである場合もはねることがあるらしいです。
    • テストとは言え、ちゃんと文章を書いた方が無難です。
      (参考:@niftyのココログQA

    • 受信側(相手)がトラックバックリクエストを保留している場合
    • WordpressのAkismetプラグインでもそうですが、ユーザが承認した場合のみトラックバックとして掲載するというパターンがどうも多そうです。
      まずはソースにデバッグコードを埋め込んで、レスポンスが「0(成功)」であった場合は、お茶でも飲んだ後か数日後に確認した方が無難です。
      レスポンスが「1(失敗)」の場合、その理由がレスポンス内に含まれていることが多かったので、それが解決の手がかりになると思います。

      fc2では・・・
      1. タイムアウトのレスポンスが返ってきた
      2. タイムアウトの時間を60秒と長くしてみた
      3. 言及リンクがないよ!というレスポンスが返ってきた
      4. 言及リンクを入れてみた
      5. fc2ブログで「承認待ち」ステータスになった(自分のアカウントでテスト用のfc2ブログを作成しました。fc2のデフォルトの設定では、取りあえずトラックバックは保留されるらしい)ってことでまだ送信者からは確認できない
      6. fc2側で承認してやっと無事トラックバック出来ていることが確認できた)



デバッグコードを埋め込んだ場所
  • comment.phpのfunction trackbackに以下を挿入(赤字の部分)

  • function trackback($trackback_url, $title, $excerpt, $ID) {
    global $wpdb;

    if ( empty($trackback_url) )
    return;

    $options = array();
    // $options['timeout'] = 4;
    $options['timeout'] = 60;
    $options['body'] = array(
    'title' => $title,
    'url' => get_permalink($ID),
    'blog_name' => get_option('blogname'),
    'excerpt' => $excerpt
    );

    $response = wp_remote_post($trackback_url, $options);

    // debug start
    $fp = fopen("testdayo.txt", "w");
    fwrite($fp, print_r($response,true).'----end---\n');
    fclose($fp);
    // debug end

    if ( is_wp_error( $response ) )
    return;

    $tb_url = addslashes( $trackback_url );
    $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET pinged = CONCAT(pinged, '\n', '$tb_url') WHERE ID = %d", $ID) );
    return $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, '$tb_url', '')) WHERE ID = %d", $ID) );
    }


    こうすると、トラックバック有りの記事の投稿の際、Wordpressのルートディレクトリにtestdayo.txtが出来て、どんなレスポンスが返ってきているのかが確認できる。

    例えばfc2で成功した時はこんな感じ。

    (中略)
    <response>
    <error>0</error> ★0=成功、1=失敗(トラックバック)
    <message>Thank You!</message> ★失敗したときはその理由が書かれる。例えばfc2で言及リンクが無かった時は「Error: Forbidden Your Entry (Link)」と書いてあった。
    </response>
    [response] => Array
    (
    [code] => 200 ★HTTPレスポンスコード。これはHTTPリクエストが成功したという意味。ここが200(成功)ステータスだからと言って、トラックバックも成功しているとは言えない。
    [message] => OK
    )

    (以下略)


こんなもんすかね。



追伸・・・

テスト用に作った僕のfc2のブログですが、トラックバックのテスト用に使ってやって下さい。

管理コンソールを見て分かったのですが、fc2はデフォルトで要承認という訳じゃなく、承認という作業は必須みたいです。

面倒なので僕は承認しませんが、その代わりに「このコメントは管理者の承認待ちです」と表示するように設定しておきました。
投稿日時で判断してください。

それと、
「本文中に言及リンクの無いトラックバックを受け付ける
本文の99%以上が英数字のものをスパムと判定
という設定にしてあるので気をつけてくらはい。


2013/09/26 追記
このテスト用ブログは削除してしまいました。



あ。もちろんこの記事へのトラックバックでテストしても構いませんが(笑

WordPressでトラックバックが送信できない

Wordpressのトラックバックについて。
トラックバックに成功したことがありません・・・。
自分のブログの記事に対しては出来るんだけど、他ブログ様だとできない・・・。

取りあえず、こちらのブログの方法を試してみたけど未解決・・・
どうやらWordpress同士なら上手くできるらしいのですが・・・。

う~ん・・・。
どうしたもんか。

もうちょっと調べてみます・・・。

~14:50分追記~
ちょっと色々調べてみたら更新pingの送信もエラーで返ってくるサイトが多かった。
そっちの方が簡単にできそうだったので、まずは更新pingの送信先の整理を行った。
その最中に見つけたのだが、更新ping一括送信サービスみたいなものがあるそうな・・・。

Pingoo!
無料で大手サイトのping先に一括で配信してくれるサービスらしい。
いちいち有効なping・無効なpingを自力で調べるより、こっちを利用した方が利口なのかもしれない・・・。

ということで、面倒になってきたのでPingoo!に登録してすませることにした。

ちなみにもちろん無料。

トラックバックのURLがおかしい

Nucleusのトラックバックプラグインを入れたのだがURLがおかしいので一時撤去。
調べる気力も失せた。
調べるより自分で調べて作った方が早い。
まぁ作る気もないが。
やっぱApacheプロジェクトやJakartaプロジェクトの様な、まとまりのあるコミュニティがリリースしているものじゃないと当てにならないな。
商用で使われているものだから当たり前だが。
Nucleusはコア部分のみを使う分にはとても良いと思う。
けどプラグインは駄目だ。
既存のプラグインとの互換性、共存性があるかどうかもわからないのにリリースしている。
ユーザが混乱するだけ。
プラグインを修正するのではなくコア部分を手直しする始末。
じゃぁ使うなという人がいるならもう使わないよ・・・。
無料だから、ボランティアだから、フリーライセンスだからといって無責任なものを世に出回していいものか。
イライラしてくる。
対価があってこそ責任が生まれるのだ。
責任があるからこそしっかりとしたものを作るのだ。
それがプロの技術屋だろう。
俺は趣味の世界ではなくプロの世界で生きたい。
とか言って起きながらフリーライセンスのツール類を使って開発をしている自分も矛盾している。
何もフリーライセンスを否定しているんじゃない。
フリーライセンス=責任を取らなくて良いって考えが嫌いだ。
そしてそういうものが出回りすぎていると思っているだけだ。
ええ。俺もeclipseとかffftpとかtera termとか使ってますよ。
「ちゃんと動くから」ね。
JavaとかFTPとかtelnetとかsshって技術はちゃんとした規格がありますからね。
HTML?CSS?あほくさい。
もうFlashでいいじゃんって思う。
あ。でもJava開発者の立場からするとAppletがまた再燃してくれると嬉しいのだけど(笑
おし。決めた。
HTMLやCSSなんて当てにならないものはぽぃ。
当てになる段階になったら使ってやんよって感じでいいや。
まともに勉強するだけ損だ。