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

Pocket

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 追記
このテスト用ブログは削除してしまいました。



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



お役に立てましたか?

ブックマークをどうぞ!

スポンサード リンク

コメントを残す