{"id":872,"date":"2008-08-07T11:24:38","date_gmt":"2008-08-07T09:24:38","guid":{"rendered":"http:\/\/planetozh.com\/blog\/?p=872"},"modified":"2008-08-08T14:21:27","modified_gmt":"2008-08-08T12:21:27","slug":"2008-plugin-competition-review-part-one","status":"publish","type":"post","link":"https:\/\/planetozh.com\/blog\/2008\/08\/2008-plugin-competition-review-part-one\/","title":{"rendered":"2008 Plugin Competition Review, Part One"},"content":{"rendered":"<p>Every year or so, the excellent staff from the excellent <a href=\"http:\/\/weblogtoolscollection.com\/\">Weblog Tools Collection<\/a> runs a <a href=\"http:\/\/weblogtoolscollection.com\/pluginblog\/\">Plugin Competition<\/a>. This is a very exciting moment of the plugin year because it fosters plugin coding and plugin ideas, and introduces new coders.<\/p>\n<p>This year, <a href=\"http:\/\/weblogtoolscollection.com\/pluginblog\/2008\/07\/26\/its-time-to-cast-your-vote\/\">50 plugins<\/a> were submitted, which I think is excellent. As I looked at some of the plugins I started to have ideas or comments that may (or may not:) qualify as valuable feedback for these plugin authors, so I thought, why not sort of review them all? Could be interesting and fun! So here it goes, <strong>2008 Plugin Competition Review, Part One<\/strong>.<br \/>\n<!--more--><\/p>\n<h2>Disclaimer :<\/h2>\n<ul>\n<li>This is a totally personal and unsollicited initiative, out of curiosity and because I like to have a look at others&#39; codes and ideas. I don&#39;t assume the following will be taken in consideration or even read by the official judges of the competition.<\/li>\n<li>I reviewed <em>almost<\/em> all the plugins. I didn&#39;t review those which I thought were too complex for a quick review to be fair and do the author&#39;s work some justice. I also didn&#39;t review them when I felt they were targetting an audience that I have no clue about (there&#39;s a Real Estate plugin for instance, or a Comic Book manager). Finally, I didn&#39;t review plugins when I just didn&#39;t understand what the heck they were about. The first thing people get to see about a plugin is its description, and a crappy description will mostly ruin the best plugin. Pay a lot of attention to it!<\/li>\n<li>As a plugin coder in mind, the very first thing I have a look at when testing a plugin is: <em>its code<\/em>. Most of the time, my opinion is done before I actually try the plugin within WordPress. The following are mostly, if not only, <strong>code<\/strong> reviews and thoughts.<\/li>\n<li>As an experienced WordPress user, I have particular needs that plugins can cover, but sometimes a plugin just don&#39;t ring any bell. It can be hard to express an opinion about a plugin that seems totally useless (when obviously it can be useful to others)<\/li>\n<li>It&#39;s not because I say &quot;this sucks&quot; that it actually sucks. What I mean is, &quot;<em>Me<\/em> thinks that it sucks, but hey, who am I to judge, and there&#39;s more than one way to do it&quot;. Don&#39;t get too upset if I say something sucks :)<\/li>\n<li>All I know about WordPress coding, I learned it from reading sources &#8212; WP and other plugins, and from others&#39; advices. When I read about a plugin concept, I always ask to myself &quot;How would I do this?&quot; and then have a look at the plugin. Sometimes my way is better, and sometimes I learn something valuable from the plugin because their way is smarter, shorter or simply better. Read sources.<\/li>\n<li>Most of the following comments or critics should easily apply to my own plugins, particulary the ones I wrote 3 or 4 years ago. By no means I&#39;m the uber definitive authority on plugins. I&#39;m just sharing ideas :)<\/li>\n<\/ul>\n<p>Still with us? Let&#39;s go!<\/p>\n<h2>Adminimize<\/h2>\n<p><em><a href=\"http:\/\/bueltge.de\/wordpress-admin-theme-adminimize\/674\/\">Adminize<\/a> minifies some areas of the admin backend.<\/em><br \/>\nThe name is really good, but I don&#39;t like the code of the plugin, for 2 main reasons.<br \/>\nFirst of all, the whole plugin is something that should be loaded only when viewing admin pages: I would have done a minimalist plugin file with just something like <tt>if (is_admin()) {include(another plugin file)}<\/tt> so that when viewing a public page (ie the blog) the webserver would not waste a single nanosecond reading files it doesn&#39;t need.<br \/>\nBut most of all, the plugin fails with <a href=\"http:\/\/planetozh.com\/blog\/2008\/06\/wordpress-plugin-coding-tips\/\">my main coding concern<\/a>: add all your options into one single database entry, damnit! I totally hate it when doing some DB maintenance I find out that a plugin added 15 lines in table <em>wp_options<\/em>, when <strong>one<\/strong> would have been enough.<\/p>\n<h2>AnyVar<\/h2>\n<p><em><a href=\"http:\/\/wordpress.org\/extend\/plugins\/anyvar\/\">AnyVar<\/a> allows for creating alias to be used in posts, such as <tt>&#91;ebay_id&#93;<\/tt> being replaced with <tt>123456789abcdef<\/tt><\/em><br \/>\nClean code encapsulated in a class, one DB entry to store everything you&#39;ll input, things are looking good. I would have put all the admin page stuff into a separate file that would load only when in the admin area, but that&#39;s minor.<br \/>\nWhat I don&#39;t get, though, is why the whole plugin doesn&#39;t use the internal <a href=\"http:\/\/planetozh.com\/blog\/2008\/03\/wordpress-25-shortcodes-api-overview\/\">WordPress Shortcode API<\/a> to replace all these <tt>&#91;stuff&#93;<\/tt> instead of using output buffering. Okay, I guess you could create any kind of alias (&#91;stuff&#93; and &lt;stuff&gt; or !!stuff!! or whatever, not only using braces) but that seems rather counter productive to me. Rule #rand(1,10) of WordPress coding is: always use the WP APIs when possible.<\/p>\n<h2>Automatic Timezone<\/h2>\n<p><em><a href=\"http:\/\/ottodestruct.com\/blog\/wordpress-plugins\/automatic-timezone\/\">Automatic Timezone<\/a> says it all, it automatically sets your timezone<\/em> (which is one of the few lame tasks when setting up a new blog, the computer should do this for you)<br \/>\nOtto is a far better WP coder than I am and is a fine code snippet provider in the <em>wp-hackers<\/em> mailing list. His plugin is cleanly written, heavily commented, ready for translation, and shows some smart behaviors such as the auto-deactivation if it cannot run on a system.<br \/>\nWhat could I say? I hope this plugin will get integrated into WordPress&#39; core, with a failover to the actual manual setting for the poor chaps running PHP4 on Windows servers.<\/p>\n<h2>Broken Links Remover<\/h2>\n<p><em><a href=\"http:\/\/techblissonline.com\/broken-links-remover-wordpress-plugin\/\">Broken Links Remover<\/a> checks every links in posts and hides them if they are broken (ie leading to 404 or other unexpected results)<\/em><br \/>\nAbout the &quot;what&quot;: having dead links in posts is both inevitable and something I don&#39;t care. Some posts on this blog are 4 years old so I don&#39;t mind if something completely outdated points to something missing. A broken link in a fresh post is something I&#39;ll probably find out by myself fast. (And I really don&#39;t think broken outgoing links have any impact on SEO)<br \/>\nAbout the &quot;how&quot;: if I understood things correctly, for every link in every post that is displayed, the plugin adds one extra DB query and maybe one remote HTTP request. That is <em>totally overkill<\/em>.<br \/>\nMy way to warn about broken links would be to check at <strong>publish time<\/strong>, and add something like an ugly popup over the &quot;Write&quot; screen telling that, dude, you&#39;ve link to 404s, wtf. But definitely not at render time, especially on old outdated forgotten posts.<\/p>\n<h2>WordPress Editor Extender<\/h2>\n<p><em><a href=\"http:\/\/benjaminsterling.com\/wordpress-editor-extender\/\">WordPress Editor Extender<\/a> enhances the WYSIWYG editor with more WYSIWYGuinness<\/em><br \/>\nThe &quot;Visual Editor&quot; is something I hate so much that I would rather amputate myself than try to do something with it. However I&#39;m glad I found about this plugin because I didn&#39;t know about <a href=\"http:\/\/benjaminsterling.com\/\">the author&#39;s site<\/a> and I really like it :)<\/p>\n<h2>Flickr Gallery<\/h2>\n<p><em><a href=\"http:\/\/wordpress.org\/extend\/plugins\/flickr-gallery\/\">Flickr Gallery<\/a> pushes the built-in <tt>&#91;gallery&#93;<\/tt> shortcode a step further to allow embedding images and galleries from Flickr<\/em><br \/>\nDan Coulter knows Flickr <a href=\"http:\/\/phpflickr.com\/\">pretty well<\/a> and that&#39;s a robust PHP class that comes into play here. The plugin code is as clean as it gets, is ready for translation, uses the shortcode API. I wouldn&#39;t mind some more inline comments, but that&#39;s all I can really ask for with this plugin. Well, except for *just one* DB entry in wp_options to store all of the 4 options, but on the other hand I learned something from his code about how <em>\/wp-admin\/options.php<\/em> handles option updating ;)<br \/>\nAll in all, that&#39;s a plugin I really like.<\/p>\n<h2>Image Browser Extender<\/h2>\n<p><em><a href=\"http:\/\/benjaminsterling.com\/wordpress-image-browser-extender\/\">Image Browser Extender<\/a> enhances the uploaded image browser with allowing you to insert multiple images at once<\/em><br \/>\nYet another plugin for the visual editor, but it seems to fix something I don&#39;t like with the default image browser (when you insert an image, the browser frame closes, so if you want to insert another image you have to re-open it)<br \/>\nSo, I like the idea of this plugin, but I&#39;m not too fond of the product itself. First of all, why limit it to the visual editor? I think it would much more efficient to add an icon next to the &quot;Add Media&quot; icons that are independent from the editor, rather than add a button into the WYSIWYG crapola. Also, a nice touch would be that when you select a type and size of an image (with or without link, full size or thumbnail, etc&#8230;) a cookie would remember the setting and use it next time.<br \/>\nI didn&#39;t really glanced the code of this plugin, since I don&#39;t like therefore know the internals of TinyMCE, but beware of the <em>wp-config.php<\/em> include that is deprecated on WP 2.6 (<a href=\"http:\/\/planetozh.com\/blog\/2008\/07\/what-plugin-coders-must-know-about-wordpress-26\/\">wp-config.php can be moved<\/a>)<br \/>\nSo, basically: very cool idea, I hope the plugin improves in the future.<\/p>\n<h2>Invite Friends<\/h2>\n<p><em><a href=\"http:\/\/wordpress.org\/extend\/plugins\/invite-friends\/\">Invite Friends<\/a> lets you&#8230; invite friends, so they&#39;ll register as users in your blog backend<\/em><br \/>\nI cannot think of a reason I&#39;d use this plugin (which is not an evidence of quality or lack thereof, of course) but I found it quite amusing that someone decided to use a setting that has been part of WordPress for years and never used since: field <tt>user_activation_key<\/tt> in table <tt>wp_users<\/tt> (at least I don&#39;t think I&#39;ve ever seen this field other than empty)<br \/>\nThe plugin is a rather neat example of query var and template redirecting, which is a tricky area of WordPress coding.<br \/>\nThere are however a number of little details I noticed: I don&#39;t like CamelCase function names although that&#39;s a really personal matter; the plugin does define constants <tt>WP_CONTENT_URL<\/tt> and <tt>WP_CONTENT_DIR<\/tt> as expected to comply with WP 2.6 but don&#39;t use them consistently (for instance, doing a <tt>require ABSPATH.\"\/wp-content\/plugins\/...<\/tt>; the plugin enforces logins to be at least 4 characters long and damn it, I hate it when I can register on a site with login &quot;Ozh&quot; because it&#39;s too short, no, seriously, I mean, WTF.<br \/>\nOther than that, a rather nice plugin, ready for translation and using well internal APIs and functions of WordPress.<\/p>\n<h2>Live Blogroll<\/h2>\n<p><em><a href=\"http:\/\/www.prelovac.com\/vladimir\/wordpress-plugins\/live-blogroll\">Live Blogroll<\/a> shows recent posts from a link in your blogroll when a user hovers it<\/em><br \/>\nThe plugin code is somewhat inconsistent, it has good and bad points. Indenting varies from block to block, which makes it annoygin to read. Javascripts are correctly added to pages using the appropriate functions, which is something neat enough to be noticed. The code block that tries to guess a feed location, assuming everything is either Blogspot, Typepad or WordPress, seems a bit weak to me. The <em>wp-config.php<\/em> requires may not work on some WP 2.6 if it has been <a href=\"http:\/\/planetozh.com\/blog\/2008\/07\/what-plugin-coders-must-know-about-wordpress-26\/\">moved<\/a>.<br \/>\nThere&#39;s also a cool idea I&#39;d like to share: one of the JS file contains a few variables that are dynamic, therefore the JS file is a PHP file, okay. But instead of including <em>wp-config.php<\/em> in order to use a plugin function that will guess the needed var values, I would simply pass those values to the .js.php file as a query argument. As a result, you don&#39;t need to include <em>wp-config.php<\/em> which has a <em>minimal cost of 7 DB queries<\/em>.<br \/>\nOverall, this is a rather nice idea and decent plugin for those using blogrolls.<\/p>\n<h2>Manageable<\/h2>\n<p><em><a href=\"http:\/\/www.aaronharp.com\/dev\/wp-manageable\/\">Manageable<\/a> lets you edit post slugs, date, title, author, categories, anything, inline right from the Manage page.<\/em><br \/>\nThis plugin looks like a killer idea and is probably a plugin I&#39;ll end up using.<br \/>\nI would have splitted the main file into smaller files that would load only <em>if (is_admin())<\/em>, I would make the <em>wp-config.php<\/em> including fully <a href=\"http:\/\/planetozh.com\/blog\/2008\/07\/what-plugin-coders-must-know-about-wordpress-26\/\">WP 2.6 compliant<\/a>, and I would make sure the javascripts are <a href=\"http:\/\/planetozh.com\/blog\/2008\/04\/how-to-load-javascript-with-your-wordpress-plugin\/\">correctly added<\/a>, those are my thoughts when looking at this plugin.<br \/>\nI will definitely give this plugin a real try.<\/p>\n<h2>Media In Response<\/h2>\n<p><em><a href=\"http:\/\/weblogtoolscollection.com\/pluginblog\/2008\/07\/09\/media-in-response\/\">Media in Response<\/a> allows your visitors to upload images or videos in their comments<\/em><br \/>\nThis is exactly a plugin I would have liked to see on action on the developer&#39;s site. I mean, when you code something that is for commenters, let your commenters see it, right? Also, I wonder how spam can interfere with this. What about disk usage, too, is there any limit settings?<br \/>\nOther than that, I didn&#39;t actually looked at the plugin.<\/p>\n<h2>And that&#39;s it for Part One<\/h2>\n<p>Time permitting, I should be able to publish part 2 within the next two days. If you don&#39;t understand a comment I made about your plugin, I you feel I just didn&#39;t understand its purpose correctly, or if you think my suggestion is dumb, please respond here!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Every year or so, the excellent staff from the excellent Weblog Tools Collection runs a Plugin Competition. This is a very exciting moment of the plugin year because it fosters plugin coding and plugin ideas, and introduces new coders. This year, 50 plugins were submitted, which I think is excellent. As I looked at some [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21],"tags":[259,85,63,245],"class_list":["post-872","post","type-post","status-publish","format-standard","hentry","category-published","tag-competition","tag-plugins","tag-review","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/planetozh.com\/blog\/wp-json\/wp\/v2\/posts\/872","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/planetozh.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/planetozh.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/planetozh.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/planetozh.com\/blog\/wp-json\/wp\/v2\/comments?post=872"}],"version-history":[{"count":0,"href":"https:\/\/planetozh.com\/blog\/wp-json\/wp\/v2\/posts\/872\/revisions"}],"wp:attachment":[{"href":"https:\/\/planetozh.com\/blog\/wp-json\/wp\/v2\/media?parent=872"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/planetozh.com\/blog\/wp-json\/wp\/v2\/categories?post=872"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/planetozh.com\/blog\/wp-json\/wp\/v2\/tags?post=872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}