昨年末に、WordPress を 2.9 にアップグレードしましたが、そのタイミングでトラックバックが送れなくなっていました。

masatsu file では「猫写真」と「WordPress」 のトラックバックピープルに 更新ping を送信しています。特に「猫写真」の方は毎日送信しているのですが、どうも反映されていない。

投稿自体はエラーも出ずに終了しているのですが、トラックバックが送れていないという状況でした。年末はテーマの変更作業でバタバタしていたので先送りしていましたが、少し落ち着いたので調べてみました。

まず最初に以下のサイトで wp-includes/comment.php の一部を変更する対処法を見つけました。

   WordPressから(公式ブログへの)トラックバック不調の件 « 雑多なブログ

この記事によると、wp-includes/comment.php の 1730行目のタイムアウトの値が4秒と短いので、30秒にすることで解決されたそうです。

[php num=1726 highlight_lines=1730]
if ( empty($trackback_url) )
return;

$options = array();
$options[‘timeout’] = 30;
$options[‘body’] = array(
‘title’ => $title,
‘url’ => get_permalink($ID),
‘blog_name’ => get_option(‘blogname’),
‘excerpt’ => $excerpt
);
[/php]

私も早速上記のように修正してみましたが、改善されず orz

続いて、以下のサイトで wp-includes/cron.php の一部を変更する対処法を見つけました。

   WordPressでトラックバックが送信できない件(解決!) | AZ::Blog

この記事によると、wp-includes/cron.php の 229行目のタイムアウトの値が0.01秒とこれまた極端に短いので、30秒にすることで解決されたそうです。

[php num=228 highlight_lines=229 font_size=”80%”]
$cron_url = get_option( ‘siteurl’ ) . ‘/wp-cron.php?doing_wp_cron’;
wp_remote_post( $cron_url, array(‘timeout’ => 30, ‘blocking’ => false, ‘sslverify’ => apply_filters(‘https_local_ssl_verify’, true)) );
[/php]

上記の通り修正したところ、今度はトラックバックが送れるようになりました!
年末からたまっていたpingが全部送信されて少し焦りましたけど(^^;

今回の修正の行数等は WordPress 2.9 に基いています。comment.php と cron.php の両方の修正が必要なのか、cron.php だけで良いのかは検証してません。私はcomment.php のタイムアウトも延ばしたままにしています。また、タイムアウトの時間はどれくらいが適当なのかも検証していません。私は参考にしたサイトと同様両方30秒にしています。確かに投稿にかかる時間は長くなりました。cron.php の方は 4秒という記述も見かけたので、適宜最適な値を設定してください。

========2010-01-12追記========
WordPress 2.9.1 になって、cron.php のバグが解消されて、ソースに修正を加えなくてもトラックバック/ピンバックが送れるようになっています。ただ、環境によっては、こちらから送ったのに先方で受信されていないケースがあるようなので、2.9.1でも同様の修正を施しました。
しかし、この投稿にあるようにタイムアウトの値を30秒にすると、同じ更新pingを4回も送ってしまうことがあったので、2.9.1では両方30秒にするのは危険かもしれません。
よって、私は現在、comment.php=16秒、cron.php=4秒、にしています。根拠はありません(爆)。やっぱりこの辺りは皆さんの環境で適宜最適な値を設定してください。
個人的見解ですが、pingが送れないのは cron.php の影響で、送信したpingが先方に反映されないのは comment.php の影響なのかなと思っています。
========2010-01-12追記========

このタイムアウトを延ばすという方法で解決できたということは WordPress のトラックバック送信にはかなり時間がかかるということですよね。私は 2.7.1 から 2.9 に一気にアップグレードしたので 2.8.x の事はよく分かりませんが、2.9 から ping を送信する際の投稿記事を取得する関数が、”the_content”から”the_content_feed”に変わってるようなので、それが原因かもしれません。素人なので専門的なことは分かりませんが。

とりあえず、うまく行ってるようなので、しばらくこの状態で様子を見ます。