/*
Plugin Name: Smart Update Pinger
Plugin URI: http://www.daven.se/usefulstuff/wordpress-plugins.html
Description: WordPressに標準で付いている ping 機能や更新通知機能を本プラグインと置き換えます。ping を送信するタイミングは,WordPress 標準機能だと新規に記事を投稿した時と記事の編集時ですが,このプラグインを使った場合は新規に記事を書いた時にのみです。また,オプション&rquot;Smart Update Pinger で ping サーバのURIの設定をしたり,ping の送信ログを読むこともできます。またここで手動で ping を送信することもできます。(日本語化: aka)
Author: Christian Davén
Version: 2.0
Author URI: http://www.daven.se/usefulstuff/
*/
# adds an options page to the options menu
function SUP_add_options_page()
{
if(function_exists("add_options_page"))
add_options_page("Smart Update Pinger", "Smart Update Pinger", 5, basename(__FILE__), "SUP_show_options_page");
}
# shows the options page
function SUP_show_options_page()
{
$ping = get_option("SUP_ping");
$uris = get_option("ping_sites");
$pingservicesnow = "今すぐ ping を送信!";
if(isset($_POST["ping"]) && $_POST["ping"] == $pingservicesnow)
{
SUP_log("手動で ping を送信中 ...");
SUP_ping_services();
}
elseif(isset($_POST["submit"]))
{
$uris = $_POST["uris"];
$ping = 0;
if($_POST["ping"] == 1)
$ping = 1;
update_option("SUP_ping", $ping);
update_option("ping_sites", $uris);
echo '
';
}
$checked = '';
if($ping == 1)
$checked = 'checked="checked"';
echo
'
ping 送信先のサーバ
以下に登録されている ping サーバへは記事を投稿する際,自動的に ping 送信や更新通知がなされます。WordPress が通常行うような,以前書いた記事の編集時ではありません
注意: このリストは オリジナルのアップデートサービスリストと同期します。.
Ping 送信ログ
このプラグインのログです(下に行くほど新しいログです)
'.SUP_get_last_log_entries(20).'
';
}
# telling WordPress to ping if the post is new, but not if it's just been edited
function SUP_ping_if_new($id)
{
global $wpdb, $post_title;
if(get_option('SUP_ping') == 1
and get_option('ping_sites') != "")
{
# fetches data directly from database; the function "get_post" is cached,
# and using it here will get the post as is was before the last save
$row = mysql_fetch_array(mysql_query(
"SELECT post_date,post_modified
FROM $wpdb->posts
WHERE id=$id"));
# if time when created equals time when modified it is a new post,
# otherwise the author has edited/modified it
if($row["post_date"] == $row["post_modified"])
{
if($post_title)
SUP_log("Pinging services (new post: “".$post_title."”) ...");
else
SUP_log("Pinging services (新規の記事の投稿) ...");
SUP_ping_services();
# Try commenting the line above, and uncommenting this line below
# if pinging seems to be out of order. Please notify the author if it helps!
# generic_ping();
}
else
{
if($post_title)
SUP_log("NOT pinging services (“".$post_title."” の設定が変更されました)");
else
SUP_log("NOT pinging services (記事が編集されました)");
}
}
else
SUP_log("NOT pinging services (管理者が ping 送信を無効にしています)");
}
# More or less a copy of WP's "generic_ping" from functions.php,
# but uses another function to send the actual XML-RPC messages.
function SUP_ping_services()
{
$services = get_settings('ping_sites');
$services = preg_replace("|(\s)+|", '$1', $services); // Kill dupe lines
$services = trim($services);
if ( '' != $services )
{
$services = explode("\n", $services);
foreach ($services as $service)
SUP_send_xmlrpc($service);
}
}
# A slightly modified version of the WordPress built-in ping functionality ("weblog_ping" in functions.php).
# This one uses correct extendedPing format (WP does not), and logs response from service.
function SUP_send_xmlrpc($server = '', $path = '')
{
global $wp_version;
include_once (ABSPATH . WPINC . '/class-IXR.php');
// using a timeout of 3 seconds should be enough to cover slow servers
$client = new IXR_Client($server, ((!strlen(trim($path)) || ('/' == $path)) ? false : $path));
$client->timeout = 3;
$client->useragent .= ' -- WordPress/'.$wp_version;
// when set to true, this outputs debug messages by itself
$client->debug = false;
$home = trailingslashit( get_option('home') );
# the extendedPing format should be "blog name", "blog url", "check url" (whatever that is), and "feed url",
# but it would seem as if the standard has been mixed up. it's therefore best to repeat the feed url.
if($client->query('weblogUpdates.extendedPing', get_settings('blogname'), $home, get_bloginfo('rss2_url'), get_bloginfo('rss2_url')))
{
SUP_log("- ".$server." への ping 送信が成功しました (拡張フォーマット)");
}
else
{
# pinging was unsuccessful, trying regular ping format
if($client->query('weblogUpdates.ping', get_settings('blogname'), $home))
{
SUP_log("- ".$server." への ping 送信が成功しました");
}
else
{
SUP_log("- ".$server." への ping 送信が失敗しました。 以下のエラーメッセージが返されました: “".$client->error->message."”");
}
}
}
$post_title = "";
# Receives the title of the post from a filter below
function SUP_post_title($title)
{
global $post_title;
$post_title = $title;
return $title;
}
# -----
# Log stuff
$logfile = ABSPATH."wp-content/smart-update-pinger.log";
# for debugging
function SUP_log($line)
{
global $logfile;
$fh = @fopen($logfile, "a");
@fwrite($fh, strftime("%D %T")."\t$line\n");
@fclose($fh);
}
function SUP_get_last_log_entries($num)
{
global $logfile;
$lines = @file($logfile);
if($lines === false)
return "Error reading log file (".$logfile."). This could mean that the wp-content directory is write-protected and no log data can be saved, that you have manually removed the log file, or that you have recently upgraded the plugin.";
else
{
$lines = array_slice($lines, count($lines) - $num);
$msg = "";
foreach($lines as $line)
$msg .= trim($line)."
";
return $msg;
}
}
# -----
# adds a filter to receive the title of the post before publishing
add_filter("title_save_pre", "SUP_post_title");
# adds some hooks
# shows the options in the administration panel
add_action("admin_menu", "SUP_add_options_page");
# calls SUP_ping whenever a post is published
add_action("publish_post", "SUP_ping_if_new");
# calls SUP_ping_draft when changing the status from private/draft to published
# add_action("private_to_published', 'SUP_ping_draft');
# removes the "WordPress official" pinging hook
remove_action("publish_post", "generic_ping");
# activates pinging if setting doesn't exist in database yet
# (before the user has changed the settings the first time)
if(get_option("SUP_ping") === false)
{
update_option("SUP_ping", 1);
}
?>