<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Technosailor.com&#187; WordPress</title>
	<atom:link href="http://technosailor.com/tag/wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>http://technosailor.com</link>
	<description>Business and Technology with Common Sense</description>
	<lastBuildDate>Thu, 24 May 2012 14:44:48 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4-beta4-20911</generator>
		<item>
		<title>10 Things You Need to Know About WordPress 3.4</title>
		<link>http://technosailor.com/2012/05/23/10-things-you-need-to-know-about-wordpress-3-4/</link>
		<comments>http://technosailor.com/2012/05/23/10-things-you-need-to-know-about-wordpress-3-4/#comments</comments>
		<pubDate>Wed, 23 May 2012 20:50:27 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress 3.4]]></category>
		<category><![CDATA[wordpress cheatsheets]]></category>
		<category><![CDATA[wordpress development]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=8564</guid>
		<description><![CDATA[WordPress 3.4 is around the corner. It&#8217;s currently beta4 which means a Release Candidate or three will be needed before it drops officially. If you want to test what&#8217;s out there now, the way to do that is through SVN. As usual, however, pre-release WordPress is not supported. As usual, however, I have been running trunk [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress 3.4 is around the corner. It&#8217;s currently beta4 which means a Release Candidate or three will be needed before it drops officially. If you want to test what&#8217;s out there now, the way to do that is through <a href="http://core.svn.wordpress.org/trunk/">SVN</a>. As usual, however, pre-release WordPress is not supported. As usual, however, I have been running trunk throughout the entire development cycle without any problems.</p>
<p>Before I get into the guts of WordPress 3.4, I want to point you to a resource which highlights some of the thinking that is going into the development, now and in the future, of how WordPress is built. Andrew Nacin sent <a href="http://lists.automattic.com/pipermail/wp-hackers/2012-March/042586.html">an email</a> to the &#8220;hackers&#8221; mailing list discussing object-oriented development that informs the thinking of the core developers now that WordPress supports PHP 5.2 and true object-oriented programming.</p>
<p>While it may be over the head of non-developer types, the gist is that now that we (used loosely) can write code smarter, we&#8217;re working our way in that direction. Some of the code in WordPress has existed for &#8220;generations&#8221; of versions and is bulky and inefficient. With new tools at our fingertips, we can begin to approach the idea of refactoring some of this code in better ways. <em>Backwards compatibility is always retained, however, in 99 out of 100 times.</em> <strong><em>WE ARE NOT DRUPAL!</em></strong><em></em></p>
<p>Without further adieu, however, let&#8217;s get into what you can expect in the new version of WordPress.</p>
<h3>Embed Tweets with oEmbed</h3>
<p><img class="aligncenter size-large wp-image-8567" title="oembed" src="http://technosailor.com/files/oembed-600x156.jpg" alt="" width="600" height="156" />Since version <a href="http://technosailor.com/2009/11/11/10-things-you-need-to-know-about-wordpress-2-9/">2.9</a>, WordPress has supported a technology called <a href="http://oembed.com/">oEmbed</a> that, simply put, has allowed the inclusion of rich media in content in a very simple way. Simply paste a YouTube link on a new line, and WordPress turns it into a properly sized video. No embed code needed. Same for Vimeo, Flickr, Scribd and more. The entire list can be found on the <a href="http://codex.wordpress.org/Embeds">Codex</a>. Now, however, Twitter is supported. Simply place the URL of a tweet on it&#8217;s own line and&#8230; bam, you have this:</p>
<blockquote class="twitter-tweet" width="550"><p>Twitter is an oEmbed provider that is supported out of the box in WordPress 3.4</p>
<p>&mdash; Aaron Brazell (@technosailor) <a href="https://twitter.com/technosailor/status/205343003328512000" data-datetime="2012-05-23T17:02:41+00:00">May 23, 2012</a></p></blockquote>
<p><script src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<h3>Query Efficiency Improvements</h3>
<p><img class="aligncenter size-large wp-image-8568" title="query.php" src="http://technosailor.com/files/query.php_-600x331.jpg" alt="" width="600" height="331" />The common bottleneck for all WordPress users are database queries and data &#8220;munging&#8221;&#8230; that is, what WordPress does with data when it&#8217;s returned from the database. The query that brings in all the necessary content necessary to render a page used to look like this:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> wp_posts <span style="color: #993333; font-weight: bold;">WHERE</span><span style="color: #66cc66;">...</span></div></td></tr></tbody></table></div>
<p>This has been how the query has worked for years. Really since the beginning of WordPress. And while, in theory that works (and it does, again it has for years), the core reality of this approach is that all the data in the posts table matching the criteria in the WHERE clause is more data than is needed, thus causing potential performance problems.</p>
<p>The <a href="http://core.trac.wordpress.org/ticket/18536">new approach is simple and elegant</a>. The first database query simply fetches a list of post IDs that fit the criteria provided in the WHERE clause.</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> ID <span style="color: #993333; font-weight: bold;">FROM</span> wp_posts <span style="color: #993333; font-weight: bold;">WHERE</span><span style="color: #66cc66;">...</span></div></td></tr></tbody></table></div>
<p>This approach means the amount of data in memory and floating around WordPress is concise and compact. PHP doesn&#8217;t have to work harder to traverse arrays or objects&#8230; it is simply a smaller list of data.</p>
<p>But what about the other data? We need the other data! Yes, in fact we do. But since WordPress has an object cache, much of this data is in the object cache. We don&#8217;t need to retrieve it from the database.</p>
<p>The second step is to look to the object cache for posts with IDs matching any of the IDs in the first dataset. Anything we can&#8217;t find is followed with a second query to get all the information matching the non-matched IDs using MySQL&#8217;s <code class="codecolorer sql default"><span class="sql"><span style="color: #993333; font-weight: bold;">IN</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></span></code> function:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> wp_posts <span style="color: #993333; font-weight: bold;">WHERE</span> ID <span style="color: #993333; font-weight: bold;">IN</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">34</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">78</span><span style="color: #66cc66;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>By changing how SQL and object caching is used, WordPress 3.4 finds new efficiencies. In the original ticket, developers were observing 2-3x speed performance improvements. I&#8217;ll drink to that.</p>
<h3>Theme Customizer</h3>
<p><iframe width="600" height="338" src="http://www.youtube.com/embed/vD8v6u3noPg?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p>Non-technical WordPress users will love the new Theme Customizer. Otto has a <a href="http://ottopress.com/2012/how-to-leverage-the-theme-customizer-in-your-own-themes/">great write-up</a> on this new feature. His video is above. The key takeaway from this new feature is that is possible now to customize a great number of things in a theme <em></em> from right within WordPress. On the fly. with a live preview.</p>
<p>Change your title, tagline, background color, image and more with a click of a mouse. I can see this being used to create child themes in the future, but for now, it manages settings that are already in WordPress (and accessible in other areas of the WordPress Admin) on the fly. The best way to really appreciate this feature is via Otto&#8217;s video above. Related: The best way to leverage this as theme developers is outlined in <em>great detail</em> in his post&#8230;</p>
<h3>Bundled &#8216;Touch&#8217; Support</h3>
<p><img class="alignleft size-large wp-image-8569" title="iphone" src="http://technosailor.com/files/iphone-300x450.png" alt="" width="300" height="450" />We live in a touchy-feeley world. And by that, I mean mobile. Specifically iOS and Android. In WordPress 3.3, we saw <a title="10 Things You Need to Know About WordPress 3.3" href="http://technosailor.com/2011/11/17/10-things-you-need-to-know-about-wordpress-3-3/">adaptive design</a> come to portions of WordPress. Adaptive design, for the uninitiated, is a technology that elegantly resizes a website to adapt to the the screen it is rendered on. It is a way for developers to create a single experience that works on desktop/laptop browsers as well as mobile interfaces with arbitrary resolutions.</p>
<p>As mobile continues to lead the charge in today&#8217;s web, WordPress 3.4 has bundled the <a href="http://touchpunch.furf.com/">jQuery UI Touch Punch</a> library that will give front-end developers more tools to work with in making a website mobile-friendly. Simply include the library via <code class="codecolorer php default"><span class="php">wp_enqueue_script<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> and now your element has the <code class="codecolorer javascript default"><span class="javascript">.<span style="color: #660066;">draggable</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> method available. This method enables &#8220;drag and drop&#8221; support that was previously unavailable and the one major caveat is that <a href="http://wpdevel.wordpress.com/2012/05/03/wordpress-3-4-tablets-touch-ui/">it does not support Windows 7/7.5 phones</a> due to limitations in the IE9 browser.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #000000; font-weight: bold;">class</span> My_Awesome_Plugin <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hooks</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> hooks<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; add_action<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'wp_head'</span><span style="color: #339933;">,</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'js'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> js<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; wp_enqueue_script<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'jquery'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; wp_enqueue_script<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'jquery-ui'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; wp_enqueue_script<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'jquery-touch-punch'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; wp_print_scripts<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">?&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;script&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; jQuery(document).ready(function(){<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jQuery('#element').draggable();<br />
&nbsp; &nbsp; &nbsp; &nbsp; });<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/script&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #000088;">$my_awesome_plugin</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> My_Awesome_Plugin<span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<h3>HTML in Captions</h3>
<div id="attachment_8570" class="wp-caption aligncenter" style="width: 610px"><img class="size-large wp-image-8570" title="redsox" src="http://technosailor.com/files/redsox-600x398.jpg" alt="Red Sox" width="600" height="398" /><p class="wp-caption-text">Photo by <a href="http://www.flickr.com/photos/kylemccluer/4516481287/">Kyle McCluer</a> and used under <strong>Creative Commons</strong>. <em>Some Rights Reserved.</em></p></div>
<p>I&#8217;m trying to rotate between developer tools and user tools in this article, so at this time, I&#8217;d like to point out a simple yet important frustration in previous versions of WordPress. When you upload an image and use the media uploader to then insert an image, you have the option of writing a caption. Sadly, it was impossible to include HTML in previous WordPress versions.</p>
<p>Often times, linking the source of a photo is welcome and, possibly depending on the usage restrictions on a photo, required. Before, the only way to do that was to set a link in the media uploader and then <em>the photo</em> would be linked. Now, in WordPress 3.4, you can include basic HTML in your captions as I have done above.</p>
<h3>XML-RPC Improvements</h3>
<p>XML-RPC. The thing that allows the WordPress apps for Android, BlackBerry and iOS to function. The thing that allows offline editors to function by remotely communicating with WordPress through a public-facing API.</p>
<p>XML-RPC is a venerable technology that is based mainly on the <a href="http://xmlrpc.scripting.com/metaWeblogApi.html"><em>Metaweblog API</em></a> invented a decade ago. WordPress has supported this iteration of XML-RPC as well as the <a href="http://www.movabletype.org/documentation/man/MT/XMLRPC.html">Movable Type XML-RPC</a> and <a href="http://codex.wordpress.org/XML-RPC_Blogger_API">Blogger XML-RPC</a> APIs for a long, long time. However, WordPress has also extended the Metaweblog API and added it&#8217;s own methods along the way.</p>
<p>No more. Instead of band-aiding a solution on top of a limited set of methods intended for blogging only, WordPress 3.4 includes a brand new <a href="http://codex.wordpress.org/XML-RPC_WordPress_API">WordPress XML-RPC</a> API designed to support all the rich features that have evolved since WordPress started focusing on CMS-style features. It incorporates all the methods introduced before as extensions to Metaweblog such as wp.getOptions, wp.getMediaItem, etc and introduces new ones such as wp.getPostTypes and wp.getTaxonomies to name just a few.</p>
<p>It&#8217;s important to note that <em>only</em> WordPress products are likely to ship with support for this new API at first, but old capabilities will still exist and function, as backwards compatibility is ensured. As API clients add support for WordPress&#8217; new capabilities, we will see more common usage.</p>
<h3>Internationalization (i18n) Improvements</h3>
<p>For international WordPress users, WordPress 3.4 continues the tradition of enhancing your experience. As we in the community have stated many times, i18n is incredibly important to WordPress growth and development. In discussing this article with someone inside of the WordPress core community, I am told 2 out of every 3 WordPress users are non-American. Additionally, I am told that 40% of WordPress installations are non-english.</p>
<p><strong>That&#8217;s Huge!</strong></p>
<p>The running list of i18n chages in WordPress 3.4 is <a href="http://wppolyglots.wordpress.com/important-changes-for-wordpress-3-4/">here</a>. Some notable changes include:</p>
<ul>
<li>Comma translation. While most languages use a comma as a separater (or delimiter), some do not. This enhancement is useful for languages like Chinese and Arabic that don&#8217;t use a comma.</li>
<li>Single-Double quote translation. It&#8217;s odd to think, but some languages like Hebrew, actually have distinct meanings for jots that are punctuation marks in an English world.</li>
<li>Default Timezones. It&#8217;s possible now to override the timezone WordPress uses in a translation. This, as you can imagine, is important when a language is largely spoken in one region in a single timezone.</li>
</ul>
<h3>Page Template Handling</h3>
<p>For theme developers looking to put more organization around their theme file structure, a new change has gone in that has both an obvious, front-facing benefit as well as a background benefit. Now, you can place any page template inside a subdirectory of a theme. So you can now have a <code class="codecolorer text default"><span class="text">/pages/</span></code> subdirectory and segregate all of your extraneous one-off or multi-use page templates to that folder (or any folder). WordPress will identify all page templates in the theme root or in a subdirectory of a theme root and make them available for pages to use.</p>
<p>The background benefit of this comes in a new <code class="codecolorer php default"><span class="php">WP_Theme</span></code> API that is lighter weight, more efficient and handles all the work for you. It&#8217;s important to note that most developers will never need to use this API and it is largely considered an &#8220;internals&#8221; thing.</p>
<p>In relation to the i18n improvements discussed earlier, the headers in these page templates are also now translatable. Simply include a <code class="codecolorer text default"><span class="text">Text Domain:</span></code> and <code class="codecolorer text default"><span class="text">Domain Path:</span></code> header in your style.css where the textdomain is the defined textdomain for translations (i.e. twentyeleven) and the Domain Path is the path relative to the stylesheet directory (i.e. the proper place the theme is regardless of if it&#8217;s a parent theme or a child theme) where the POT file is (<code class="codecolorer text default"><span class="text">/langs</span></code>). I don&#8217;t want to get too deep into this as Andrew Nacin, the architect of this feature, plans to put out a <a href="http://nacin.com/tag/field-guide/">field guide</a> going into detail. Stay tuned to that.</p>
<h3>Custom Header API</h3>
<p>For a few versions now, WordPress has supported two functions <code class="codecolorer php default"><span class="php">add_custom_header_image<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> and <code class="codecolorer php default"><span class="php">add_custom_background<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code>. These two functions have added new menus for designating header and background images to the Appearances menu.</p>
<p>WordPress 3.4 introduces a new API for dealing with custom headers and backgrounds and introduces new flexibility in terms of image sizes, etc. The two functions above have been deprecated (which means they&#8217;ll work for awhile but will ultimately go away, so use the new techniques) and replaced with new theme support. If you recall from previous version, we use the <code class="codecolorer php default"><span class="php">add_theme_support<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> function to, well, add support for a feature in a theme. To integrate the new stuff, include these lines in your theme <code class="codecolorer text default"><span class="text">functions.php</span></code>:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
add_theme_support<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'custom-header'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
add_theme_support<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'custom-background'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Both function calls can take a second argument which must be an array of presets, but it&#8217;s entirely optional. To omit the second argument renders behavior as we&#8217;ve known it for some time. To include it allows theme developers to designate designate parameters for both elements, that can then be customized by the end user.</p>
<p>For custom headers, you may include defaults along these lines (gregariously stolen from <a href="http://codex.wordpress.org/Custom_Headers">the Codex</a>):</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #000088;">$defaults</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'default-image'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'random-default'</span> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'width'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'height'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'flex-height'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'flex-width'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'default-text-color'</span> &nbsp; &nbsp; <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'header-text'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'uploads'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'wp-head-callback'</span> &nbsp; &nbsp; &nbsp; <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'admin-head-callback'</span> &nbsp; &nbsp;<span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'admin-preview-callback'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
add_theme_support<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'custom-header'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$defaults</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Likewise, for custom background defaults you might have this:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #000088;">$defaults</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'default-color'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'default-image'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'wp-head-callback'</span> &nbsp; &nbsp; &nbsp; <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'_custom_background_cb'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'admin-head-callback'</span> &nbsp; &nbsp;<span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'admin-preview-callback'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
add_theme_support<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'custom-background'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$defaults</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<h3>Bonus</h3>
<p>Did you know?</p>
<ul>
<li>PHP end of file closing PHP tags are now removed. Those are these &#8211; <code class="codecolorer php default"><span class="php"><span style="color: #000000; font-weight: bold;">?&gt;</span></span></code> Why is this important? Including the closing tag means that if there is any white space at the end of a file, PHP is likely to break. Omission means that PHP assumes a close tag at the end of the file and whitespace can&#8217;t corrupt. Personally I&#8217;ve argued for this in the past. The main opponent must have been in a coma when this was slipped through by other core developers.</li>
<li>Distraction Free Writing, first introduced in <a href="http://technosailor.com/2011/06/20/10-things-you-need-to-know-about-wordpress-3-2/">WordPress 3.2</a> is now supported by all custom post types.</li>
<li>The theme installer now has infinite scroll which is just kind of pretty aesthetic thing. It also defaults to keyword searches when you&#8217;re browsing for a new theme on the WordPress Theme repository.</li>
<li>Internal functions and classes now output &#8220;rtl&#8221;, &#8220;ie7&#8243;, &#8220;ie8&#8243;, etc as classes for browser targetting.
</ul>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2012/05/23/10-things-you-need-to-know-about-wordpress-3-4/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>TUTORIAL: Using WordPress&#8217; Ajax API</title>
		<link>http://technosailor.com/2012/02/08/tutorial-using-wordpress-ajax-api/</link>
		<comments>http://technosailor.com/2012/02/08/tutorial-using-wordpress-ajax-api/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 17:46:35 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=8543</guid>
		<description><![CDATA[WordPress has tons of APIs to do tons of things. It really does. One of the cool ones that I&#8217;ve been using a lot lately, has been around for a bit. It&#8217;s the Ajax API. Sure, you could write your own Ajaxy thing but why do that when WordPress lets you do it all very [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress has tons of APIs to do tons of things. It really does. One of the cool ones that I&#8217;ve been using a lot lately, has been around for a bit. It&#8217;s the Ajax API. Sure, you could write your own Ajaxy thing but why do that when WordPress lets you do it all very simply.</p>
<p>This tutorial will show you how to replicate the functionality that is presented in the &#8220;Like&#8221; button at Facebook. It assumes that you have WordPress set to require users to be logged in to take such actions. It wouldn&#8217;t make much sense for someone to not be logged in for such functionality. Obviously, you could do something else with Ajax (polls? Loading new content?) that doesn&#8217;t have the same assumption, but in this case&#8230; we&#8217;re assuming a user is logged in and the <code class="codecolorer php default"><span class="php"><span style="color: #000088;">$current_user</span></span></code> global is set.</p>
<h2>Getting Started</h2>
<p>Let&#8217;s start with the basic PHP class (<a href="http://stackoverflow.com/questions/2285404/why-should-i-use-classes-rather-than-just-a-collection-of-functions">you do write good object-oriented code, right?</a>)</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">class</span> My_Like_Button <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000088;">$my_like_button</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> My_Like_Button<span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>This code is just a basic skeleton that provides a constructor (the <code class="codecolorer php default"><span class="php">__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> method, which I&#8217;ll use later. It also instantiates a new <code class="codecolorer php default"><span class="php">My_Like_Button</span></code> object and assigns it to the <code class="codecolorer text default"><span class="text">$my_like_button</span></code> variable for use in the global scope. Obviously, you can use whatever strikes your fancy for the class name or the global variable.</p>
<h2>Building the HTML for the Like Button</h2>
<p>Next, we need the basic HTML structure that will be used in our theme for the Like button. For the sake of simplicity, I&#8217;m not providing any CSS, but feel free to do as you wish. We need to add this as a new method in our class.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">function</span> like_button<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>is_user_logged_in<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$current_user</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000088;">$html</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'&lt;form action=&quot;&quot; method=&quot;post&quot;&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;input type=&quot;hidden&quot; name=&quot;like_post_id&quot; id=&quot;like_post_id&quot; value=&quot;'</span> <span style="color: #339933;">.</span> get_the_ID<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;input type=&quot;hidden&quot; name=&quot;like_user_id&quot; id=&quot;like_user_id&quot; value=&quot;'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$current_user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ID</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&quot;&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;input type=&quot;button&quot; name=&quot;like_this_post&quot; id=&quot;like_this_post&quot; value=&quot;Like&quot; /&gt;<br />
&nbsp; &nbsp; &lt;/form&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$html</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>This form provides two hidden form fields using <code class="codecolorer php default"><span class="php">get_the_ID<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> and the <code class="codecolorer php default"><span class="php"><span style="color: #000088;">$current_user</span></span></code> object. Having done this (and after ensuring there is a logged in user), we can now drop this into our theme <em>in the Loop</em> as a template tag:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$my_like_button</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">like_button</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
<h2>Sending the Ajax Request with jQuery</h2>
<p>This is useless by itself. We need something to handle the Ajax. But before we get there, we need to understand how Ajax works within the WordPress context.</p>
<p><strong><em>All requests must go to <code class="codecolorer text default"><span class="text">wp-admin/admin-ajax.php</span></code>. Forget the confusion about why you would send a front-end Ajax request to the back-end. You just do.</em></strong></p>
<p>On the back-end, you&#8217;ll have to define functions that will hook into the Ajax API to let WordPress know how to handle the request. More on that in a minute. Let&#8217;s build some jQuery to send this to <code class="codecolorer text default"><span class="text">admin-ajax.php</span></code>.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function js()<br />
{<br />
&nbsp; &nbsp; wp_enqueue_script( 'jquery' );<br />
&nbsp; &nbsp; wp_print_scripts();<br />
&nbsp; &nbsp; ?&gt;<br />
&nbsp; &nbsp; &lt;script&gt;<br />
&nbsp; &nbsp; jQuery(document).ready(function(){<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; jQuery('#like_this_post').click(function(){<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var like_post_id = jQuery('#like_post_id').val();<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var like_user_id = jQuery('#like_user_id').val();<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jQuery.post(<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; '<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> get_option<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'siteurl'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'/wp-admin/admin-ajax.php'</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; action&nbsp; &nbsp; &nbsp; : 'register_like',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; user_id &nbsp; &nbsp; : like_user_id,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; post_id &nbsp; &nbsp; : like_post_id,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _wpnonce&nbsp; &nbsp; : '<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> wp_create_nonce<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'nonce-register_like'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; function(response) {&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; alert(response);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; );<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; });<br />
&nbsp; &nbsp; });<br />
&nbsp; &nbsp; &lt;/script&gt;<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>This is just a PHP function that we can use to throw some jQuery (using the <code class="codecolorer javascript default"><span class="javascript">.<span style="color: #660066;">post</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> method for our Ajax call) into the head. Note the nonce. You must include this for security. Additionally, you must have an action set. The action is used by WordPress to route the Ajax request.</p>
<p>Finally, we&#8217;re passing two extra pieces of data &#8211; <code class="codecolorer javascript default"><span class="javascript">user_id</span></code> which is the WordPress user ID and the <code class="codecolorer javascript default"><span class="javascript">post_id</span></code> which is the WordPress post ID of the current <code class="codecolorer php default"><span class="php"><span style="color: #000088;">$post</span></span></code> object inside the Loop. Both of these are supplied in the hidden form fields we created earlier.</p>
<p>Let&#8217;s add a new method for hooks and call it in our constructor, so that hooks are executed when the object is instantiated:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hooks</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
<span style="color: #000000; font-weight: bold;">function</span> hooks<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; add_action<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'wp_head'</span><span style="color: #339933;">,</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'js'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<h2>Supplying the Ajax Handler</h2>
<p>Having hooked the jQuery into WordPress, we now need something on the other end to handle the request and return something back to our page. For this, let&#8217;s create a method called <code class="codecolorer text default"><span class="text">handle_like()</span></code>.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">function</span> handle_like<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$user_id</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'user_id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$post_id</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>is_user_logged_in<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>wp_verify_nonce<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'_wpnonce'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'nonce-register_like'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/die"><span style="color: #990000;">die</span></a><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Go away, asshole!'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">/* <br />
&nbsp; &nbsp; &nbsp; &nbsp; Here is where we do some sort of database operation to associate<br />
&nbsp; &nbsp; &nbsp; &nbsp; the Like of the given post with the user who performed the action<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; Make sure you check for errors. In order to return data, you must<br />
&nbsp; &nbsp; &nbsp; &nbsp; echo something that the originating page can see. True or false<br />
&nbsp; &nbsp; &nbsp; &nbsp; only makes sense on this page and not back there.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; Typically, you'd output some sort of JSON, XML or plain text.<br />
&nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$meta_id</span> <span style="color: #339933;">=</span> add_post_meta<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$post_id</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'user_liked'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$user_id</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$meta_id</span> <span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Like not recorded&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Like recorded&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/exit"><span style="color: #990000;">exit</span></a><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>In this method, it&#8217;s important that all data be sanitized to avoid security problems. I&#8217;m performing the most basic of data security here by casting the $_POST variables for the users ID and the post ID to integers.</p>
<p>We&#8217;re also checking to make sure the user is logged in. <em>This is why using the built in WordPress Ajax API is actually kind of important. If you build your own Ajax handler, there&#8217;s no way to reliable tie in to WordPress to use other APIs like the User API.</em></p>
<p>Finally, make sure you verify the nonce so you know the request is coming from a legitimate source.</p>
<p>The three security procedures I just listed will largely prevent SQL Injection, ensure authenticated users and eliminate the possibility of Cross Site Request Forgery (CSRF) and generally should be used in <em>all</em> WordPress plugin development.</p>
<p>Simply though, the above method takes the post ID, the user ID and creates a new record in the <code class="codecolorer text default"><span class="text">postmeta</span></code> table. On success, it will print a success method readable by the original sending page and vica versa on failure.</p>
<p><strong>Note: You must use <code class="codecolorer php default"><span class="php"><a href="http://www.php.net/die"><span style="color: #990000;">die</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> or <code class="codecolorer php default"><span class="php"><a href="http://www.php.net/exit"><span style="color: #990000;">exit</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> at the end of the method to make sure the Ajax response exits properly.</strong></p>
<h2>Tying the Handler into WordPress</h2>
<p>Now that we have a handler method to do our bidding, we need to make sure WordPress knows about it so it routes Ajax requests to the proper place. To do this, we leverage the <code class="codecolorer php default"><span class="php">wp_ajax_<span style="color: #009900;">&#123;</span><span style="color: #000088;">$action</span><span style="color: #009900;">&#125;</span></span></code> hook.</p>
<p>Remember earlier, while building the jQuery Ajax request, I mentioned that an <code class="codecolorer text default"><span class="text">action</span></code> POST variable had to be set? WordPress looks to this variable to create a dynamic hook that we can use our new Ajax callback to hook into.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">add_action<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'wp_ajax_register_like'</span><span style="color: #339933;">,</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'handle_like'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Because our action in the <code class="codecolorer php default"><span class="php">js<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> method was set to <code class="codecolorer text default"><span class="text">register_like</span></code>, the hook WordPress creates dynamically is <code class="codecolorer text default"><span class="text">wp_ajax_register_like</span></code> and we can use that to hook our Ajax handler onto.</p>
<h2>Wrapping it all Together</h2>
<p>Easy right? Use jQuery to send data, <code class="codecolorer text default"><span class="text">wp-admin/admin-ajax.php</span></code> to receive the Ajax request and pass it on to an appropriate handler function, and send data back to the original page. On the receiving end, you can use normal means to handle the returned data as you wish.</p>
<p>You can download the full code used here at <a href="https://gist.github.com/1771566">Github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2012/02/08/tutorial-using-wordpress-ajax-api/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Skunkworks</title>
		<link>http://technosailor.com/2012/01/03/skunkworks/</link>
		<comments>http://technosailor.com/2012/01/03/skunkworks/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 19:08:54 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[jobs]]></category>
		<category><![CDATA[Social Media]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=8514</guid>
		<description><![CDATA[Back in October, I announced my departure from WP Engine. At that time, though I didn&#8217;t talk about it on this blog, I decided to take some time off, more or less. Since 2006, I&#8217;ve been hard at work with very little time alotted to myself. I spent 2 years with b5media and jumped immediately [...]]]></description>
			<content:encoded><![CDATA[<p>Back in October, I announced <a href="http://technosailor.com/2011/10/03/changing-roles-at-wp-engine/">my departure from WP Engine</a>. At that time, though I didn&#8217;t talk about it on this blog, I decided to take some time off, more or less. Since 2006, I&#8217;ve been hard at work with very little time alotted to myself. I spent 2 years with <a href="http://b5media.com">b5media</a> and jumped immediately into a failed role at <a href="http://www.lijit.com/blog/2011/10/04/go-big-or-stay-home/">Lijit</a> (who has now been acquired by <a href="http://www.federatedmedia.net/">Federated Media</a> &#8211; nice work, guys!). Upon my departure from Lijit, shortly after the market bottom in 2008, and needing money desperately, I went into full time WordPress consulting. I did that until I moved to Austin last year when I went in full time on <a href="http://wpengine.com">WP Engine</a> and stayed there for 15 months or so.</p>
<p>So basically, I haven&#8217;t had a lot of time to myself. So I took time. In the past few months, I&#8217;ve taken some large consulting contracts, but mostly, I&#8217;ve spent time travelling to Maryland, Seattle, Chicago &#8211; all for pleasure, nothing for work. I&#8217;ve spent time trying to weigh my priorities and wants. I&#8217;ve tossed around starting up a new company or doing something different.</p>
<p>At the end of the day, now that it&#8217;s 2012, I know what I want to do. It&#8217;s a bit unusual, but I think it&#8217;s important and can really revolutionize a boutique agency. I&#8217;m not comfortable doing social media work. I&#8217;m too honest and raw in my own online presence and many companies and clients may not be comfortable with my level of authenticity.</p>
<p>I also don&#8217;t want to do what is common among agencies &#8211; sweatshop site development. Hey, no offense. That&#8217;s what it is. Take on 30 new clients, promise them websites that are the brainchilds of the agency marketing &#8220;expertise&#8221; and ask the developers to crank them out with little to no strategic or creative input.</p>
<p>That might work for some developers, but I&#8217;m not a normal developer. I&#8217;m a highly established WordPress professional that has commanded 5 figure consulting deals, written a 700+ page book on the subject and have built some of the most complex WordPress solutions I&#8217;ve ever seen (Humble brag! Also proprietary, but can provide in person demos). I&#8217;m not a good fit for sweatshop site generation.</p>
<p><img class="alignright size-full wp-image-8515" title="skunkworks" src="http://technosailor.com/files/skunkworks.jpg" alt="" width="410" height="160" />You know what agencies need that no one is doing because no one has taken the time to think outside the box? A skunkworks division. What agencies need to differentiate themselves from the thousands of other agencies they are competing with is a person or small group of people with autonomy and who are focused soley on creating disruptive technologies that no one else is doing. Try things. Fail at some, succeed at others. Test market demand. Offer exclusive access to stuff that no other agency has. Innovate, innovate, innovate.</p>
<p>That&#8217;s what I want to do. And someone sees the sense in that. And someone realizes that <em>that</em> is worth thinking outside the box for. Someone is willing to invest in that competitive advantage. Someone gets it. It&#8217;ll take money. It&#8217;ll take risk. It&#8217;ll take balls of steel. Or you can be normal. Who wants to be normal?</p>
<p>So as we enter 2012, I am open to conversations around this or other creative outlets you might want to explore if you want a competitive advantage. Email me at <a href="mailto:aaron@technosailor.com">aaron@technosailor.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2012/01/03/skunkworks/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>TUTORIAL: Adding an oEmbed Provider to WordPress</title>
		<link>http://technosailor.com/2011/12/14/tutorial-adding-an-oembed-provider-to-wordpress/</link>
		<comments>http://technosailor.com/2011/12/14/tutorial-adding-an-oembed-provider-to-wordpress/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 19:53:12 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[oembed]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=8507</guid>
		<description><![CDATA[I don&#8217;t often write tutorials. I probably should. But normally it&#8217;s only when someone asks me something and I think, &#8220;Hey, self&#8230; you should write up how to do this&#8221;. As if a book wasn&#8217;t enough. Last night I was at the Austin Web Holiday party, a gathering of some 15+ technical meetup groups cross-pollinating [...]]]></description>
			<content:encoded><![CDATA[<p>I don&#8217;t often write tutorials. I probably should. But normally it&#8217;s only when someone asks me something and I think, &#8220;Hey, self&#8230; you should write up how to do this&#8221;. As if <a href="http://amzn.to/wpbible2">a book</a> wasn&#8217;t enough.</p>
<p>Last night I was at the Austin Web Holiday party, a gathering of some 15+ technical meetup groups cross-pollinating over beer and socializing. I was introduced to one guy (can&#8217;t remember his name!) who had built a video site and enabled it for oEmbed. He couldn&#8217;t understand why WordPress wouldn&#8217;t just automatically let users use his videos, like it does for YouTube, Vimeo, etc. <a href="http://codex.wordpress.org/Embeds">The full list of default oEmbed providers are listed here</a>.</p>
<p>WordPress doesn&#8217;t allow automatic use of oEmbed for security reasons. Otherwise, someone could build a video service stuffed with malicious code that could potentially access your database or create a man in the middle attack or worse. WordPress.com certainly doesn&#8217;t allow arbitrary oEmbed sites and the dot-org open source software doesn&#8217;t allow arbitrary stuff automatically. But it can be done, on the dot-org side, with a plugin. All it is a hook.</p>
<p>Here&#8217;s an example. If you want to register an oEmbed video site that is, say, at (randomly) http:/mysuperawesomevideosite.com and your videos are of the format http://mysuperawesomevideosite.com/video/*, it&#8217;s as simple as adding a function in your plugin (or more properly from a PHP perspective, a method in a class &#8211; but that&#8217;s a personal preference. The method/function should call the <code class="codecolorer php default"><span class="php">&nbsp;wp_oembed_add_provider<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> function.</p>
<p>In it&#8217;s simplest form, all you have to do is:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class My_Plugin {<br />
<br />
&nbsp; var $oembed_endpoint;<br />
&nbsp; var $oembed_format;<br />
<br />
&nbsp; function __construct() <br />
&nbsp; {<br />
&nbsp; &nbsp; $this-&gt;oembed_endpoint = 'http://mysuperawesomevideosite.com';<br />
&nbsp; &nbsp; $this-&gt;oembed_format = 'http://mysuperawesomevideosite.com/video/*';<br />
<br />
&nbsp; &nbsp; $this-&gt;new_oembed();<br />
&nbsp; }<br />
<br />
&nbsp; function __destruct() {}<br />
<br />
&nbsp; function new_oembed()<br />
&nbsp; {<br />
&nbsp; &nbsp; wp_oembed_add_provider( $this-&gt;oembed_format, $this-&gt;oembed_endpoint );<br />
&nbsp; }<br />
<br />
}</div></td></tr></tbody></table></div>
<p>Then, to make this code work, just instantiate the class somewhere.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$my_plugin</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> My_Plugin<span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Voila!</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2011/12/14/tutorial-adding-an-oembed-provider-to-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10 Things You Need to Know About WordPress 3.3</title>
		<link>http://technosailor.com/2011/11/17/10-things-you-need-to-know-about-wordpress-3-3/</link>
		<comments>http://technosailor.com/2011/11/17/10-things-you-need-to-know-about-wordpress-3-3/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 20:22:17 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress 3.3]]></category>
		<category><![CDATA[wordpress cheatsheets]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=8498</guid>
		<description><![CDATA[WordPress 3.2 has been downloaded a killer 12M+ times. WordPress as a whole continues to grow and is touted to be in the approximate 14% of the web zone. That&#8217;s ridiculously huge and it astounds me how big the projects footprint has become in the 7 years I&#8217;ve been around the community. Well done to [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://technosailor.com/files/Screen-Shot-2011-11-17-at-2.18.53-PM-600x397.png" alt="WordPress Downloaded over 12.5M times" title="WordPress Downloaded over 12.5M times" width="584" height="386" class="alignright size-large wp-image-8505" />WordPress 3.2 has been downloaded a killer 12M+ times. WordPress as a whole continues to grow and is touted to be in the approximate 14% of the web zone. That&#8217;s ridiculously huge and it astounds me how big the projects footprint has become in the 7 years I&#8217;ve been around the community. Well done to all involved!</p>
<p>With that said, WordPress 3.3 is just around the corner and, as usual, it&#8217;s chock full of goodies for everyone. I&#8217;d say that the notable changes for developers are the most significant. Improved metadata handling, improved SQL tools, improved cache API and deprecation of several venerable functions are all changes that developers should be aware of.</p>
<p>This article touches mostly on the user experience and features that are new in WordPress 3.3. Developers who want to dive in should reference <a href="http://codex.wordpress.org/Version_3.3">this running list of &#8220;things&#8221; that were addressed in WP 3.3</a>.</p>
<h2>Admin Bar Overhaul</h2>
<p>The Admin Bar that was introduced a few versions ago has become a main-stay of my WordPress experience. At first, I felt like it got in the way, but I soon got used to it. In WordPress 3.3, the Admin Bar gets tweaked and enhanced. For Multisite users, you now have access to the Network Admin from a new &#8220;My Sites&#8221; menu along with all sites that you have access to <a class="simple-footnote" title="You will only see sites that you have a Core Role on (Administrator, Editor, Author, Contributor, Subscriber). Super Admins that are not assigned to a blog, even though they have access to it as a Super Admin, will not have that blog listed" id="return-note-8498-1" href="#note-8498-1"><sup>1</sup></a>.</p>
<p>As usual, developers can modify the admin bar using the <code class="codecolorer text default"><span class="text">admin_bar_menu</span></code> action, and hooking a callback that modifies the <code class="codecolorer php default"><span class="php"><span style="color: #000088;">$wp_admin_bar</span></span></code> global. This object is created by the <code class="codecolorer php default"><span class="php">WP_Admin_Bar</span></code> class that provides an <code class="codecolorer php default"><span class="php">add_menu<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> and <code class="codecolorer php default"><span class="php">remove_menu<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></span></code> method for manipulation.</p>
<p>Sample Code:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">function</span> ab_add_faq_link<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$wp_admin_bar</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000088;">$wp_admin_bar</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_menu</span><span style="color: #009900;">&#40;</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'menu_faq'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'title'</span> <span style="color: #339933;">=&gt;</span> __<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'FAQs'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'href'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'http://example.com/faqs'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'meta'</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'class'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'custom_adminbar_menu'</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#41;</span><br />
&nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
add_action<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'wp_admin_bar'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ab_add_faq_link'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<h2>HTML5 Admin/Responsive Layout</h2>
<p>More Admin-side improvements, like a conversion to HTML5 are a little more understated and less pronounced &#8211; unless you&#8217;re trying to access it from your iPhone or mobile phone. The conversion to HTML5, while meeting the trends of the day, also have the practical effect of providing an adaptive design which conforms to the device or viewport you are using. There&#8217;s nothing too crazy here, but with the web world going in the direction of HTML5, this move lays groundwork for new HTML5 features in the future.</p>
<h2>Drag and Drop Media Uploader</h2>
<p>One of the biggest new features in WordPress 3.3 (and a long time in coming!) is a new and improved media uploader. This is a feature that is discussed every single release cycle but because there&#8217;s only so much room in a major release cycle for major features (and this is a huge rewrite), it has continued to get bumped to a future release &#8211; until now.</p>
<p>While the new uploader is not the holy grail and I feel like there&#8217;s still a lot of room for improvement, it takes a giant leap forward in making the web interface feel more natural and more like a native application.</p>
<p>What am I talking about? Well, three words: Drag and Drop. With the new media uploaded, it&#8217;s as simple as dragging files to the &#8220;drop zone&#8221; in the native way that your OS allows: On Mac, from the Finder or by dragging the title bar icon in the app you&#8217;re using (Photoshop? Preview? Skitch?) into drop zone. On Windows, by pulling your file from Explorer into the Drop Zone.</p>
<p>Plus, related to the last feature, this media uploader prefers HTML5. For the geeky, the failover for HTML5 uploading is first Silverlight, then Flash then the old fashioned &#8220;Choose File&#8221; HTML dialog.</p>
<div id="attachment_8501" class="wp-caption aligncenter" style="width: 594px"><img class="size-large wp-image-8501" title="HTML5 Media Uploader" src="http://technosailor.com/files/Screen-Shot-2011-11-17-at-12.04.37-PM-600x375.png" alt="HTML5 Media Uploader" width="584" height="365" /><p class="wp-caption-text">HTML5 Media Uploader</p></div>
<h2>Welcome Screen and Pointers</h2>
<p><img class="alignright size-full wp-image-8502" title="Dashboard ‹ Technosailor.com — WordPress" src="http://technosailor.com/files/Dashboard-‹-Technosailor.com-—-WordPress.jpg" alt="" width="355" height="209" />If you already are using WordPress, you won&#8217;t see the welcome screen unless you setup a new WordPress install <a class="simple-footnote" title="You can manually turn the Welcome panel on in the Dashboard Screen Option" id="return-note-8498-2" href="#note-8498-2"><sup>2</sup></a>. The Welcome panel gives an overview of WordPress to new users.</p>
<p>More importantly, there is a new jQuery plugin that adds &#8220;Pointers&#8221; to WordPress whenever a new core, user facing feature is added. In WordPress 3.3, you&#8217;ll see one immediately pertaining to the new Admin Bar. However, Plugin and Theme developers who want to highlight new features can also do so. If you know jQuery, the following code is a good head start in the right direction:</p>
<p>Sample Code:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function ab_pointers()<br />
{<br />
&nbsp; if( !is_admin() )<br />
&nbsp; &nbsp; return false;<br />
<br />
&nbsp; // Get Proper CSS involved - probably already included, but we want to be safe.<br />
&nbsp; wp_enqueue_style( 'wp-pointer' );<br />
&nbsp; wp_print_styles();<br />
<br />
&nbsp; // Get Proper bundled jQuery plugin involved - probably already included, but just to be safe<br />
&nbsp; wp_enqueue_script( 'wp-pointer' );<br />
&nbsp; wp_print_scripts();<br />
<br />
&nbsp; // Define text for the Pointer. Make sure you escape stuff<br />
&nbsp; $widget_text = '&lt;h3&gt;' . esc_js( __( 'Important!') ) . '&lt;/h3&gt;';<br />
&nbsp; $widget_text .= '&lt;p&gt;' . esc_js( __( &quot;This is where you would put some text that'll help the user understand WTF is up with your new stuff. Use it wisely and make sure it's short (Users won't read it if it's too long and once they dismiss it, it won't be shown again)&quot; ) ). '&lt;/p&gt;';<br />
&nbsp; ?&gt;<br />
&nbsp; &lt;script type=&quot;text/javascript&quot;&gt;<br />
&nbsp; jQuery(document).ready(function(){<br />
&nbsp; &nbsp; jQuery('#your_dom_element').pointer({<br />
&nbsp; &nbsp; &nbsp; content &nbsp; &nbsp;: '<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$widget_text</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>',<br />
&nbsp; &nbsp; &nbsp; position&nbsp; &nbsp;: 'left',<br />
&nbsp; &nbsp; &nbsp; close &nbsp;: function() {}<br />
&nbsp; &nbsp; }).pointer('open');<br />
&nbsp; });<br />
&nbsp; &lt;/script&gt;<br />
&nbsp; <span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #009900;">&#125;</span><br />
add_action<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin_head'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'ab_pointers'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>I imagine this will get easier to implement in the future.</p>
<h2>Improvements to Distraction Free Writing</h2>
<p>Distraction Free Writing, <a href="http://technosailor.com/2011/06/20/10-things-you-need-to-know-about-wordpress-3-2/">which made its debut in WordPress 3.2</a>, offered bloggers vast improvements to how they wrote content by removing the silly things that, well, distract from the job of writing.</p>
<p>In WordPress 3.3, DFW now integrates the content width and other CSS stylings of post content into the editor. This is all based on the active theme CSS and it attempts to aid the blogger in formatting properly for the theme the content will be displayed in.</p>
<h2>Admin Menu Flyouts</h2>
<p>A minor enhancement, yet important from a UI perspective &#8211; especially for those of you who, like me, constantly have wp-admin menus expanded &#8211; are menu flyouts. Very simple little thing, but when a user mouses over a menu, the submenu items under it appear in a &#8220;flyout&#8221; to the right and disappear when the mouse is no longer over the top level menu. Of course, for touch devices and clicky people, the collapse/expand functionality still exists.</p>
<p><img class="alignright size-large wp-image-8503" title="Screen Shot 2011-11-17 at 1.19.54 PM" src="http://technosailor.com/files/Screen-Shot-2011-11-17-at-1.19.54-PM-600x394.png" alt="" width="584" height="383" /></p>
<h2>Tumblr Importer</h2>
<p>Technically, importers are <a href="http://technosailor.com/2009/11/11/10-things-you-need-to-know-about-wordpress-2-9/">no longer bundled with WordPress core</a>. They are plugins. However, the removed importers are still listed on the Tools > Import console and can be installed from within WordPress.</p>
<p>An importer that has been in demand for some time, due to the popularity of <a href="http://tumblr.com">Tumblr</a> but the more popular nature of WordPress, is a Tumblr importer. Now that is available &#8211; also as a one-click plugin &#8211; to assist Tumblrs in moving to WordPress.<br />
<div id="attachment_8504" class="wp-caption alignright" style="width: 594px"><img src="http://technosailor.com/files/Screen-Shot-2011-11-17-at-1.35.13-PM-600x394.png" alt="Tumblr Importer" title="Tumblr Importer" width="584" height="383" class="size-large wp-image-8504" /><p class="wp-caption-text">Tumblr Importer</p></div></p>
<p>Go forth and enjoy a better blogging experience. And hey, use <a href="http://codex.wordpress.org/Press_This">Press This</a> if you like the Tumble style.</p>
<h2>Multisite &#8211; Internationalized Domain Name Support</h2>
<p>For non-english Multisite installs, it is now possible to designate an international domain name <a class="simple-footnote" title="IDNs are domain names that contains non-ASCII characters such as are provided by languages like Arabic, Kanji or Hiragana or language styles like Cyrillic" id="return-note-8498-3" href="#note-8498-3"><sup>3</sup></a> as the site install domain. In Multisite, this means that base installs of WordPress can use IDNs now, which will serve to increase the adoption of these domains in non-English speaking parts of the world.</p>
<p>ワードプレスのイェーイ.jp, FTW!</p>
<h2>Multisite &#8211; Network Enabled Themes and Theme Updates</h2>
<p>Since we&#8217;re on the topic of Multisite, WordPress 3.3 brings the Network Activate option that has been available for plugins to themes. The plugin flow and the theme flow is different in WordPress, so this option makes things significantly easier. The plugin workflow only allows Super Admins to <em>install</em> WordPress and gives the Super Admin the ability to turn off the plugin menu for Blog Admins, but if left turned on, any Admin can activate any available plugin for their particular blog. For plugins, Super Admins can designate a plugin as a global plugin by Network activating in the Network Admin.</p>
<p>For Themes, it was an arduous task of making themes available to sub-sites in the past. Now, after installing a theme from the Network Admin, all it takes is a single click on Network Activate to make that theme available to sites in the network.</p>
<h2>Deprecating Feeds</h2>
<p>Finally, for those of you who rely on your feeds and are stuck in the stone age still, WordPress no longer supports old RSS 0.92 feeds and RDF feeds. For what it&#8217;s worth though, the default RSS feed is the still supported RSS 2.0 feed (add <code class="codecolorer text default"><span class="text">/feed</span></code> to the end of just about any URL in WordPress and that is your RSS 2.0 feed.</p>
<p>Still, I know some of you don&#8217;t like to change and may be using the old feeds. There are two things to note:</p>
<ol>
<li>These now-deprecated feeds will redirect to the proper feed, with 301,</li>
<li>If you use <a href="http://feedburner.com">FeedBurner</a>, or similar feed repurposing and syndication service, please make sure you are using the RSS 2.0 feed, not the RSS 0.92 feed. Like I said, a 301 will occur but that is actually additional load on the web server because it generates additional HTTP requests</li>
</ol>
<h2>Wrap Up</h2>
<p>Sadly, this was the first WordPress release in some time where I have not contributed any code. There are a lot of reasons for that, none of which are all that important. But the core development team has really done a great job with this release and they should be commended. </p>
<p>If you really like WordPress, <a href="http://wordpressfoundation.org/donate/">thank the team with a donation to the WordPress Foundation</a>. All of the work that has gone into this release has come on the backs of volunteers or dedicated, full time paid employees of other companies who have been &#8220;donated&#8221; to the project.</p>
<div class="simple-footnotes"><p class="notes">Notes:</p><ol><li id="note-8498-1">You will only see sites that you have a Core Role on (Administrator, Editor, Author, Contributor, Subscriber). Super Admins that are not assigned to a blog, even though they have access to it as a Super Admin, will not have that blog listed <a href="#return-note-8498-1">&#8617;</a></li><li id="note-8498-2">You can manually turn the Welcome panel on in the Dashboard Screen Option <a href="#return-note-8498-2">&#8617;</a></li><li id="note-8498-3">IDNs are domain names that contains non-ASCII characters such as are provided by languages like Arabic, Kanji or Hiragana or language styles like Cyrillic <a href="#return-note-8498-3">&#8617;</a></li></ol></div>]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2011/11/17/10-things-you-need-to-know-about-wordpress-3-3/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>TUTORIAL: Using Sass and Compass for managing CSS in WordPress</title>
		<link>http://technosailor.com/2011/11/02/tutorial-using-sass-and-compass-for-managing-css-in-wordpress/</link>
		<comments>http://technosailor.com/2011/11/02/tutorial-using-sass-and-compass-for-managing-css-in-wordpress/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 19:35:36 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[compass]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[sass]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[ux design]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=8494</guid>
		<description><![CDATA[I don&#8217;t often write tutorials but since the rebuild of the WP Engine website some months ago, I have been turned on to the use of a brilliant combination of tools made for development in a Ruby on Rails environment. That doesn&#8217;t mean we can&#8217;t make it work for WordPress too. The tools are Compass [...]]]></description>
			<content:encoded><![CDATA[<p>I don&#8217;t often write tutorials but since the rebuild of the <a href="http://wpengine.com">WP Engine</a> website some months ago, I have been turned on to the use of a brilliant combination of tools made for development in a Ruby on Rails environment. That doesn&#8217;t mean we can&#8217;t make it work for WordPress too.</p>
<p><img class="aligncenter size-full wp-image-8496" title="wp-compass" src="http://technosailor.com/files/wp-compass.png" alt="" width="600" height="250" /></p>
<p>The tools are <a href="http://compass-style.org/">Compass</a> combined with <a href="http://sass-lang.com/">Sass</a> (which means Sytactically Awesome Stylesheets or some random crap like that).</p>
<p>Sass is cool because it lets you do a whole bunch of stuff with CSS that you couldn&#8217;t normally. It&#8217;s a kind of abstraction layer above CSS which means you can write normal CSS if you want, but then why wouldn&#8217;t you just write normal CSS instead of using Sass?</p>
<p>I&#8217;m getting slightly ahead of myself, but With Sass you can do awesome things like variable/placeholders which is awesome for things like defining core elements of a stylesheet such as a palette of colors.</p>
<div class="codecolorer-container css default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$cloud-<span style="color: #000000; font-weight: bold;">blue</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#d9e7f3</span><span style="color: #00AA00;">;</span><br />
$light-<span style="color: #000000; font-weight: bold;">blue</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#f0f7fc</span><span style="color: #00AA00;">;</span><br />
$dark-<span style="color: #000000; font-weight: bold;">blue</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#036</span><span style="color: #00AA00;">;</span><br />
$green<span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#7ca60a</span><span style="color: #00AA00;">;</span></div></td></tr></tbody></table></div>
<p>Then using those variables, you can just use these placeholders in your SCSS (Sassy CSS) file:</p>
<div class="codecolorer-container css default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">a <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> $dark-<span style="color: #000000; font-weight: bold;">blue</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span><br />
a<span style="color: #3333ff;">:hover </span><span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> $light-<span style="color: #000000; font-weight: bold;">blue</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>You can also write Mixins. Mixins are essentially reusable blocks of CSS that look a lot like functions you would see in languages like JavaScript, PHP or Ruby:</p>
<div class="codecolorer-container css default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$radius<span style="color: #00AA00;">:</span><span style="color: #933;">5px</span><span style="color: #00AA00;">;</span><br />
<br />
<span style="color: #a1a100;">@mixin border-radius($radius)</span><br />
<span style="color: #00AA00;">&#123;</span><br />
border-radius<span style="color: #00AA00;">:</span>$radius<span style="color: #00AA00;">;</span><br />
-moz-border-radius<span style="color: #00AA00;">:</span> $radius<span style="color: #00AA00;">;</span><br />
-webkit-border-radius<span style="color: #00AA00;">:</span> $radius<span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>You can use that in your SCSS file as such:</p>
<div class="codecolorer-container css default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">form input <span style="color: #00AA00;">&#123;</span> <span style="color: #a1a100;">@include border-radius(5px); }</span></div></td></tr></tbody></table></div>
<p>But again, I&#8217;m getting ahead of myself.</p>
<p>When I talked about using Sass and Compass on Twitter, other WordPress devs made comments that made me want to write this tutorial. One person said that they were tired of Rails developers having all the toys &#8211; and it&#8217;s true. There are so many awesome things out there for Rails developers that we as PHP and WordPress developers don&#8217;t benefit from. This tutorial is non-exhaustive. There are tons of things that you can do with this that I won&#8217;t cover. But this should get you going with Mac OS X Lion, developing WordPress locally on your own machine and uploading to a theme file called &#8220;test&#8221; on a remote server.</p>
<h2>Prerequisites</h2>
<p>First of all, you need to have a local version of WordPress running. There are a variety of ways to do this, but I use the approach of installing XAMPP. <a href="http://www.endlesslycurious.com/2011/03/14/running-wordpress-on-mac-os-x-with-xampp/">Here&#8217;s a tutorial on that</a>. Follow the rabbit trail to configure Apache to look to your Sites directory, as I have, or make that translation in your head to what the default is. There&#8217;s plenty of instruction on how to do that on the internet.</p>
<p>For the specifics of this tutorial, it&#8217;s <strong>very important</strong> that you have the latest version of Ruby. The best way to do this is with a tool called rvm, or Ruby Version Manager. Install this with the following Terminal command:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">bash</span> <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight: bold;">&lt;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>curl <span style="color: #660033;">-s</span> https:<span style="color: #000000; font-weight: bold;">//</span>raw.github.com<span style="color: #000000; font-weight: bold;">/</span>wayneeseguin<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>master<span style="color: #000000; font-weight: bold;">/</span>binscripts<span style="color: #000000; font-weight: bold;">/</span>rvm-installer<span style="color: #7a0874; font-weight: bold;">&#41;</span></div></td></tr></tbody></table></div>
<p>Once rvm is installed, use it to install 1.9.3-p0, the only current version compatible with OS X Lion, and refresh your Terminal profile settings. The last command sets 1.9.3-p0 (or whatever future version you choose to use) as your default.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">rvm <span style="color: #c20cb9; font-weight: bold;">install</span> 1.9.3-p0<br />
rvm reload<br />
<span style="color: #7a0874; font-weight: bold;">source</span> ~<span style="color: #000000; font-weight: bold;">/</span>.bash_profile<br />
rvm <span style="color: #660033;">--default</span> use 1.9.3-p0</div></td></tr></tbody></table></div>
<p>If you wish to verify that you&#8217;ve got the proper version of Ruby active, verify it with the <code class="codecolorer bash default"><span class="bash">ruby <span style="color: #660033;">-v</span></span></code> command.</p>
<p>My system reported:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11.2.0]</div></td></tr></tbody></table></div>
<p>Now, there are some gems that need to be installed. For developers unfamiliar with Ruby &#8211; or Rails &#8211; gems, are essentially additional libraries that are installed into the Ruby framework, much like PHP PEAR or PECL modules.</p>
<p>The first is <a href="http://rubygems.org/gems/builder">Builder, which is used for building XML structures. The second one is <a href="http://compass-style.org">Compass</a> which will give us the ability to leverage Sass for CSS authoring.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">gem <span style="color: #c20cb9; font-weight: bold;">install</span> builder<br />
gem <span style="color: #c20cb9; font-weight: bold;">install</span> compass</div></td></tr></tbody></table></div>
<h2>Creating a Sass Project</h2>
<p>Once we have everything installed properly, we can start a new project. I keep this out of my web directory (i.e. WordPress structure). Personally, I&#8217;ve created a sass directory under my user profile (/Users/aaron/sass) and run my projects out of it with a separate directory for each project.</p>
<p>Now we have to create our compass project. We do that with <code class="codecolorer bash default"><span class="bash">compass create</span></code> from our <code class="codecolorer text default"><span class="text">~/sass</span></code> directory and then moving into the newly created directory.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">compass create <span style="color: #7a0874; font-weight: bold;">test</span><br />
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #7a0874; font-weight: bold;">test</span></div></td></tr></tbody></table></div>
<p>Doing a directory listing should show something along these lines:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">NCC-1701:test aaron$ ls -la<br />
total 8<br />
drwxr-xr-x 6 aaron staff 204 Nov 2 11:36 .<br />
drwxr-xr-x 4 aaron staff 136 Nov 2 11:36 ..<br />
drwxr-xr-x 5 aaron staff 170 Nov 2 11:36 .sass-cache<br />
-rw-r--r-- 1 aaron staff 861 Nov 2 11:36 config.rb<br />
drwxr-xr-x 5 aaron staff 170 Nov 2 11:36 sass<br />
drwxr-xr-x 5 aaron staff 170 Nov 2 11:36 stylesheets</div></td></tr></tbody></table></div>
<p>Good. Our project is created but we need to make some changes to make this work with WordPress. To do this, we need to edit the <code class="codecolorer text default"><span class="text">config.rb</span></code> file which is the project configuration file. You can edit this file in Textmate, vi, or whatever you choose as your preferred text editor.</p>
<p>The default configuration is:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">http_path = <span style="color:#996600;">&quot;/&quot;</span><br />
css_dir = <span style="color:#996600;">&quot;stylesheets&quot;</span><br />
sass_dir = <span style="color:#996600;">&quot;sass&quot;</span><br />
images_dir = <span style="color:#996600;">&quot;images&quot;</span><br />
javascripts_dir = <span style="color:#996600;">&quot;javascripts&quot;</span></div></td></tr></tbody></table></div>
<p>My config file looks like this:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">http_path = <span style="color:#996600;">&quot;../../Sites&quot;</span><br />
css_dir = <span style="color:#996600;">&quot;../../Sites/wp-content/themes/test/css&quot;</span><br />
sass_dir = <span style="color:#996600;">&quot;sass&quot;</span><br />
images_dir = <span style="color:#996600;">&quot;images&quot;</span><br />
javascripts_dir = <span style="color:#996600;">&quot;js&quot;</span><br />
project_type = <span style="color:#ff3333; font-weight:bold;">:stand_alone</span><br />
output_style = <span style="color:#ff3333; font-weight:bold;">:nested</span><br />
line_comments = <span style="color:#0000FF; font-weight:bold;">false</span></div></td></tr></tbody></table></div>
<p>Important changes here:</p>
<ul>
<li>The <code class="codecolorer text default"><span class="text">http_path</span></code> is a <em>relative</em> path to my DOCROOT &#8211; for some reason, things got whacked when using an absolute path.</li>
<li>The <code class="codecolorer text default"><span class="text">css_dir</span></code> is a <em>relative</em> path to the <code class="codecolorer text default"><span class="text">css</span></code> directory in my WordPress theme directory. At this time, there is no configuration option to control the name of the CSS files being generated so we will have to use <code class="codecolorer css default"><span class="css"><span style="color: #a1a100;">@import</span></span></code> inside the required WordPress <code class="codecolorer text default"><span class="text">style.css</span></code> template file to incorporate Compass generated CSS files.</li>
<li>You can change the <code class="codecolorer text default"><span class="text">images_dir</span></code> and <code class="codecolorer text default"><span class="text">javascripts_dir</span></code> as needed to reflect your taste. Personally, I prefer shorter names, so that is reflected in the config file.</li>
<li>The <code class="codecolorer text default"><span class="text">project_type</span></code> flag is required because, if omitted, Compass assumes we are working in a Rails environment on a Rails project with Rails conventions&#8230; WordPress is none of that.</li>
<li>The <code class="codecolorer text default"><span class="text">output_style</span></code> flag has been set to <code class="codecolorer text default"><span class="text">:nested</span></code> but could be <code class="codecolorer text default"><span class="text">:expanded</span></code>, <code class="codecolorer text default"><span class="text">:compact</span></code> or <code class="codecolorer text default"><span class="text">:compressed</span></code> depending on your tastes.</li>
<li>The <code class="codecolorer text default"><span class="text">line_comments</span></code> flag has been set to false to remove debug information from the generated CSS</li>
</ul>
<p>All configuration options can be referenced in the <a href="http://compass-style.org/help/tutorials/configuration-reference/">Compass docs</a>.</p>
<p>Having modified the config file, we can take one of two approaches to generating the CSS in our WordPress theme. We can use the <code class="codecolorer bash default"><span class="bash">compass compile</span></code> which will generate the files one time. Everytime modifications are made, however, this command would have to be re-run. I prefer, instead, to use <code class="codecolorer bash default"><span class="bash">compass <span style="color: #c20cb9; font-weight: bold;">watch</span></span></code> which is a small process that remains running and watches your Sass project for changes and recompiles automatically when changes are made.</p>
<p>Simply run this command from inside the Sass project:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">compass <span style="color: #c20cb9; font-weight: bold;">watch</span><br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Change detected to: ie.scss<br />
create ..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>Sites<span style="color: #000000; font-weight: bold;">/</span>wp-content<span style="color: #000000; font-weight: bold;">/</span>themes<span style="color: #000000; font-weight: bold;">/</span>test<span style="color: #000000; font-weight: bold;">/</span>ie.css<br />
create ..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>Sites<span style="color: #000000; font-weight: bold;">/</span>wp-content<span style="color: #000000; font-weight: bold;">/</span>themes<span style="color: #000000; font-weight: bold;">/</span>test<span style="color: #000000; font-weight: bold;">/</span>print.css<br />
create ..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>Sites<span style="color: #000000; font-weight: bold;">/</span>wp-content<span style="color: #000000; font-weight: bold;">/</span>themes<span style="color: #000000; font-weight: bold;">/</span>test<span style="color: #000000; font-weight: bold;">/</span>screen.css<br />
<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>aaron<span style="color: #000000; font-weight: bold;">/</span>.rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-1.9.3-p0<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>fssm-0.2.7<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>fssm<span style="color: #000000; font-weight: bold;">/</span>support.rb:<span style="color: #000000;">40</span>: Use RbConfig instead of obsolete and deprecated Config.<br />
FSSM -<span style="color: #000000; font-weight: bold;">&gt;</span> An optimized backend is available <span style="color: #000000; font-weight: bold;">for</span> this platform<span style="color: #000000; font-weight: bold;">!</span><br />
FSSM -<span style="color: #000000; font-weight: bold;">&gt;</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> rb-fsevent<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Compass is polling <span style="color: #000000; font-weight: bold;">for</span> changes. Press Ctrl-C to Stop.</div></td></tr></tbody></table></div>
<p>At this point, if you want to develop locally, all you have to do is have your WordPress <code class="codecolorer text default"><span class="text">style.css</span></code> import these stylesheets.</p>
<div class="codecolorer-container css default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">/*<br />
Theme Name: Test Theme<br />
Author: Aaron Brazell<br />
Author URI: http://emmense.com<br />
Description: A test theme demonstrating Sass and Compass<br />
Version: 1.0<br />
*/</span><br />
<br />
<span style="color: #a1a100;">@import url('css/screen.css');</span><br />
<span style="color: #a1a100;">@import url('css/print.css');</span><br />
<span style="color: #a1a100;">@import url('css/ie.css');</span></div></td></tr></tbody></table></div>
<h2>Uploading to a Remote WordPress Install</h2>
<p>Fortunately, with a little Ruby magic and some built in Compass hooks, we can also upload these newly created CSS files to our WordPress theme. In order to do this, you have to make sure the remote server has the theme directory created <em>and</em> if you are uploading to a subdirectory of that theme (e.g. theme_dir/css), that that directory is created as well.</p>
<p>In our case, the theme directory is <code class="codecolorer text default"><span class="text">test/</span></code> and I want to upload to a subdirectory <code class="codecolorer text default"><span class="text">test/css/</span></code>.</p>
<p>Next we have to install two new gems &#8211; the Net::SSH and Net::SFTP gems. Installing these is as straightforward as the earlier gems:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">gem <span style="color: #c20cb9; font-weight: bold;">install</span> net-ssh<br />
gem <span style="color: #c20cb9; font-weight: bold;">install</span> net-sftp</div></td></tr></tbody></table></div>
<p>Once this has done, include these in your <code class="codecolorer text default"><span class="text">config.rb</span></code> file. I did this at the top which is best practice with Ruby.</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'net/ssh'</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'net/sftp'</span></div></td></tr></tbody></table></div>
<p>Below all the previous configurations, add some configuration lines and replace values as needed for your own project:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># note that this is the directory that CSS files will be written. It can be the theme dir</span><br />
<span style="color:#008000; font-style:italic;"># or a subdirectory (e.g. theme_dir/css). Whatever this path is MUST exist</span><br />
remote_theme_dir_absolute = <span style="color:#996600;">'/home/sites/emmense.com/httpdocs/wp-content/themes/test/css'</span><br />
<br />
<span style="color:#008000; font-style:italic;"># SFTP Connection Details - Does not support alternate ports os SSHKeys, but could with mods</span><br />
sftp_host = <span style="color:#996600;">'hostname.com'</span> <span style="color:#008000; font-style:italic;"># Can be an IP</span><br />
sftp_user = <span style="color:#996600;">'username'</span> <span style="color:#008000; font-style:italic;"># SFTP Username</span><br />
sftp_pass = <span style="color:#996600;">'password'</span> <span style="color:#008000; font-style:italic;"># SFTP Password</span></div></td></tr></tbody></table></div>
<p>Finally, we can leverage Compass&#8217; built-in <code class="codecolorer text default"><span class="text">on_stylesheet_saved</span></code> hook to upload to the remote server using your SFTP credentials:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># Callback to be used when a file change is written. This will upload to a remote WP install</span><br />
on_stylesheet_saved <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>filename<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; <span style="color:#ff6633; font-weight:bold;">$local_path_to_css_file</span> = css_dir <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">'/'</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">basename</span><span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span><br />
<br />
&nbsp; <span style="color:#6666ff; font-weight:bold;">Net::SFTP</span>.<span style="color:#9900CC;">start</span><span style="color:#006600; font-weight:bold;">&#40;</span> sftp_host, sftp_user, <span style="color:#ff3333; font-weight:bold;">:password</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; sftp_pass <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>sftp<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; &nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> sftp.<span style="color:#9900CC;">upload</span>! <span style="color:#ff6633; font-weight:bold;">$local_path_to_css_file</span>, remote_theme_dir_absolute <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">basename</span><span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;&gt;&gt;&gt; Compass is polling for changes. Press Ctrl-C to Stop&quot;</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p>Restart Compass, save one of your Sass .scss files with a change of some sort (from where CSS will be compiled), and watch your files be saved locally and remotely.</p>
<p>At this point, my full <code class="codecolorer text default"><span class="text">config.rb</span></code> file looks like this:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># Require any additional compass plugins here.</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'net/ssh'</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'net/sftp'</span><br />
<br />
<span style="color:#008000; font-style:italic;"># Set this to the root of your project when deployed:</span><br />
http_path = <span style="color:#996600;">&quot;../../Sites&quot;</span><br />
css_dir = <span style="color:#996600;">&quot;../../Sites/wp-content/themes/test/css&quot;</span><br />
sass_dir = <span style="color:#996600;">&quot;sass&quot;</span><br />
images_dir = <span style="color:#996600;">&quot;images&quot;</span><br />
javascripts_dir = <span style="color:#996600;">&quot;javascripts&quot;</span><br />
<br />
project_type = <span style="color:#ff3333; font-weight:bold;">:stand_alone</span><br />
output_style = <span style="color:#ff3333; font-weight:bold;">:nested</span><br />
line_comments = <span style="color:#0000FF; font-weight:bold;">false</span><br />
<br />
<span style="color:#008000; font-style:italic;"># note that this is the directory that CSS files will be written. It can be the theme dir</span><br />
<span style="color:#008000; font-style:italic;"># or a subdirectory (e.g. theme_dir/css). Whatever this path is MUST exist</span><br />
remote_theme_dir_absolute = <span style="color:#996600;">'/home/sites/emmense.com/httpdocs/wp-content/themes/test/css'</span><br />
<br />
<span style="color:#008000; font-style:italic;"># SFTP Connection Details - Does not support alternate ports os SSHKeys, but could with mods</span><br />
sftp_host = <span style="color:#996600;">'hostname.com'</span> <span style="color:#008000; font-style:italic;"># Can be an IP</span><br />
sftp_user = <span style="color:#996600;">'username'</span> <span style="color:#008000; font-style:italic;"># SFTP Username</span><br />
sftp_pass = <span style="color:#996600;">'password'</span> <span style="color:#008000; font-style:italic;"># SFTP Password</span><br />
<br />
<span style="color:#008000; font-style:italic;"># Callback to be used when a file change is written. This will upload to a remote WP install</span><br />
on_stylesheet_saved <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>filename<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; <span style="color:#ff6633; font-weight:bold;">$local_path_to_css_file</span> = css_dir <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">'/'</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">basename</span><span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span><br />
<br />
&nbsp; <span style="color:#6666ff; font-weight:bold;">Net::SFTP</span>.<span style="color:#9900CC;">start</span><span style="color:#006600; font-weight:bold;">&#40;</span> sftp_host, sftp_user, <span style="color:#ff3333; font-weight:bold;">:password</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; sftp_pass <span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>sftp<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; &nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> sftp.<span style="color:#9900CC;">upload</span>! <span style="color:#ff6633; font-weight:bold;">$local_path_to_css_file</span>, remote_theme_dir_absolute <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">basename</span><span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;&gt;&gt;&gt;&gt; Compass is polling for changes. Press Ctrl-C to Stop&quot;</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<h2>Conclusion</h2>
<p>Rails developers have all the fun. It&#8217;s true. But with Compass, Sass and a little bit of Ruby, PHP developers (including WordPress theme developers) have a great tool that will make workflows more efficient, CSS more readable and structured and central management more coherent.</p>
<p>Obviously, I did not get too far into the details of <em>using</em> Compass and Sass. That&#8217;s a whole tutorial to itself. For information on that, I&#8217;d recommend checking out these fine articles written on the topic:</p>
<ul>
<li><a href="http://net.tutsplus.com/tutorials/html-css-techniques/using-compass-and-sass-for-css-in-your-next-project/">Using Compass and Sass for CSS in Your Next Project</a> (NetTuts+)</li>
<li><a href="http://sass-lang.com/tutorial.html">Official Sass Tutorials</a> (sass-lang.org)</li>
</ul>
<p><em>(Protip: I love being able to nest CSS&#8230; try it)</em></p>
<p><em>Disclaimer: I am a PHP developer, not a Ruby developer. My Ruby code could probably be improved upon by someone who is more in tune with the Ruby language.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2011/11/02/tutorial-using-sass-and-compass-for-managing-css-in-wordpress/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Changing Roles at WP Engine</title>
		<link>http://technosailor.com/2011/10/03/changing-roles-at-wp-engine/</link>
		<comments>http://technosailor.com/2011/10/03/changing-roles-at-wp-engine/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 17:10:05 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[consulting]]></category>
		<category><![CDATA[employment]]></category>
		<category><![CDATA[jobs]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wpengine]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=8491</guid>
		<description><![CDATA[For some time, I&#8217;ve felt there was a change coming and today, I&#8217;m ready to announce that my role within WP Engine is changing. Starting today, I have transitioned into an advisory and consulting role with the company. Effective immediately, I will be taking the portion of the business that focused on professional services and [...]]]></description>
			<content:encoded><![CDATA[<p>For some time, I&#8217;ve felt there was a change coming and today, I&#8217;m ready to announce that my role within <a href="http://wpengine.com">WP Engine</a> is changing. Starting today, I have transitioned into an advisory and consulting role with the company.</p>
<p>Effective immediately, I will be taking the portion of the business that focused on professional services and consulting to allow the company to focus on premiere WordPress hosting. It&#8217;s a good thing and I&#8217;m excited about the possibilities. Back in November, we decided to start taking on some professional services work to augment demands from many of our customers. It was awesome to have fast, secure, scaleable, managed hosting but they wanted more!</p>
<p>And we wanted more.</p>
<p>However, as the company has evolved, taken funding, hired more people, addressed growth challenges and built out our hosting option, it seemed clear that the professional services portion of the company was a separate kind of deal than what we wanted to focus on.</p>
<p>So today, I&#8217;ll be taking that portion of the company (and all related existing and current relationships, as agreed on), and working on that. Meanwhile, I&#8217;ll still be working with the company to guide direction and strategy. So it&#8217;s good for everyone.</p>
<p>Effective immediately, I am available for all WordPress consulting roles. However, I am also currently entertaining all possibilities involving full time employment as well, and welcome those conversations.</p>
<p>To contact me, please direct emails to <a href="mailto:aaron@technosailor.com">aaron@technosailor.com</a>. As transitions go, the immediate financial impact is something that I need to consider.</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2011/10/03/changing-roles-at-wp-engine/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How is WordPress Subversion Organized</title>
		<link>http://technosailor.com/2011/09/30/how-is-wordpress-subversion-organized/</link>
		<comments>http://technosailor.com/2011/09/30/how-is-wordpress-subversion-organized/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 17:14:26 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress development]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=8486</guid>
		<description><![CDATA[There&#8217;s some confusion about how WordPress organizes it&#8217;s Subversion (SVN) repository. Most SVN repositories are organized into three main directories, as is best practice &#8212; trunk, tags, branches. The repository can be found at http://core.svn.wordpress.org/ and a primer on how to use SVN for WordPress development can be found on Mark&#8217;s blog and, for Windows, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://technosailor.com/files/svn-600x450.jpg" alt="" title="svn" width="584" height="438" class="aligncenter size-large wp-image-8487" /><br />
There&#8217;s some confusion about how WordPress organizes it&#8217;s Subversion (SVN) repository. Most SVN repositories are organized into three main directories, as is best practice &mdash; trunk, tags, branches. </p>
<p>The repository can be found at <a href="http://core.svn.wordpress.org/">http://core.svn.wordpress.org/</a> and a primer on how to use SVN for WordPress development can be found on <a href="http://markjaquith.wordpress.com/2005/11/02/my-wordpress-toolbox/">Mark&#8217;s blog</a> and, for Windows, on <a href="http://blog.ftwr.co.uk/archives/2005/11/03/windows-wordpress-toolbox/">Westi&#8217;s blog</a>.</p>
<p>Though there are varying schools of thought as to how branches and tags work, WordPress follows the following system:</p>
<p><strong>/trunk is where future release development occurs.</strong> Right now, WordPress development is focused on an upcoming 3.3 release. All development for this release is going into /trunk.</p>
<p><strong>/branches is where 3.3 will go once it is released (or where future &#8220;branches&#8221; of the software will be housed down the road.</strong> The directory contains a series of directories that are branches from the current release development &mdash; for example, /branches/3.0, /branches/3.1, /branches/3.2, etc. What you won&#8217;t find in branches are security (or dot) releases.</p>
<p>For instance, when a security vulnerability is discovered, it will be patched in /trunk for the current development branch and may be backported to the previous release branch (currently, 3.2). But until the next security release of WordPress comes out for that branch, it is still considered &#8220;development&#8221; and not &#8220;stable&#8221;.</p>
<p><strong>/tags is where stable releases are archived.</strong> No development goes into tagged releases. These are final releases. You will find every release here in the form of /tags/3.2.1, /tags/3.2, /tags/3.1.4, etc. If you&#8217;re looking for the latest current stable for production, this is the place to look.</p>
<p>When branches achieve the next milestone (i.e. a maintenance or security or &#8220;dot&#8221; release), this is the place where the code is kept.</p>
<p>Hopefully this makes the WordPress repository (and maybe other projects) clear as mud.</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2011/09/30/how-is-wordpress-subversion-organized/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WordPress Release Word Clouds</title>
		<link>http://technosailor.com/2011/06/21/wordpress-release-word-clouds/</link>
		<comments>http://technosailor.com/2011/06/21/wordpress-release-word-clouds/#comments</comments>
		<pubDate>Tue, 21 Jun 2011 21:41:57 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[Fun]]></category>
		<category><![CDATA[word clouds]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=8456</guid>
		<description><![CDATA[Yesterday, I published the 12th in an ongoing series of blog posts since December 26, 2005, where I take my own look at major WordPress releases and write a hopefully helpful article about features. It&#8217;s the routine, and now expected, &#8220;10 Things You Need to Know&#8221; posts. Out of morbid curiosity, I decided to run [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday, <a title="10 Things You Need To Know About WordPress 3.2" href="http://technosailor.com/2011/06/20/10-things-you-need-to-know-about-wordpress-3-2/">I published the 12th in an ongoing series of blog posts</a> since December 26, 2005, where I take my own look at major WordPress releases and write a hopefully helpful article about features. It&#8217;s the routine, and now expected, &#8220;10 Things You Need to Know&#8221; posts.</p>
<p>Out of morbid curiosity, I decided to run all of those posts through a word cloud generator and see if there were any trends that could be seen. Of course, it&#8217;s my writing so there are obvious tendencies and biases, but it was fun to see anyway.</p>
<p>One thing I did to make the results better&#8230; I removed the words WordPress and WP. Also, several of the posts had my name in it so I figured it would be better not to include that either.</p>
<h2>WordPress 2.0</h2>
<p><img class="aligncenter size-large wp-image-8457" title="wordpress20" src="http://technosailor.com/files/wordpress20-600x301.jpg" alt="" width="584" height="292" /></p>
<h2>WordPress 2.1<img class="aligncenter size-large wp-image-8458" title="wordpress21" src="http://technosailor.com/files/wordpress21-600x286.jpg" alt="" width="584" height="278" /></h2>
<h2>WordPress 2.2<img class="aligncenter size-large wp-image-8459" title="wordpress22" src="http://technosailor.com/files/wordpress22-600x381.jpg" alt="" width="584" height="370" /></h2>
<h2>WordPress 2.3<img class="aligncenter size-large wp-image-8460" title="wordpress23" src="http://technosailor.com/files/wordpress23-600x335.jpg" alt="" width="584" height="326" /></h2>
<h2>WordPress 2.5</h2>
<p><img class="aligncenter size-large wp-image-8461" title="wordpress25" src="http://technosailor.com/files/wordpress25-600x301.jpg" alt="" width="584" height="292" /></p>
<h2>WordPress 2.6<img class="aligncenter size-large wp-image-8462" title="wordpress26" src="http://technosailor.com/files/wordpress26-600x339.jpg" alt="" width="584" height="329" />WordPress 2.7<img class="aligncenter size-large wp-image-8463" title="wordpress27" src="http://technosailor.com/files/wordpress27-600x365.jpg" alt="" width="584" height="355" /></h2>
<h2>WordPress 2.8<img class="aligncenter size-large wp-image-8464" title="wordpress28" src="http://technosailor.com/files/wordpress28-600x401.jpg" alt="" width="584" height="390" /></h2>
<h2>WordPress 2.9<img class="aligncenter size-large wp-image-8465" title="wordpress29" src="http://technosailor.com/files/wordpress29-600x302.jpg" alt="" width="584" height="293" />WordPress 3.0<img class="aligncenter size-large wp-image-8466" title="wordpress30" src="http://technosailor.com/files/wordpress30-600x294.jpg" alt="" width="584" height="286" />WordPress 3.1<img class="aligncenter size-large wp-image-8467" title="wordpress31" src="http://technosailor.com/files/wordpress31-600x305.jpg" alt="" width="584" height="296" />WordPress 3.2<img class="aligncenter size-large wp-image-8468" title="wordpress32" src="http://technosailor.com/files/wordpress32-600x278.jpg" alt="" width="584" height="270" /></h2>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2011/06/21/wordpress-release-word-clouds/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>10 Things You Need To Know About WordPress 3.2</title>
		<link>http://technosailor.com/2011/06/20/10-things-you-need-to-know-about-wordpress-3-2/</link>
		<comments>http://technosailor.com/2011/06/20/10-things-you-need-to-know-about-wordpress-3-2/#comments</comments>
		<pubDate>Tue, 21 Jun 2011 04:36:12 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress 3.2]]></category>
		<category><![CDATA[wordpress cheatsheet]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=8439</guid>
		<description><![CDATA[Photo credit Randy Stewart. WordPress 3.2 will be released soon (at the time of this writing, it is in RC1 which essentially means it is done and being tested). This is an exciting release as it marks the first release that drops PHP 4 dependency. For years, WordPress has opted to play to the lowest [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-large wp-image-8443" title="wordpress-legs" src="http://technosailor.com/files/wordpress-legs-600x400.jpg" alt="" width="584" height="389" /></p>
<address><em>Photo credit Randy Stewart.</em></address>
<p>WordPress 3.2 will be released soon (at the time of this writing, it is in RC1 which essentially means it is done and being tested). This is an exciting release as it marks the first release that drops PHP 4 dependency. For years, WordPress has opted to play to the lowest common denominator while hosts have taken their sweet time arriving at PHP 5.</p>
<p>Of course, this may mean nothing to you, depending on your technical knowledge of the underlying language. However, it has limited the amount of innovation that could be possible using the more modern version of PHP 5.</p>
<p>The focus for this release was to slim down redundant code that had been added along the way to employ PHP 5 techniques in a PHP 4-compatible fashion. In addition, a focus was placed on slimming down code all along the way to provide a more efficient codebase. Eliminate, eliminate, eliminate! More Red than Green &#8211; a reference to the way changes are recorded visually where red is code elimination and green is code addition.</p>
<p>Regardless, the approach to PHP 5 adoption has had a positive effect. Approximately 12% of the web is powered today by WordPress, whether self-hosted &#8220;<a href="http://wordpress.org">.org</a>&#8221; sites or Automattic&#8217;s <a href="http://wordpress.com">WordPress.com</a> and other hosted WordPress sites.</p>
<p>As I have done eleven other times before, today I bring you the Ten Things that, in my opinion, you should know about WordPress 3.2.</p>
<h2>Twenty-Eleven</h2>
<p>One of the big things that was discussed internally around the time when WordPress 3.0 was released over a year ago was the need to keep the default theme fresh. To that end, for WordPress 3.0 did away with the old Kubrick theme and <a href="http://technosailor.com/2010/05/01/10-things-you-need-to-know-about-wordpress-3-0/">replaced it with the fresh and semantic Twenty-Ten theme</a>.</p>
<p>Yes, you can see how naming a theme Twenty-Ten in 2010 setup the opportunity for a Twenty-Eleven theme in 2011. And there is that opportunity for a new theme called Twenty-Twelve in 2012, but let&#8217;s not get too far ahead of ourselves.</p>
<p>Twenty-Eleven visually is not a huge departure from Twenty-Ten. It still uses much of the same visual layout that Twenty-Ten did. The new theme, however, is greatly different behind the scenes.</p>
<p><em>Note: This blog (along with all of my blogs) are running Twenty-Eleven <strong>right now.</strong></em></p>
<p><img class="aligncenter size-large wp-image-8444" title="twentyeleven-themoptions" src="http://technosailor.com/files/twentyeleven-themoptions-600x289.jpg" alt="" width="584" height="281" /></p>
<p>Users of Twenty-Eleven have the opportunity to select a one-column or two column layout for their blog from inside the WordPress Admin. The two column layouts can use a sidebar left or sidebar right variant.</p>
<p>My <a href="http://photos.aaronbrazell.com">photoblog</a> uses a one-column format, as an example.</p>
<p>Additionally, Twenty-Eleven also offers a dark and light color scheme. My photoblog, for instance, uses the dark format while this blog uses the light format.</p>
<p>Finally, as with Twenty-Ten, the theme allows for custom header images (or no header images) and backgrounds. Because of the professional nature of this blog, I&#8217;ve opted to use no header on this blog and my <a href="http://aaronbrazell.com">personal blog</a> utilizes a custom header image.</p>
<p>And of course, as with all things WordPress, no one says you have to settle for what Twenty-Eleven offers out of the box. In fact, it is encouraged that you use Twenty-Eleven as a parent theme that offers all of the benefits of the default theme while putting your own spin on it with a <a href="http://codex.wordpress.org/Child_Themes">child theme</a>.</p>
<h2>Distraction Free Writing</h2>
<p>While I write this post, I am using the successor to the Full-screen mode that has been in WordPress for some time. Full screen mode, in my opinion, never really was well adopted but it has been championed in the past by bloggers who focus on efficient workstyles, or Getting Things Done (&#8220;GTD&#8221;) approach to work.</p>
<p><img class="aligncenter size-large wp-image-8446" title="dfw" src="http://technosailor.com/files/dfw-600x416.jpg" alt="" width="584" height="404" /><img class="aligncenter size-large wp-image-8447" title="dfw2" src="http://technosailor.com/files/dfw2-600x429.jpg" alt="" width="584" height="417" /></p>
<p>The ability to shut out all distractions so as to focus on the task at hand is hugely important. WordPress core developer <a href="http://markjaquith.wordpress.com">Mark Jaquith</a> has said for years that his vision for WordPress was that it would become a tool that got out of the way of people and their writing. It&#8217;s not about WordPress. It&#8217;s about writing and the experience should be such that you should never have to think about what tool you are using to do that.</p>
<p>With Distraction Free Writing, you have just that. By clicking on the Full Screen (in HTML writing mode) or the new icon for DFW in the toolbar of the visual text editor, the blogger finds themself on a plain off-white canvas with minor tools along the top of the screen to assist in basic formatting. If you leave your hands off the mouse, even these fade away allowing you to just write in a pleasant, serene environment.</p>
<p>This feature is probably my favorite in WordPress 3.2 and usability/writer-facing features are rarely my favorite as a developer. I generally prefer new APIs and developer tools. However, this feature wins hands-down.</p>
<h2>Minor Overhaul to Administrative UI</h2>
<p>It&#8217;s been several years since WordPress has undergone a major Admin overhaul. There have been tweaks along the way, but by and large the administrative interface has stayed true to what it evolved into (with much research and usability testing) in <a href="http://technosailor.com/2008/11/18/10-things-you-need-to-know-about-wordpress-27/">WordPress 2.7</a>.</p>
<p><img class="aligncenter size-large wp-image-8448" title="newui" src="http://technosailor.com/files/newui-600x318.jpg" alt="" width="584" height="309" /></p>
<p>There is not a drastic overhaul in WordPress 3.2, but it is the larger than a few tweaks and color scheme modifications. In <a href="http://technosailor.com/2010/12/30/10-things-you-need-to-know-about-wordpress-3-1/">WordPress 3.1</a>, the Admin Bar (which I&#8217;ll talk about later) came into being and in 3.2, emphasis has been put on placing more commonly accessed functions into it as opposed to the main UI.</p>
<p>As a result, familiar things (which were often used for blogs in Multisite mode) such as the &#8220;Favorites Menu&#8221; have been removed to the Admin Bar. The Quick Access menu that allowed Multisite Super Admins quick access to the &#8220;Network Admin&#8221; has been relocated to a less-than-obvious dropdown  in the upper right. Hint: The dropdown menu can be accessed by clicking the &#8220;Howdy Aaron&#8221; link, where &#8220;Aaron&#8221; is your username.<img class="aligncenter size-full wp-image-8449" title="Quick-Menu" src="http://technosailor.com/files/Quick-Menu.jpg" alt="" width="269" height="151" /></p>
<p>Other aspects of the new interface are mainly aesthetic. Menus are where you&#8217;d expect them. Features are where they&#8217;ve always been. Plugin developers who have built UI for their plugins are still safe as long as, as usual, they are using the WordPress best-practices, i.e. using the same HTML formats and structures used in core.</p>
<h2>More Determined Move to the Admin Bar</h2>
<p>As mentioned before, the Admin Bar has become the focus of a &#8220;Command Center&#8221; approach. By default, quick actions like Adding a new post or editing a page or getting quick access to the dashboard of other Multisite sites are loaded into quick menus in the Admin Bar.</p>
<p>This is also where the philosophy of plugin development that provides quick access to features should be. A good example of this is the Purge Cache functionality in <a href="http://wordpress.org/extend/plugins/w3-total-cache/">W3 Total Cache</a>. Where this has been in the Favorites menu inside WordPress, it now will have to move to the Admin Bar. This seems like a more natural place to me anyway. Other plugin developers should look at their code to ensure that they are compliant with this approach.</p>
<p>John Brook has a <a href="http://johanbrook.com/development/wordpress/customizing-the-wordpress-admin-bar/">most excellent tutorial</a> on creating and adding menus to the Admin Bar.</p>
<h2>PHP 5.2.4 and MySQL 5.0</h2>
<p>I mentioned the new system requirements at the beginning of this article. This shift to PHP 5 has been a long time in coming and was done deliberately to time with WordPress hosting on PHP 4 dipping below 10%. <em>In other words, it is more than likely your host is already on PHP 5.2.4+</em>. However, you should verify this if you&#8217;re not sure.</p>
<p>With the adoption of PHP 5.2.4, there is also a bump in the requirements for MySQL. Now WordPress requires MySQL 5.0, another hurdle that is not very hard to overcome but should be verified if you&#8217;re not sure.</p>
<p>Ryan Duff has created a <a href="http://wordpress.org/extend/plugins/wordpress-requirements-check/">quick and easy plugin</a> that can be installed to ensure compatibility with WordPress 3.2.</p>
<h2>For Newbies, a Better Help Menu on Each Page<img class="aligncenter size-large wp-image-8450" title="help" src="http://technosailor.com/files/help-600x203.jpg" alt="" width="584" height="197" /><img class="aligncenter size-large wp-image-8451" title="morehelp" src="http://technosailor.com/files/morehelp-600x324.jpg" alt="" width="584" height="315" /></h2>
<p>For some time, WordPress has included a contextual &#8220;Help&#8221; menu in the upper right of many of the screens in the admin interface. However, with WordPress 3.2, every page has a help menu. Not only does every page have a help menu, newbies can get detailed contextual assistance for each page. Veteran users already know their way around, so this will be less than helpful, but for n00bs, the guidance lowers the barrier to entry.</p>
<h2>Upgrade Enhancement &#8211; Just the code you need!</h2>
<p>Think iOS5 but for WordPress. When Steve Jobs announced at WWDC recently that<a href="http://www.engadget.com/2011/06/06/apple-turns-ios-pc-free-with-ota-updates-and-wireless-sync/"> iOS updates would <em>in the future</em> come in smaller packages</a> applying just new code and differences over the air, WordPress was already working on this (errr, except the over the air part).</p>
<p>Up until WordPress 3.2, upgrades were performed by downloading the entire package and applying it over the existing install. While this was fine, it took a lot more time due to the larger package size. This new version <em>will enable</em> future upgrades of WordPress to be done incrementally making the process much faster and efficient.</p>
<h2>Code Efficiency enhancements</h2>
<p>A huge emphasis was placed on core efficiency in this release. Many of the updates that have gone into this release have been major refactoring of code as well as the removal of legacy (and now unneeded) PHP4 compatibility code.</p>
<p>When I write these articles, I like to look at a diff file of all code changes between the last major release and the current. I was blown away by the amount of PHP4 compatibility code that has been axed.</p>
<p>Additionally, a lot of effort has been placed on database optimization. Many queries have been made more efficient. These things are less notable for smaller sites, but for large sites and hosting companies (such as my company, <a href="http://wpengine.com">WP Engine</a>), these types of optimizations add up in orders of magnitude!</p>
<h2>File System API</h2>
<p>Another optimization that has been made (getting the clue that this release is all about streamlines?) has been in the code that handles upgrades and automatic installs of plugins. When the original code was written, it was written to find what methods were available to write to the filesystem. This was because WordPress does the best it can to be as compatible as possible with as many server configurations as possible.</p>
<p>Some of the more obsolete (and unnecessary) transports have been done away with in favor of <em>Streams. </em>Though streams existed in PHP 4.3 (WordPress&#8217; former system requirement), the upgraded requirement now allows us to do so much more with file transfer, handling and writing.</p>
<p>But I don&#8217;t want to get overly technical right now.</p>
<h2>No IE6 Support<img class="aligncenter size-large wp-image-8452" title="ie6wordpresscom" src="http://technosailor.com/files/ie6wordpresscom-600x337.jpg" alt="" width="584" height="328" /></h2>
<address>Screenshot courtesy of <a href="http://mashable.com/2011/05/19/wordpress-com-ie6/">Mashable</a>.</address>
<p>We all knew Internet Explorer was dead. Well, most of us. Believe it or not, there are still folks (mostly in government and enterprise organizations) where IE6 is still in use. While WordPress has always endeavored to be as compatible with as many configurations as possible, just like file handling replaced by Streams and PHP4 going the way of the Dodo Bird, <a href="http://www.theie6countdown.com/default.aspx">IE6 can die in a fucking fire too</a>. Oops. Sorry, kids. No more IE6 support.</p>
<h2>Automatically approve parent comments</h2>
<p>Finally, a longtime nuance has been comment approval. Comments have always been a one-to-one relationship with approval. You approve one comment at a time. And while that&#8217;s normally fine, what if you have nested comments and you approve a child comment but not a parent comment? Then you have a weird hierarchy that may not make a lot of sense.</p>
<p>In WordPress 3.2, now when you approve a comment that has an unapproved parent comment, the parent comment will also be approved. Many people have asked for that and now it&#8217;s here.</p>
<h2>BONUS: Credits Screen</h2>
<p>But wait&#8230; There&#8217;s one more thing. Every release, hundreds of people participate in the development process by writing code, contributing patches, discussing ideas in IRC and on <a href="http://trac.wordpress.org/">Trac</a>. That doesn&#8217;t even begin to acknowledge the testers, translators, and documentation writers who contribute their time free of charge.</p>
<p>Now, in the footer of the WordPress Admin, you&#8217;ll find a Credits link that shows everyone who has contributed to this release. Good job, guys! (I&#8217;m one of the contributors).</p>
<p><img class="aligncenter size-large wp-image-8453" title="credits" src="http://technosailor.com/files/credits-572x450.jpg" alt="" width="572" height="450" /></p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2011/06/20/10-things-you-need-to-know-about-wordpress-3-2/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>WordPress Bible: 2E Released (and a contest)</title>
		<link>http://technosailor.com/2011/04/01/wordpress-bible-2e-released-and-a-contest/</link>
		<comments>http://technosailor.com/2011/04/01/wordpress-bible-2e-released-and-a-contest/#comments</comments>
		<pubDate>Fri, 01 Apr 2011 15:58:40 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[resources]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress bible]]></category>

		<guid isPermaLink="false">http://technosailor.aaronbrazell.com/?p=8413</guid>
		<description><![CDATA[A few months ago, I let you know that WordPress Bible: Second Edition was available for pre-order. That has changed. It is now out and available to be ordered. Amazon, as usual, is the best way to order it.
This edition of my book has 60 new pages in it and covers up to WordPress 3.1. So all that stuff about post formats, custom post types, custom taxonomies, the merge of WordPress MU into WordPress as Multisite, the terminology changes… all of it…. covered in this book.]]></description>
			<content:encoded><![CDATA[<p><img src="http://technosailor.com/files/wpbible21-319x400.jpg" alt="" title="wpbible2" width="319" height="400" class="alignright size-medium wp-image-8414" />A few months ago, I let you know that <a href="http://technosailor.com/2011/01/18/pre-order-wordpress-bible-2nd-edition/">WordPress Bible: Second Edition was available for pre-order</a>. That has changed. It is <a href="http://amzn.to/wpbible2">now out and available to be ordered</a>. Amazon, as usual, is the best way to order it.</p>
<p>This edition of my book has 60 new pages in it and covers up to WordPress 3.1. So all that stuff about post formats, custom post types, custom taxonomies, the merge of WordPress MU into WordPress as Multisite, the terminology changes&#8230; all of it&#8230;. covered in this book.</p>
<p>I didn&#8217;t get everything right in the first edition. There were glaring omissions, politically incorrect moves (such as coverage of non-GPL products), and blatant mistakes. These have all been corrected in the second edition.</p>
<p>I&#8217;d love it if you supported the book and me. Please leave a review on Amazon as that helps drive more sales as well as proves the market for the book.</p>
<p>But here&#8217;s the question&#8230; how can the WordPress Bible, and the whole Bible series, be better? If you own more than one, what do you feel the strengths and weaknesses of the books are. Where can I (and Wiley) improve. This feedback is super-important. Feel free to email me on that if you don&#8217;t wish to publish publicly in comments.</p>
<p>Finally&#8230; if you take a picture of you with your first edition book, post it to Twitter to my attention, you have the chance to win a free signed copy of the second edition. I have my criteria for selecting a winner, but that will remain unshared for the time. So get to snapping and tweeting. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2011/04/01/wordpress-bible-2e-released-and-a-contest/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>INFOSEC 101: Breaking Down Scary Terms and What They Mean</title>
		<link>http://technosailor.com/2010/12/30/infosec-101-breaking-down-scary-terms-and-what-they-mean/</link>
		<comments>http://technosailor.com/2010/12/30/infosec-101-breaking-down-scary-terms-and-what-they-mean/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 19:51:14 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[0day]]></category>
		<category><![CDATA[csrf]]></category>
		<category><![CDATA[ddos]]></category>
		<category><![CDATA[dos]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[sql injection]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://technosailor.aaronbrazell.com/?p=8372</guid>
		<description><![CDATA[I am not a hacker. But I understand the information security world. It&#8217;s a scary place, unfortunately, to people who have no exposure to it. Yesterday, WordPress 3.0.4 was released as a critical release&#8230; and it was. Matt explained the reason for the release in this way: Version 3.0.4 of WordPress&#8230;is a very important update [...]]]></description>
			<content:encoded><![CDATA[<p>I am not a hacker. But I understand the information security world. It&#8217;s a scary place, unfortunately, to people who have no exposure to it. Yesterday, <a href="http://wordpress.org/news/2010/12/3-0-4-update/">WordPress 3.0.4 was released</a> as a critical release&#8230; and it was. Matt explained the reason for the release in this way:</p>
<blockquote><p>Version 3.0.4 of WordPress&#8230;is a very important update to apply to your sites as soon as possible because it fixes a core security bug in our HTML sanitation library, called KSES. I would rate this release as “critical.”</p></blockquote>
<p>Simple enough. He goes on to refer to the vulnerability as an XSS vulnerability which caused a bit of angst on Twitter about what that means and if non-technical users should be given more information due to the terminology.</p>
<p>So, as a public service, I give you some basic definitions and concepts of web security and what we mean. These concepts are rightly scary, but the names tend to be scarier to those who don&#8217;t understand them.</p>
<h2>XSS</h2>
<p><strong>XSS</strong> means cross site scripting. Cross site scripting attacks are generally attacks that occur because <em>something</em> is injected into a URL or &#8220;event&#8221; on a site to make the site do something else. Do something else can mean &#8220;hijack&#8221; a site so all visitors are sent somewhere else, or special HTML is injected into a site (often in the form of hidden links that diminish Google search results for the site, etc). This was the nature of the vulnerability fixed in WordPress yesterday.</p>
<p>XSS attacks are almost always carried out because of JavaScript injection. WordPress does have security API that makes dangerous characters (that is, special characters that make JavaScript do things) and it is encouraged that all plugin and theme developers use these APIs. <a href="http://codex.wordpress.org/Data_Validation">[Docs]</a></p>
<p><img class="aligncenter size-large wp-image-8373" title="3187207970_7dd7c42426_z" src="http://technosailor.com/files/3187207970_7dd7c42426_z-600x398.jpg" alt="" width="600" height="398" /></p>
<h2>CSRF</h2>
<p><strong>CSRF</strong> means Cross Site Request Forgery. With CSRF attacks, browsers (and sometimes other things) are hijacked to &#8220;do&#8221; things to a website without a user knowing. It&#8217;s the proverbial trojan horse where there is an inherent trust from a site that the user/browser is doing something trusted and so attacks riding the coat tails of such trust are given the same trust that the user would also get.</p>
<p>A simple example (does not actually exist) would be that an authenticated user in WordPress with admin privileges is tricked into clicking a link (as the authenticated user) and then admin privileges are transferred to the attacker. We&#8217;ve seen this kind of attack on Facebook and Twitter before where DMs or messages are spread across Facebook walls or via Twitter DM).</p>
<h2>SQL Injection</h2>
<p><strong>SQL Injection</strong> is an attack that, without going into the technical details, allows an attacker to send special queries to the database that can alter, modify or even delete a database altogether. You don&#8217;t see many of these anymore because most apps are built on frameworks or platforms (like WordPress or Drupal) that have built in routines and APIs that prevent this. In WordPress, there is a prepare() function in the database class which ensures that no SQL injection is possible.</p>
<h2>0Day Vulnerabilities</h2>
<p><strong>0Day</strong> (that is Zero, not &#8220;Oh&#8221;) is a vulnerability that is exploited before it has been disclosed. Many security researchers work closely with web application developers to alert them to newly discovered vulnerabilities before they are publicly disclosed. They then work with the developers to close the hole before disclosing the vulnerability. The term 0Day comes from the idea that the web app developer knows about the exploit on the 0th day after public disclosure (it hasn&#8217;t been disclosed yet).</p>
<h2>Denial of Service/(D)DoS</h2>
<p><strong>(D)DoS</strong> is a (Distributed) Denial of Service attack. These attacks are carried out by flooding a site with traffic/requests to the point where the site can no longer handle the traffic and collapses. If the attack comes from a single source, it&#8217;s a DoS but if it comes from more than one, it is a DDoS.</p>
<p>Obviously, there are many aspects of security. We could go way complicated on terminology and concepts, but these are some of the basics you should know when you see something about a vulnerability.</p>
<p><cite>Photo Credit: <a href="http://www.flickr.com/photos/heathbrandon/3187207970/">heathbrandon</a></cite></p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2010/12/30/infosec-101-breaking-down-scary-terms-and-what-they-mean/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>10 Things You Need to Know About WordPress 3.1</title>
		<link>http://technosailor.com/2010/12/30/10-things-you-need-to-know-about-wordpress-3-1/</link>
		<comments>http://technosailor.com/2010/12/30/10-things-you-need-to-know-about-wordpress-3-1/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 15:44:24 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress 3.1]]></category>
		<category><![CDATA[wordpress cheatsheet]]></category>
		<category><![CDATA[WordPress Releases]]></category>

		<guid isPermaLink="false">http://technosailor.aaronbrazell.com/?p=8360</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2010/12/30/10-things-you-need-to-know-about-wordpress-3-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>WordCamp Mid-Atlantic: Where It&#8217;s Been, Where It&#8217;s Going</title>
		<link>http://technosailor.com/2010/09/21/wordcamp-mid-atlantic-where-its-been-where-its-going/</link>
		<comments>http://technosailor.com/2010/09/21/wordcamp-mid-atlantic-where-its-been-where-its-going/#comments</comments>
		<pubDate>Wed, 22 Sep 2010 03:52:56 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[baltimore]]></category>
		<category><![CDATA[dc]]></category>
		<category><![CDATA[washington]]></category>
		<category><![CDATA[wcma]]></category>
		<category><![CDATA[wcmidatl]]></category>
		<category><![CDATA[WordCamp]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://technosailor.aaronbrazell.com/?p=8327</guid>
		<description><![CDATA[Late in 2008, while I was transitioning from life in Baltimore to life outside of Washington, D.C., I was contemplating organizing the first WordCamp event in that area. Baltimore had begun to show signs of a healthy tech community and Washington had continued to flourish as a healthy communications scene. Philadelphia, just up I-95, had [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://technosailor.com/files/wcmalogo.png" alt="" title="wcmalogo" width="299" height="178" class="alignright size-full wp-image-8328" />Late in 2008, while I was transitioning from life in Baltimore to life outside of Washington, D.C., I was contemplating organizing the first WordCamp event in that area. Baltimore had begun to show signs of a healthy tech community and Washington had continued to flourish as a healthy communications scene. Philadelphia, just up I-95, had a healthy design and development community and I had become somewhat familiar with that city as well.</p>
<p>I made a point of making my event one that would set trends and challenge the status quo.</p>
<h3>Mid-Atlantic</h3>
<p>One thing I did think of early on was that I detested the trend that identified an event with a singular city, especially when there were multiple cities, all offering different, yet complementary <em>modus operandi</em>. I bucked the trend of identifying the event by a city, eschewing names like WordCamp DC or WordCamp Baltimore. These names, while celebratory of the city that hosts them, inherently bear the problem of inferred exclusivity.</p>
<p>From the very first WordCamp in the region, I challenged that designation and attempted to bring the cities together. It was called <a href="http://wordcampmidatlantic.com">WordCamp Mid-Atlantic</a>.</p>
<h3>Three Cities, then Two</h3>
<p>The original plan was to bring the three cities together in Baltimore for a WordPress event. Ideally, the result would be more collaboration and resources shared between the various communities. Ultimately, Philadelphia never bought into Mid-Atlantic (and in fact, ended up with their own successful <a href="http://wordcampphilly.com/">WordCamp Philly</a>). However, Mid-Atlantic was wildly supported by both Baltimore and DC. even garnering coverage in the <a href="http://articles.baltimoresun.com/2009-05-14/business/0905130133_1_wordpress-software-blogging-baltimore">Baltimore Sun</a> business publication <a href="http://mddailyrecord.com/2009/05/15/wordpress-bloggers-travel-to-baltimore-for-workshop/">Maryland Daily Record</a>.</p>
<p>For WordCamp Mid-Atlantic 2010, the event was geared mainly to the Washington Metro and Baltimore.</p>
<h3>Keynotes That Challenge</h3>
<p>In both events, I wanted to bring in someone from the WordPress leadership hierarchy as a Keynote as well as someone from outside of WordPress entirely to challenge the gathered attendees. This as quite controversial, actually. In 2009, I brought in Anil Dash, founder and former SVP at <A href="http://sixapart.com">SixApart</a>. Anil was known historically as somewhat of an antagonist, but did a wonderful job in sharing and illustrating the similarities between WordPress and SixApart who provided a competing platform. His message was one of learning from each other.</p>
<p>This past year, I opted to bring in <a href="http://blog.tabini.ca">Marco Tabini</a> who has also been a frequent antagonist of WordPress. His message was one from the perspective of the PHP community and reconciling how the PHP core people could learn and help the WordPress core people, and vica versa. My inbox became a little tense in the weeks leading up to the event due to other incidents involving dissenting views about the GPL license and WordPress&#8217; interpretation of it. Needless to say, Marco did an amazing job.</p>
<h3>It&#8217;s Not My Baby</h3>
<p>As most of you know, I have left the Baltimore/Washington region. As a result, this past WordCamp Mid-Atlantic was my last. People have asked me quite a lot about who I would pass the baton to. This is a tricky question because the event is not mine. It&#8217;s yours.</p>
<p>That said, this is not for just anyone to run. I cannot put any strings on who will run the next event but I do have the platform to voice my sentiments:</p>
<ul>
<li>I want to see Mid-Atlantic stay in the event. I do not want to see a fractured event where there becomes a WordCamp Baltimore and a WordCamp DC. Both cities have user groups that meet frequently. I want to see the WordCamp Mid-Atlantic event retain it&#8217;s place as a regional/local event.</li>
<li>I want to see the idea of challenging (and even dissenting) opinions welcomed to the stage, like Marco&#8230; and Anil. We should not be scared of being shaken up. We should embrace it and learn from it. That said, future organizers should be sensitive as to who you have come and speak.</li>
<li>Retain the unconference. One of the amazing success stories of WordCamp Mid-Atlantic 2010 was the unconference, organized by Steve Fisher. Besides the pre-scheduled and organized tracks that are familiar to conference goers, we provided a separate, yet equal unconference for ad-hoc discussion and talks. The only thing I&#8217;d change is to make it true barcamp style and make a no-powerpoint rule.</li>
<li>No one organizer. I became the defacto organizer for both events. While I had varying degrees of help for both, I really became the guy for the event. This was not wise on my part. There should be an organizer in each city.</li>
</ul>
<p>This is Baltimore&#8217;s event. This is Washington&#8217;s event. This event brilliantly integrated both communities. It really, really did. I want to see it continue (obviously with new leadership), but I want it to be with people who take it seriously and can make it better than it ever was. Put your own spin on it. Make it your own, not mine.</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2010/09/21/wordcamp-mid-atlantic-where-its-been-where-its-going/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Back in Startup Mode&#8230; Announcing WP Engine!</title>
		<link>http://technosailor.com/2010/07/29/back-in-startup-mode-announcing-wp-engine/</link>
		<comments>http://technosailor.com/2010/07/29/back-in-startup-mode-announcing-wp-engine/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 14:37:57 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[startups]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wpengine]]></category>

		<guid isPermaLink="false">http://technosailor.aaronbrazell.com/?p=8262</guid>
		<description><![CDATA[Since I moved to Austin, I have been very coy about what I&#8217;ve been up to. There&#8217;s a reason for that and today I can tell you all about it. Especially since my good friend Marshall over at ReadWriteWeb already has. :-) It was very interesting. Back in May, my friend Pete Jackson, who works [...]]]></description>
			<content:encoded><![CDATA[<p>Since I moved to Austin, I have been very coy about what I&#8217;ve been up to. There&#8217;s a reason for that and today I can tell you all about it. Especially since my good friend Marshall over at ReadWriteWeb <a href="http://www.readwriteweb.com/archives/turn-key_customizable_wordpress_hosting_maintenance.php">already has</a>. :-)</p>
<p>It was very interesting. Back in May, my friend <a href="http://twitter.com/peteonrails">Pete Jackson</a>, who works for <a href="http://intridea.com">Intridea</a>, started making a point of introducing me over to Twitter to one of his friends in whatever city I happened to be travelling in at that moment.</p>
<p>It was in this way that I met <a href="http://twitter.com/theseancook">Sean Cook</a>, the manager of mobile integrations at Twitter in San Francisco and, when I was in Austin visiting in May, he made sure that I met <a href="http://twitter.com/techscruggs">Aaron Scruggs</a> of <a href="http://otherinbox.com">Other Inbox</a> who has since become a pretty good friend.</p>
<p>It was after that meeting with Scruggs in May that he connected me to one of the smartest guys I&#8217;ve ever met, <a href="http://blog.asmartbear.com">Jason Cohen</a>. Jason is one of the two founding partners at <a href="http://www.capitalthought.com/">Capital Thought</a>, an Austin-based incubator. Jason has also built several companies and parlayed two of those into healthy exits. I&#8217;ve come to have a tremendous amount of respect for his technical and business savvy.</p>
<p>Jason described to me the concept for a business that he was working on along with <a href="http://www.10hats.com/">Cullen Wilson</a>. A premium, WordPress platform that would cater specifically to the customers who want to  make sure their blog is always taken care of from a maintenance and upgrade perspective, but also would offer significant value adds that nobody else is providing in a WordPress-optimized environment.</p>
<p><img class="alignright size-large wp-image-8263" title="welovewordpress" src="http://technosailor.com/files/welovewordpress-635x441.png" alt="" width="635" height="441" /></p>
<p>I&#8217;ll get to what all those buzzwords mean in a minute. Stick with me.</p>
<p>We started talking about me joining up with them to take this idea to the bank. Shortly after moving down here to Austin, I joined the team and we&#8217;ve been working hard over the last couple months to get to the point where we could reliably take on new customers and talk about our idea publicly.</p>
<p><em>Today is that day.</em></p>
<p>So, you&#8217;re still probably wondering what the hell <a href="http://wpengine.com">WP Engine</a> is and why it&#8217;s important, right?</p>
<p>Let&#8217;s talk security for a minute. There have been significant security &#8220;incidents&#8221; in recent months. Most people on the outside simply see &#8220;WordPress hacked! WordPress hacked!&#8221; &#8211; I&#8217;m looking at you <a href="http://chrisbrogan.com">Chris Brogan</a>, <a href="http://scobleizer.com">Robert Scoble</a> and <a href="http://techcocktail.com">Frank Gruber (Techcocktail)</a>. In the WordPress community, we know the real issues in these cases were not WordPress but the hosts that the blogs were on. Still, people saw WordPress hacked.</p>
<p>We take this very seriously and have partnered with a provider that has multiple levels of security including Intrusion Detection Systems (IDS) outside of our boxes. We have gone to great lengths to keep our customers connecting to us in very secure ways and keep a close eye on the activity happening on our boxes. This is all very important because if an attacker could get through our outside defenses, chances are they couldn&#8217;t do anything malicious without us knowing about it.</p>
<p>Our infrastructure is also built with optimization and <em>blazing, fast speed a</em>s a core expectation and deliverable. We don&#8217;t overload servers and have the means to see potential performance problems before they arrive. With our dual nginx-apache server configuration, we are able to handle sustained high-volume traffic as well as spikes that are the pain point for WordPress bloggers who suddenly get a story featured on a prominent site.</p>
<p><em><span style="font-style: normal;"> </span><span style="font-style: normal;">For the people who claim WordPress doesn&#8217;t scale&#8230; I call bullshit. We believe we know exactly how to make WordPress scale.</span></em></p>
<p><em><span style="font-style: normal;">But we&#8217;re not just a hosting company. If we were that, we would be our competitors. We are also working on additional features such as &#8220;Curated Plugins&#8221; which are plugins that are entirely open source, that are popular or in demand from our customers and have been vetted from a security standpoint. These are plugins that we support 100%. This does not preclude customers from using other non-supported plugins, and we don&#8217;t dictate what bloggers can have on their blog as some of the other hosted WordPress solutions do. We just say, &#8220;Hey, if you use one of these, we&#8217;re gonna have your back&#8221;.</span></p>
<p><span style="font-style: normal;">Other things that make WP Engine different:</span></p>
<ul>
<li><span style="font-style: normal;">3 Smart guys supporting customers personally</span></li>
<li><span style="font-style: normal;">A &#8220;Staging&#8221; area for one-click deployments and testing</span></li>
<li><span style="font-style: normal;">We give back to the community. In fact, I made sure that I could work on the WordPress open source project, write the second edition of my book, and that much of our work will be returned to the community. Code is a commodity. The people and service behind the code is not.</span></li>
</ul>
<p><span style="font-style: normal;">We are not perfect yet, nor do we claim to be. We are a young company and have hundreds of things still to do and hopefully learn from. We are in an &#8220;invite only&#8221; mode at this time as much of the stuff we are doing and want to do is still not ready. But we are open for business and taking customers. And for $50/mo <a class="simple-footnote" title="For most customers" id="return-note-8262-1" href="#note-8262-1"><sup>1</sup></a> for a dedicated WordPress environment that has optimization, speed and security plus the flexibility of you doing your own thing with a safety net&#8230; it&#8217;s a steal, really.</span></p>
<p><cite>Photo used with permission by <a href="http://inphotos.org/we-love-wordpress/">Donncha O Caoimh</a></cite></p>
<p></em></p>
<div class="simple-footnotes"><p class="notes">Notes:</p><ol><li id="note-8262-1">For most customers <a href="#return-note-8262-1">&#8617;</a></li></ol></div>]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2010/07/29/back-in-startup-mode-announcing-wp-engine/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Impending Legal Precedent for GPL Licensing?</title>
		<link>http://technosailor.com/2010/07/14/impending-legal-precedent-for-gpl-licensing/</link>
		<comments>http://technosailor.com/2010/07/14/impending-legal-precedent-for-gpl-licensing/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 21:38:42 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[gpl]]></category>
		<category><![CDATA[gplv2]]></category>
		<category><![CDATA[legal]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://technosailor.aaronbrazell.com/?p=8226</guid>
		<description><![CDATA[If you pay attention to the WordPress world, you might be aware that a landmark lawsuit is likely to be filed. I say landmark expecting that both sides will litigate and not settle &#8211; something that is desperately needed in the United States to validate and uphold the scope of the GPL license. WordPress is [...]]]></description>
			<content:encoded><![CDATA[<p>If you pay attention to the WordPress world, you might be aware that a landmark lawsuit is likely to be filed. I say landmark expecting that both sides will litigate and not settle &#8211; something that is desperately needed in the United States to validate and uphold the scope of the GPL license.</p>
<p>WordPress is a free software that is licensed under <a href="http://www.gnu.org/licenses/gpl-2.0.html">GPLv2</a> &#8211; a license that was created in 1991 to protect the ability of developers and users to gain access to software, create derivative works and distribute the copyrighted code <em>in its entirety</em> under the same protective license.</p>
<p>One of the tenants of the GPL that is argued prolifically is that derivative works are works that &#8220;link&#8221; into other works via APIs and dependencies (such as library dependencies). According to the argument, software that is considered a derivative work must retain the same licensing as the GPL&#8217;d work that it links into.</p>
<p>There are many legal (and non-legal) minds who would like to interpret this license in a variety of ways. There have been notable legal cases around the GPL in the United States, but all (to the best of my knowledge) have settled prior to litigation. One of these cases, <em>Progress Software v MySQL AB</em>, revolved around a product called Nusphere that was bundled with MySQL but was proprietary and incompatible with the GPL. The judge refused to grant summary judgement and eventually MySQL simply did not bundle the proprietary software.</p>
<p><img src="http://technosailor.com/files/117048243_7cc6bb0b87_b-635x423.jpg" alt="" title="117048243_7cc6bb0b87_b" width="635" height="423" class="aligncenter size-large wp-image-8227" /></p>
<p>Another case avoided judicial decision &#8211; and thus avoided judicial precedence. That case, <em>Free Software Foundation v. Cisco</em>, was settled out of court with a donation from Cisco and a pledge of commitment to the GPL.</p>
<p>Today, a major incident happened that has been brewing for years now. Due to an unfortunate incident which involved source code for the popular Thesis theme for WordPress (from <a href="http://diythemes.com">DIYThemes</a>) becoming compromised by a hacker, tempers started boiling over. Matt Mullenweg, founder of <a href="http://wordpress.org">WordPress</a> and the public face of <a href="http://automattic.com">)Automattic</a>, the largest company behind the WordPress project, ended up on a live interview alongside Chris Pearson of DIYThemes.</p>
<p>Matt suggests (I think accurately) that a theme that is provided for WordPress (it does not work without WordPress) is a derivative work and requires GPL compatibility. He also suggests (accurately, I think) that GPL compliance would only enhance DIYTheme&#8217;s business as evidenced by countless other proprietary software providers who have gone open source.</p>
<p>Not to mention that a license does insinuate adherence to legal requirements provided by the license. If you don&#8217;t agree to the terms of the license, you&#8217;re not permitted to use the software. Makes sense.</p>
<p>Chris&#8217; defense is that Thesis is completely independent of WordPress (which I question the rationality of since the software cannot exist absent of WordPress). He believes he has a business and economic right to maintain a license that is at odds with WordPress&#8217; GPL license.</p>
<p>So my editorial question is&#8230; compliance with the WordPress GPL license is optional but compliance with the Thesis license is not? Hmmm.</p>
<p>Matt, in so many words, has already indicated that there will be a lawsuit that comes out of this. This could be landmark as, if the suit were not settled, it could define the parameters of open source software creation, usage and distribution reaching into every aspect of our life. Who uses Firefox? Yeah&#8230; depending on the outcome, that could be affected.</p>
<p>In a perfect world, the two sides reach an amicable solution. Thesis <em>is</em> popular, but it is not the only game in town. However, the second best solution is a legal precedent governing GPL software.</p>
<p>So we stand by and wait.</p>
<p><cite>Image by <a href="http://www.flickr.com/photos/joegratz/117048243/">Joe Gratz</a></cite></p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2010/07/14/impending-legal-precedent-for-gpl-licensing/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>10 Things You Need to Know About WordPress 3.0</title>
		<link>http://technosailor.com/2010/05/01/10-things-you-need-to-know-about-wordpress-3-0/</link>
		<comments>http://technosailor.com/2010/05/01/10-things-you-need-to-know-about-wordpress-3-0/#comments</comments>
		<pubDate>Sat, 01 May 2010 04:27:50 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress 3.0]]></category>
		<category><![CDATA[wordpress cheatsheet]]></category>
		<category><![CDATA[wordpress mu]]></category>
		<category><![CDATA[wordpress multisite]]></category>

		<guid isPermaLink="false">http://technosailor.aaronbrazell.com/?p=8159</guid>
		<description><![CDATA[By now, you&#8217;ve probably heard the hype about WordPress 3.0. You may have even seen the WordPress 3.0 preview webinar I did not too long ago. This is somewhat of an odd release as I can&#8217;t point to 10 individual new features in WordPress. However, I can point to several very large new features that [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://technosailor.com/2010/05/01/10-things-you-need-to-know-about-wordpress-3-0/grey-xl/" rel="attachment wp-att-8170"><img src="http://technosailor.com/files/grey-xl.png" alt="" title="grey-xl" width="250" height="250" class="alignright size-full wp-image-8170" /></a>By now, you&#8217;ve probably heard the hype about WordPress 3.0. You may have even seen the <a href="http://technosailor.com/2010/04/22/wordpress-3-0-preview-webinar/">WordPress 3.0 preview webinar</a> I did not too long ago.</p>
<p>This is somewhat of an odd release as I can&#8217;t point to 10 individual new features in WordPress. However, I can point to several <em>very large</em> new features that have been hyped enough already. Inside each of these new major things, there are several components. So, let me break the ten things down into three groups. We&#8217;re a little behind schedule (thanks to Jane Wells&#8217; cat below) but I think the wait is worth it.</p>
<h2>The Merge! WordPress and WordPress Multisite Together At Last</h2>
<p>Back at WordCamp San Francisco last year (which is happening this weekend and I will be at), Matt Mullenweg announced that WordPress and WordPress MU would be merging into one singular software package. <a href="http://technosailor.com/2009/05/30/wordcamp-sf-announcement-wordpress-and-wordpress-mu-to-merge/">I covered that shortly after the announcement</a>. The reasoning was that all of the WordPress core was already in sync with WordPress MU and MU simply had a bit more functionality added to it. Most of the code is the same. Why split resources and developers?</p>
<p>WordPress 3.0 is where this merge takes place.</p>
<h3>Language Changes</h3>
<p>While this is not a new feature in WordPress, existing WordPress MU users may find themselves &#8220;thrown&#8221; by new terminology involved in WordPress 3.0. In WordPress MU, we had the concept of a &#8220;Site&#8221; which was an <em>installation</em> of WordPress MU. Within a Site you could have one or more blogs.</p>
<p>In WordPress 3.0, we have the concept of a Network (which was a Site in WordPress MU) and under a Network, we have Sites (which were Blogs). Sites are Blogs. Networks are Sites. Site Admins in WordPress MU are now called Super Admin&#8217;s in WordPress 3.0. Making things complicated, we don&#8217;t call it WordPress MU anymore. We call it putting WordPress into <em>Multisite</em> mode. Complicated, eh? New WordPress Core Developer, Andrew Nacin, <a href="http://www.andrewnacin.com/2010/03/25/terminology-nightmare-blogs-sites-networks/">describes this terminology nightmare</a>.</p>
<h3><a rel="attachment wp-att-8165" href="http://technosailor.com/2010/05/01/10-things-you-need-to-know-about-wordpress-3-0/attachment/129164777472495202/"><img class="alignleft size-thumbnail wp-image-8165" title="129164777472495202" src="http://technosailor.com/files/129164777472495202-250x187.jpg" alt="" width="250" height="187" /></a>Enabling WordPress for Multisite Mode</h3>
<p>Something that is bound to be confusing for users who expect to simply install WordPress and get all the benefits of Multisite out of the gate are bound to be confused by the fact that there is no apparent &#8220;switch&#8221; to turn it on. When you install WordPress 3.0, it will be in standard WordPress mode. In order to flip the switch, you have to add a new constant to your wp-config.php file. It&#8217;s easy, just add the following and save:</p>
<pre>define('WP_ALLOW_MULTISITE',true);</pre>
<p>Once this is done, you&#8217;ll find a new menu item called &#8220;Network&#8221;  in your Admin under Tools. Visit this page, enable Multisite and follow the instructions. You may need to add new configuration settings to your .htaccess file and wp-config.php, but WordPress will provide these lines for you to copy and paste.</p>
<p><strong><em>Note:<span style="font-weight: normal;"> As with WordPress MU, you may need to make server level system changes to enable WordPress to handle subdomains. This is not an easily solved problem and caused heartburn with MU users and will likely continue to cause heartburn with WordPress 3.0 users as well.</span></em></strong></p>
<h3>Upgrading from WordPress or WordPress MU 2.9 or below</h3>
<p>A lot of people, including myself, were concerned about upgrade paths when the Merge was announced. I should have known not to be concerned. WordPress has taken great care for years to ensure backwards compatibility and we&#8217;ve done the same thing here. If you&#8217;re on WordPress <em>or</em> WordPress MU, you will be able to install WordPress 3.0 and upgrade seamlessly. WordPress MU installs will become WordPress 3.0 with Multisite enabled and single installs of WordPress will retain all the benefits of standard installs of WordPress.</p>
<h2>WordPress as a CMS: Custom Post Types and Taxonomies</h2>
<p>Developers are already very excited about the new APIs available in WordPress 3.0. Specifically, Custom Post Types (which received <a href="http://technosailor.com/2009/11/11/10-things-you-need-to-know-about-wordpress-2-9/">initial support in WordPress 2.9</a>). This is a very important set of new features because it finally &#8211; <em>finally!</em> &#8211; brings CMS support to WordPress. For the first time, we don&#8217;t have to simply pretend that WordPress is a CMS&#8230;. it can have all the CMS qualities of a Drupal or Joomla.</p>
<h3>Custom Post Types</h3>
<p>We initially talked about custom post types in WordPress 2.9 but in WordPress 3.0, the feature is fully vetted and able to be utilized. With a simple function in a plugin or theme, developers can create new post types (such as film reviews, podcasts or FAQs), provide entirely familiar UI (similar to posts and pages), etc.</p>
<p>You can find all the possible options under register_post_type() in the wp-includes/post.php file.</p>
<h3>Custom Taxonomies</h3>
<p>Going hand in hand with custom post types, you can also create custom taxonomies. Taxonomies are bits of metadata and most people think of them in terms of &#8216;categories&#8217; and &#8216;tags&#8217;. Built into WordPress already are three taxonomies &#8211; categories, tags and link categories (which most people think about). The difference, from a technical perspective, between tags and categories is hierarchy. Categories have hierarchy so a category can have a child category, etc. Tags are flat and have no hierarchy.</p>
<p>You can create custom taxonomies with the register_taxonomy() function which will create UI automatically. All the options for custom taxonomies can be found in the wp-includes/taxonomy.php file.</p>
<p><strong><em>Note: </em><span style="font-weight: normal;"><em>I have </em><a href="http://wordpress.org/extend/plugins/google-code/"><em>created a plugin</em></a><em> and made it available for download that demonstrates how to use custom taxonomies and post types.</em></span></strong></p>
<h2>User Facing Enhancements</h2>
<p>There are two major user facing enhancements. When I say two major user facing enhancements, I&#8217;m not being sensational. These things are killer and I think you&#8217;ll be excited.</p>
<h3>Menus</h3>
<p>Wow, this has been a controversial new feature. Mostly because it almost didn&#8217;t make it into WordPress 3.0 and users have <em>really, really</em> wanted it. Those familiar with the navigation creator in many of the <a href="http://woothemes.com/">WooThemes</a> will be familiar with the new Menus feature in WordPress. This is because we worked early on with Woo to adopt their premium theme feature, which was very good, into the WordPress core (a fantastic case study on how premium theme developers can work directly with the WordPress core team).</p>
<p>The idea is really simple: Compose any menu with any hierarchy out of category archives, pages and custom links. Once a menu is created and saved, theme developers can enable support for this feature with the following line:</p>
<pre>enable_theme_support('nav-menus');</pre>
<p>Dropdowns are automatically created and semantic CSS markup allows style modifications easily. You can also create multiple menus (let&#8217;s say, a secondary navigation piece) and use them as sidebar widgets or hardcode them directly into a theme.</p>
<h3>Default theme&#8230; no, no default theme&#8230; no, new default theme!</h3>
<p>Well, you know all those free themes over on the <a href="http://wordpress.org/extend/themes/">theme repository</a>? Yeah, most of theme are heavily modified versions of Kubrick, the default theme for WordPress. Theme people would take the code base, modify it and make it their own. They might upload it to the theme repository. Problem is, they would not be updated with the new stuff that would go into Kubrick. That and Kubrick sucked as a theme.</p>
<p>Well, as of WordPress 3.0, there is no more Kubrick. There also is no more Classic theme. Now, we have a new theme called twentyten. Yes, that means next year, we&#8217;ll have twentyeleven.</p>
<p>Twentyten is a very complex theme. <em>It should not just be duplicated and hacked up.</em> We want themers to adopt the child theme method of doing things. This is important because as changes go into twentyten, your child theme will inherit those changes.  <a href="http://themeshaper.com/wordpress-child-theme-basics/">Here&#8217;s a good starter</a> for how to build child themes.</p>
<p><strong><em>Note:<span style="font-weight: normal;"> If you are upgrading from previous versions of WordPress and have a child theme based on Kubrick, don&#8217;t delete the default theme. If you do, you can still <a href="http://wordpress.org/extend/themes/default">grab the theme</a> from the theme repository.</span></em></strong></p>
<h3><span style="font-weight: normal;">WordPress Admin Enhancements</span></h3>
<p><span style="font-weight: normal;">The WordPress Administrative interface has also seen enhancements. Jane Wells is our usability expert in the WordPress developers group and has done quite a lot of work. Minor enhancements include an all light-grey style color scheme (as opposed to the dark grey header bar). This does seem to be better on the eyes. Additionally, the themes interface also has a new &#8220;tabbed&#8221; interface.</span></p>
<h3><strong>Custom Backgrounds</strong></h3>
<p>Built into twentyten is a new custom background feature. The cool thing is, theme developers can include this feature in their own theme. Simply adding this function to your theme functions.php will add a new menu item to your Appearance menu that allows for quick modification of the background image on the blog.</p>
<pre>add_custom_background();</pre>
<h2><span style="font-weight: normal;">The Extras</span></h2>
<p><span style="font-weight: normal;">Of course, not everything can fit into the three main areas of feature adds. Some are important and just don&#8217;t fit anywhere else.</span></p>
<h3><span style="font-weight: normal;">Admin Username</span></h3>
<p><span style="font-weight: normal;">Many of the security problems that have occurred in WordPress&#8217; history have been a result of the administrative username being admin. This has not been selectable or changeable without hacking the database and changing the admin username there.</span></p>
<p><span style="font-weight: normal;">In WordPress 3.0, the username can now be selected on install. Here&#8217;s a hint&#8230;. don&#8217;t name it admin. :)</span></p>
<p><span style="font-weight: normal;">For a complete list of expected changes, see <a href="http://codex.wordpress.org/Version_3.0">this Codex page</a>.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2010/05/01/10-things-you-need-to-know-about-wordpress-3-0/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>WordPress 3.0 Preview Webinar</title>
		<link>http://technosailor.com/2010/04/22/wordpress-3-0-preview-webinar/</link>
		<comments>http://technosailor.com/2010/04/22/wordpress-3-0-preview-webinar/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 18:22:16 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[ithemes]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress 3.0]]></category>

		<guid isPermaLink="false">http://technosailor.aaronbrazell.com/?p=8154</guid>
		<description><![CDATA[Yesterday, the iThemes folks graciously hosted me for a webinar. I had the opportunity to demonstrate some of the more anticipated features of WordPress 3.0 (due out next month). In the process, I also expressed some of the philosophies in the WordPress community around contributing and shaping the most popular publishing platform on the web. [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday, the <a href="http://ithemes.com">iThemes</a> folks graciously <a href="http://ithemes.com/wordpress-3-0-preview-with-aaron-brazell/">hosted me for a webina</a>r. I had the opportunity to demonstrate some of the more anticipated features of WordPress 3.0 (due out next month). In the process, I also expressed some of the philosophies in the WordPress community around contributing and shaping the most popular publishing platform on the web.</p>
<p>Some of my answers to questions late in the webinar are directed specifically toward the fringe elements of the community who approach the project from a combative perspective choosing to take pot shots at people and Automattic specifically while never doing a damn thing to push the platform forward. While I&#8217;ve left names out of the webinar and this post, the message is clear: if you want to have credibility in the community, learn how to be constructive and own the features and elements you want to see.</p>
<p>But the webinar was not a political statement. In fact, most of it was a hands on demonstration of the new twentyten default theme in WordPress 3.0, the custom taxonomy and post type features which bring WordPress into approximate parity with other content management systems, as well as a preview of &#8220;The Merge&#8221; &#8211; the combination of WordPress MU and WordPress.</p>
<p>Thanks again to the folks over at iThemes. If you missed the Webinar, here it is. Sorry, iPhone and iPad users&#8230;. it&#8217;s Flash. ;)</p>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=11137993&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=11137993&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object>
<p><a href="http://vimeo.com/11137993">WordPress 3.0 Preview with Aaron Brazell</a> from <a href="http://vimeo.com/webdesigncom">WebDesign.com</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2010/04/22/wordpress-3-0-preview-webinar/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Battle of the Titans: Premium Theme Framework Smackdown</title>
		<link>http://technosailor.com/2010/04/07/battle-of-the-titans-premium-theme-framework-smackdown/</link>
		<comments>http://technosailor.com/2010/04/07/battle-of-the-titans-premium-theme-framework-smackdown/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 18:52:28 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Hall of Fame]]></category>
		<category><![CDATA[builder theme]]></category>
		<category><![CDATA[genesis theme]]></category>
		<category><![CDATA[headway theme]]></category>
		<category><![CDATA[Reviews]]></category>
		<category><![CDATA[thesis theme]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=8103</guid>
		<description><![CDATA[I have provided updates for the problems reported with each theme on their pages in this report. We can provide one update per framework as long as something significant has changed (as in a new release of the theme). For a few days now, I&#8217;ve been looking closely at the four major theme frameworks. There [...]]]></description>
			<content:encoded><![CDATA[<p><em>I have provided updates for the problems reported with each theme on their pages in this report. We can provide one update per framework as long as something significant has changed (as in a new release of the theme).</em></p>
<p>For a few days now, I&#8217;ve been looking closely at the four major theme frameworks. There are many premium themes. I, in fact, for the time, am using one from <a href="http://woothemes.com">Woo Themes</a> that I&#8217;ve modified to fit here. However, there are only four that I see as worthy competitors among the elite theme frameworks.</p>
<p>I will be using affiliate links when referencing all of them just because, if you choose to use any of them based on this article, I don&#8217;t mind collecting a commission fee. This does not indicate my endorsement of any of them. In fact, quite the opposite. I expect you&#8217;ll find me to be a hard, but objective critic of all of them.<br />
<img src="http://technosailor.com/files/3773601713_771a2d16c8_b-285x400.jpg" alt="" title="Cage Match!" width="285" height="400" class="alignright size-medium wp-image-8108" /><br />
The four theme frameworks: <a href="http://www.shareasale.com/r.cfm?B=198392&amp;U=423316&amp;M=24570">Thesis 1.7</a>, <a href="http://www.headwaythemes.com/affiliates/idevaffiliate.php?id=961">Headway 1.6.1</a>, <a href="http://www.shareasale.com/r.cfm?B=242693&#038;U=423316&#038;M=28169">Genesis 1.1.1</a>, and <a href="http://ithemes.com/member/go.php?r=6055&amp;i=l0">Builder 2.3.11</a>.</p>
<h3>Report Scope and Prism</h3>
<p>When I went about gathering data on this post, I heard a lot of back and forth from those in the WordPress community about why they liked or disliked each of these themes. Some of the issues were restrictive licensing that flies in the face of the open society that is WordPress. Other things were lingering effects from the Great Premium Theme Pissing Matches™ of 2008. Still others were about how user-friendly the themes were for users. In this report, I put all of that aside and look strictly from the perspective of infrastructure, data, security and WordPress core feature support.</p>
<p>All metrics that have been taken were created equally via a local installation of WordPress (eliminating network latency), with no plugins installed, 10,000 blog posts and 10,000 pages. The data points were taken in the context of a stress test and may or may not reflect actual usage. However, large scale stress is something to be concerned with for any site that is large or plans to become large. How the server handles database transactions, and file load is an integral part of a long term strategy. Each theme was deployed with no configuration changes beyond default settings provided by the theme. The results are fascinating.</p>
<p>This is a seven page article so click through to each new page to read the analysis of each theme.</p>
<p><cite>Photo by <a href="http://www.flickr.com/photos/icantcu/3773601713/">icantcu</a></cite></p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2010/04/07/battle-of-the-titans-premium-theme-framework-smackdown/feed/</wfw:commentRss>
		<slash:comments>46</slash:comments>
		</item>
		<item>
		<title>HipHop, PHP, and the Evolution of Language</title>
		<link>http://technosailor.com/2010/02/04/hiphop-php-and-the-evolution-of-language/</link>
		<comments>http://technosailor.com/2010/02/04/hiphop-php-and-the-evolution-of-language/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 16:37:41 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[b5media]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[hiphop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[scaling]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=8023</guid>
		<description><![CDATA[A lively little discussion developed over the past few days on the DC-PHP developers mailing list. We have a very active developers group here in the DC area &#8211; much larger than most cities, in fact. Part of what makes our group great is the diversity of background and experience that is in the group. [...]]]></description>
			<content:encoded><![CDATA[<p>A lively little discussion developed over the past few days on the DC-PHP developers mailing list. We have a very active developers group here in the DC area &#8211; much larger than most cities, in fact. Part of what makes our group great is the diversity of background and experience that is in the group.</p>
<p>This was front and center over the past few days when one of our members, Hans, <a href="http://groups.google.com/group/washington-dcphp-group/browse_thread/thread/b41c85e76653aae0?hl=en">offered his opinions</a> on Facebook&#8217;s new HipHop for PHP product. We have already <a href="http://technosailor.com/2010/02/02/facebooks-hiphop-and-what-it-means-to-wordpress/">expressed our intent to help make WordPress compliant with HipHop</a>, something that will be beneficial to major WordPress sites like TechCrunch, Mashable, VentureBeat, WordPress.com, the NFL Blogs, the NY Times blogs, the Cheezeburger network (LOLcats, FAILBlog, etc) that carry large amounts of traffic. I hope to be able to consult with some of these organizations on moving into a HipHop system once my head is wrapped around it and WordPress is compliant.</p>
<div id="attachment_8024" class="wp-caption alignleft" style="width: 527px"><a href="http://www.flickr.com/photos/joshunter/2090569277/"><img class="size-large wp-image-8024" src="http://technosailor.com/wp-content/uploads/2010/02/2090569277_79bdc78eb5_b-517x690.jpg" alt="Photo by Josh Hunter" width="517" height="690" /></a><p class="wp-caption-text">Photo by Josh Hunter</p></div>
<p>Hans is an extraordinary developer. I have never met him personally, but his depth of knowledge on issues of security and scalability is downright frightening. He offered his own opinion of HipHop on the mailing list and so I&#8217;m going to pick on him a bit:</p>
<blockquote><p>This HipHop thing is interesting, perhaps in much the same way as HipHop music: it feels like a hack.  &#8212; And I mean that respectfully in both cases; I like hip-hop music, and appreciate how it pays homage to R&amp;B roots, remixing/reinterpreting them, etc; and I think that the idea of taking one language and building it out to something else is also something I should support.  After all, I&#8217;ve embroiled myself in code generation tools (e.g. Propel) that are operating on the same philosophical groundwork.  But I also believe that there&#8217;s a general rule like &#8220;if you need code generation, there&#8217;s something wrong [in your design or in the tools you've chosen or ...]&#8221; &#8230; so those tools also feel like hacks.</p></blockquote>
<p>In all of life, there is an evolution that happens. One iteration of something becomes better with improvements over time. This has happened on a micro level inside PHP. Without PHP 3 there would be no PHP 4. Without PHP 4, there would be no PHP 5. Ben Ramsey talked about <a href="http://phpadvent.org/2009/phps-not-just-a-language-by-ben-ramsey">this evolution</a> before Christmas.</p>
<p>Why is it a hack to improve upon the tools used with a language? Is it a hack to use <a href="http://memcached.org/">Memcached</a> with PHP? Is it a hack to run on <a href="http://nginx.org/">nginx</a> instead of Apache or to implement <a href="http://www.fastcgi.com/">FastCGI</a>? All of these are third party software or extensions <em>outside</em> of PHP. So how is HipHop any different?</p>
<blockquote><p>That&#8217;s all fair, but I feel like the problem here is that somewhere a long, long time ago, Facebook *must* have realized that they were going to have scaling problems.  Long before they started having a problem, someone *must* have thought &#8220;maybe a compile-at-runtime language isn&#8217;t the right solution here&#8221;.  I guess to me this cross-compiler is just a public way to admit that PHP is not the right tool for the job, but they&#8217;re stuck with all these developers that only know PHP so it was somehow cheaper to engineer a way to change PHP to C++ than it was to retrain developers on C++ (or, probably more realistic, Java).</p></blockquote>
<p>I responded in that conversation with an only slightly edited response. While I appreciate, and always have appreciated, his frank, honest, high level view of PHP, web security, web applications, etc., he strikes me as somewhat naive and puritanical.</p>
<p>What I can say is *I*, along with dozens of other technology people in and out of DC, in and out of PHP, never look at our initial ideas as scaling ideas. We look at them as ideas and experiments to see if they have legs. In fact, I&#8217;d go so far as to say it is counter-productive to think about scale before thinking of concievability (is that a word?).</p>
<p>There&#8217;s a reason why Rails (God help us) is popular. It&#8217;s a great prototyping tool. You stand up an app quickly and let it into the wild to see if it has legs. Does it go? What are the market influences? What are the<br />
pros and cons? Do we have to adjust?</p>
<p>After a concept is proven, then a solid dev team with solid tech leadership brings in their expertise to see if the idea can be built into something sustainable. As a sidebar, please take a read of Brad Feld&#8217;s very awesome<br />
post from a few years ago &#8220;<a href="http://www.feld.com/wp/archives/2006/05/web-20-the-first-25000-users-are-irrelevant.html">The first 25,000 Users are Irrelevant</a>&#8220;.</p>
<p>My point is, it&#8217;s silly and a waste of resources for startup people to start thinking about how big they <em>might</em> get <em>maybe</em> 5 years down the road. I think you&#8217;d find out that, in most cases, successful technology, web-based companies happened by some dumb luck. Twitter. Facebook. Name-the-popular-app. Dumb luck.</p>
<p>Hey, I&#8217;d even argue that when <strong>too</strong> much comp-sci brain energy goes into an app, you get things like <a href="http://www.wolframalpha.com/">Wolfram Alpha</a>. Cool. But useless. And not nimble enough to actually do the scaling necessary to need all that comp-sci engineering prowess.</p>
<p>Balance, my friend. Balance.</p>
<p>Facebook (and others) start with PHP because PHP is fairly ubiquitous and easy as pie to drop into production. However, there is a point of no return where you are committed to PHP and that&#8217;s where HipHop comes in.</p>
<p>Personally, I wish we had HipHop when I was at <a href="http://b5media.com">b5media</a>. We had a ton of scaling problems with PHP and we were running fully clustered Apache servers (25 deep, if I recall), sharded MySQL across 6ish database servers, and we had massive I/O bottlenecks. We ran <a href="http://eaccelerator.net/">eAccelerator</a> and Memcached and had <a href="http://www.squid-cache.org/">squid</a>-based load balancing and damn if Grey&#8217;s Anatomy or the Oscar&#8217;s didn&#8217;t pin our entire network on <a href="http://technosailor.com/2008/12/04/be-nimble-be-quick/">more than one occasion</a>. What could have happened with an alternate to opcode caching. What could have happened if I had resources to put on developing C++ binaries of our frequently used PHP libraries.</p>
<p>I&#8217;ll tell you. It would have rocked. We were already committed to PHP. We were already committed to WordPress. And when the company started, we were all volunteer resources. There was no assumption that our idea had legs or I think everyone on the team would have quit our jobs immediately and put everything into building that company. It took a year to get there.</p>
<p>This is, for better or for worse, the way companies get started in the real world.</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2010/02/04/hiphop-php-and-the-evolution-of-language/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Facebook&#039;s HipHop and What it Means to WordPress</title>
		<link>http://technosailor.com/2010/02/02/facebooks-hiphop-and-what-it-means-to-wordpress/</link>
		<comments>http://technosailor.com/2010/02/02/facebooks-hiphop-and-what-it-means-to-wordpress/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 18:42:27 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[hiphop for php]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=8020</guid>
		<description><![CDATA[This was originally posted on my company blog and reposted here for posterity. By now, the news has hit the street about Facebook&#8217;s new PHP pseudo-compiler technology that is looking set to change the PHP world once again. It is called HipHop for PHP. Here at Emmense, we build on PHP and more specifically, we [...]]]></description>
			<content:encoded><![CDATA[<p><em>This was <a href="http://emmense.com/blog/2010/02/02/facebook-hiphop-and-wordpress/">originally posted</a> on my company blog and reposted here for posterity.</em></p>
<p>By now, the news has hit the street about Facebook&#8217;s new PHP pseudo-compiler technology that is looking set to change the PHP world once again. It is called <a href="http://developers.facebook.com/news.php?blog=1&amp;story=358">HipHop for PHP</a>.</p>
<p>Here at Emmense, we build on PHP and more specifically, we build on <a href="http://wordpress.org">WordPress</a>. The PHP community as a whole continues to innovate the language and Facebook has been a longstanding member of that community. WordPress stands on the shoulders who have gone before, and there are certainly instances of large-scale installs of WordPress that could stand to use some acceration.</p>
<p>It is our intention, here at Emmense, to support the Facebook HipHop methodology where appropriate. We will be exploring the use and implementation of this technology in the days and weeks to come and will be working to build solutions that leverage it in the WordPress world for our clients. Where possible, our work will be conributed back to the WordPress core where appropriate.</p>
<p>While we expect that many more service providers will likely leverage this technology, we want to continue to lead in the WordPress community in an ever-open exchange of ideas between the <a href="http://technosailor.com/2009/12/03/php-doesnt-do-wordpress-and-wordpress-doesnt-do-php/">PHP and WordPress communities</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2010/02/02/facebooks-hiphop-and-what-it-means-to-wordpress/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>WordPress Bible Release</title>
		<link>http://technosailor.com/2010/01/28/wordpress-bible-release/</link>
		<comments>http://technosailor.com/2010/01/28/wordpress-bible-release/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 15:52:24 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[freshbooks]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress bible]]></category>
		<category><![CDATA[wpbible]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=8016</guid>
		<description><![CDATA[Last night, I got home to find my copies of the WordPress Bible at my door. This was tremendously exciting as I have been waiting for 8 months for this day. It was exciting and the buzz on Twitter has been tremendous. Pre-sale numbers were huge. The sharing and re-sharing of information about this book [...]]]></description>
			<content:encoded><![CDATA[<p>Last night, I got home to find my copies of the <a href="http://bit.ly/wpbible">WordPress Bible</a> at my door. This was tremendously exciting as I have been waiting for 8 months for this day. It was exciting and the buzz on Twitter has been tremendous. Pre-sale numbers were huge. The sharing and re-sharing of information about this book has been deafening.</p>
<p>Below is a video of the unboxing. And of course, you can order the book today from <a href="http://bit.ly/wpbible">Amazon</a> and I hope you do. If not for the book, to support my efforts. Thanks to everyone who has stood by me during this process!</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2010/01/28/wordpress-bible-release/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>The Greater Good: Entrepreneurship, Open Source, and a Better World</title>
		<link>http://technosailor.com/2010/01/22/the-greater-good-entrepreneurship-open-source-and-a-better-world/</link>
		<comments>http://technosailor.com/2010/01/22/the-greater-good-entrepreneurship-open-source-and-a-better-world/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 21:22:24 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[blogging]]></category>
		<category><![CDATA[dc]]></category>
		<category><![CDATA[entrepreneurship]]></category>
		<category><![CDATA[social good]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=8013</guid>
		<description><![CDATA[Last night, I was catching up with a friend who is as far from me in lifestyle outlook as you could possibly be. She is a extremely left wing type working for an environmental advocacy organization in DC. I, on the other hand, am an entrepreneur with one foot planted firmly on the right and [...]]]></description>
			<content:encoded><![CDATA[<p>Last night, I was catching up with a friend who is as far from me in lifestyle outlook as you could possibly be. She is a extremely left wing type working for an environmental advocacy organization in DC. I, on the other hand, am an entrepreneur with one foot planted firmly on the right and one foot firmly planted on the left.</p>
<p><a href="http://technosailor.com/files/3356246959_8d06a52c48.jpg"><img src="http://technosailor.com/files/3356246959_8d06a52c48.jpg" alt="" width="500" height="333" class="alignleft size-full wp-image-8014" /></a></p>
<p>The conversation came to an issue that I&#8217;ve only marginally thought in great detail about. I had made the comment about how I am potentially looking to leave the DC area because, as I put it, it&#8217;s not my scene. I feel like a square peg trying to be fit into a round hole. While I certainly have political views and will sometimes voice them, my life does not revolve around politics, policy and advocacy as it does in Washington. In fact, when pressed to explain my feelings around why I dislike DC, I described myself as a regular guy wanting to live a regular life in a regular town.</p>
<p>Defining that more explicitly, I appreciate town like Baltimore, where I was raised and lived most of my life, because it&#8217;s filled with people who go about their normal everyday lives. No one is trying to &#8220;save the world&#8221; as seems to be the case in DC. Certainly, there are people and companies (hopefully many) who take a balanced position in life to be good stewards of the earth, energy and the planet. Certainly, many are socially conscious in how they live their lives. But it isn&#8217;t an all consuming agenda such that you find in DC.</p>
<p>I love Austin too. Why? Well, it is the self described live music capital of the country. On any given night, from my experience, it is not difficult to find bars that have a good live music set that is original and that doesn&#8217;t carry a cover charge. Outside of a handful of live music venues (DC9, 9:30 Club, Velvet Lounge, Madames Organ to a degree, Rock and Roll Hotel, etc) it&#8217;s hard to find a burgeoning music scene in DC.</p>
<p>Even with sports, which consumes a fair bit of my life, it&#8217;s hard to find supporters of the home team. No one, it seems, is <em>from</em> DC. They all came here with an agenda. You have to go out to Maryland or Virginia to find real hometown fans.</p>
<p>This is not my scene. This is not what I like. I am an entrepreneur because, first and foremost, I want to make money. When I made a break from my former corporate job, it was after becoming aware of how much my employer was billing our customer for my services and realizing that if that was how much I was worth, I could damn well do that on my own.</p>
<p>But that&#8217;s the crux. As entrepreneurs, our general purpose is not to do social good (though there are <a href="http://zoeticamedia.com/">exceptions</a>). Not that there is anything wrong with that. There isn&#8217;t. But entrepreneurs get our kicks from building something. From doing something. And of course, from making money. Who starts a company with the intention to not increase profit margins? You show me that entrepreneur, and I&#8217;ll show you an entrepreneur who will fail within a year.</p>
<p>There, of course, is a balance. Like Geoff, Beth and Kami are doing at Zoetica, there&#8217;s a balance between making money and doing good. The more I had this conversation with my friend, the more shallow I realized I sounded.</p>
<p>But as I thought some more, the more I realized that doing good is not something you do. It&#8217;s something you are. Based on the integrity and character of the entrepreneur, the decisions that are made, whether geared for profit or for building a product or spinning it up into an acquisition by Google, become decisions made out of the character and integrity of being &#8220;good&#8221;.</p>
<p>Frankly, the more I thought about it, the more I realized that even what I do as an entrepreneur creating services and products around WordPress, (and yes, even sometimes <a href="http://core.trac.wordpress.org/ticket/11976">writing patches</a> for WordPress core itself) is done to make the world a better place. Even writing <a href="http://bit.ly/wpbible">a book</a> on WordPress and travelling to San Francisco, Dallas, New York, Atlanta, Miami, Chicago and Raleigh speaking to WordPress users, developers and designers is done to extend the platform, thus extending the reach and improving on the largest self-hosted blogging platform on the planet.</p>
<p>Think about why this is important. It&#8217;s not just about WordPress. It&#8217;s about enabling voices. Giving those who never had a chance to speak before the opportunity to be heard. We&#8217;ve heard as recently as this week about the man who <a href="http://www.google.com/hostednews/afp/article/ALeqM5gkLqK_yYWyfCtN0fXc1zzoRvVJKQ">used an iPhone app</a> to figure out how to treat his own wounds while buried under the rubble in Haiti.</p>
<p>The Chinese government is so threatened by web technologies, and blogging in particular, that they have banned WordPress.com in China.<a href="http://www.labnol.org/internet/ban-on-wordpress-blogs-in-china/8913/">That is not likely to be lifted anytime soon</a>, especially as the government lockdown and censorship of the Chinese people is thrust back into the limelight with the latest <a href="http://googleblog.blogspot.com/2010/01/new-approach-to-china.html">Google-China</a> fallout.</p>
<p>Even the <a href="http://codex.wordpress.org/Translating_WordPress">internationalization efforts in WordPress</a> is putting WordPress into the hands of more people in more countries and making it possible for voices to be heard, not only in the United States, but in the Sudan and Kurdistan as well.</p>
<p>As an entrepreneur with integrity and character, even the mundane decisions that go into building a company can be seen as social good. This is not intended to diminish the efforts of those who explicitly set out to do social good, but with the right mindset, the things that make us successful can also make the world around us better.</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2010/01/22/the-greater-good-entrepreneurship-open-source-and-a-better-world/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PHP Doesn&#039;t Do WordPress and WordPress Doesn&#039;t Do PHP</title>
		<link>http://technosailor.com/2009/12/03/php-doesnt-do-wordpress-and-wordpress-doesnt-do-php/</link>
		<comments>http://technosailor.com/2009/12/03/php-doesnt-do-wordpress-and-wordpress-doesnt-do-php/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 19:20:23 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[ben ramsey]]></category>
		<category><![CDATA[cal evans]]></category>
		<category><![CDATA[keith casey]]></category>
		<category><![CDATA[marco tabini]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=7963</guid>
		<description><![CDATA[If there&#8217;s one thing I have been consistent on in the past (almost) 6 years of blogging and engaging on the web, it&#8217;s that I believe in the mantra &#8220;no sacred cows&#8221;. In politics, I confound and confuse members of both parties who look at life through sterilized lenses that reflect their party platform. I [...]]]></description>
			<content:encoded><![CDATA[<p>If there&#8217;s one thing I have been consistent on in the past (almost) 6 years of blogging and engaging on the web, it&#8217;s that I believe in the mantra &#8220;no sacred cows&#8221;. In politics, I confound and confuse members of both parties who look at life through sterilized lenses that reflect their party platform. I will often stir up controversy by dragging people into a process of debate that, while respectful, causes them to think and re-think their positions. At least that&#8217;s the goal. I am a fiercely independent thinker and though some of my closest friends are on the left, I&#8217;ve ruthlessly challenged the parts of the left that I don&#8217;t like while supporting the ones I do. I&#8217;ve done the same thing with folks on the right.</p>
<p>So as I prepare to write this article with an admittedly slightly inflammatory title, I expect it will cause some controversies &#8211; maybe, and perhaps intentionally, it will cause some rancor in the leadership of the WordPress community itself &#8211; the ones who set the tone and cadence for the rest of the community. This is not all bad and nobody can ever accuse me of not being consistent in how I approach issues I feel strongly about.</p>
<p>For nearly 10 years, I have been coding in PHP. For the past 4, I have spent my time focusing my energies on WordPress specifically. It seems to me that for software that is built on PHP, then, there should be some consistent crossover between the WordPress community and the PHP community. That natural convergence does not seem to exist however.<br />
<img src="http://technosailor.com/wp-content/uploads/2009/12/php_logo-250x131.jpg" alt="" width="250" height="131" class="alignright size-medium wp-image-7964" /></p>
<p>Early on, when getting started on the web, I hung out a lot over at <a href="http://sitepoint.com/forums">the SitePoint Forums</a>. It was there that, through a community of PHP developers of varying skill levels, that I cut my teeth. I knew nothing at the time and there were folks who were much more skilled than me. It was in the PHP 4 era (that era had just begun and has since ended) so there was no such thing as <em>real</em> classes and object orientation. XML parsing became a hot topic during those days as PHP devs wrestled with the best way (they were all ugly!) to parse XML. I was just trying hard to figure out how to connect to a database.</p>
<p>I spent months learning and picking up what I could and contributing back my learnt wisdom to other newbies along the way. The cycle of karma was great as people learned and taught each other.</p>
<p>Shortly after I left SitePoint in 2003, I started blogging (May of 2004). I started on <a href="http://textpattern.com/">Textpattern</a> but within a week, as my curiosity about this new WordPress platform started hitting my ears, I switched over to WordPress. I joined the <a href="http://lists.automattic.com/mailman/listinfo/wp-hackers">wp-hackers</a> mailing list and began immersing myself in the WordPress community. Generally speaking, people were very helpful and I learned a lot.</p>
<p>Eventually, as part of that community, I would lead the technology efforts at <a href="http://b5media.com">b5media</a> where my team was responsible for a very large WordPress farm. Having some of the best and the brightest working alongside me meant that my good understanding of the PHP involved in WordPress, and the event driven nature of its core, would increase to maybe very good.</p>
<p>Today, my business is WordPress. I just wrote the <a href="http://technosailor.com/2009/11/17/the-wordpress-bible-writing-a-book-redux" /><em>WordPress Bible</em></a>. I do WordPress consulting. I run all my blogs on WordPress. I speak at WordCamps all over. Heck, I&#8217;m organizing <a href="http://wordcampmidatlantic.com">WordCamp Mid-Atlantic</a> again this year. I love the WordPress community.</p>
<p>During the writing of the Bible, <a href="http://caseysoftware.com">Keith Casey</a>, my friend and also a top developer in the PHP community (He works with Marco Tabini of <a href="http://phparch.com">PHP Architect</a> &#8211; if that doesn&#8217;t give him street cred, I don&#8217;t know what will), offered to review anything I wrote along the way. I took him up on it even though I already had editors including a very WordPress-specific technical editor. My thinking? Having someone from the greater PHP community look at my code for the WordPress world can only make it better.</p>
<p>My question is, why doesn&#8217;t the rest of the WordPress world do this as well? We, as a community, can only be better by embracing the greater PHP community. We can learn things from them. They can learn things from us. Of course, the greater PHP community is going to scorn WordPress for <a href="http://technosailor.com/2009/11/18/wordpress-and-php-5-be-the-change-you-want-to-see/">remaining PHP 4 compatible</a> when PHP 4 is end of life and I think that point has validity but that&#8217;s not the point. I think both sides can agree that WordPress has its way and it is not likely to change its philosophy on this soon.</p>
<p>However, what about the rest of the converging community? Why do WordPress people not participate in the major PHP conferences like <a href="http://tek.phparch.com/">Tek-X</a> or <a href="http://zendcon.com/">ZendCon</a>? Why was <a href="http://dentedreality.com.au/">Beau Lebens</a> the only WordPress guy that I&#8217;m aware of that attended any of the 7-conferences-in-14-days-roaming-conference <a href="http://cw.mtacon.com/">CodeWorks</a>?</p>
<p>Why is it that when WordPress developers are asked to speak at these events, they look down their nose in scorn (I can think of two specific incidents that have been related to me)?</p>
<p>Hey, if we&#8217;re going to have a war on PHP coding ability, I&#8217;ve got to side with the PHP coders of the world, not the WordPress coders. If we&#8217;re going to have a war on extensible platforms, well, I&#8217;ll probably go with WordPress.</p>
<p>My point is really simple: The WordPress community needs to abandon this concept of elitism and isolationism. Yes, isolationism only makes you isolated. Over the past six months, I have come to appreciate the greater PHP community more. I&#8217;ve rekindled my love for that community and the karma and learning that comes from it. I&#8217;ve discovered new things about PHP because I&#8217;ve opened my horizons again and got outside the WordPress box. Fortunately, by doing so, I can apply that knowledge and karma inside the WordPress world as well. It&#8217;s sort of like finally getting that water after being parched and thirsty for so long. It&#8217;s refreshing and gives new energy and drive.</p>
<p>So in 2010, I will continue to work inside the WordPress world to try to influence change. My code will reflect that change. I&#8217;ve abandoned PHP 4 (but again, that&#8217;s beside the point) and won&#8217;t work with it in my own work, plugins, etc. I hope to make a major announcement regarding some crossover and convergence in the next few weeks as well.</p>
<p>To the PHP World: Understand that the WordPress world is different. You already know this. We are a PHP 4 world for a reason, like it or not. We need some understanding. We also have our feelings on GPL and open source which don&#8217;t always jive. Work with us. <a href="http://technosailor.com/2009/11/18/wordpress-and-php-5-be-the-change-you-want-to-see/">Help us be better</a>.</p>
<p>To the WordPress world: Get outside your comfort zone and embrace the leaders in the PHP world. I already mentioned Keith. Add <a href="http://blog.tabini.ca/">Marco Tabini</a>, <a href="http://benramsey.com/">Ben Ramsey</a> and <a href="http://blog.calevans.com/">Cal Evans</a> to the list of people to pay attention to.</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2009/12/03/php-doesnt-do-wordpress-and-wordpress-doesnt-do-php/feed/</wfw:commentRss>
		<slash:comments>34</slash:comments>
		</item>
		<item>
		<title>WordPress and PHP 5: Be the Change You Want to See</title>
		<link>http://technosailor.com/2009/11/18/wordpress-and-php-5-be-the-change-you-want-to-see/</link>
		<comments>http://technosailor.com/2009/11/18/wordpress-and-php-5-be-the-change-you-want-to-see/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 18:46:47 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[php4]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=7935</guid>
		<description><![CDATA[The other day, I wrote the popular 10 Things You Need to Know About WordPress 2.9. As usual, most people are very excited about the new release which is now in beta and available for testing. In the article, I made a few fundamental errors which I have since corrected. Notably, I mentioned that WordPress [...]]]></description>
			<content:encoded><![CDATA[<p>The other day, I wrote the popular <a href="http://technosailor.com/2009/11/11/10-things-you-need-to-know-about-wordpress-2-9/">10 Things You Need to Know About WordPress 2.9</a>. As usual, most people are very excited about the new release which is now in beta and available for testing. In the article, I made a few fundamental errors which I have since corrected.</p>
<p>Notably, I mentioned that WordPress 3.0 would be going to PHP 5. This was based on conversations I had with a core developer which I now realized I misunderstood. Kinda. WordPress will probably not be dropping PHP 4 support in WordPress 3.0 but as core developer Mark Jaquith <a href="http://wpdevel.wordpress.com/2009/11/16/wordpress-2-9-beta-1-is-available-get-i/comment-page-1/#comment-3800">suggests</a>:</p>
<p style="padding-left: 30px">Some things already require PHP 5, like time zone support or oEmbed. There are no plans that I know of to remove PHP 4 support in 3.0 &#8220;” last I checked we still had 12% of WP installs using PHP 4.</p>
<p style="padding-left: 30px">I see more of a natural and gradual deprecation of PHP 4. We&#8217;re very much open to making new features require PHP 5 if it would be a pain to make them PHP 4 compatible.</p>
<p>As a PHP developer, I am on board with calls for PHP 5 support. PHP 4 has been end of life (EOL) since <a href="http://caseysoftware.com/free-tagging/php4-eol">August 8, 2008</a>. That basically means that there will be no more releases, no more security patches, no more nothing. It&#8217;s done. Stick a fork in it. However, as Matt mentioned on stage at WordCamp NYC this weekend, there are still 12% of WordPress installations using PHP 4 hosting. He breaks that down as approximately 2M installs, the size of a major American city. More precisely, that&#8217;s approximately the size of Philadelphia.</p>
<p>This is not to defend WordPress development. I&#8217;d leave Philadelphia behind in a minute if I could get access to real object oriented PHP, reliable XML parsing, better HTTP transports and so much more. Yes, Philadelphia&#8230; I just threw you under the bus. That&#8217;s for <a href="http://sports.espn.go.com/nfl/news/story?id=4397938">signing Mike Vick</a>. However, as Mark suggests, increasingly more features are being added to the core that require PHP 5.</p>
<p>oEmbed, which will ship in WordPress 2.9, requires XML or JSON parsing. XML parsing sucks in PHP 4. JSON ships by default in PHP 5.2. It is easier to backport JSON support to PHP 4 than try to engineer XML parsing for PHP 4. Some in the PHP community feel like backporting a PHP 5 feature to PHP 4 disincentivizes PHP 5 movement. It may, I&#8217;m not here to argue that.</p>
<p>Time Zone support is handled via the PHP class <a href="http://us3.php.net/manual/en/class.datetimezone.php">DateTimeZone</a>, a PHP 5 class. Of course, on PHP 4 hosts, the user simply has to set the UTC offset (say, UTC-5 for Eastern Standard Time) manually. Graceful degradation.</p>
<p>I personally was one of the first people to write code for the SSH2 portion of the one click automatic upgrade feature. I, of course, did not go very far with it, but I was the one who first took a stab at creating that.</p>
<p>It is not worth it for PHP developers to throw mud at WordPress developers and the PHP 4 requirement if they are not willing to write code to make it better. Writing code does not, of course, mean that your feature will be incorporated. But this is an open source project. If you want to see new features, and the developers have indicated willingness through not only words, but also action, to include PHP 5 features, then you need to be the champion of those changes. In other words, you need to write the code, submit the ticket and state your case. Even if you can&#8217;t write the code, <a href="http://trac.wordpress.org">open a ticket</a> and be a champion for the case.</p>
<p>Effective arguments, however, do not include holy wars over PHP 4 or PHP 5. Effective arguments do include security, usability, and feature requests that reflect &#8220;must have&#8221; features. Is it plugin territory or should it be a core feature? Why? State your case.</p>
<p>I will admit not being overly active in the ongoing development of WordPress. I have client work built around WordPress, so that takes up most of my time. Understanding that, I also have no room to throw mud unless I&#8217;m willing to step up and write code too. It&#8217;s sort of like voting. If I don&#8217;t bother to go vote, then I can&#8217;t complain about my elected officials.</p>
<p>If you want to see change in WordPress, be that change and put your words into action.</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2009/11/18/wordpress-and-php-5-be-the-change-you-want-to-see/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>The WordPress Bible: A Writing Redux</title>
		<link>http://technosailor.com/2009/11/17/the-wordpress-bible-writing-a-book-redux/</link>
		<comments>http://technosailor.com/2009/11/17/the-wordpress-bible-writing-a-book-redux/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 19:07:11 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress bible]]></category>
		<category><![CDATA[wpbible]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=7875</guid>
		<description><![CDATA[Back in July, I noted that I had accepted and was beginning the process of writing The WordPress Bible for Wiley Publishing. You can read that post here. It&#8217;s now November and almost everything is in the bag for me. I&#8217;ve written the book with an average of 20-30 pages per chapter. I&#8217;ve gone through [...]]]></description>
			<content:encoded><![CDATA[<p><span class="drop_cap">B</span>ack in July, I noted that I had accepted and was beginning the process of writing <a href="http://bit.ly/wpbible">The WordPress Bible</a> for <a href="http://www.wiley.com">Wiley Publishing</a>. <a href="http://technosailor.com/2009/07/03/writing-the-wordpress-bible/">You can read that post here</a>.</p>
<p>It&#8217;s now November and almost everything is in the bag for me. I&#8217;ve written the book with an average of 20-30 pages per chapter. I&#8217;ve gone through Author Review (A.R.), more commonly called &#8220;editing&#8221;. I&#8217;ve taken screenshots. Wrote code. Sifted through pages and pages that have so many changes, from three different editors, that the page appears to bleed. I&#8217;ve survived. Sometimes barely. I want to talk about the process of writing that book.</p>
<p>Writing a book is as much mental as it is emotional. Everyday, you evaluate what you have to get done, how much time you have to get it done, and consider the tone and voice in which it is written. I noted in my announcement that I would take on extra work to compensate for the lack of full-time pay the advance money would turn out to be. This became the most difficult part of the process, as it would turn out.</p>
<p>Early on, I spent a tremendous amount of time being very precise and intentional in how I wrote. It was a very slow process but I was pacing myself. I had 4 deadlines at 25% increments that were a month apart (except the last one). I could afford to be deliberate and intentional and pace myself. I had nine chapters to write in 30 days. Done. The first deadline was no problem, but it was a definite time investment.</p>
<p>The second deadline approached in late August. It was the 50% deadline and nine more chapters were due. By this time, I was heavily invested in the two client projects &#8211; a corporate redevelopment of <a href="http://navstar-inc.com">Navstar</a>, a federal IT service provider in Northern Virginia and <a href="http://thecityfix.com">TheCityFix</a>, a WordPress MU/BuddyPress-based project for <a href="http://embarq.org">EMBARQ</a>, a major non-profit in DC. Both of these projects were lagging behind as I went about being meticulous about my book. So when the 50% deadline came, I had my chapters but I was delayed on my clients.</p>
<p>Putting the book on the back-burner at the beginning of the 75% deadline, I spent time catching up on client work. As a week turned into two, and then three and I had not been able to start on the 75% deadline, I had mornings where I would have nervous and mental breakdowns in the shower. I had no idea how I could do it all. I was under intense pressure to do and I simply did not know if I could do it. I hid it well, but exactly one week before I had to have another nine chapters turned in, I began that process of writing those nine chapters. I told my clients I was unavailable. I locked myself away for 12-16 hour writing marathons. At 8pm on the day of my 75% deadline, I turned in my last chapter &#8211; a marathon effort that began 7 days before. I headed to the bar for a beer.</p>
<p>We got started on the process late, so although Wiley agreed to push back the 25%, 50% and 75% deadlines to compensate, the final deadline had to stay fixed at October 14. Two and a half weeks. I took a bit of time off to go back to client work because I knew I&#8217;d be going to Orlando to keynote IZEAFest, and had intentionally took advantage of the group rate that <a href="http://izea.com">IZEA</a> had negotiated to get a few extra days in sunny Florida. In theory, I could write the rest of the book by the pool and enjoy the sun. Good idea, but then the wifi was ridiculously poor and I lost six days in the two and a half weeks I had to finish things up.</p>
<p>I came back from Orlando looking at the same situation I had with my 75% deadline &#8211; 8 days to go, 9 chapters to write. Up until this point, I had made every deadline even if I was unofficially granted a few extra days here or there if I needed it. I never took those extensions. My editor was firm on the 100% deadline though. It must be done. (She ended up giving slightly in the end but I couldn&#8217;t take her up on that because I was leaving for Vegas and <a href="http://blogworldexpo.com">Blog World Expo</a> on the day of my final deadline. There was no way to be in Vegas and take advantage of a few more days to write!)</p>
<p>Miraculously, as I flew at 37,000 feet on <a href="http://virginamerica.com">Virgin America</a> en route to Blog World Expo, I was submitting my final chapter and screenshots. Thank God for wireless internet on flights! I made it. Done. Complete. Breathe.</p>
<p>When I got back from Vegas, however, my editor told me she needed me to rewrite a chapter (or significant portions of the chapter). Sighing heavily, I did just that addressing the areas of concern she had. Then the deluge of chapters began floating back to me for A.R. I had to sort through every single chapter, rewriting some portions, approving code changes from <a href="http://markjaquith.wordpress.com">Mark Jaquith</a>, my technical editor, wording and grammatical changes from my copy editor and other generalized suggestions and changes from my lead editor.</p>
<p>I was told that the edit process is grueling. That it is painful. That I better have thick skin. I went into A.R. expecting the worst. Fortunately, it was a fairly painless process. Perhaps after the marathon sprints and my inherent instinct to trust the people around me to make me look good, I rolled with the process. These people make me look good! While I accepted almost every suggestion from all three editors, there were times I vetoed. As the author, I have that prerogative to a point. Generally, however, I trust these people to help me through. It was not as bad as I expected.</p>
<p>Emotionally, I was numb. The book took a toll on me. In most ways, the toll is good. In other ways, perhaps not so much. I still will have to proofread the final product in December and will have a week to do so, but this process is all but over. However, I&#8217;m still numb. Does a man achieving what seemed so difficult to do give him an emotional outbreak, as we see when sports teams win the big championship, or does it make us look at life a little more soberly and say, &#8220;Wow&#8230; I did that. Crazy. Now what?&#8221; For me, I think it&#8217;s the latter.</p>
<p>From a business perspective, The Navstar project has been wrapped up for almost two months now. TheCityFix is all but wrapped up. When you&#8217;re writing, you don&#8217;t have time for business development. So now I&#8217;ve hit the reset button and rebuilding again. The buzz around the book has already generated enough leads that I don&#8217;t think I&#8217;ll be hurting for work.</p>
<p>From a book perspective, I can&#8217;t wait for this thing to come out. It is available on Amazon on February 15th and you can <a href="http://bit.ly/wpbible">preorder it now</a>. There will be a book launch in Baltimore and Washington, likely. I will undoubtedly be traveling to many WordCamps next year, including our own WordCamp Mid-Atlantic (which I co-organize). Next time I write a book, however, I will write it about something <em>I want</em> to write about and not something I&#8217;m qualified to write about. (kidding).</p>
<p>To aspiring writers, I say:</p>
<ul>
<li>Find your groove early. Don&#8217;t waste time on stylesheets (every publisher provides a style guide). That&#8217;s what the editor is for.</li>
<li>Roadmap your book so it&#8217;s on paper. Most publishers will require a table of contents before you start. It&#8217;s for your good as well as theirs.</li>
<li>Have thick skin during the editing process. Your editors don&#8217;t hate you even if their markup seems like they do. They have your best interest in mind.</li>
<li><strong>Have an agent!</strong> The agent is there to help navigate through the business process. Sure, they take 10-15% off the top, but they can often get you more money and more concessions. It&#8217;s sort of like don&#8217;t ever go to court without a lawyer.</li>
<li>Write because you want to write. You&#8217;ll never make it rich on writing (unless you&#8217;re Thomas Friedman, and even then, you&#8217;re probably making money from speaking engagements <em>because</em> of your writing).</li>
<li>Figure out the environment and mode you need to be in to effectively write.</li>
<li>If you need to stop because you&#8217;re mentally exhausted, stop&#8230; because you&#8217;re mentally exhausted. It doesn&#8217;t help your writing to be doing so in a robotic, bleary eyed way.</li>
<li>Most of all, have fun! Writing a book is a hard process, but so rewarding. If you treat it like work, it will be work. If you treat it as a way to channel your energies, you&#8217;ll have more fun doing it. :-)</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2009/11/17/the-wordpress-bible-writing-a-book-redux/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>10 Things You Need to Know About WordPress 2.9</title>
		<link>http://technosailor.com/2009/11/11/10-things-you-need-to-know-about-wordpress-2-9/</link>
		<comments>http://technosailor.com/2009/11/11/10-things-you-need-to-know-about-wordpress-2-9/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 22:36:41 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress 2.9]]></category>
		<category><![CDATA[wordpress cheatsheets]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=7832</guid>
		<description><![CDATA[Gentlemen, start your engines! WordPress 2.9 is just around the corner. Unlike WordPress 2.8, which Mark Jaquith describes as the Snow Leopard of WordPress since most of the basis of the WordPress 2.8 upgrade was complete rewrites and optimization of the infrastructure that ran WordPress instead of providing lots of new features in the same [...]]]></description>
			<content:encoded><![CDATA[<p><span class="drop_cap">G</span>entlemen, start your engines! WordPress 2.9 is just around the corner. Unlike WordPress 2.8, which <a href="http://markjaquith.wordpress.com">Mark Jaquith</a> describes as the Snow Leopard of WordPress since most of the basis of the WordPress 2.8 upgrade was complete rewrites and optimization of the infrastructure that ran WordPress instead of providing lots of new features in the same way Apple&#8217;s new OS X release is a focus on improved performance instead of features, WordPress 2.9 brings major new &#8220;bling&#8221; to the table. As a reminder of WordPress 2.8, you can see the writeup that <a href="http://wpvibe.com">Jonathan Dingman</a> brought us <a href="http://technosailor.com/2009/06/05/10-things-you-need-to-know-about-wordpress-28/">last time around</a>.</p>
<p>By and large, this release is a plugin developers release with lots of new APIs and abstraction. However, there are significant additions for theme designers and users as well. As a result, unlike previous iterations of this article (I do one for every major WordPress release), I&#8217;m going to break this down into sections for each kind of feature.</p>
<h2>Themes: the_post_thumbnail()</h2>
<p>Theme developers have a new piece of functionality that have become extremely popular in themes these days. As blogs have evolved from journal form into entities that can be very magazine-like, the use of thumbnail images has also grown. Typically, this layout is achieved through the use of custom fields that must be manually created and populated. No more!<br />
<img src="http://technosailor.com/files/wordpress-logo-hoz-rgb.png" alt="" width="499" height="113" class="alignright size-full wp-image-7675" /><br />
As of WordPress 2.9, if you use the built in image uploader, then WordPress handle this for you. Theme designers that wish to support this feature can add the template tag the_post_image() to their themes to achieve proper placement as required by the theme layout. The template tag can optionally take a &#8220;size&#8221;, which is one of the WordPress default sizes: thumbnail, medium, large, etc. If none is provided, it defaults to your preset thumbnail size.</p>
<p>Example:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; <span style="color: #339933;">&lt;</span>div <span style="color: #000000; font-weight: bold;">class</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;entry&quot;</span><span style="color: #339933;">&gt;</span><br />
&nbsp; &nbsp; <span style="color: #339933;">&lt;</span>h1<span style="color: #339933;">&gt;&amp;</span>lt<span style="color: #339933;">;</span>a href<span style="color: #339933;">=&amp;</span>quot<span style="color: #339933;">;</span><span style="color: #0000ff;">&quot;&amp;gt;&lt;/a&gt;&lt;/h1&gt;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <br />
&lt;/div&gt;</span></div></td></tr></tbody></table></div>
<p>Conveniently, if a theme is enabled for post thumbnails, the only &#8220;feature&#8221; currently offering this support in WordPress, then a new &#8220;meta box&#8221; will be displayed on the Write screen allowing you to assign a post image.</p>
<h2>Themes: Register Support for WordPress Features</h2>
<p><em>Editorial Note: Since this article was published, the code has changed to refer to post-thumbnails, not post-images. As a result, function names have also change. The code and examples included before reflect this change. Sorry for the confusion and sorry specifically to theme devs who have implemented the_post_image() feature already. Just change it to the_post_thumbnail()</em></p>
<p>This may seem to be an obscure feature, and typically, it&#8217;s pretty simple to figure out what I&#8217;m talking about just by looking at the header. In this case, it&#8217;s a bit more obscure because it suggests a feature that is introduced in WordPress 2.9 and then only for a very niche purpose. I can see this being built out over time, and plugin authors can supply their own use cases.</p>
<p>The concept is simple. If a feature exists &#8220;” in the core, the only use case is for the thumbnails I described earlier and it is called &#8216;post-thumbnails&#8217; &#8220;” then a theme can declare support for the feature using the add_theme_support() function in the theme functions.php. It can only be declared in this file and it requires a feature be assigned a name. As I mentioned, with WordPress 2.9, there is only one feature that is named and that is post-image. Plugin authors can provide their own new functionality using the require_if_theme_supports() function.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">require_if_theme_supports('my-custom-feature','/path/to/custom-lfeature-library.php');</div></td></tr></tbody></table></div>
<p>Themes would then enable support for the feature by including the following in their functions.php file.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">if ( function_exists( 'add_theme_support' ) )<br />
add_theme_support( 'my-custom-feature' );</div></td></tr></tbody></table></div>
<p>We&#8217;ve used the function_exists() check on the add_theme_support() function to ensure backwards compatibility with WordPress installations prior to WordPress 2.9. Similarly (and possibly confusingly in this context), before you would have to check for the existence of a plugin by using a function_exists() or class_exists() piece of logic and loading it if the class or function did exist, but now there are on/off switches to get it done.</p>
<h2>Users: The Trash Can</h2>
<p>On Windows, they call it the Recycle Bin. On Macs, it&#8217;s the Trash. In both cases, the feature exists to help people recover from accidental deletions. We have all had those moments where we nuked something we had no intention of nuking. With WordPress, accidental deletions have been permanent. In WordPress 2.9, everything is recoverable now with a new Trash feature. When you delete a post, page, category, comment, or any bit of content, it is moved to the Trash where you can decide whether to pull it back at a later date.</p>
<div id="attachment_7843" class="wp-caption alignright" style="width: 700px"><img class="size-large wp-image-7843" src="http://technosailor.com/wp-content/uploads/2009/11/Screen-shot-2009-11-11-at-6.08.34-PM-690x227.png" alt="The Trash Can view. From here, content can be restored or deleted permanently." width="690" height="227" /><p class="wp-caption-text">The Trash Can view. From here, content can be restored or deleted permanently.</p></div>
<p>Trash collection is done every 30 days by default, but it is possible to change this by editing your wp-config.php file. Add the following to your config file to change trash collection to every 7 days. Modify as needed.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">define('EMPTY_TRASH_DAYS',7);</div></td></tr></tbody></table></div>
<h2>Users: Image Editing</h2>
<p>One of the hot new features in WordPress 2.9 is image editing. Now don&#8217;t get me wrong. This isn&#8217;t Photoshop. And it only support basic functionality at this time. However, image editing will allow bloggers to crop, scale and rotate images from right within WordPress. From the media library, you can edit images by clicking the Edit link under an image, and then clicking the Edit button on the individual image page. This brings up an interface like what is shown below.</p>
<div class="wp-caption aligncenter" style="width: 510px"><img src="http://farm3.static.flickr.com/2684/4096969054_06d3401641.jpg" alt="The WordPress 2.9 Image Editing Screen" width="500" height="259" /><p class="wp-caption-text">The WordPress 2.9 Image Editing Screen</p></div>
<h2>Users: oEmbed</h2>
<p>oEmbed, as described at <a href="http://oembed.com/">oEmbed.com</a>, is a specification that allows media providers like <a href="http://flickr.com">Flickr</a>, <a href="http://youtube.com">YouTube</a> and others to provide data for consumer applications like WordPress about media. So by including an Embed (Use the File uploader and choose &#8220;From URL&#8221; and paste the link <em>to the page</em> that contains the media, not the media file itself) in a post or page, WordPress can retrieve the relevant specs on the media file and formulate a properly formatted embed accordingly.</p>
<p>Below is an embed of one of my Flickr photos using oEmbed.<br />
<a href="http://www.flickr.com/photos/technosailor/3630505051/sizes/m/in/set-72157619803598938/"><img src="http://farm4.static.flickr.com/3550/3630505051_e02053a1ca.jpg" alt="Scenes from San Francisco" width="500" height="333" /></a></p>
<p>Below, is an oEmbedded YouTube video (Original video removed so here&#8217;s the Iron Man 2 Trailer).<br />
<object width="600" height="363"><param name="movie" value="http://www.youtube.com/v/siQgD9qOhRs?fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/siQgD9qOhRs?fs=1" type="application/x-shockwave-flash" width="600" height="363" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>If you don&#8217;t want to use the GUI for this stuff, you can simply wrap the URL to the media page in embed shortcode tags like this.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[embed]http://www.youtube.com/watch?v=ZGp220EQUis&amp;amp;feature=popt00us0a[/embed]</div></td></tr></tbody></table></div>
<p>The list of supported oEmbed sites in WordPress are as follows:</p>
<ul>
<li>YouTube (via oEmbed)</li>
<li>Blip.tv (via oEmbed)</li>
<li>Flickr images and videos (via oEmbed)</li>
<li>Hulu (via oEmbed)</li>
<li>Viddler (via oEmbed)</li>
<li>Qik.com (via oEmbed) &#8220;” never heard of this site, but it was listed on oEmbed&#8217;s website, so&#8221;¦</li>
<li>Revision3 (via oEmbed)</li>
<li>Google Video (via an internal handler)</li>
<li>PollDaddy (via an internal handler)</li>
<li>DailyMotion (via an internal handler)</li>
</ul>
<p>That said, plugin authors can add new providers if they want by using the oembed_providers filter or override altogether with the WP_oEmbed-&gt;providers property.</p>
<h2>Plugins: Custom Post Types</h2>
<p>One of the strengths of <a href="http://drupal.com">Drupal</a> has been its ability to have multiple types of contents contained in objects that all look alike to PHP. WordPress has supported a variety of content types as well, but it has not been nearly as flexible making WordPress a blog platform with some additional support for pages and attachments. Technically, the only post_types that WordPress has supported have been post, page, revision and attachment. While it has technically been possible to add new post_types (like podcast, mp4, or tutorials &#8211; they could be anything, really), it has been a chore and required plugin developers to handle quite a few moving parts in order to make it all work properly.</p>
<p>No longer. Plugin authors now have API to register new post types, opening up the possibility for even more creativity and uses for WordPress.</p>
<h3>get_post_type()</h3>
<p>The get_post_type() function can only be used in the Loop. It returns the type of post a post is. Keep in mind, I&#8217;m using post loosely. All content in WordPress is kept in the posts table thereby inheriting the name &#8220;post&#8221;, but post is also a kind of content that is associated with blog content (as opposed to page which is a pseudo-static page, attachment which is information about an image or file uploaded with the media uploader, etc).</p>
<h3>get_post_types()</h3>
<p>The get_post_types() function will return a list of all types of post content. By default, this will be post, page, attachment and revision. Refer to the source code for optional arguments that can be used to control what kind of data is returned.</p>
<h3>register_post_type()</h3>
<p>As a plugin author, you can use this function to create a new post type. The first argument is the unique handle you want to assign to the post type &#8211; let&#8217;s call it podcast &#8211; and the second argument is an array that contains additional elements. The key one here is an exclude_from_search, which by default is set to true. You actually probably want to set this to false unless you really don&#8217;t want this additional content searchable. See below for example usage.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function wpb_podcast_init()<br />
{<br />
register_post_type('podcast',array('exclude_from_search' =&amp;gt; false) );<br />
}<br />
add_action('init','wpb_podcast_init');</div></td></tr></tbody></table></div>
<p>There is currently no user interface for post types. There is a patch in for UI that will likely be included in WordPress 3.0.</p>
<h2>Plugins: Comment Meta</h2>
<p>There has been a variety of meta tables in WordPress. Meta tables, like usermeta or postmeta, are database tables that contain information about the type of data that is stored in WordPress. It allows plugins and WordPress to assign metadata, such as user roles and capabilities, to pieces of data thus extending that data. Now, there is a comment meta table as well.</p>
<p>Though it is unclear how plugin authors will seek to use this table, the fact that it is available is a major deal as it essentially provides meta tables for every piece of content in WordPress now.</p>
<h2>Plugins: Metadata API</h2>
<p>With the addition of a comments meta table, it has become effectively redundant to duplicate functions throughout WordPress. You have a get_post_meta() function that does the same thing as a get_usermeta() function except they query data from different tables that also look identical except for the data stored in them.</p>
<p>In WordPress 2.9, there is an entirely new Metadata API that can be used to retrieve data from any of these meta tables.</p>
<p>The add_metadata() function takes a meta type (&#8216;comment&#8217;, &#8216;post&#8217;, &#8216;user&#8217;, etc), the ID of the content type, the key and value of the metadata and whether the information should be unique or not (true or false).</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">add_metadata('comment', 12345, 'twitter_id', 'someyoungpunk');</div></td></tr></tbody></table></div>
<p>You can also use update_metadata(), delete_metadata(), get_metadata() and update_meta_cache() for further wrangling. Refer to wp-includes/meta.php for full documentation.</p>
<h2>Themes/Plugins: Theme System Modification</h2>
<p>A lot of messiness has been eliminated in WordPress 2.9 theming. For one, new template opportunities exist. Now, instead of looking for a template file called category-x.php, tag-x.php or page-x.php, where x is the ID of one of those types of content types, it will look for these templates second. The first template that is now looked for is based on the slug. So if you have a category, tag or page called foo, the first template to be sought after would be category-foo.php, tag-foo.php, or page-foo.php. If none of these templates exist, <em>then</em> the ID-based template file is looked for.</p>
<p>Additionally, plugin developers can register new directories for themes to be located with the register_theme_directory() function.</p>
<h2>System: Database Repair Script</h2>
<p>The database occasionally needs a good spring cleaning. Other times, the database needs a repair. WordPress ships with a new script that will do just this. It is housed at /wp-admin/maint/repair.php but in order to use it, you need to create a new (or modify if it already exists for some reason) constant in wp-config.php.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">define('WP_ALLOW_REPAIR',true);</div></td></tr></tbody></table></div>
<h2>System: Minimum Requirements</h2>
<p>PHP 5 is not required yet. That&#8217;s <del datetime="2009-11-18T02:28:44+00:00">coming in WordPress 3.0</del> will be increasingly implemented over time. <del datetime="2009-11-18T02:28:44+00:00">But MySQL requirements have been boosted from MySQL 4.0 to MySQL 4.1.2.</del></p>
<h2>Bonus coverage</h2>
<p>Other interesting things in WordPress 2.9.</p>
<ul>
<li>JSON compatibility, before only beneficial to PHP 5.2, has been backported for use in WordPress</li>
<li>New &#8216;Undo&#8217; button when using the Visual Text Editor</li>
<li>A new sanitization API (with functions like esc_html())</li>
<li>The emoticon system can be altered using the smilies_src hook. :-)</li>
<li>Bulk Upgrading of plugins</li>
<li>Filesystem optimizations pertaining to FTP/SSH etc.</li>
<li>rel=&#8221;canonical&#8221; for single posts and pages aiding in SEO</li>
<li>Minify Admin CSS making for quicker (and smaller) page loads</li>
<li>Bunny Tags and Jeromes Keywords Importers removed</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2009/11/11/10-things-you-need-to-know-about-wordpress-2-9/feed/</wfw:commentRss>
		<slash:comments>108</slash:comments>
		</item>
		<item>
		<title>WordPress Security and How I&#8217;m Going to Take All Your Money</title>
		<link>http://technosailor.com/2009/09/06/wordpress-security-and-how-im-going-to-take-all-your-money/</link>
		<comments>http://technosailor.com/2009/09/06/wordpress-security-and-how-im-going-to-take-all-your-money/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 14:07:16 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=7760</guid>
		<description><![CDATA[So, it&#8217;s happened again. Another vulnerability discovered in WordPress that is now becoming the raging topic around the blogosphere. Is WordPress insecure? Should people move to another platform? If we stomp our feet loud and enough and whine enough, then we can make WordPress look like a ridiculous piece of software that only amateurs should [...]]]></description>
			<content:encoded><![CDATA[<p><span class="drop_cap">S</span>o, it&#8217;s happened again. Another vulnerability discovered in WordPress that is now becoming the raging topic around the blogosphere. Is WordPress insecure? Should people move to another platform? <a href="http://scobleizer.com/2009/09/05/i-dont-feel-safe-with-wordpress-hackers-broke-in-and-took-things/">If we stomp our feet loud and enough and whine enough</a>, then we can make WordPress look like a ridiculous piece of software that only amateurs should use.</p>
<p>I call bullshit. Here&#8217;s why.</p>
<p>The current security paranoia is around an exploit <em>that has already been fixed!</em> That&#8217;s right, it was known and fixed two releases ago. The problem is, the people complaining about WordPress&#8217; security are running old software. <em>They didn&#8217;t bother to do the responsible thing and keep their blog up to date!</em></p>
<p><a href="http://technosailor.com/files/grey-xl1.png"><img src="http://technosailor.com/files/grey-xl1.png" alt="" title="grey-xl" width="250" height="250" class="alignleft size-full wp-image-8412" /></a>See, WordPress has two different types of releases. Major releases (2.5, 2.6, 2.7, 2.8, etc) provide new features. These releases keep the software innovative, bringing new functionality to bloggers every 4-6 months. Security releases (2.8.1, 2.8.2, 2.8.3, 2.8.4, etc) are arguably more important than major releases because <em>they keep you safe!</em></p>
<p>Bloggers who <em>ignore</em> these security releases do so at their own risk.</p>
<p>And because of that, <strong>when you are hacked, I will charge you an assload of money to fix you up!</strong> Believe it.</p>
<p>There is nothing more I want to do on a holiday weekend that also happens to be my birthday weekend, than to fix peoples blogs who didn&#8217;t bother to take care of themselves. It&#8217;s personal responsibility. Oh, I&#8217;ll do it. You won&#8217;t like the bill, though.</p>
<p>If you&#8217;re using WordPress 2.7+, as said loudmouth blogger was, it&#8217;s so simple to keep things up to date with the auto-upgrade button. WordPress even informs you when your version is out of date and provides a direct link to the upgrade page. If you ignore that, it&#8217;s not my fault&#8230; it&#8217;s yours.</p>
<p>For clients hosted on my servers, you are up to date. Why? Because I make sure of it. For the rest of you, <a href="http://lorelle.wordpress.com/2009/09/04/old-wordpress-versions-under-attack/">do your part, so I don&#8217;t have to</a>. Because my part will be making your blog secure, but it will also be sending you a sizable invoice.</p>
<p>Cheers, and happy Labor Day!</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2009/09/06/wordpress-security-and-how-im-going-to-take-all-your-money/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>WordPress Bible Book Tour</title>
		<link>http://technosailor.com/2009/08/26/wordpress-bible-book-tour/</link>
		<comments>http://technosailor.com/2009/08/26/wordpress-bible-book-tour/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 16:46:35 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[tour]]></category>
		<category><![CDATA[Travel]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress bible]]></category>
		<category><![CDATA[wpbible]]></category>

		<guid isPermaLink="false">http://technosailor.com/?p=7751</guid>
		<description><![CDATA[From the moment I announced that I would be writing the WordPress Bible, friends and fans all over the world have been asking me to come to their city to do an event. Clearly, I would love to do such a thing, but without tremendous support it is not in the cards. However, more recently, [...]]]></description>
			<content:encoded><![CDATA[<p><span class="drop_cap">F</span>rom the moment I announced that I would be <a href="http://technosailor.com/2009/07/03/writing-the-wordpress-bible/">writing the WordPress Bible</a>, friends and fans all over the world have been asking me to come to their city to do an event. Clearly, I would love to do such a thing, but without tremendous support it is not in the cards.</p>
<p>However, more recently, as I&#8217;ve just reached my 50% writing deadline, I&#8217;ve thought more seriously about going on the road next year after the book goes on sale. (It&#8217;s slated currently for Feb 22, 2010 and <a href="http://www.amazon.com/gp/product/0470568135?ie=UTF8&amp;tag=emmensetechno-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0470568135">you can pre-order the book now on Amazon for $31.49</a><img src="http://www.assoc-amazon.com/e/ir?t=emmensetechno-20&amp;l=as2&amp;o=1&amp;a=0470568135" width="1" height="1" border="0" alt="" style="border:none !important;margin:0px !important" /><br />
 &#8211; aff).<br />
<img src="http://technosailor.com/wp-content/uploads/2009/07/wordpress-logo-hoz-rgb1-249x56.png" alt="wordpress-logo-hoz-rgb" width="249" height="56" class="alignleft size-medium wp-image-7678" /><br />
So here&#8217;s the deal. I am working on a sponsorship that would provide me a vehicle for a round-the-country 2-3 week book tour in late March, early April. I would like to visit 12-15 cities around the U.S. and Canada. Ideally, these are cities where there are a core of WordPress users and, ideally, where there has been a WordCamp (this denotes interest in the topic). Some of these cities might be:</p>
<ul>
<li>Washington, D.C.</li>
<li>NYC</li>
<li>Boston</li>
<li>Toronto</li>
<li>Nashville</li>
<li>Columbus</li>
<li>Chicago</li>
<li>Dallas</li>
<li>Denver</li>
<li>San Francisco</li>
<li>Los Angeles</li>
<li>San Diego</li>
<li>Seattle</li>
</ul>
<p>Each city needs to have a host who can organize the event, take care of expenses, etc. I would like to be able to host an open bar/reception time as well so sponsors probably need to be raised. Don&#8217;t get me wrong, this type of thing is probably not a break-the-bank kind of event. We need a venue (bookstore likely), venue (reception), maybe sponsors, my expenses, and someone to get people out.</p>
<p>If you&#8217;re interested in hosting in these or other cities, send me an email at <a href="mailto:aaron@technosailor.com">aaron@technosailor.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2009/08/26/wordpress-bible-book-tour/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Writing &quot;The WordPress Bible&quot;</title>
		<link>http://technosailor.com/2009/07/03/writing-the-wordpress-bible/</link>
		<comments>http://technosailor.com/2009/07/03/writing-the-wordpress-bible/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 16:00:55 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Aaron Brazell]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[Studiob]]></category>
		<category><![CDATA[Wiley]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpress bible]]></category>

		<guid isPermaLink="false">http://technosailor.com/2009/07/03/writing-the-wordpress-bible/</guid>
		<description><![CDATA[A long time ago in a galaxy far, far away&#8230; That&#8217;s how the process of coming to be the newest author for Wiley Publishing seems to have gone, even though the initial contact was only in late April. Back then, I received a mysterious email in my inbox asking if I would be interested in [...]]]></description>
			<content:encoded><![CDATA[<p><em>A long time ago in a galaxy far, far away&#8230;</em></p>
<p>That&#8217;s how the process of coming to be the newest author for <a href="http://www.wiley.com/">Wiley Publishing</a> seems to have gone, even though the initial contact was only in late April.</p>
<p>Back then, I received a mysterious email in my inbox asking if I would be interested in writing <em>The WordPress Bible</em>. Fascinated, I immediately responded back and the conversation began.</p>
<p>We have had an agreement in principle for several weeks and now that the contract is official, I feel comfortable talking publicly about the deal &#8211; though the details of the deal will remain undisclosed.</p>
<p>I&#8217;m excited about writing this book. As many of you who have been with me for these more than five years know, I began the process of writing a book with my friend and colleague <a href="http://ensight.org">Jeremy Wright</a> back in 2005. Honestly, I don&#8217;t think either of our hearts were in that book and we amicably agreed with the publisher that we wouldn&#8217;t complete that project. Sort of a shame in itself, but all for the better.</p>
<p><img src="http://technosailor.com/wp-content/uploads/2009/07/wordpress-logo-hoz-rgb1-249x56.png" alt="wordpress-logo-hoz-rgb" width="249" height="56" class="alignleft size-medium wp-image-7678" /></p>
<p>That project gave me a little window into the life of an author. Overcoming writers block. Roadmapping chapters. Communication at all time with project editors. Stylesheets. Deadlines. All that jazz.</p>
<p>At that time, I was much less mature as a writer so it was a huge challenge to write effectively and for an audience. At that time, I was a much more free-spirited author writing often elaborate (and possibly poetic) prose which might not have been the right fit for a book of that nature. Today, I still am the best damned writer around (kidding) but know when to turn it on and off and how to write an effective 4000 word article or a 140 character tweet.</p>
<p>Today, I approach <em>The WordPress Bible</em> with some fear and trepidation. Currently, the book is marked at around a cool 700 pages. And oh yes, it has to be done in October. Yikes!</p>
<p>What this effectively means is that for the next four months, I will be spending monumental amounts of time doing nothing but writing. I&#8217;m considering disappearing to the mountains once a month for 3-4 days just to write.</p>
<p>During the process, I am going to continue to work with my clients to deliver valuable WordPress solutions for their businesses. In the past week, I have secured 3 more clients that I will be able to work with over the next few months.</p>
<p>I want to thank Stephanie McComb at Wiley for believing in me and reaching out to me in April. This will be a great addition to the Bible series. I also want to thank Lynn Haller from <a href="http://studiob.com">Studio B</a> for helping me through the process and running valuable interference during the negotiations. Anyone looking to write a book should reach out to her to represent you. Authors should usually have agents and she&#8217;s a great agent.</p>
<p>I can&#8217;t wait for this book to hit the shelf. It&#8217;s going to be an invaluable resource for WordPress users, themers and developers of all range of skills and will be a &#8220;must order&#8221;.</p>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://technosailor.com/2009/07/03/writing-the-wordpress-bible/feed/</wfw:commentRss>
		<slash:comments>54</slash:comments>
		</item>
	</channel>
</rss>

