To simplyfy uploading wordpress to new sites from my somewhat unreliable internet-connection, I have made a simple single-file script that downloads and unzips the current version of WP directly to the server, together with the plugins I "always" use.
However - while getting the current version of WP is simple, many plugins use their version number in the filename for the zip, so I instead have to upgrade them after the install is done (I've hardcoded the urls to these zips into the script), and since I'd like to make this script public, I would like to do this smarter and get the current versions automatically.
Does anyone know how I could do this? Can it be done by checking the repository in some way?
(and yeah, I am planning to let people choose if they want to install a plugin or not)
I run this part of the script after WP has been downloaded and unzipped, so maybe its possible to use wordpress' own functions?
This is the function I use now:
function plugindownload($pluginname, $pluginurl)
{
$dir = dirname(__FILE__);
$pluginfile=$dir."/wp-content/plugins/".$pluginname.".zip";
$plugindir=$dir."/wp-content/plugins/".$pluginname;
download_remote_file($pluginurl, $pluginfile);
echo "<li>".$pluginname." installed</li>";
$zip = new ZipArchive;
$zipped = $zip->open($pluginfile);
if ( $zipped ) {
$zip->extractTo($dir."/wp-content/plugins");
unlink( $pluginfile );
$zip->close();
}
set_time_limit(25);
}
and then call it like this:
plugindownload('wp-super-cache', 'http://downloads.wordpress.org/plugin/wp-super-cache.1.1.zip');
Hai Bui answers:
I found the code to do that here http://wikiduh.com/869/get-the-latest-version-number-of-a-wordpress-plugin-with-php
<?php
function pull_tag( $plugin_uri, $tag = 'Stable tag' ) {
$trunk_readme = file( 'http://plugins.svn.wordpress.org/' . $plugin_uri . '/trunk/readme.txt' );
foreach( $trunk_readme as $i => $line )
if( substr_count( $line, $tag . ': ' ) > 0 ) return trim( substr( $line, strpos( $line, $tag . ': ' ) + strlen( $tag ) + 2 ) );
return NULL;
}
$latest_version = pull_tag( 'bbpress' );
?>
Ross Wilson answers:
This should get you the current version number from the readme.txt file in the svn repo
<?php
function pull_tag( $plugin_uri, $tag = 'Stable tag' ) {
$trunk_readme = file( 'http://plugins.svn.wordpress.org/' . $plugin_uri . '/trunk/readme.txt' );
if($trunk_readme){
foreach( $trunk_readme as $i => $line )
if( substr_count( $line, $tag . ': ' ) > 0 ) return trim( substr( $line, strpos( $line, $tag . ': ' ) + strlen( $tag ) + 2 ) );
}
return NULL;
}
$plugin = 'wp-super-cache';
$latest_version = pull_tag( 'wp-super-cache' );
echo $plugin . " " . $latest_version;
?>
Ross Wilson comments:
I have tested it on a few plugins and you seem to be able to get the latest version with just using the plugin name like so
bbpress: http://downloads.wordpress.org/plugin/bbpress.zip
wp-super-cache: http://downloads.wordpress.org/plugin/wp-super-cache.zip
Torstein Opperud comments:
Now I'll be damned... it really seems to be that simple Ross :)
Dbranes answers:
You can get the latest plugin version number from the readme.txt files (Stable tag: x.x.x)
$plugin_readme_url="http://plugins.svn.wordpress.org/{$plugin_name}/trunk/readme.txt";
For example in the case of wp-super-cache:
[[LINK href="http://plugins.svn.wordpress.org/wp-super-cache/trunk/readme.txt"]]http://plugins.svn.wordpress.org/wp-super-cache/trunk/readme.txt[[/LINK]]
Stable tag: 1.1
So you could fetch these readme.txt files for your plugins and parse out the Stable tag line.
Torstein Opperud comments:
yeah, but not all plugins use the version number in the filename... for instance - "All in one SEO pack" - http://wordpress.org/extend/plugins/all-in-one-seo-pack/ - there the filename is http://downloads.wordpress.org/plugin/all-in-one-seo-pack.zip, regardless of version numbers
Dbranes comments:
I wrote a very simple test case that works for me at least:
<?php
function get_plugin_version($name){
$readme_file="http://plugins.svn.wordpress.org/$name/trunk/readme.txt";
$readme_text=file_get_contents($readme_file);
$lines=explode("\n",$readme_text);
$needle="Stable tag:";
foreach($lines as $line ){
if( strpos($line,$needle) > -1 ){
$version= trim(str_replace($needle,"",$line));
break;
}
}
return $version;
}
echo get_plugin_version("wp-super-cache");
?>
This returns "1.1"
Dbranes comments:
Another approach would be to fetch the whole plugin page, fx
[[LINK href="http://wordpress.org/extend/plugins/all-in-one-seo-pack/"]]http://wordpress.org/extend/plugins/all-in-one-seo-pack/[[/LINK]]
and parse out the version number from the download link html tags
<p class="button"><a href='http://downloads.wordpress.org/plugin/all-in-one-seo-pack.zip'>Download Version 1.6.14.5</a></p>
Dbranes comments:
Third approach would be to use the same method as Wordpress
The code that Wordpress is using to check plugins is (see wp-includes/update.php)
$to_send = (object) compact('plugins', 'active');
$options = array(
'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3),
'body' => array( 'plugins' => serialize( $to_send ) ),
'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' )
);
$raw_response = wp_remote_post('http://api.wordpress.org/plugins/update-check/1.0/', $options);
if ( is_wp_error( $raw_response ) || 200 != wp_remote_retrieve_response_code( $raw_response ) )
return false;
$response = maybe_unserialize( wp_remote_retrieve_body( $raw_response ) );
if ( is_array( $response ) )
$new_option->response = $response;
else
$new_option->response = array();
set_site_transient( 'update_plugins', $new_option );
so you could use api directly:
[[LINK href="http://api.wordpress.org/plugins/update-check/1.0/"]]http://api.wordpress.org/plugins/update-check/1.0/[[/LINK]]
and I found some info here about this api:
[[LINK href="http://dd32.id.au/projects/wordpressorg-plugin-information-api-docs/"]]http://dd32.id.au/projects/wordpressorg-plugin-information-api-docs/[[/LINK]]