. */ # 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 '

Options saved.

'; }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.

Separate multiple service URIs with line breaks:

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":2768,"date":"2014-12-12T13:42:46","date_gmt":"2014-12-12T13:42:46","guid":{"rendered":"https:\/\/kite2012.com\/?p=2768"},"modified":"2014-12-19T13:39:40","modified_gmt":"2014-12-19T13:39:40","slug":"kite-trip-to-brazil","status":"publish","type":"post","link":"https:\/\/kite2012.com\/kite-trip-to-brazil\/","title":{"rendered":"Kite trip to Brazil"},"content":{"rendered":"

Brazil<\/a> is great destination for kite surfing vacation. Wind every day at season wide sandy beaches warm weather , good facilities and pleasant atmosphere. Except the super reliable wind, the main attraction of kiboarding in Brazil is the batter flat lagoons and the great downwinders.<\/p>\n

Brazil is suitable for everybody: beginners can learn to kite in the lagoons and pro’s can enjoy the endless hours of kitesurfing in best conditions. Families that enjoy (windy) beach life will be happy here, and girls alone will feel great.<\/p>\n

\"kite<\/p>\n

Kite lagoon at north Brazil<\/h2>\n

There are many shallow rivers in the kite area in north Brazil, creating a lot of lagoons. The Lagoons near the beach, get the wind from the sea, creating paradise condition for free style kite boarding. The most famous kite lagoon is Cauipe lagoon in Cumbuco. Great place to kiteboard and chill out while watching local and pro’s puling some tricks. You can get to the lagoon by fun 1 hour down trip from the village, and get back with one of the buggy’s available here all day.<\/p>\n

Cauipe lagoon, Cumbuco Brazil<\/p>\n

\"kite<\/p>\n

\nPhoto by @Hilla Ost<\/a><\/small><\/p>\n

 <\/p>\n

Other great lagoons are the huge tidal lagoon in Ilha do Guajiru <\/a>, and the huge sea lagoon in Barra Grande<\/a>. Many smaller lagoons can be found along the kite beach, most are reachable by buggy ride or downwind kitesurfing.<\/p>\n

Ilha do Guajiru kite \u00a0lagoon<\/p>\n

\"kiteboarding<\/p>\n

Downwind kite trips at north Brazil<\/h2>\n

The kite area in north Brazil<\/a> has hundred miles of wide sandy beaches habitat with mainly small fisherman villages. That plus the fact that winds blows constantly from side ti side-onshore direction, allows you to kite downwind along the beach for days. \u00a0The best way is to have a buggy or a pickup escorting you on the beach. Buggy’s and pickups are not cheap in Brazil, so If you are young and restless, you can kite to the next village, and come back by bus. Just don’t forget your flip-lops.<\/p>\n

Refreshing moment in Taiba<\/a> Paracuru<\/a> downwind<\/p>\n

\"downwind<\/p>\n

There are many great small downwinds of 10-20km that you can do daily. The most popular is the 6-8km downwind from Cumbuco to Cauipe lagoon, no transport is needed, just go and take a buggy back at the lagoon. Taiba to Paracuru is amazing downwinds for kitesurfing wave. And you can go for the big downwind<\/a> (250km) \u00a0from Cumbuco<\/a> to Jericoacoara, or even bigger until Barra Grande<\/a>, sleeping each night at a different village. You can join an organized doanwind, or organize one yourself.<\/p>\n

Family kite trip to Brazil<\/h2>\n

Kids are very welcome in Brazil at any age, people there are very tolerant towards children and very fond of them. Beach hotels, usually have a wind sheltered area by the pool, so even baby’s can enjoy here.<\/p>\n

Teenagers can learn how to kite, enjoy buggy rides and horse riding. Kids can surf wave , swim in the lagoons and play football with the locals. Food here is simple and suitable for children. Lots of fruits, grilled meat, rice, french fries and pasta can be found everywhere.<\/p>\n

Kite kiteboard at Cauipe Lagoon Cumbuco<\/a><\/p>\n

\"kite<\/p>\n

Families, can stay at beach hotels, or rent a villa or apartment.\u00a0<\/span>If you stay some time in Cumbuco<\/a> or Jericoacoara, you can arrange yourself a verity of activities. You can arrange Portuguese lessons, and daily Capoeira<\/span>\u00a0classes for your family at your hotel. Recommended kite villages for families are Cumbuco, Guajiru<\/a> and Jericoacoara.<\/p>\n

Kite beach hotel Cumbuco Brazil<\/a><\/p>\n

\"kite<\/p>\n

More information on your next kite trip<\/h2>\n

All the information about kitesurfing at north Brazil can be found in Go-kite.com<\/a> – kitesurf traveler guide to Brazil and other spots world wide. How to get to kite spost, where to stay, kite conditions, kite lessons and more.<\/p>\n

\"profile\u00a0 \u00a0 \u00a0The author<\/h5>\n
\u00a0 \u00a0 \u00a0Naomi Fridman<\/h5>\n
\u00a0 \u00a0 \u00a0Go-kite.com<\/a><\/h5>\n
\u00a0 \u00a0 \u00a0Facebook<\/a><\/h5>\n

 <\/p>\n

 <\/p>\n

 <\/p>\n

 <\/p>\n

 <\/p>\n","protected":false},"excerpt":{"rendered":"

Brazil is great destination for kite surfing vacation. Wind every day at season wide sandy beaches warm weather , good facilities and pleasant atmosphere. Except the super reliable wind, the main attraction of kiboarding in Brazil is the batter flat lagoons and the great downwinders. Brazil is suitable for everybody: beginners can learn to kite […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[93,163,194],"tags":[532,547,501,6],"_links":{"self":[{"href":"https:\/\/kite2012.com\/wp-json\/wp\/v2\/posts\/2768"}],"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=2768"}],"version-history":[{"count":17,"href":"https:\/\/kite2012.com\/wp-json\/wp\/v2\/posts\/2768\/revisions"}],"predecessor-version":[{"id":2813,"href":"https:\/\/kite2012.com\/wp-json\/wp\/v2\/posts\/2768\/revisions\/2813"}],"wp:attachment":[{"href":"https:\/\/kite2012.com\/wp-json\/wp\/v2\/media?parent=2768"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kite2012.com\/wp-json\/wp\/v2\/categories?post=2768"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kite2012.com\/wp-json\/wp\/v2\/tags?post=2768"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}