/*
Plugin Name: Ultimate Plugins Smart Update Pinger
Plugin URI: http://ultimateplugins.com/wordpress/smart-update-pinger/
Description: Replaces the built-in ping/notify functionality. Pings only when publishing new or future posts, not when editing. The new post's url is pinged, not the main url. Also includes reverse order logfile.
Author: Ultimate Plugins
Version: 3.1
Author URI: http://ultimateplugins.com/
License: GNU General Public License: This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see .
*/
# Known/outstanding issues:
# [UNCONFIRMED ISSUE] Plugin seems to keep pinging when importing an XML/WXR file even if pinging is disabled
# Plugin does not seem to report any errors if it cannot write to the log file (see E2 blog for example)
function SUP_add_options_page(){
if(function_exists("add_options_page"))
add_options_page("UP Smart Update Pinger", "UP Smart Update Pinger", 5, basename(__FILE__), "SUP_show_options_page");
}
function SUP_show_options_page(){
global $logfile;
$ping = get_option("SUP_ping");
$pinglog = get_option("SUP_pinglog");
$uris = get_option("ping_sites");
$forcedpings = false; $SUP_output_log='';
$pingservicesnow = "Ping Services Now!";
$deletelogfile = "Delete Log File";
if(isset($_POST["ping"]) && $_POST["ping"] == $pingservicesnow){
$forcedpings = true;
SUP_log(SUP_ping_services($forcedpings).strftime("%D %T")."\tForced pinging services (Homepage)\n\t─────\n");
}elseif(isset($_POST["submit"])){
$uris = $_POST["uris"];
$ping = 0;
if($_POST["ping"] == 1) $ping = 1;
$pinglog = 0;
if($_POST["pinglog"] == 1) $pinglog = 1;
update_option("SUP_ping", $ping);
update_option("SUP_pinglog", $pinglog);
update_option("ping_sites", $uris);
echo '
';
}elseif(isset($_POST["delete"]) && $_POST["delete"] == $deletelogfile){
$fh = @fopen($logfile, "w");
if(false === @fwrite($fh, strftime("%D %T")."\tLog file deleted\n\t─────\n")){
update_option("SUP_error", 1);
}else{
update_option("SUP_error", 0);
}
@fclose($fh);
}
$checked1 = '';
if($ping == 1)
$checked1 = 'checked="checked"';
$checked2 = '';
if($pinglog == 1)
$checked2 = 'checked="checked"';
echo '
Ultimate Plugins Smart Update Pinger
Click here for installation instructions
Click here for usage instructions
Click here for updated versions
Click here for comments and suggestions
URIs to Ping
The following services will automatically be pinged/notified when you publish normal or future timestamped posts. Not when you edit previously published posts, as WordPress does by default.
This plugin also fixes an issue with the default extended ping programming in Wordpress and pre-2.1 versions of Smart Update Pinger (it now includes the url of the new post).
NB: this list is synchronized with the original update services list.
Ping log
These are the last 100 actions performed by the plugin. In reverse chronological order for easier reading (latest ping first).
';
SUP_get_last_log_entries(500);
echo '
';
}
# 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;
$SUP_output_log="\t─────\n";
$SUP_ping_result=''; $forcedpings = false;
if(get_option('SUP_ping') == 1 && trim(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,post_title,guid FROM $wpdb->posts WHERE id=$id"));
"SELECT post_date,post_modified,post_title 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_title"]){
$SUP_output_log=strftime("%D %T")."\tNOT Pinging services (ERROR: YOU HAVE FORGOTTEN TO ENTER A POST TITLE) ...\n".$SUP_output_log;
}else{
if($row["post_date"] == $row["post_modified"]){
$SUP_output_log=strftime("%D %T")."\tPinging services (New normal post: “".$row["post_title"]."”) ...\n".$SUP_output_log;
$SUP_output_log=SUP_ping_services($forcedpings,get_permalink($id)).$SUP_output_log;
# 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{
// Post has been edited or it's a future post
// If we have a post title it means that we are in the normal WP loop and therefore it was an edit (not a future post)
if($post_title){
$SUP_output_log=strftime("%D %T")."\tNOT Pinging services (Existing post was edited: “".$row["post_title"]."”) ...\n".$SUP_output_log;
}else{
$SUP_output_log=strftime("%D %T")."\tPinging services (New timestamped post: “".$row["post_title"]."”) ...\n".$SUP_output_log;
$SUP_output_log=SUP_ping_services($forcedpings,get_permalink($id)).$SUP_output_log;
# 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 (trim(get_option('ping_sites')) != ""){
$SUP_output_log=strftime("%D %T")."\tNOT Pinging services (WARNING: DISABLED BY ADMINISTRATOR)\n".$SUP_output_log;
}else{
$SUP_output_log=strftime("%D %T")."\tNOT Pinging services (WARNING: EMPTY PING SERVICES LIST)\n".$SUP_output_log;
}
}
SUP_log($SUP_output_log);
}
# 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($forcedpings,$SUP_guid = ''){
$SUP_output_log='';
#$services = get_settings('ping_sites');
#UP - 17.07.07 - get_option is newer/better then get_settings
$services = get_option('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_output_log=SUP_send_xmlrpc($forcedpings,$SUP_guid,$service).$SUP_output_log;
}
return $SUP_output_log;
}
# A slightly modified version of the WordPress built-in ping functionality ("weblog_ping" in functions.php).
# Original version:
#function weblog_ping($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') );
#if ( !$client->query('weblogUpdates.extendedPing', get_option('blogname'), $home, get_bloginfo('rss2_url') ) ) // then try a normal ping
#$client->query('weblogUpdates.ping', get_option('blogname'), $home);
#}
# This one uses correct extendedPing format (WP does not), and logs response from service.
function SUP_send_xmlrpc($forcedpings,$SUP_guid = '',$server = '', $path = ''){
global $wp_version;
$SUP_output_log='';
include_once (ABSPATH . WPINC . '/class-IXR.php');
// using a timeout of 5 seconds should be enough to cover slow servers (changed from 3 to 5)
$client = new IXR_Client($server, ((!strlen(trim($path)) || ('/' == $path)) ? false : $path));
$client->timeout = 5;
$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" (the new URL), and "feed url".
# Related Website(s)
# http://www.weblogs.com/api.html
# An example:
# Someblog - Title
# http://spaces.msn.com/someblog - Home URL
# http://spaces.msn.com/someblog/PersonalSpace.aspx?something - Check/New URL
# http://spaces.msn.com/someblog/feed.rss - Feed
# Changed the following line therefore:
# if($client->query('weblogUpdates.extendedPing', get_settings('blogname'), $home, get_bloginfo('rss2_url'), get_bloginfo('rss2_url')))
if ($forcedpings){
# If this is a forced ping it's better to use a regular ping for the homepage without an update URL (safer)
if($client->query('weblogUpdates.ping', get_option('blogname'), $home)){
$SUP_output_log=strftime("%D %T")."\t► [Regular Ping] ".$server." was successfully pinged\n".$SUP_output_log;
if (get_option('SUP_pinglog') == 1){
$SUP_output_log=strftime("%D %T")."\t►► Blogname: '".get_option('blogname')."'\n".$SUP_output_log;
$SUP_output_log=strftime("%D %T")."\t►► Homepage: '".$home."'\n".$SUP_output_log;
}
}else{
$SUP_output_log=strftime("%D %T")."\t► ".$server." could not be pinged. Error message: “".$client->error->message."”\n".$SUP_output_log;
}
}else{
if($client->query('weblogUpdates.extendedPing', get_option('blogname'), $home, $SUP_guid, get_bloginfo('rss2_url'))){
$SUP_output_log=strftime("%D %T")."\t► [Extended Ping] ".$server." was successfully pinged\n".$SUP_output_log;
if (get_option('SUP_pinglog') == 1){
$SUP_output_log=strftime("%D %T")."\t►► Blogname: '".get_option('blogname')."'\n".$SUP_output_log;
$SUP_output_log=strftime("%D %T")."\t►► Homepage: '".$home."'\n".$SUP_output_log;
$SUP_output_log=strftime("%D %T")."\t►► Updated : '".$SUP_guid."'\n".$SUP_output_log;
$SUP_output_log=strftime("%D %T")."\t►► RSS URL : '".get_bloginfo('rss2_url')."'\n".$SUP_output_log;
}
}else{
# pinging was unsuccessful, trying regular ping format
if($client->query('weblogUpdates.ping', get_option('blogname'), $home)){
$SUP_output_log=strftime("%D %T")."\t► [Regular Ping] ".$server." was successfully pinged\n".$SUP_output_log;
if (get_option('SUP_pinglog') == 1){
$SUP_output_log=strftime("%D %T")."\t►► Blogname: '".get_option('blogname')."'\n".$SUP_output_log;
$SUP_output_log=strftime("%D %T")."\t►► Homepage: '".$home."'\n".$SUP_output_log;
}
}else{
$SUP_output_log=strftime("%D %T")."\t► ".$server." could not be pinged. Error message: “".$client->error->message."”\n".$SUP_output_log;
}
}
}
return $SUP_output_log;
}
$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
$logfile = ABSPATH . 'wp-content/plugins/ultimate-plugins-smart-update-pinger/ultimate-plugins-smart-update-pinger.log';
function SUP_log($SUP_log_output){
global $logfile;
$logerror = 0;
$fh = @fopen($logfile, "a");
if(false === @fwrite($fh, $SUP_log_output)){
update_option("SUP_error", 1);
}else{
update_option("SUP_error", 0);
}
@fclose($fh);
}
function SUP_get_last_log_entries($num){
global $logfile;
$lines = @file($logfile);
if(get_option("SUP_error") == 1){
$fh = @fopen($logfile, "a");
if(false === @fwrite($fh, "")){
echo "Error writing log file (".$logfile."). Most likely your logfile (".$logfile.") is write-protected and no log data can be saved (change the rights of this file to 777), or alternatively this could mean that you have manually removed the log file, or that you have changed the directory or file name of the plugin (they both should be 'ultimate-plugins-smart-update-pinger')";
}else{
// Original: $lines = array_slice($lines, count($lines) - $num);
// Modified to show in reverse order (easier for reading)
$lines = array_reverse(array_slice($lines, count($lines) - $num));
$msg = "";
foreach($lines as $line){
$msg.=trim($line)."
";
}
echo $msg;
}
@fclose($fh);
}else{
if($lines === false){
echo "Error reading log file (".$logfile."). Most likely you have manually removed the log file, or alternatively this could mean that the logfile (".$logfile.") is read-protected (change the rights of this file to 777), or that you have changed the directory or file name of the plugin (they both should be 'ultimate-plugins-smart-update-pinger')";
}else{
// Original: $lines = array_slice($lines, count($lines) - $num);
// Modified to show in reverse order (easier for reading)
$lines = array_reverse(array_slice($lines, count($lines) - $num));
$msg = "";
foreach($lines as $line){
$msg.=trim($line)."
";
}
echo $msg;
}
}
}
# adds a filter to receive the title of the post before publishing
add_filter("title_save_pre", "SUP_post_title");
# 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);}
if(get_option("SUP_pinglog") === false){update_option("SUP_pinglog", 1);}
if(get_option("SUP_error") === false){update_option("SUP_error", 0);}
?>
{"id":2557,"date":"2012-10-14T12:09:37","date_gmt":"2012-10-14T12:09:37","guid":{"rendered":"https:\/\/kite2012.com\/?p=2557"},"modified":"2012-10-14T12:10:31","modified_gmt":"2012-10-14T12:10:31","slug":"kite-surfing-in-boracay","status":"publish","type":"post","link":"https:\/\/kite2012.com\/kite-surfing-in-boracay\/","title":{"rendered":"Kite surfing in Boracay"},"content":{"rendered":"Kite surfing in Boracay<\/strong><\/p>\n<\/a>Boracay, a small tropical island of Philippines, in recent years has been famous for its beaches and home for kite surfing lovers. The white sunny beaches, and the warm temperature whole year makes the day and night life as one of the most happening places and this is what Boracay is special. The country of Philippines is ranked first for getting registered in Kite surfing and that became the best place in Asia. Trainers of IKO and VBWS teach the beginners. Boracay Island is situated away from the mainland and so less crowded compared to the other beaches. Bulabog is a Beach where Kite surfing takes place. The kiters also have their own secluded section for kite surfing. Another beach for good kite surfing is situated to the north known as the White Beach or Diniwid. In total, the island of Boracay has 12 beaches. The kite surfing practiced on these beaches have mainly five different types of courses. Each course is being taught by the IKO instructor to the beginners and generally each instructor will have maximum two students each at a time. Every student is given proper attention so that they can learn the safety procedures of flying and also gather experience through their performance. The equipments which will be needed for the beginners to learn kite surfing are \u2013 Cabrinha<\/a>, F-One<\/a>, Slingshot Kites<\/a>, Naish Kites<\/a>, Nobile Kite boards<\/a>, Prolimit <\/a>and many other brands. In fact you can pretty much learn kitesurfing or hire equipment with any of the major brands on the kitesurfing market.<\/p>\nThe different types of courses that the students learn here will have an international license that will be equivalent to the IKO level certificate provided around the world. The different courses trained here are namely \u2013<\/p>\n
Discovery Course<\/strong> \u2013 It\u2019s the introductory course for the beginners or for those people who wants to learn and then find out whether they can do kite surfing or not. It\u2019s a course for only 2 hours.<\/p>\nDay Course Level 1 IKO \u2013 <\/strong>This is the first step one course for beginners. They start learning with the IKO instructor\u2019s help. In this step, they are trained about the set up of the kite, turbulences, bar and lines, safety system, fly a 4 line kite, power zone and wind-window theory. At the end of this level the beginners learn to use the kite in the power zone. This course is of 4 hours duration.<\/p>\nBeginner Course Level 1+2 IKO (IKO Certificate) –<\/strong> In this course one gets trained to become an independent kiter. The instructor also helps them during this training. After a 12 hours\/ 3days of session one gets good control over kite surf. Another part of the learning in this session is to get on the board and riding oneself.<\/p>\nAdvanced Course Level 3 (IKO Certificate) –<\/strong> Session of 5 hours\/1 or 2 days. Here learner already knows how to ride a kite. He learns from the professional instructors how to turn, ride upwind, and do their jumps.<\/p>\nPrivate Tuition \u2013<\/strong> A course of 1 hour. Someone will be there who will recommend and answer your questions. Select of right spot for kite surfing and right material. It depends on direction of wind, shallow water and strength. There always be someone for launching and landing. Anyone lost then instructor will help and pick them up.<\/p>\n","protected":false},"excerpt":{"rendered":"Kite surfing in Boracay Boracay, a small tropical island of Philippines, in recent years has been famous for its beaches and home for kite surfing lovers. The white sunny beaches, and the warm temperature whole year makes the day and night life as one of the most happening places and this is what Boracay is […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[93,38],"tags":[509,6],"_links":{"self":[{"href":"https:\/\/kite2012.com\/wp-json\/wp\/v2\/posts\/2557"}],"collection":[{"href":"https:\/\/kite2012.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kite2012.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kite2012.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kite2012.com\/wp-json\/wp\/v2\/comments?post=2557"}],"version-history":[{"count":3,"href":"https:\/\/kite2012.com\/wp-json\/wp\/v2\/posts\/2557\/revisions"}],"predecessor-version":[{"id":2562,"href":"https:\/\/kite2012.com\/wp-json\/wp\/v2\/posts\/2557\/revisions\/2562"}],"wp:attachment":[{"href":"https:\/\/kite2012.com\/wp-json\/wp\/v2\/media?parent=2557"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kite2012.com\/wp-json\/wp\/v2\/categories?post=2557"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kite2012.com\/wp-json\/wp\/v2\/tags?post=2557"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}