<?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>Xavisys&#187; Wordpress</title> <atom:link href="http://xavisys.com/tag/wordpress/feed/" rel="self" type="application/rss+xml" /><link>http://xavisys.com</link> <description>WordPress Plugins and Custom WordPress Development</description> <lastBuildDate>Thu, 21 Jan 2010 20:22:34 +0000</lastBuildDate> <generator>http://wordpress.org/?v=2.9.2</generator> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <atom:link rel='hub' href='http://xavisys.com/?pushpress=hub'/> <item><title>How To Make Your Own WordPress Widget</title><link>http://xavisys.com/wordpress-widget/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=wordpress-widget</link> <comments>http://xavisys.com/wordpress-widget/#comments</comments> <pubDate>Mon, 09 Nov 2009 18:45:26 +0000</pubDate> <dc:creator>AaronCampbell</dc:creator> <category><![CDATA[WordPress Widgets]]></category> <category><![CDATA[wordpress development]]></category> <category><![CDATA[Wordpress]]></category> <category><![CDATA[WordPress 2.8]]></category> <category><![CDATA[WordPress Howto]]></category><guid
isPermaLink="false">http://wpinformer.com/?p=44</guid> <description><![CDATA[In this article, I&#8217;m going to show you how to write a simple plugin that adds a new widget to WordPress.  We&#8217;ll be using the new WP_Widget class, which is the newest method but means that the widget will only work in WordPress 2.8+.  I know that 2.8 isn&#8217;t actually out yet, but [...]]]></description> <content:encoded><![CDATA[<p>In this article, I&#8217;m going to show you how to write a simple plugin that adds a new widget to WordPress.  We&#8217;ll be using the new WP_Widget class, which is the newest method but means that the widget will only work in WordPress 2.8+.  I know that 2.8 isn&#8217;t actually out yet, but it will be soon and there&#8217;s no sense in learning the old method.</p><p>The widget we&#8217;ll be creating will display upcoming posts (scheduled posts).  A lot of sites schedule posts to automatically publish at a specific time, helping them keep a steady flow of articles.  I know that I use this trick on <a
href="http://webdevnews.net">Web Developer News</a> and <a
href="http://www.attackr.com">Attackr</a>, and I&#8217;ll use it on this site as soon as I get some more articles written.  Since the articles are already there and ready to be posted, why not tease them and give your readers something to look forward to?  That&#8217;s exactly what this widget will do.</p><p><span
id="more-44"></span></p><p>To start, you need to create a class for your widget that that extends WP_Widget.  We&#8217;ll be using WP_Widget_Upcoming_Posts.  Then you should hook into the widgets_init action and use register_widget() to register your new widget.  The bare bones skeleton looks like this (and does nothing but throw a warning):</p><pre class="brush: php;">
/**
 * Upcoming_Posts widget class
 */
class WP_Widget_Upcoming_Posts extends WP_Widget {
	// Our Widget methods will go here
}
function registerUpcomingPostsWidget() {
	register_widget('WP_Widget_Upcoming_Posts');
}
add_action('widgets_init', 'registerUpcomingPostsWidget');
</pre><p>Now, there are a few methods that you need to create.  The first needs to be named the same as the class (WP_Widget_Upcoming_Posts in this case), which will be used to instantiate the widget.  Do not use the PHP5 __construct, as the WP_Widget class uses that and you end up with an infinite loop if you do.  Second, you must create a widget method, which is used to actually manage and display your widget.  In our case we&#8217;ll also be overloading the update method to handle updates to widget settings and the form method which is used to display the setting form on the widget admin page.  I&#8217;m going to go through each method, explain the code, and then put it all together.</p><p>First, the WP_Widget_Upcoming_Posts method:</p><pre class="brush: php;">
function WP_Widget_Upcoming_Posts() {
	$widget_ops = array('classname' =&gt; 'widget_upcoming_entries', 'description' =&gt; __( &quot;List scheduled/upcoming posts&quot;, 'upcoming_posts_widget') );
	$this-&gt;WP_Widget('upcoming-posts', __('Upcoming Posts', 'upcoming_posts_widget'), $widget_ops);
}
</pre><p>First, we set up the options for the widget.  We set the classname to widget_upcoming_posts.  This will be added to the li tag of the widget when it&#8217;s displayed.  We also set the description, which is displayed when the widget box is expanded in the available widgets section of the new widgets admin page.  These options are passed to WP_Widget along with the id base (upcoming-posts) and the widget name (Upcoming Posts).</p><pre class="brush: php;">
function widget($args, $instance) {
	extract($args);

	$title = empty($instance['title']) ? __('Upcoming Posts', 'upcoming_posts_widget') : apply_filters('widget_title', $instance['title']);
	if ( !$number = (int) $instance['number'] )
		$number = 10;
	else if ( $number &lt; 1 )
		$number = 1;
	else if ( $number &gt; 15 )
		$number = 15;

	$queryArgs = array(
		'showposts'			=&gt; $number,
		'what_to_show'		=&gt; 'posts',
		'nopaging'			=&gt; 0,
		'post_status'		=&gt; 'future',
		'caller_get_posts'	=&gt; 1,
		'order'				=&gt; 'ASC'
	);

	$r = new WP_Query($queryArgs);
	if ($r-&gt;have_posts()) :
?&gt;
	&lt;?php echo $before_widget; ?&gt;
	&lt;?php echo $before_title . $title . $after_title; ?&gt;
	&lt;ul&gt;
	&lt;?php  while ($r-&gt;have_posts()) : $r-&gt;the_post(); ?&gt;
	&lt;li&gt;&lt;?php if ( get_the_title() ) the_title(); else the_ID(); ?&gt;&lt;?php edit_post_link('e',' (',')'); ?&gt;&lt;/li&gt;
	&lt;?php endwhile; ?&gt;
	&lt;/ul&gt;
	&lt;?php echo $after_widget; ?&gt;
&lt;?php
	endif;
	wp_reset_query();  // Restore global post data stomped by the_post().
}
</pre><p>The first thing we do is extract $args, which gives you $name, $id, $before_widget, $after_widget, $before_title, $after_title, $widget_id, and $widget_name.  We&#8217;ll use those throughout the rest of the function.  Next we set $title.  If it was specified in the settings for the widget, then use use it and apply the widget_title filter to it.  If a title wasn&#8217;t specified, we use &#8220;Upcoming Posts&#8221;.</p><p>Next, we deal with the number of posts to display.  If nothing was specified in the widget settings, we set $number to 10.  If the user did specify the number of posts to display, we do some sanity checks to make sure that the number is at least 0 and no more than 15.  This isn&#8217;t absolutely necessary, but it&#8217;s nice to set some limits to things don&#8217;t get out of hand.</p><p>Now we need to prepare to actually query the database and retrieve the posts.  In order to get the posts we want, we set the following:</p><dl><dt>showposts</dt><dd>This sets the number of posts to display.</dd><dt>what_to_show</dt><dd>This specifies what items to retrieve from the database.  We want posts, not pages, attachments, revisions, etc.</dd><dt>nopaging</dt><dd>If the blog is set up to show fewer posts per page than we&#8217;re trying to get, paging would interfere.  We turn it off just to be safe.</dd><dt>post_status</dt><dd>Since this plugin displays scheduled posts, we need to make sure that the post status is future, not published, draft, etc.</dd><dt>caller_get_posts</dt><dd>This is to make sure that sticky posts aren&#8217;t re-ordered to the top.</dd><dt>order</dt><dd>The order defaults to descending, which means it displays post with the highest (most futuristic) date first.  We want to display the next post (oldest scheduled post) first, so we set this to ASC for ascending.</dd></dl><p>Now that all the options are set, we run the query.  We want to make sure that all output is inside the have_posts loop, so that if no posts are returned the widget doesn&#8217;t display (rather than showing the title with no posts).  In order to fit within all themes, you want to make sure to always echo your output in this order: $before_widget, $before_title, $title, $after_title, your widget content, $after_widget.  A theme can customize each of those before and after items to create the proper markup for their design, so it&#8217;s important to use them.  Our widget content is simply an unordered list of posts.  The only little extra I added is the edit_post_link(), which will display a link to edit the post if you are logged in with sufficient permissions.  The last thing we do is reset the query, so that our widget query doesn&#8217;t mess up other queries.</p><p>The next method we need to set up is the update method.  Technically this isn&#8217;t actually required, but it gives us a chance to sanitize input.</p><pre class="brush: php;">
function update( $new_instance, $old_instance ) {
	$instance = $old_instance;
	$instance['title'] = strip_tags($new_instance['title']);
	$instance['number'] = (int) $new_instance['number'];

	return $instance;
}
</pre><p>As you can see, we strip tags from the title and make sure that number is and integer.  You&#8217;ll notice that we take the old instance and update it with info from the new instance.  This makes sure that no one tries to sneak in extra data by modifying the form on the widget admin page.  It&#8217;s not necessary, but it&#8217;s a little more secure.</p><p>The last thing we need to do is set up the form method, which actually displays the settings on the widget admin page.</p><pre class="brush: php;">
function form( $instance ) {
	$title = attribute_escape($instance['title']);
	if ( !$number = (int) $instance['number'] )
		$number = 5;
?&gt;
	&lt;p&gt;&lt;label for=&quot;&lt;?php echo $this-&gt;get_field_id('title'); ?&gt;&quot;&gt;
	&lt;?php _e('Title:'); ?&gt;
	&lt;input class=&quot;widefat&quot; id=&quot;&lt;?php echo $this-&gt;get_field_id('title'); ?&gt;&quot; name=&quot;&lt;?php echo $this-&gt;get_field_name('title'); ?&gt;&quot; type=&quot;text&quot; value=&quot;&lt;?php echo $title; ?&gt;&quot; /&gt;&lt;/label&gt;&lt;/p&gt;

	&lt;p&gt;&lt;label for=&quot;&lt;?php echo $this-&gt;get_field_id('number'); ?&gt;&quot;&gt;
	&lt;?php _e('Number of posts to show:'); ?&gt;
	&lt;input id=&quot;&lt;?php echo $this-&gt;get_field_id('number'); ?&gt;&quot; name=&quot;&lt;?php echo $this-&gt;get_field_name('number'); ?&gt;&quot; type=&quot;text&quot; value=&quot;&lt;?php echo $number; ?&gt;&quot; /&gt;&lt;/label&gt;
	&lt;br /&gt;&lt;small&gt;&lt;?php _e('(at most 15)'); ?&gt;&lt;/small&gt;&lt;/p&gt;
&lt;?php
}
</pre><p>Since we will be putting the title into the value attribute of an input element, we want to make sure it&#8217;s safe to do so by using attribute_escape() first.  Then we make sure that number is an integer and set it to 5 if it does not exist (this doesn&#8217;t actually set the widget settings to 5, it just displays a 5 in the form field rather than leaving it blank, giving the user and idea of what&#8217;s expected).  Then we break out of PHP and actually display the form.  The format I use is the default and will make your widget blend with the ones included with WordPress.  It goes like this (with and without &#8220;hint text&#8221;):</p><pre class="brush: xml;">
&lt;p&gt;
	&lt;label&gt;
		Label Text
		&lt;input&gt;
	&lt;/label&gt;
&lt;/p&gt;

&lt;p&gt;
	&lt;label&gt;
		Label Text
		&lt;input&gt;
	&lt;/label&gt;
	&lt;br /&gt;
	&lt;small&gt;
		Hint Text
	&lt;/small&gt;
&lt;/p&gt;
</pre><p>That&#8217;s it!  Your widget is done, it matches the existing widgets, and can be dropped into any widget-ready section of a WordPress 2.8+ blog!  Download a slightly more advanced version of the <a
href="http://xavisys.com/2009/04/wordpress-upcoming-posts-widget/">Upcoming Posts Widget</a> that includes caching, and try it out!  you can also see the widget completed below:</p><pre class="brush: php;">
/**
 * Upcoming_Posts widget class
 */
class WP_Widget_Upcoming_Posts extends WP_Widget {
	function WP_Widget_Upcoming_Posts() {
		$widget_ops = array('classname' =&gt; 'widget_upcoming_entries', 'description' =&gt; __( &quot;List scheduled/upcoming posts&quot;, 'upcoming_posts_widget') );
		$this-&gt;WP_Widget('upcoming-posts', __('Upcoming Posts', 'upcoming_posts_widget'), $widget_ops);
	}

	function widget($args, $instance) {
		extract($args);

		$title = empty($instance['title']) ? __('Upcoming Posts', 'upcoming_posts_widget') : apply_filters('widget_title', $instance['title']);
		if ( !$number = (int) $instance['number'] )
			$number = 10;
		else if ( $number &lt; 1 )
			$number = 1;
		else if ( $number &gt; 15 )
			$number = 15;

		$queryArgs = array(
			'showposts'			=&gt; $number,
			'what_to_show'		=&gt; 'posts',
			'nopaging'			=&gt; 0,
			'post_status'		=&gt; 'future',
			'caller_get_posts'	=&gt; 1,
			'order'				=&gt; 'ASC'
		);

		$r = new WP_Query($queryArgs);
		if ($r-&gt;have_posts()) :
	?&gt;
		&lt;?php echo $before_widget; ?&gt;
		&lt;?php echo $before_title . $title . $after_title; ?&gt;
		&lt;ul&gt;
		&lt;?php  while ($r-&gt;have_posts()) : $r-&gt;the_post(); ?&gt;
		&lt;li&gt;&lt;?php if ( get_the_title() ) the_title(); else the_ID(); ?&gt;&lt;?php edit_post_link('e',' (',')'); ?&gt;&lt;/li&gt;
		&lt;?php endwhile; ?&gt;
		&lt;/ul&gt;
		&lt;?php echo $after_widget; ?&gt;
	&lt;?php
		endif;
		wp_reset_query();  // Restore global post data stomped by the_post().
	}

	function update( $new_instance, $old_instance ) {
		$instance = $old_instance;
		$instance['title'] = strip_tags($new_instance['title']);
		$instance['number'] = (int) $new_instance['number'];

		return $instance;
	}

	function form( $instance ) {
		$title = attribute_escape($instance['title']);
		if ( !$number = (int) $instance['number'] )
			$number = 5;
	?&gt;
		&lt;p&gt;&lt;label for=&quot;&lt;?php echo $this-&gt;get_field_id('title'); ?&gt;&quot;&gt;
		&lt;?php _e('Title:'); ?&gt;
		&lt;input class=&quot;widefat&quot; id=&quot;&lt;?php echo $this-&gt;get_field_id('title'); ?&gt;&quot; name=&quot;&lt;?php echo $this-&gt;get_field_name('title'); ?&gt;&quot; type=&quot;text&quot; value=&quot;&lt;?php echo $title; ?&gt;&quot; /&gt;&lt;/label&gt;&lt;/p&gt;

		&lt;p&gt;&lt;label for=&quot;&lt;?php echo $this-&gt;get_field_id('number'); ?&gt;&quot;&gt;
		&lt;?php _e('Number of posts to show:'); ?&gt;
		&lt;input id=&quot;&lt;?php echo $this-&gt;get_field_id('number'); ?&gt;&quot; name=&quot;&lt;?php echo $this-&gt;get_field_name('number'); ?&gt;&quot; type=&quot;text&quot; value=&quot;&lt;?php echo $number; ?&gt;&quot; /&gt;&lt;/label&gt;
		&lt;br /&gt;&lt;small&gt;&lt;?php _e('(at most 15)'); ?&gt;&lt;/small&gt;&lt;/p&gt;
	&lt;?php
	}
}
function registerUpcomingPostsWidget() {
	register_widget('WP_Widget_Upcoming_Posts');
}
add_action('widgets_init', 'registerUpcomingPostsWidget');
</pre><h3 class='related_post_title'>Related Posts:</h3><ul
class='related_post'><li><a
href='http://xavisys.com/wordpress-core-canonical-plugins/' title='WordPress Core vs Canonical Plugins'>WordPress Core vs Canonical Plugins</a></li><li><a
href='http://xavisys.com/wordpress-haspatch-marathon/' title='The WordPress has-patch marathon'>The WordPress has-patch marathon</a></li><li><a
href='http://xavisys.com/xavisys-wordpress-plugin-framework/' title='The Xavisys WordPress Plugin Framework'>The Xavisys WordPress Plugin Framework</a></li><li><a
href='http://xavisys.com/wordpress-developer-meeting-july-01-2009/' title='WordPress Developer Meeting &#8211; July 01, 2009'>WordPress Developer Meeting &#8211; July 01, 2009</a></li><li><a
href='http://xavisys.com/wordpress-2-8-release-date/' title='WordPress 2.8 Release Date'>WordPress 2.8 Release Date</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://xavisys.com/wordpress-widget/feed/</wfw:commentRss> <slash:comments>9</slash:comments> </item> <item><title>WordPress Core vs Canonical Plugins</title><link>http://xavisys.com/wordpress-core-canonical-plugins/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=wordpress-core-canonical-plugins</link> <comments>http://xavisys.com/wordpress-core-canonical-plugins/#comments</comments> <pubDate>Mon, 13 Jul 2009 13:00:12 +0000</pubDate> <dc:creator>AaronCampbell</dc:creator> <category><![CDATA[Wordpress]]></category> <category><![CDATA[wordpress development]]></category><guid
isPermaLink="false">http://xavisys.com/?p=429</guid> <description><![CDATA[There has been intense discussion about what should and shouldn&#8217;t go into the core of WordPress and what should be in plugins since way before Matt talked about canonical WordPress plugins in his State of the Word, but that mention has definitely caused some serious buzz.  The question is whether WordPress should stay small [...]]]></description> <content:encoded><![CDATA[<p>There has been intense discussion about what should and shouldn&#8217;t go into the core of WordPress and what should be in plugins since way before <a
href="http://ma.tt">Matt</a> talked about canonical WordPress plugins in his <a
href="http://wpinformer.com/state-word-wordcamp-part-2/">State of the Word</a>, but that mention has definitely caused some serious buzz.  The question is whether WordPress should stay small and fast or grow and be feature rich.  Both have their advantages and disadvantages.</p><p>The advantages to the &#8220;WordPress should stay small&#8221; philosophy are not limited to the WordPress download staying small (although that is one advantage).  A smaller code base will make it easier to keep WordPress fast, reliable, and easy to test as well.   The people that support this side of the argument would argue that WordPress could be extended to still accomplish any of the &#8220;missing&#8221; features through plugins and custom themes, and having built-in functionality that you don&#8217;t use is a waste.</p><p>The disadvantages are that many users (remember there are millions of WordPress blogs out there, many ran by people that are not tech savvy) are not comfortable with or even capable of installing plugins to solve their problems.  For those people, having the functionality in the core WordPress install is probably the only way they&#8217;ll get to use it.  Not to mention if 99% of people that install WordPress install a specific plugin, isn&#8217;t it obvious that the functionality provided by that plugin should be included in WordPress itself?  Unfortunately, what if it&#8217;s 95%?  90%?  75?  It&#8217;s hard to figure out where to draw the line.  Additionally, if something is popular but doesn&#8217;t make it into core, should the programmers test against it before releasing new versions of WordPress or does that responsibility fall to the plugin author?</p><p>Obviously the advantages and disadvantages for the &#8220;WordPress should be feature rich&#8221; philosophy are the exact opposite.  The problem is, both sides have valid arguments, so the real question becomes &#8220;is there something better?&#8221;  I think canonical plugins may very well be the answer to that.  The idea of canonical plugins is that WordPress would back a specific plugin as being the &#8220;solution&#8221; to a specific problem.  For example, maybe you want to display related posts and WordPress has decided that &#8220;<a
href="http://xavisys.com/2009/06/efficient-related-posts/">Efficient Related Posts</a>&#8221; is the solution for that.  They may have a list of commonly asked for features and their solutions on a page somewhere, or they may take it one step further and package the plugins with the official WordPress download.</p><p>I think that if they package some plugins with the official WordPress download, they may be very close to a great solution to this tiring debate.  The advantages are that the core would stay lean, fast, and reliable.  The functionality would be available to all users because it&#8217;s just a matter of activating the plugins rather than finding, downloading, and installing them.  Also, the plugins that are shipped with WordPress would need to be tested with each new version, which means they&#8217;ll be stable as well.  The only real disadvantage is that the download size would grow, but we live in the era of broadband.  It seems a small price to pay to solve so many other problems.<br
/><h3 class='related_post_title'>Related Posts:</h3><ul
class='related_post'><li><a
href='http://xavisys.com/wordpress-widget/' title='How To Make Your Own WordPress Widget'>How To Make Your Own WordPress Widget</a></li><li><a
href='http://xavisys.com/wordpress-haspatch-marathon/' title='The WordPress has-patch marathon'>The WordPress has-patch marathon</a></li><li><a
href='http://xavisys.com/xavisys-wordpress-plugin-framework/' title='The Xavisys WordPress Plugin Framework'>The Xavisys WordPress Plugin Framework</a></li><li><a
href='http://xavisys.com/wordpress-developer-meeting-july-01-2009/' title='WordPress Developer Meeting &#8211; July 01, 2009'>WordPress Developer Meeting &#8211; July 01, 2009</a></li><li><a
href='http://xavisys.com/wordcamp-san-francisco-2009/' title='WordCamp San Francisco 2009'>WordCamp San Francisco 2009</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://xavisys.com/wordpress-core-canonical-plugins/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>WordCamp San Francisco 2009</title><link>http://xavisys.com/wordcamp-san-francisco-2009/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=wordcamp-san-francisco-2009</link> <comments>http://xavisys.com/wordcamp-san-francisco-2009/#comments</comments> <pubDate>Tue, 02 Jun 2009 20:21:35 +0000</pubDate> <dc:creator>AaronCampbell</dc:creator> <category><![CDATA[Wordpress]]></category> <category><![CDATA[BuddyPress]]></category> <category><![CDATA[SEO]]></category> <category><![CDATA[WordCamp]]></category> <category><![CDATA[WordCamp SF 2009]]></category><guid
isPermaLink="false">http://xavisys.com/?p=390</guid> <description><![CDATA[As some of you already know, I went to WordCamp San Francisco last weekend.  I took the wife (who didn&#8217;t attend WordCamp, but did come to the party) and had a great time taking in some of &#8220;The City&#8221; in the process.  I went to the main event on Saturday, the WordPress Anniversary [...]]]></description> <content:encoded><![CDATA[<p>As some of you already know, I went to WordCamp San Francisco last weekend.  I took the wife (who didn&#8217;t attend WordCamp, but did come to the party) and had a great time taking in some of &#8220;The City&#8221; in the process.  I went to the main event on Saturday, the WordPress Anniversary Party Saturday night, and also the developer day on Sunday.  It was really nice to meet some of the people, and just get a feel for what a WordCamp is like.</p><p>When I first showed up on Saturday, they weren&#8217;t even ready to check people in yet.  I tend to be quite prompt, so I was there a few minutes before eight, and they were still alphabetizing name tags.  Luckily there was a nice little place to sit, with power for my laptop and free wi-fi (unsecured to be exact&#8230;).  The plan was to tweet about the experience as <a
href="http://twitter.com/wpinformer">@wpinformer</a>, which is the Twitter account for <a
href="http://wpinformer.com">WordPress Informer</a> where you&#8217;ll be able to read more detailed posts about each speaker I listened to.  once they were ready I checked in, and just a few minutes later I was passing the check in tables and overheard them turning away walk-ins because they were already overbooked.  I don&#8217;t know what the actual totals were, but I&#8217;m guessing there were about 800 people in attendance.</p><p>I ended up attending the welcome by <a
href="http://ma.tt">Matt</a> Mullenweg, &#8220;Cooking With BuddyPress&#8221; by Andy Peatling, &#8220;Straight from Google: What You Need to Know&#8221; by Matt Cutts, State of the Word by Matt Mullenweg, &#8220;Your Business Web&#8221; by Dave Gray of XPlane, &#8220;Customizing Themes and Plugins&#8221; by Ann Oyama, &#8220;Even Faster WordPress Themes&#8221; by Steve Souders, &#8220;FAILs, LOLs and User-Generated Content&#8221; by Scott Porad, &#8220;Lessons from Mozilla&#8221; by John Lilly, and the Goodbye by Matt Mullenweg.  The fact that there were two tracks means that I missed a lot, but I was able to see pretty much everything I wanted to.</p><p>The tracks were upstairs and downstairs, with the main room being upstairs.  The welcome by Matt Mullenweg was extremely quick and generic.  It served as a kind of kickoff, but I honestly could have skipped it and just started downstairs at the first speaker.</p><p>The first real presentation I saw was &#8220;Cooking With BuddyPress&#8221; by Andy Peatling.  You can read <a
href="http://wpinformer.com/buddypress/">Why BuddyPress</a> to get more detail about what I thought, but overall it was a really great session.  Andy obviously knows what he&#8217;s talking about (he is the lead developer of BuddyPress), but he&#8217;s also good as conveying that knowledge to his audience.  It was nice to hear a little of the history of the project (421 days to version 1.0) and some of the plans for the future (such as better BBPress installation), but the best thing was getting a quick overview of how BuddyPress worked, what it did, and how it could be extended and customized.</p><p>Next I went back upstairs to listen to &#8220;Straight from Google: What You Need to Know&#8221; by Matt Cutts.  Matt is the head of Google&#8217;s Anti-webspam department.  His job is to find those spam sites that plague the internet, and make sure that Google doesn&#8217;t offer you links to those kinds of sites in your search results.  Since he spends so much time dealing with Google&#8217;s algorithms, he&#8217;s extremely current on best practices in Search Engine Optimization.  The biggest thing to take away from this talk was that Matt said that WordPress is a &#8220;great choice&#8221; for SEO because it solves &#8220;80-90% of Search Engine Optimization (SEO).&#8221;  That&#8217;s really saying something coming from one of the true experts out there.</p><p>After that, everyone came upstairs for &#8220;State of the Word&#8221; by Matt Mullenweg, whoch actually continued with a question and answer session after lunch.  We got a lot of the normal history, WordPress was a fork of B2 and was later officially recognized by the B2 creator as the &#8220;official&#8221; continuation of B2, etc.  There were a couple interesting WordPress facts such as that plugins were introduced in WordPress 1.2 and themes were introduced in WordPress 1.5.  He also gave his summary of GPL  Freedom to use software for any purpose, freedom to modify software, and freedom to redistribute.  Then he talked about the fact that WordPress.org would be featuring themes that had paid support available, which he sees as perfectly in line with the essence of the GPL (and I agree).  Alex King was brought up to talk a little about Crowd Favorite which now has eight full time staff in Denver and WordPress development and support is their primary revenue stream.</p><p><img
src="http://cdn.xavisys.com/wp-content/uploads/2009/06/the-internet-according-to-dave-gray-300x225.jpg" alt="The Internet According to Dave Gray" title="The Internet According to Dave Gray" width="300" height="225" class="alignleft size-medium wp-image-391" /> After the Q &#038; A with Matt, I went downstairs to listen to &#8220;Growing Your Business Web&#8221; by Dave Gray of XPlane.  Dave started by saying his slides sucked and wouldn&#8217;t be available for download, but I disagree.  As a matter of fact, I loved &#8220;the internet according to Dave Gray&#8221; which spread pretty quickly across Twitter (so I&#8217;m not the only one).  The whole talk was great, but was unfortunately cut short because he was going over his allotted time.  It would have been nice to let him go a few more minutes, but I understand that they needed to keep things going.</p><p>Next up was &#8220;Customizing Themes and Plugins&#8221; by Ann Oyama, again downstairs.  Ann was <strong>extremely</strong> nervous, and it showed.  I was fine with that, I get nervous too.  It seems like she knew most of the material, and I credited her nervousness with the bits that she seemed to leave out, skip over, or jumble up.  Unfortunately, some of the information she gave was simply wrong.  For example, functions.php and plugins are not really &#8220;the same thing.&#8221;  They are loaded at different times, so they can do different things.  For example, plugins are loaded before pluggable.php and can therefore override about 43 functions (depending on the version of WordPress) that functions.php cannot.  Plugins can also modify settings <strong>before</strong> the global $wp_query is set up, which can be extremely handy.  There are more differences as well, but that&#8217;s not really the point.  Nervousness aside, there was some misinformation and while many of the people in the room will never need to know the differences (and some of the people there already knew), it&#8217;s still pretty unfortunate.</p><p>After Ann, things really picked up.  Next was &#8220;Even Faster WordPress Themes&#8221; by Steve Souders, who wrote &#8220;High Performance Web Sites&#8221; and &#8220;Even Faster Web Sites&#8221; (both must reads in my opinion).  Steve has spent time optimizing web performance for companies like Yahoo and Google, and he really knows his stuff.  A lot of it was repeat info from his books, but it was definitely extremely useful information.</p><p>Following Steve was &#8220;FAILs, LOLs and User-Generated Content&#8221; by Scott Porad.  He went over some of the highs and lows of having users generate your content for you.  Steve Porad is the CTO at Pet Holdings, Inc. (aka lolcats) and I think everyone will agree that they&#8217;ve definitely succeeded at user generated content.  They also run completely on WordPress.com, which really says something for WordPress.com.</p><p>For the last full session of the day I listened to &#8220;Lessons from Mozilla&#8221; by John Lilly.  I loved his style of talking.  He was a little ADD, running a lot of tangents&#8230;which reminded me of&#8230;well&#8230;me.  He offered no &#8220;magic&#8221; key to succeeding as an open source project, which I respect because I don&#8217;t think one exists.  However, he did give a good picture of what it&#8217;s like at the top of the food chain, with no one to copy or follow.  It had been a long day, and I was tired, so I slacked off on tweeting as well as notes.  I wish I hadn&#8217;t.</p><p>The day ended with the Goodbye by Matt Mullenweg.  It was nearly as quick as the welcome, but by the end of the day it didn&#8217;t seem so bad. The big announcement?  Don&#8217;t forget about the sixth anniversary party at the Automattic lounge.  The party was nice, but let&#8217;s face it&#8230;we geeks aren&#8217;t all that outgoing.  It seemed pretty dead by about 10pm when I left.  So what was the best part of the conference?  Definitely the developer day on Sunday, which I promise to write about soon.<br
/><h3 class='related_post_title'>Related Posts:</h3><ul
class='related_post'><li><a
href='http://xavisys.com/buddypress/' title='Why BuddyPress'>Why BuddyPress</a></li><li><a
href='http://xavisys.com/googles-matt-cutts-on-wordpress/' title='Google&#039;s Matt Cutts on WordPress'>Google&#039;s Matt Cutts on WordPress</a></li><li><a
href='http://xavisys.com/state-word-wordcamp-part-2/' title='State of the Word from WordCamp &#8211; Part 2'>State of the Word from WordCamp &#8211; Part 2</a></li><li><a
href='http://xavisys.com/state-of-the-word-from-wordcamp-part-1/' title='State of the Word from WordCamp &#8211; Part 1'>State of the Word from WordCamp &#8211; Part 1</a></li><li><a
href='http://xavisys.com/wordcamp-san-francisco-2009-2/' title='WordCamp San Francisco 2009'>WordCamp San Francisco 2009</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://xavisys.com/wordcamp-san-francisco-2009/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>The Problem with Related Post Plugins</title><link>http://xavisys.com/problem-related-post-plugins/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=problem-related-post-plugins</link> <comments>http://xavisys.com/problem-related-post-plugins/#comments</comments> <pubDate>Thu, 21 May 2009 15:52:00 +0000</pubDate> <dc:creator>AaronCampbell</dc:creator> <category><![CDATA[Wordpress]]></category> <category><![CDATA[Efficient Related Posts]]></category> <category><![CDATA[Related Posts]]></category> <category><![CDATA[WordPress Plugins]]></category><guid
isPermaLink="false">http://wpinformer.com/?p=54</guid> <description><![CDATA[Showing related content to your users is important.  I don&#8217;t think there&#8217;s anyone disputing that (at least not that I&#8217;m listening to).  The real question is &#8220;how?&#8221;  How can you show your user good related content without adding a ton of extra work for yourself?  This is where related posts plugins [...]]]></description> <content:encoded><![CDATA[<p>Showing related content to your users is important.  I don&#8217;t think there&#8217;s anyone disputing that (at least not that I&#8217;m listening to).  The real question is &#8220;how?&#8221;  How can you show your user good related content without adding a ton of extra work for yourself?  This is where related posts plugins come into play.</p><p>There are a lot of options out there.  So many that it&#8217;s quite time consuming to try them all until you find one that suits you.  Two of my favorites are <a
href="http://wordpress.org/extend/plugins/wordpress-23-related-posts-plugin/">WordPress Related Posts</a> and <a
href="http://wordpress.org/extend/plugins/yet-another-related-posts-plugin/">Yet Another Related Posts Plugin (YARPP)</a>.  Yarpp gives you more control over how matches are made, but for that very reason it&#8217;s also less efficient.  Joost de Valk referred to it as a &#8220;heavy plugin&#8221; in his article on <a
href="http://yoast.com/wordpress-performance-optimization/">Optimizing WordPress database performance</a>, and it definitely is.  WordPress Related Posts is far more efficient, but offers you a little less control over how matches are made.  Unfortunately they share the same problem.</p><p>So what is this problem?  They all find matches to a post in the front end rather than the back end.  They do it when a user views a specific post, rather than when a post is created or modified.  On a brand new site I launched, which has only 7 posts, we&#8217;ve received roughly 2000 pageviews.  That&#8217;s pretty low, but lets take a look at it.  About 700 of those visits were to the home page and about 1300 were to single post pages.  If you only show related posts on single post pages (which is how we currently do it) then the related posts plugin has been run over 1300 times for only 7 posts, which is roughly 185 times per post!  If I were to show related posts for each post on the front page then it would have run another 4000 times (which is a conservative estimate), bringing it to 757 times per post.  If you think this seems excessive, lets take a look at the stats for <a
href="http://webdevnews.net">Web Developer News</a>.  It has had over 13,500 page views in the last 30 days.  About 750 were to the home page, about 140 were to other static pages, roughly 550 were to tag pages, and another 250 were to miscellaneous pages such as search pages.  That leaves 11,810 visits to single post pages and 21 posts during that same time.  That&#8217;s about 562 times per post!  If I added related posts to the home page, tag pages, and search pages it would need to be run roughly another 15,000 or 1,276 times per post.</p><p><span
id="more-456"></span></p><p>In addition to the simple waste of memory and cpu cycles, putting the calculation of related posts on the front end means that when they start to slow down your users are left with a bad experience and slow loading pages.  And they <strong>will</strong> slow down eventually, if your site gets big enough.  I just recently worked on a site with more than 6,000 posts and over 1,800 tags (they offer investing advice, and have a lot of tags that correspond to ticker symbols).  At that point, some of the related posts queries were taking 10 seconds to run.  That&#8217;s really show.  We can do better than that right?  Well it&#8217;s not easy but I think we can.</p><p>I would always prefer that I (or my content creators) have to wait, rather than make my users wait.  So, the logical solution would be to match related posts when a post is saved, and store them in the post&#8217;s meta data.  Simple and solved right?  Wrong.  If that&#8217;s all you did, then posts would only <strong>ever</strong> be related to posts older than themselves.  This would mean that part two of a series would likely relate to part one, but part one would never relate to part two.  We solved the speed issue, but we took a huge hit in functionality.  However, a plugin that I&#8217;ve developed and am testing takes it farther than that.  When a post is saved, it&#8217;s related posts are saved, but all possible related posts are spidered and checked to see if they need to have new matches calculated for them.</p><p>For extremely large sites, the plugin still causes delays when you save a post.  However, better you than your user.  If you&#8217;re interested in using this plugin, I&#8217;ll be releasing it soon and I&#8217;ll add a link to it here when I do<sup>1</sup>.  However, for now I need a name for it!  I originally called it <em>Related Posts &#8211; High Volume</em> because it was meant to fix issues on high-volume sites.  However, since it can apply to almost any site, I&#8217;m looking for an inspired name that really lets people know what it can do.  You can leave any ideas you have in the comment here or send them via twitter to <a
href="http://twitter.com/aaroncampbell">@aaroncampbell</a> or <a
href="http://twitter.com/wpinformer">@wpinformer</a>.</p><p>UPDATE:<br
/> The WordPress plugin has been released.  You can download <a
href="http://wordpress.org/extend/plugins/efficient-related-posts/">Efficient Related Posts</a> from wordpress.org and you can read more about it at <a
href="/wordpress-plugins/efficient-related-posts/">Efficient Related Posts at Xavisys.com</a><br
/><h3 class='related_post_title'>Related Posts:</h3><ul
class='related_post'><li><a
href='http://xavisys.com/xavisys-wordpress-plugin-framework/' title='The Xavisys WordPress Plugin Framework'>The Xavisys WordPress Plugin Framework</a></li><li><a
href='http://xavisys.com/10-great-wordpress-plugins/' title='10 Great WordPress Plugins'>10 Great WordPress Plugins</a></li><li><a
href='http://xavisys.com/wordpress-widget/' title='How To Make Your Own WordPress Widget'>How To Make Your Own WordPress Widget</a></li><li><a
href='http://xavisys.com/wordpress-plugins/manual-related-links/' title='Manual Related Links'>Manual Related Links</a></li><li><a
href='http://xavisys.com/wordpress-plugins/efficient-related-posts/' title='Efficient Related Posts'>Efficient Related Posts</a></li></ul><ol
class="footnotes"><li
id="footnote_0_456" class="footnote"><a
href="/wordpress-plugins/efficient-related-posts/">Efficient Related Posts</a></li></ol>]]></content:encoded> <wfw:commentRss>http://xavisys.com/problem-related-post-plugins/feed/</wfw:commentRss> <slash:comments>13</slash:comments> </item> <item><title>The WordPress has-patch marathon</title><link>http://xavisys.com/wordpress-haspatch-marathon/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=wordpress-haspatch-marathon</link> <comments>http://xavisys.com/wordpress-haspatch-marathon/#comments</comments> <pubDate>Thu, 16 Apr 2009 17:17:58 +0000</pubDate> <dc:creator>AaronCampbell</dc:creator> <category><![CDATA[Wordpress]]></category> <category><![CDATA[wordpress development]]></category><guid
isPermaLink="false">http://xavisys.com/?p=373</guid> <description><![CDATA[Xavisys is participating in the WordPress 24 hour has-patch marathon.  We&#8217;ll update this post as we go, but wanted to encourage others out there to participate as well.  Grab a ticket and get started!#8014 has been fixed as part of the marathon.
Now you can use dbDelta() with SQL containing backticks!
#9507 has been fixed
You [...]]]></description> <content:encoded><![CDATA[<p>Xavisys is participating in the <a
href="http://wordpress.org/development/2009/04/the-super-awesome-wordpress-24-hour-has-patch-marathon/">WordPress 24 hour has-patch marathon</a>.  We&#8217;ll update this post as we go, but wanted to encourage others out there to participate as well. <a
href="http://core.trac.wordpress.org/query?status=assigned&#038;status=new&#038;status=reopened&#038;max=500&#038;order=priority&#038;milestone=2.8">Grab a ticket</a> and get started!</p><dl><dt><a
href="http://core.trac.wordpress.org/ticket/8014">#8014</a> has been fixed as part of the marathon.</dt><dd>Now you can use dbDelta() with SQL containing backticks!</dd><dt><a
href="http://core.trac.wordpress.org/ticket/9507">#9507</a> has been fixed</dt><dd>You can now localize the &#8220;tag&#8221; word in the new plugin page</dd><dt><a
href="http://core.trac.wordpress.org/ticket/9408">#9408</a> has been committed</dt><dd>WAI-ARIA landmark roles have been added to the default theme to increase accessibility</dd><dt><a
href="http://core.trac.wordpress.org/ticket/5710">#5710</a> &#8211; wp_tag_cloud should echo get_tag_cloud</dt><dd>For this one, my patch was replaced with a better solution offered by DD32 which added an echo option to the args array for wp_tag_cloud</dd><dt><a
href="http://core.trac.wordpress.org/ticket/9472">#9472</a> &#8211; Fixed</dt><dd>Now wp_list_pages() applies the &#8220;current_page_item/parent/ancestor&#8221; classes when browsing image/attachment pages!</dd><dt>Some new filters were added</dt><dd>I always like to see new filters.  It means that plugins can be more powerful.  They added <a
href="http://core.trac.wordpress.org/ticket/9558">wp_trim_excerpt</a> and <a
href="http://core.trac.wordpress.org/ticket/9552">admin_footer_text</a> so far.</dd><dt><a
href="http://core.trac.wordpress.org/ticket/9442">#9442</a> &#8211; Login UI</dt><dd>They added a password recovery link to the login error messages</dd></dl><h3 class='related_post_title'>Related Posts:</h3><ul
class='related_post'><li><a
href='http://xavisys.com/wordpress-widget/' title='How To Make Your Own WordPress Widget'>How To Make Your Own WordPress Widget</a></li><li><a
href='http://xavisys.com/wordpress-core-canonical-plugins/' title='WordPress Core vs Canonical Plugins'>WordPress Core vs Canonical Plugins</a></li><li><a
href='http://xavisys.com/xavisys-wordpress-plugin-framework/' title='The Xavisys WordPress Plugin Framework'>The Xavisys WordPress Plugin Framework</a></li><li><a
href='http://xavisys.com/wordpress-developer-meeting-july-01-2009/' title='WordPress Developer Meeting &#8211; July 01, 2009'>WordPress Developer Meeting &#8211; July 01, 2009</a></li><li><a
href='http://xavisys.com/wordcamp-san-francisco-2009/' title='WordCamp San Francisco 2009'>WordCamp San Francisco 2009</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://xavisys.com/wordpress-haspatch-marathon/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Exciting new things in WordPress 2.8?</title><link>http://xavisys.com/exciting-wordpress-28/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=exciting-wordpress-28</link> <comments>http://xavisys.com/exciting-wordpress-28/#comments</comments> <pubDate>Fri, 10 Apr 2009 18:35:07 +0000</pubDate> <dc:creator>AaronCampbell</dc:creator> <category><![CDATA[Wordpress]]></category> <category><![CDATA[News]]></category><guid
isPermaLink="false">http://xavisys.com/?p=335</guid> <description><![CDATA[WordPress 2.8 is slated to be released late this month.  Unfortunately, I&#8217;ve heard a lot of talk that 2.8 isn&#8217;t anything to get excited about.  People are saying that it doesn&#8217;t have a lot of new features.  As a matter of fact, in the WordPress Weekly Podcast &#8211; Episode 49 Were You [...]]]></description> <content:encoded><![CDATA[<p>WordPress 2.8 is <a
href="http://wordpress.org/about/roadmap/">slated to be released late this month</a>.  Unfortunately, I&#8217;ve heard a lot of talk that 2.8 isn&#8217;t anything to get excited about.  People are saying that it doesn&#8217;t have a lot of new features.  As a matter of fact, in the <a
href="http://www.wptavern.com/wordpress-weekly">WordPress Weekly Podcast</a> &#8211; <a
href="http://www.wptavern.com/wpweekly-episode-49-were-you-fooled">Episode 49 <em>Were You Fooled?</em></a>, David Peralty even said that it only had &#8220;stuff that should have been in WordPress already&#8221;.</p><p>While I agree that 2.8 will have fewer noticeable new features than 2.7 did, it definitely has plenty packed into it.  First, <a
href="http://core.trac.wordpress.org/query?status=closed&#038;group=resolution&#038;max=300&#038;order=priority&#038;milestone=2.8">more than 270 tickets have been closed for 2.8</a>, over 240 of those were set to &#8220;fixed&#8221;.  Many of the changes in WordPress 2.8 are cleaning up what was added in 2.7, as well as strengthening the foundations of the core code.</p><p>The widgets code has been completely reworked and all the core widgets have been updated to use the new WP_Widget class.  Personally, I think it&#8217;s pretty exciting!  Previously, writing widgets that followed the multi-widget pattern (the ones that can be used more than once, like the text widget) was a real pain.  Using the old widgets methodology, the text widget was 104 lines of code, and rather confusing.  The new WP_Widget class has reduced that to 39 lines of considerably simpler code.  I&#8217;m looking forward to updating my <a
href="http://xavisys.com/2008/04/wordpress-twitter-widget/" title="WordPress Twitter Widget">WordPress Twitter Widget</a>, <a
href="http://xavisys.com/2008/05/gallery-widget-pro/" title="WordPress Gallery Widget Pro">Gallery Widget Pro</a>, and <a
href="http://xavisys.com/2009/02/get-free-web-designs-widget/" title="WordPress Get Free Web Designs Widget">Get Free Web Designs Widget</a>.  I also plan to release a few new widgets using the new framework.</p><p>Another new feature in 2.8 that I find important, is support in the Admin UI for <a
href="http://core.trac.wordpress.org/ticket/9381">taxonomy descriptions</a>.  Currently in the WordPress admin interface, you can add descriptions to categories, but not for tags or any custom taxonomy.  Since categories, tags, and other terms are all the same now, there&#8217;s really no reason you shouldn&#8217;t be able to control the description of all of them.  The <a
href="http://core.trac.wordpress.org/changeset/10903">patch that was committed</a> (which I submitted), adds a description box to the tag/taxonomy forms in the admin section, adds a description column to the tag and custom taxonomy tables in the admin, and adds two new helper functions for use in your theme called tag_description and term_description.</p><p>Here are some other things I find interesting that are new in 2.8:</p><ul><li><a
href="http://core.trac.wordpress.org/ticket/4832">comments_popup_link() now works on pages and single posts</a> &#8211; This is something that I ran into six months ago on a project I was working on.  I found the ticket already submitted by JeremyVisser and submitted a patch.</li><li>I&#8217;m a huge proponent of the fairly new <a
href="http://xavisys.com/2008/04/wordpress-25-shortcodes/">WordPress Shortcodes</a>.  A couple advancements have been made there. <a
href="http://core.trac.wordpress.org/ticket/6518">Shortcode Escaping</a> &#8211; If order to actually show a &#91;shortcode] in your post you had to use &amp;#91; to encode the &#91;.  Now you can use &#91;&#91;shortcode]] to do the same thing.  Also, the <a
href="http://core.trac.wordpress.org/ticket/9022">caption shortcode can now have shortcodes inside it</a>.</li><li><a
href="http://core.trac.wordpress.org/ticket/8670">Support arbitrary tag taxonomies with edit-tags.php</a> &#8211; Basically, the tag interface in the admin section now works with custom taxonomies.  This is huge for people setting up large complex sites.  Recently I had to re-create a lot of this to set up a stock tickers taxonomy.  This will make future development much simpler.</li><li><a
href="http://core.trac.wordpress.org/ticket/9060">Autosave post/page when pressing Control/Command+S in TinyMCE</a> &#8211; this is really nice for those that are not experienced at blogging (or web-based computing in general).  Almost everyone knows what Ctrl+S does, so implementing that simple functionality into WordPress is extremely handy.</li></ul><p>In the end, the changes may not be as flashy as they were in 2.5 or 2.7, but 2.8 is a solid step forward for WordPress.<br
/><h3 class='related_post_title'>Related Posts:</h3><ul
class='related_post'><li><a
href='http://xavisys.com/acquia-puts-drupal-in-the-news/' title='Acquia Puts Drupal in the News'>Acquia Puts Drupal in the News</a></li><li><a
href='http://xavisys.com/wordpress-widget/' title='How To Make Your Own WordPress Widget'>How To Make Your Own WordPress Widget</a></li><li><a
href='http://xavisys.com/wordpress-core-canonical-plugins/' title='WordPress Core vs Canonical Plugins'>WordPress Core vs Canonical Plugins</a></li><li><a
href='http://xavisys.com/wordcamp-san-francisco-2009/' title='WordCamp San Francisco 2009'>WordCamp San Francisco 2009</a></li><li><a
href='http://xavisys.com/problem-related-post-plugins/' title='The Problem with Related Post Plugins'>The Problem with Related Post Plugins</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://xavisys.com/exciting-wordpress-28/feed/</wfw:commentRss> <slash:comments>13</slash:comments> </item> <item><title>Becoming a Freelance Web Developer/Designer</title><link>http://xavisys.com/becoming-a-freelance-web-developerdesigner/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=becoming-a-freelance-web-developerdesigner</link> <comments>http://xavisys.com/becoming-a-freelance-web-developerdesigner/#comments</comments> <pubDate>Mon, 08 Sep 2008 08:00:27 +0000</pubDate> <dc:creator>AaronCampbell</dc:creator> <category><![CDATA[Web Design]]></category> <category><![CDATA[business]]></category> <category><![CDATA[Community]]></category> <category><![CDATA[drupal]]></category> <category><![CDATA[freelancing]]></category> <category><![CDATA[gallery]]></category> <category><![CDATA[marketing]]></category> <category><![CDATA[web developers]]></category> <category><![CDATA[web development]]></category> <category><![CDATA[Wordpress]]></category> <category><![CDATA[work]]></category><guid
isPermaLink="false">http://xavisys.com/?p=186</guid> <description><![CDATA[It wasn&#8217;t all that long ago (although in &#8220;web years&#8221; it&#8217;s been ages) that I was trying to break into web development as a career.  Now that I&#8217;m more established, people are asking me the same questions I asked others when I was starting.  They all amount to one thing: How can I [...]]]></description> <content:encoded><![CDATA[<p>It wasn&#8217;t all that long ago (although in &#8220;web years&#8221; it&#8217;s been ages) that I was trying to break into web development as a career.  Now that I&#8217;m more established, people are asking me the same questions I asked others when I was starting.  They all amount to one thing: How can I take this from a hobby to a career?</p><p>In my experience, most web developers and designers (especially those trying to begin a career) enjoy what they do.  They usually start building small sites or themes as a hobby, often getting together with other like-minded people at sites such as <a
href="http://www.opendesigns.org/">Open Designs</a>.  They do what they do because they like it, but who can fault them for wanting to get paid for doing something they love?  It&#8217;s the ultimate goal.</p><p>So what do you do?  First off, you need to understand that it&#8217;s a highly saturated market, and you&#8217;re going to have to put in serious time and effort to turn this into a career.  You&#8217;re going to be putting in 40 hours at work to pay the bills, and another 20-30 hours laying the foundation for your future career.  If you aren&#8217;t ready to put in the time and effort, you can stop reading right now.  This is not a get rich quick scheme, it&#8217;s a plan that you can follow if you&#8217;re really serious about it.</p><p>Now that you&#8217;ve agreed to put in the necessary effort, here are some steps to follow:</p><p><strong>Step 1:</strong><br
/> Register a domain name, and get some inexpensive hosting.  You can get hosting through <a
href="http://www.godaddy.com/">GoDaddy</a> for less than $5/mo, and if you do, you can get a domain name from them for $2 for the first year.  Install something like WordPress or Drupal on the site, and put up some general info.  As you go, you will build this out into a portfolio, but you need to start somewhere.</p><p><strong>Step 2:</strong><br
/> If you haven&#8217;t already, you should join a community like <a
href="http://www.opendesigns.org/">Open Designs</a>.  If you are a designer, create and submit designs.  You&#8217;re not looking for quantity, you&#8217;re looking for quality.  Your designs need to stand out as better than all the rest.  Be unique.  Find out what you&#8217;re good at, and perfect it.  While you are aiming for quality, quantity DOES matter.  However, that won&#8217;t be a problem since you&#8217;re spending 20-30 hours per week doing this right?  I&#8217;m sure you can turn out a design every week or two, so you worry about quality, and quantity will handle itself.  Release your designs as public domain, but keep your absolute best design for yourself.  Creative Commons is more hassle than it&#8217;s worth, and you want your designs to be used.</p><p>If you are not a designer, try to network with designers.  Offer to code their designs into themes for common CMSs, etc.  You probably won&#8217;t make it very far as a freelance programmer if you don&#8217;t have some designers you can use.  Build relationships with the quality designers, and remember that quantity will handle itself as you put in those extra hours.  Also try to post helpful tidbits in the forums and answer people&#8217;s questions when you can.  Networking is important.</p><p><strong>Step 3:</strong><br
/> Continue to build the site you started in step one.  Take your best design and add it to your site.  If you are a developer, ask a quality designer if you can barter work for a custom design.  Document your work on there.  Not just a gallery, post some content.  Walk a visitor through your design process or make a tutorial on converting a design to a theme.  Make sure to set up a contact page with your info so clients can reach you.</p><p><strong>Step 4:</strong><br
/> Do some inexpensive work for hire.  Consider finding a charity or a <a
href="http://acholibeads.com/business/whats-a-socially-proactive-business/">socially proactive business</a> and do some work for almost nothing.  Get used to working with clients and doing things up to their standards.  An alternative to the charities is to try out a <a
href="http://webdevnews.net/2008/09/freelance-web-design-top-sites/">freelance website</a>.  The competition is massive, because the market is global, but if you&#8217;re persistent you can get work.</p><p><strong>Step 5:</strong><br
/> Go for clients with a vengeance.  Make a form-style E-Mail that has information about you, links to your portfolio (which should look pretty good at this point), etc.  Leave room at the beginning (NOT the end, this is important) for a personal note that will let the potential client know that you personally read and replied to their request.  Find places where jobs are posted for work that you are especially good at.  Consider finding niche places like a <a
href="http://jobs.wordpress.net/">WordPress</a> or <a
href="http://www.drupaljob.com/">Drupal</a> job list where there may be less competition.</p><p>Don&#8217;t limit yourself to job lists.  More than 80% of jobs are never posted anywhere.  Find local businesses that have poor sites or no site at all, and take them a proposal (in person) with specific ways they will benefit from it.  If they have a bad site, make sure to be careful what you say, it&#8217;s VERY common to hear an owner say &#8220;my {insert relative here} made that site for us&#8221; and you don&#8217;t want to be insulting.  Base your argument on facts and statistics, possibly taking mockups or printouts of sites that are similar to what you are recommending.</p><p><strong>Step 6:</strong><br
/> Make the leap.  At some point, you have to let go of your regular job and switch to this full time.  I haven&#8217;t really found a rule of thumb for when this is.  It&#8217;s different for every person.  If you&#8217;re having a hard time deciding if you&#8217;re ready to drop the 9-5, consider getting a part-time job elsewhere and doing this full-time.  Maybe the extra income will help ease the transition.  Mostly remember that freelancing is still a job, it&#8217;s just one you like.  And it&#8217;s not against the rules to like your job.<br
/><h3 class='related_post_title'>Related Posts:</h3><ul
class='related_post'><li><a
href='http://xavisys.com/whats-the-best-cms/' title='What&#039;s the best CMS?'>What&#039;s the best CMS?</a></li><li><a
href='http://xavisys.com/acquia-puts-drupal-in-the-news/' title='Acquia Puts Drupal in the News'>Acquia Puts Drupal in the News</a></li><li><a
href='http://xavisys.com/new-web-development-resource-launched/' title='New Web Development Resource Launched'>New Web Development Resource Launched</a></li><li><a
href='http://xavisys.com/how-to-profit-with-the-open-source-community/' title='How to Profit with the Open Source Community'>How to Profit with the Open Source Community</a></li><li><a
href='http://xavisys.com/a-marketing-strategy-you-can-believe-in/' title='A Marketing Strategy You Can Believe In'>A Marketing Strategy You Can Believe In</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://xavisys.com/becoming-a-freelance-web-developerdesigner/feed/</wfw:commentRss> <slash:comments>12</slash:comments> </item> <item><title>What&#039;s the best CMS?</title><link>http://xavisys.com/whats-the-best-cms/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=whats-the-best-cms</link> <comments>http://xavisys.com/whats-the-best-cms/#comments</comments> <pubDate>Fri, 05 Sep 2008 08:00:02 +0000</pubDate> <dc:creator>AaronCampbell</dc:creator> <category><![CDATA[Wordpress]]></category> <category><![CDATA[drupal]]></category> <category><![CDATA[MovableType]]></category> <category><![CDATA[Open Source]]></category><guid
isPermaLink="false">http://xavisys.com/?p=179</guid> <description><![CDATA[What is the best CMS?  This is a question that I am asked all the time.  There are so many options out there that answering this question is no small task.  Once again Jeffery Scott comes through with an amazing article as he reviews the The Top 10 Open Source Content Management [...]]]></description> <content:encoded><![CDATA[<p>What is the best CMS?  This is a question that I am asked all the time.  There are so many options out there that answering this question is no small task.  Once again <a
href="http://www.touchandclick.com/">Jeffery Scott</a> comes through with an amazing article as he reviews the <a
href="http://webdevnews.net/2008/09/the-top-10-open-source-content-management-systems/">The Top 10 Open Source Content Management Systems</a>.  What does his list look like?  Here it is:</p><ol><li>Drupal</li><li>WordPress</li><li>Joomla</li><li>Media Wiki</li><li>Liferay</li><li>TYPO3</li><li>Moodle</li><li>Dolphin</li><li>Pligg</li><li>Movable Type</li></ol><p>His conclusion was that Drupal edged out the top spot because of its ease of use, great support, and vast number of modules.  He concedes that WordPress is a really a close second.  I&#8217;m not sure I agree with his exact order, but I&#8217;m biased because I&#8217;ve been developing on WordPress for years and I&#8217;m very familiar with it.  I&#8217;d probably put the top three like this:</p><ol><li>WordPress</li><li>Drupal</li><li>Movable Type</li></ol><p>Of course, with the introduction of <a
href="http://acquia.com/">Acquia</a> to the scene, that may change in the near future.  Either way, the article is a great read.<br
/><h3 class='related_post_title'>Related Posts:</h3><ul
class='related_post'><li><a
href='http://xavisys.com/acquia-puts-drupal-in-the-news/' title='Acquia Puts Drupal in the News'>Acquia Puts Drupal in the News</a></li><li><a
href='http://xavisys.com/becoming-a-freelance-web-developerdesigner/' title='Becoming a Freelance Web Developer/Designer'>Becoming a Freelance Web Developer/Designer</a></li><li><a
href='http://xavisys.com/reorder-gallery-now-in-wordpress-core/' title='Reorder Gallery now in WordPress Core'>Reorder Gallery now in WordPress Core</a></li><li><a
href='http://xavisys.com/adobes-take-on-wordpress-vs-movabletype/' title='Adobe&#039;s take on WordPress vs MovableType'>Adobe&#039;s take on WordPress vs MovableType</a></li><li><a
href='http://xavisys.com/the-heart-of-open-source/' title='The Heart of Open Source'>The Heart of Open Source</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://xavisys.com/whats-the-best-cms/feed/</wfw:commentRss> <slash:comments>18</slash:comments> </item> <item><title>Acquia Puts Drupal in the News</title><link>http://xavisys.com/acquia-puts-drupal-in-the-news/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=acquia-puts-drupal-in-the-news</link> <comments>http://xavisys.com/acquia-puts-drupal-in-the-news/#comments</comments> <pubDate>Mon, 01 Sep 2008 21:55:18 +0000</pubDate> <dc:creator>AaronCampbell</dc:creator> <category><![CDATA[News]]></category> <category><![CDATA[Web Design]]></category> <category><![CDATA[drupal]]></category> <category><![CDATA[MovableType]]></category> <category><![CDATA[web developer resource]]></category> <category><![CDATA[Wordpress]]></category> <category><![CDATA[xavisys]]></category><guid
isPermaLink="false">http://xavisys.com/?p=167</guid> <description><![CDATA[As many know, Xavisys recently launched a web developer resource site called WebDevNews.  Jeffery Scott really helped kicked things off right with a great article: Acquia Gets Ready for Release of Carbon – Commercially Supported Drupal
He talks about Acquia, a new company that was launched by Dries Buytaert, founder of Drupal.  It will [...]]]></description> <content:encoded><![CDATA[<p>As many know, Xavisys <a
href="http://xavisys.com/new-web-development-resource-launched/">recently launched a web developer resource</a> site called <a
href="http://webdevnews.net">WebDevNews</a>. <a
href="http://www.touchandclick.com/">Jeffery Scott</a> really helped kicked things off right with a great article: <a
href="http://webdevnews.net/2008/08/acquia-gets-ready-for-release-of-carbon-commercially-supported-drupal/">Acquia Gets Ready for Release of Carbon – Commercially Supported Drupal</a></p><p>He talks about Acquia, a new company that was launched by Dries Buytaert, founder of Drupal.  It will offer commercial support for Drupal.  It seems that Acquia plans on supporting Drupal much the same way that <a
href="http://automattic.com/">Automattic</a> supports <a
href="http://wordpress.org">WordPress</a> and <a
href="http://www.sixapart.com/">SixApart</a> supports <a
href="http://movabletype.com/">Movable Type</a>.  With this kind of support available to our clients, Xavisys will now be offering Drupal solutions in addition to the WordPress and custom solutions already offered.<br
/><h3 class='related_post_title'>Related Posts:</h3><ul
class='related_post'><li><a
href='http://xavisys.com/whats-the-best-cms/' title='What&#039;s the best CMS?'>What&#039;s the best CMS?</a></li><li><a
href='http://xavisys.com/exciting-wordpress-28/' title='Exciting new things in WordPress 2.8?'>Exciting new things in WordPress 2.8?</a></li><li><a
href='http://xavisys.com/becoming-a-freelance-web-developerdesigner/' title='Becoming a Freelance Web Developer/Designer'>Becoming a Freelance Web Developer/Designer</a></li><li><a
href='http://xavisys.com/adobes-take-on-wordpress-vs-movabletype/' title='Adobe&#039;s take on WordPress vs MovableType'>Adobe&#039;s take on WordPress vs MovableType</a></li><li><a
href='http://xavisys.com/the-heart-of-open-source/' title='The Heart of Open Source'>The Heart of Open Source</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://xavisys.com/acquia-puts-drupal-in-the-news/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Reorder Gallery now in WordPress Core</title><link>http://xavisys.com/reorder-gallery-now-in-wordpress-core/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=reorder-gallery-now-in-wordpress-core</link> <comments>http://xavisys.com/reorder-gallery-now-in-wordpress-core/#comments</comments> <pubDate>Wed, 21 May 2008 20:05:48 +0000</pubDate> <dc:creator>AaronCampbell</dc:creator> <category><![CDATA[Wordpress]]></category> <category><![CDATA[jquery]]></category> <category><![CDATA[Open Source]]></category><guid
isPermaLink="false">http://xavisys.com/?p=119</guid> <description><![CDATA[Less than a week ago, I released a new WordPress plugin called &#8220;Reorder Gallery&#8221; which gave you the ability to change the order of your images when you uploaded them, so that the gallery shortcode would display them in an order of your choosing.  Two days later, Matt Mullenweg stopped by to say that [...]]]></description> <content:encoded><![CDATA[<p>Less than a week ago, I released a new WordPress plugin called &#8220;<a
href="http://xavisys.com/wordpress-plugins/reorder-gallery/">Reorder Gallery</a>&#8221; which gave you the ability to change the order of your images when you uploaded them, so that the gallery shortcode would display them in an order of your choosing.  Two days later, <a
href="http://ma.tt/">Matt Mullenweg</a> stopped by to say that it &#8220;<a
href="http://xavisys.com/wordpress-reorder-gallery-plugin/#comment-1593">would be pretty cool functionality for core WP</a>&#8221; so I offered to add it in.  It&#8217;s now done, and you can look forward to seeing it in WordPress 2.6.</p><p><span
id="more-119"></span></p><p>So, what&#8217;s the bid deal?  Well, in the process the jQuery library that WordPress uses was upgraded to 1.2.5, and the jQuery UI was added!  This will be good news for any developers that make plugins for use in the admin section of WordPress, or who prefer to use jQuery over Prototype in their plugins.<br
/><h3 class='related_post_title'>Related Posts:</h3><ul
class='related_post'><li><a
href='http://xavisys.com/whats-the-best-cms/' title='What&#039;s the best CMS?'>What&#039;s the best CMS?</a></li><li><a
href='http://xavisys.com/the-heart-of-open-source/' title='The Heart of Open Source'>The Heart of Open Source</a></li><li><a
href='http://xavisys.com/how-to-profit-with-the-open-source-community/' title='How to Profit with the Open Source Community'>How to Profit with the Open Source Community</a></li><li><a
href='http://xavisys.com/wordpress-25-shortcodes/' title='WordPress 2.5 Shortcodes'>WordPress 2.5 Shortcodes</a></li><li><a
href='http://xavisys.com/wordpress-widget/' title='How To Make Your Own WordPress Widget'>How To Make Your Own WordPress Widget</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://xavisys.com/reorder-gallery-now-in-wordpress-core/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> </channel> </rss>
<!-- This site's performance optimized by W3 Total Cache. Dramatically improve the speed and reliability of your blog!

Learn more about our WordPress Plugins: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (user agent is rejected)
Database Caching using apc
Content Delivery Network via cdn.xavisys.com

Served from: 173.203.136.116 @ 2010-03-14 09:03:47 -->