My job at the moment is updating and coding YourMembers, which is a commercial plugin for WordPress.
Recently I’ve been working on a method to Auto Upgrade the plugin, since commercial plugins cannot go on Extend, and there is no commercial equivalent. Extend being the WordPress plugin repository.
Commercial plugins get no nice little “Plugin needs updating Circle” on the plugins tab, or a nice little message on the plugins page, let alone access to the auto updater!
Which leaves us (commercial plugin devs) to write our own version checkers and hook in accordingly.
So now I have a nice little PHP class which will detect whether it can fwrite/rename and if not if it can FTP instead, much the same as the WordPress updater does.
Now this is all well and good, but I needed a method to download and unzip the new plugin file. Grabbing the file is easy, either file_get_contents (heaven forbid), or curl (yay for curl), and write the file (being a zip) to the web servers temporary directory and process from there.
Now the problem here is how to unzip. A Brief look at how WordPress does it seems to show it has three different methods of unzipping. So dump that.
Didn’t feel the need to use PHP’s ZipArchive class, since I don’t need to edit the zip, just extract its contents.
Off to php.net I go and I find some nice handy functions, and quite surprised to find that the zip_read function can handily recurs into directories within the zip file to return their paths/names. Mildly annoying at the time as I had gone and written a recur loop to go inside directories…. and got thrown a error, nice headdesk moment!
So basically the Zip functions, the basic ones of PHP, are actually quite nice, handy and useful!
Heres my code snippet:
<?php class someclass() { private function unpack() { $from = $this->tmp_write; $to = $this->tmp_out; @mkdir($to); $zip = zip_open($from); if (is_resource($zip)) { $this->readzip($zip); zip_close($zip); } else { // failed to open $this->error = 1; } } private function readzip($zip) { $from = $this->tmp_write; $to = $this->tmp_out; echo '</pre><textarea style="width: 100%; height: 100px;">'; while (FALSE !== ($file = zip_read($zip))) { $name = zip_entry_name($file); echo $name . "\n"; if (!strpos($name, '.')) { // is dir @mkdir($to . '/' . $name); } else { // it recurs into directorys on its own! $item = zip_entry_open($zip, $file); $size = zip_entry_filesize($file); $read = zip_entry_read($file, $size); $fp = fopen($to . '/' . $name, 'w'); fwrite($fp, $read); fclose($fp); } } echo '</textarea><pre>'; } } ?>
I just installed this code snippet plugin, which I might need to change its background colours…..
Any suggestions for code snippet plugins greatly appreciated!
Actually there is a little open-source plug-in called “Upgrademe” that provides auto-update functionality for commercial plugin-in.
It’s not intended to provide fake impression of built-in WP update system (which may change over versions), it simply feeds WP with latest version information and update download URLs for privately hosted plug-ins.
Read my post about it if you’re interested: Automatically updating commercial WordPress plug-ins
In the end we found a PHP Class that plugins can include that does the job quite well.
You can find details here http://w-shadow.com/blog/2010/09/02/automatic-updates-for-any-plugin/
I just never got around to writing a follow up post 😀
The problem with upgradeMe is that I would have ship the commercial plugin with another plugin just to handle updates….
Sure I can fold in upgradeMe into my Plugin Core. But then I already have (but with something else that still works to this day).