<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Ptah Dunbar</title>
	
	<link>http://ptahdunbar.com</link>
	<description>Web Craftsman, WordPress hacker and Entrepreneur.</description>
	<lastBuildDate>Sat, 19 Sep 2009 22:07:02 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ptahdunbar" type="application/rss+xml" /><feedburner:emailServiceId>ptahdunbar</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Till next year</title>
		<link>http://feedproxy.google.com/~r/ptahdunbar/~3/gjky66Om4nk/</link>
		<comments>http://ptahdunbar.com/personal/till-next-year/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 22:07:02 +0000</pubDate>
		<dc:creator>Ptah Dunbar</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://ptahdunbar.com/?p=846</guid>
		<description><![CDATA[Just publicly announcing that I&#8217;ll won&#8217;t be active until the new year for personal reasons. As always, I&#8217;m reachable via email.
]]></description>
			<content:encoded><![CDATA[<p>Just publicly announcing that I&#8217;ll won&#8217;t be active until the new year for personal reasons. As always, I&#8217;m reachable via email.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=gjky66Om4nk:mwFmPDUsHxI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=gjky66Om4nk:mwFmPDUsHxI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=gjky66Om4nk:mwFmPDUsHxI:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=gjky66Om4nk:mwFmPDUsHxI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=gjky66Om4nk:mwFmPDUsHxI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=gjky66Om4nk:mwFmPDUsHxI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=gjky66Om4nk:mwFmPDUsHxI:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ptahdunbar/~4/gjky66Om4nk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ptahdunbar.com/personal/till-next-year/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://ptahdunbar.com/personal/till-next-year/</feedburner:origLink></item>
		<item>
		<title>Consolidate Options with Arrays in your WordPress Themes</title>
		<link>http://feedproxy.google.com/~r/ptahdunbar/~3/6GwrKmSuGHI/</link>
		<comments>http://ptahdunbar.com/wordpress/consolidate-options-with-arrays-in-your-wordpress-themes/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 00:38:14 +0000</pubDate>
		<dc:creator>Ptah Dunbar</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://ptahdunbar.com/?p=788</guid>
		<description><![CDATA[As more and more themes start growing in complexity and features, storing information in the database is a natural progression towards saving any user preferences for that particular theme. In this article we&#8217;re going to talk about how you can consolidate all those theme options into a single database entry. Then we&#8217;re going to create [...]]]></description>
			<content:encoded><![CDATA[<p>As more and more themes start growing in complexity and features, storing information in the database is a natural progression towards saving any user preferences for that particular theme. In this article we&#8217;re going to talk about how you can consolidate all those theme options into a single database entry. Then we&#8217;re going to create a set of functions to easily interface with those options for use throughout your template files.</p>
<p>In this example, we&#8217;re going to look at the popular k2 theme and see what it takes to consolidate their settings into one single database entry.</p>
<p>Upon installation, k2 runs an install function that adds several settings into the database.</p>
<pre>function install() {
	add_option( 'k2version', K2_CURRENT );
	add_option( 'k2asidescategory', '0' );
	add_option( 'k2livesearch', '1' );
	add_option( 'k2rollingarchives', '1' );
	add_option( 'k2archives', '0' );
	add_option( 'k2sidebarmanager', '0' );
	add_option( 'k2columns', '2' );

	// Added 1.0-RC8
	add_option( 'k2animations', '1' );
	add_option( 'k2entrymeta1', __('Published on %date% in %categories%. %comments% %tags%', 'k2_domain') );
	add_option( 'k2entrymeta2', '' );
	add_option( 'k2widgetoptions', array() );

	$defaultjs = "// Lightbox v2.03.3 - Adds new images to lightbox\nif (typeof myLightbox != 'undefined' &amp;&amp; myLightbox instanceof Lightbox &amp;&amp; myLightbox.updateImageList) {\n\tmyLightbox.updateImageList();\n}\n";
	add_option( 'k2ajaxdonejs', $defaultjs );
}</pre>
<p>We&#8217;re going to recreate that install function, but first, lets add a new function that stores the default values for each option as an array:</p>
<pre>function k2_default_options() {
	$defaultjs = "// Lightbox v2.03.3 - Adds new images to lightbox\nif (typeof myLightbox != 'undefined' &amp;&amp; myLightbox instanceof Lightbox &amp;&amp; myLightbox.updateImageList) {\n\tmyLightbox.updateImageList();\n}\n";
	$options = array(
		'version' =&gt; K2_CURRENT,
		'asidescategory' =&gt; false,
		'livesearch' =&gt; true,
		'rollingarchives' =&gt; true,
		'archives' =&gt; false,
		'sidebarmanager' =&gt; false,
		'archives' =&gt; false,
		'columns' =&gt; '2',
		'animations' =&gt; true,
		'entrymeta1' =&gt; __('Published on %date% in %categories%. %comments% %tags%', 'k2_domain'),
		'entrymeta2' =&gt; '',
		'widgetoptions' =&gt; array(),
		'ajaxdonejs' =&gt; $defaultjs,
	);
	return $options;
}</pre>
<p>You&#8217;ll noticed that I removed all prefixes of k2 as their not needed when everything is being stored under one entry. I also converted all the 0&#8217;s and 1&#8217;s into their boolean values. Now let&#8217;s recreate the install function:</p>
<pre>function install() {
	add_option( 'kaytwo', k2_default_options() );
}</pre>
<p>It&#8217;s as simple as that. Retrieving those values is just as easy:</p>
<pre>$kaytwo = get_option( 'kaytwo' );

echo $kaytwo['version'];
echo $kaytwo['columns'];
echo $kaytwo['entrymeta1'];</pre>
<p>Updating options involves retrieving the entire options array and updating only those that need to be updated.</p>
<pre>$kaytwo = get_option( 'kaytwo' );

$kaytwo['version'] = '1.0';
$kaytwo['columns'] = '4';
$kaytwo['entrymeta2'] = __('Posted in %categories%. Tagged: %tags%', 'k2_domain');

update_option( 'kaytwo', $kaytwo );</pre>
<p class="warning">Remember to include <strong>all options</strong>, even those that are not being updated themselves. Failure to do so removes those options from the database <em>completely</em>.</p>
<p>Deleting an option is similar to updating. Retrieve the entire options array and unset those that need to be removed:</p>
<pre>$kaytwo = get_option( 'kaytwo' );

unset( $kaytwo['sidebarmanager'] );
unset( $kaytwo['asidescategory'] );

update_option( 'kaytwo', $kaytwo );</pre>
<p>And that&#8217;s how you would consolidate all your options under a single database entry. But why stop here? Since we&#8217;re going to be interfacing with the database all throughout our WordPress theme, let&#8217;s make these calls into functions.</p>
<pre>define( 'THEMEOPTIONS', 'kaytwo' );

/**
 * Returns the value of an option from the db if it exists.
 *
 * @since 0.4
 *
 * @param string $name Option Name.
 * @return mixed Returns the option's value if it exists, false if it doesn't.
 */
function framework_get_option( $name ) {
	$options = get_option( THEMEOPTIONS );
	if ( isset($options[$name]) ) {
		return $options[$name];
	} else {
		return false;
	}
}

/**
 * Adds an option to the options db.
 *
 * @since 0.4
 *
 * @param string $name Option Name. Must be unique.
 * @param mixed $value Option Value.
 * @return bool True on success, false if the option already exists.
 */
function framework_add_option( $name, $value ) {
	$options = get_option( THEMEOPTIONS );
	if ( $options and !isset($options[$name]) ) {
		$options[$name] = $value;
		return update_option( THEMEOPTIONS, $options );
	} else {
		return false;
	}
}

/**
 * Updates an option to the options db.
 *
 * @since 0.4
 *
 * @param string $name Option Name. Must be unique.
 * @param mixed $value Option Value.
 * @return bool true|false
 */
function framework_update_option( $name, $value ) {
	$options = get_option( THEMEOPTIONS );
	if ( $value != $options[$name] ) {
		$options[$name] = $value;
		return update_option( THEMEOPTIONS, $options );
	} else {
		return false;
	}
}

/**
 * Deletes an option from the options db.
 *
 * @since 0.4
 *
 * @param string $name Option Name. Must be unique.
 * @return bool true|false
 */
function framework_delete_option( $name ) {
	$options = get_option( THEMEOPTIONS );
	if ( $options[$name] ) {
		unset( $options[$name] );
		return update_option( THEMEOPTIONS, $options );
	} else {
		return false;
	}
}</pre>
<p>Just define <code>THEMEOPTIONS</code> as the name of the database entry and your all set.</p>
<p>To read more on this topic, check out this post on <a href="http://striderweb.com/nerdaphernalia/2008/07/consolidate-options-with-arrays/">Striderweb</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=6GwrKmSuGHI:guk_4ghGIwQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=6GwrKmSuGHI:guk_4ghGIwQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=6GwrKmSuGHI:guk_4ghGIwQ:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=6GwrKmSuGHI:guk_4ghGIwQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=6GwrKmSuGHI:guk_4ghGIwQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=6GwrKmSuGHI:guk_4ghGIwQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=6GwrKmSuGHI:guk_4ghGIwQ:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ptahdunbar/~4/6GwrKmSuGHI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ptahdunbar.com/wordpress/consolidate-options-with-arrays-in-your-wordpress-themes/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://ptahdunbar.com/wordpress/consolidate-options-with-arrays-in-your-wordpress-themes/</feedburner:origLink></item>
		<item>
		<title>Smarter Hooks: Contextual Hooks</title>
		<link>http://feedproxy.google.com/~r/ptahdunbar/~3/lNR-8RuslTM/</link>
		<comments>http://ptahdunbar.com/wordpress/smarter-hooks-contextual-hooks/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 20:06:26 +0000</pubDate>
		<dc:creator>Ptah Dunbar</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[droppin' knowledge on WordPress]]></category>

		<guid isPermaLink="false">http://ptahdunbar.com/?p=770</guid>
		<description><![CDATA[In the last article, we looked at a simple way for making your template files more cleaner and DRY using do_atomic(), a function that registers three predefined do_actions() for any particular location. In this article, we&#8217;re going to step it up a notch and talk about context and how we can create context sensitive action [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ptahdunbar.com/wordpress/smarter-hooks/">In the last article</a>, we looked at a simple way for making your template files more cleaner and <abbr title="Don't Repeat Yourself">DRY</abbr> using <code>do_atomic()</code>, a function that registers three predefined <code>do_actions()</code> for any particular location. In this article, we&#8217;re going to step it up a notch and talk about context and how we can create context sensitive action hooks.</p>
<p>Let&#8217;s talk about what we can do now. WordPress allows you to create action hooks at any point in your WordPress theme to allow other functions to be executed at that particular location. Well that&#8217;s pretty cool. But what about context? If you&#8217;ve ever used any sandbox-based theme, you should be familiar with the class generating functions it pours into the body tag and other sections throughout your theme. Those functions give CSS clear context as to what page is being displayed and a lot more specifics.</p>
<p>So if we had a <code>#header</code> div that displayed our site&#8217;s name and tagline, those class generating functions would allow us to style the <code>#header</code> div differently for pages, archives, or any other template without adding any <code>if, else</code> logic to the actual template file.</p>
<pre>&lt;!--BEGIN #header--&gt;
&lt;div id="header"&gt;
	&lt;h1 id="logo"&gt;&lt;a href="&lt;?php bloginfo( 'url' ); ?&gt;"&gt;&lt;?php bloginfo( 'name' ) ?&gt;&lt;/a&gt;&lt;/h1&gt;
	&lt;p id="tagline"&gt;&lt;?php bloginfo( 'description' ) ?&gt;&lt;/p&gt;
&lt;!--END #header--&gt;
&lt;/div&gt;</pre>
<pre>#header { background-image: url( '../images/header.jpg' ); }
.page #header { background-image: url( '../images/header-page.jpg' ); }
.single #header { background-image: url( '../images/header-single.jpg' ); }</pre>
<p>So that got me thinking, why not do this for action hooks too?</p>
<p class="alert"><a href="http://ptahdunbar.com/wordpress/smarter-hooks-contextual-hooks/#comment-4482">Chris Jean</a> wrote an improved version of the <code>get_context()</code> function which you should definitely  <a href="http://new.gaarai.com/pd_hierarchy_context.phps">check out</a>.</p>
<pre>/**
 * Retrive the context of the queried template.
 *
 * @since 0.4
 * @return array $context
 */
function get_context() {
	global $wp_query;

	$context = array();
	$id = $wp_query-&gt;get_queried_object_id();

	// Absract context
	is_singular() ? $context['abstract'] = 'singular' : null;
	is_archive() ? $context['abstract'] = 'archive' : null;

	// General context
	is_front_page()	? $context['general'] = 'home'      : null;
	is_page() ? $context['general'] = 'page' : null;
	is_single() ? $context['general'] = 'single' : null;
	is_search() ? $context['general'] = 'search' : null;
	is_attachment() ? $context['general'] = 'attachment' : null;
	is_author() ? $context['general'] = 'author': null;
	is_category() ? $context['general'] = 'category' : null;
	is_tag() ? $context['general'] = 'tag' : null;
	is_tax() ? $context['general'] = 'tax' : null;
	is_404() ? $context['general'] = 'error404' : null;
	is_date() ? $context['general'] = 'date' : null;

	// Specific context
	is_page() ? $context['specific'] = 'page-'. $id : null;
	is_single() ? $context['specific'] = 'single-'. $id : null;
	is_attachment() ? $context['specific'] = 'attachment-'. $id : null;
	is_author() ? $context['specific'] = 'author-'. $id : null;
	is_category() ? $context['specific'] = 'category-'. $id : null;
	is_tag() ? $context['specific'] = 'tag-'. $id : null;
	is_tax() ? $context['specific'] = 'tax-'. $id : null;
	is_month() ? $context['specific'] = 'month-'. $id : null;
	is_year() ? $context['specific'] = 'year-'. $id : null;
	is_day() ? $context['specific'] = 'day-'. $id : null;

	return $context;
}</pre>
<p><code>get_context()</code> returns an array containing the context of the current queried template. The context is broken up into three tiers, <code>abstract</code>, <code>general</code>, and <code>specific</code>.</p>
<p>Now, that we have some context, let&#8217;s put it into action. Here&#8217;s the new and revised <code>do_atomic()</code> function:</p>
<pre>function do_atomic( $location = '' ) {
	$context = get_context();
	$prefix = apply_filters( 'do_atomic_prefix', 'theme_hook_' );

	// Global context
	do_action( $prefix . $location );

	// Abstract context
	if ($context['absract'])
		do_action( $prefix . "{$context['abstract']}_{$location}" );

	// General context
	if ($context['general'])
		do_action( $prefix . "{$context['general']}_{$location}" );

	// Specific context
	if ($context['specific'])
		do_action( $prefix . "{$context['specific']}_{$location}" );
}</pre>
<p>So now using <code>do_atomic()</code>, we can treat our action hooks just like we always did. In addition, <code>do_atomic()</code> registers up to <em>22 different contexts</em>, so if you&#8217;d like to display something specific to page templates or archives-based templates, <code>do_atomic()</code> allows you to do so without creating any additional code.</p>
<p>Let&#8217;s go back to our header.php and replace the #header div with this:</p>
<pre>&lt;?php do_atomic( 'header' ); ?&gt;</pre>
<p>And now, viewing a page template, you&#8217;ll have four actions fired in this order:</p>
<ol>
<li><code>theme_hook_header</code></li>
<li><code>theme_hook_singular_header</code></li>
<li><code>theme_hook_page_header</code></li>
<li><code>theme_hook_page-id-5-header</code></li>
</ol>
<p>This way, you can specify a variety of looks for the header (albeit, it&#8217;ll probably be more than just a small trivial change) all while keeping your template files clean and clutter free of <code>if, else</code> and <code>is_*</code> statements.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=lNR-8RuslTM:nHj-ib4SHZI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=lNR-8RuslTM:nHj-ib4SHZI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=lNR-8RuslTM:nHj-ib4SHZI:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=lNR-8RuslTM:nHj-ib4SHZI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=lNR-8RuslTM:nHj-ib4SHZI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=lNR-8RuslTM:nHj-ib4SHZI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=lNR-8RuslTM:nHj-ib4SHZI:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ptahdunbar/~4/lNR-8RuslTM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ptahdunbar.com/wordpress/smarter-hooks-contextual-hooks/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://ptahdunbar.com/wordpress/smarter-hooks-contextual-hooks/</feedburner:origLink></item>
		<item>
		<title>Smarter hooks</title>
		<link>http://feedproxy.google.com/~r/ptahdunbar/~3/na2NBTf8TG4/</link>
		<comments>http://ptahdunbar.com/wordpress/smarter-hooks/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 12:19:50 +0000</pubDate>
		<dc:creator>Ptah Dunbar</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[droppin' knowledge on WordPress]]></category>

		<guid isPermaLink="false">http://ptahdunbar.com/?p=763</guid>
		<description><![CDATA[Now that everyone&#8217;s finally understanding the benefits of using theme frameworks and the like, I&#8217;m noticing a lot more hooks in themes:
theme_before_location();
theme_location();
theme_after_location();
Where location is the location of that particular hook (e.g. header, footer, loop). Now that&#8217;s great and all, but here&#8217;s a smarter way:
do_atomic( 'location' );
Where do_atomic is:
// Registers three action hooks at once.
function do_atomic( [...]]]></description>
			<content:encoded><![CDATA[<p>Now that everyone&#8217;s finally understanding the benefits of using theme frameworks and the like, I&#8217;m noticing a lot more hooks in themes:</p>
<pre>theme_before_location();
theme_location();
theme_after_location();</pre>
<p>Where location is the location of that particular hook (e.g. header, footer, loop). Now that&#8217;s great and all, but here&#8217;s a smarter way:</p>
<pre>do_atomic( 'location' );</pre>
<p>Where do_atomic is:</p>
<pre>// Registers three action hooks at once.
function do_atomic( $location = '' ) {
	if ( !isset($location) ) return;

	do_action( "theme_before_{$location}" );
	do_action( "theme_{$location}" );
	do_action( "theme_after_{$location}" );
}</pre>
<p>Makes for much cleaner template files. The next article on smarter hooks will take this concept to an even higher level.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=na2NBTf8TG4:ud6G_b_Bpig:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=na2NBTf8TG4:ud6G_b_Bpig:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=na2NBTf8TG4:ud6G_b_Bpig:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=na2NBTf8TG4:ud6G_b_Bpig:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=na2NBTf8TG4:ud6G_b_Bpig:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=na2NBTf8TG4:ud6G_b_Bpig:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=na2NBTf8TG4:ud6G_b_Bpig:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ptahdunbar/~4/na2NBTf8TG4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ptahdunbar.com/wordpress/smarter-hooks/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://ptahdunbar.com/wordpress/smarter-hooks/</feedburner:origLink></item>
		<item>
		<title>On using WordPress Theme Frameworks</title>
		<link>http://feedproxy.google.com/~r/ptahdunbar/~3/x4vAt1Jgs3A/</link>
		<comments>http://ptahdunbar.com/wordpress/on-using-wordpress-theme-frameworks/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 22:04:57 +0000</pubDate>
		<dc:creator>Ptah Dunbar</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://ptahdunbar.com/?p=732</guid>
		<description><![CDATA[In my last post, Kel from BadCat design brought up a very important question about theme frameworks that needs to be discussed:
On the same path… If you have a child theme (I’ll use Ian Stewart’s pro/paid Thematic child theme called Power Blog, as the example) and want to customize that &#8211; what do you do? [...]]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://ptahdunbar.com/wordpress/does-your-theme-have-children/">last post</a>, Kel from <a href="http://www.badcat.com/">BadCat design</a> brought up a very important question about theme frameworks that needs to be discussed:</p>
<blockquote cite="http://ptahdunbar.com/wordpress/does-your-theme-have-children/#comment-3372"><p>On the same path… If you have a child theme (I’ll use Ian Stewart’s pro/paid Thematic child theme called Power Blog, as the example) and want to customize that &#8211; what do you do? Currently we’re talking about customizing themes by using Child Themes. If I wanted to make mods to Power Blog, I’d have to change the child theme directly, thus negating some of the reasons for using a Child theme &#8211; like upgradability.</p>
<p>Do we get to a day where we need grandchildren themes? I think your code might be the start of a way to “group” the family theme files together. -<a href="http://ptahdunbar.com/wordpress/does-your-theme-have-children/#comment-3372">Kel</a></p></blockquote>
<p>The day WordPress starts talking about &#8220;grandchild&#8221; themes is the same day I&#8217;ll convert all my blogs over to <span style="text-decoration: line-through;">movable type</span> Habari.</p>
<p>Way back when I started talking about <a href="http://ptahdunbar.com/projects/wp-framework/brainstorming-a-wordpress-theming-framework/">theme frameworks</a>, I talked about how <a href="http://wpframework.com">WP Framework</a> stands out:</p>
<blockquote><p>One of the main design goals I wanted to achieve with WP Framework that differentiates it from other frameworks is the fact that <strong><em>it’s not styled</em></strong>.</p></blockquote>
<p>A <a href="http://wpframework.com">WordPress theme framework</a> <strong>should be design-agnostic</strong>. That&#8217;s why it&#8217;s a <a href="http://www.google.com/search?q=define%3Aframework"><em>framework</em></a>. It should only contain the building blocks and the most essential code (by the way, <a href="http://wpframework.com/versions/024-release/">WP Framework 0.2.4</a> has just be released!).</p>
<p><a href="http://carringtontheme.com">Carrington</a> gets it. <a href="http://alexking.org">Alex King</a> built <a href="http://carrington.googlecode.com/svn/framework/trunk/">a base framework</a> of carrington, basically extracted all the template logic and things that made his theme work into a &#8220;core&#8221; framework. <a href="http://carringtontheme.com/themes/">When he builds themes off of carrington</a>, he simply extends the core framework by building on top of it; <strong>not</strong> via a child theme.</p>
<p>So if users of <a href="http://blog.carringtontheme.com/">Carrington blog</a> wanted to customize it, they would create a child theme for it and modify it accordingly. Here&#8217;s two possible scenario&#8217;s that show the benefits of what I&#8217;m describing:</p>
<ul class="fat">
<li>Carrington blog gets an update that includes a new section above the sidebar (a feature dealing with the design, not the logic). Users would simply download/update Carrington blog and the new section would appear above the sidebar as expected. All of the user&#8217;s changes for Carrington is preserved and left intact via the child theme.</li>
<li>But let&#8217;s say Carrington framework fixes a bug in it&#8217;s atomic template system (an issue dealing with the framework logic, not the design). There would be an update available to <a href="http://carringtontheme.com/themes/">all themes based on carrington</a>, and users would simply download/update carrington blog (or which ever theme based on Carrington they have) and the fix gets applied. The user&#8217;s modifications to Carrington blog are left intact via the child theme.</li>
</ul>
<p>It&#8217;s important to think of a theme framework as the logic of the theme, not the design or the underlying xHTML.</p>
<h3>To put this into a step by step process:</h3>
<ol>
<li>Start with a blank WordPress theme framework</li>
<li>Create your WordPress theme based off said framework</li>
<li>Now to customize this WordPress theme (which is essentially the first two steps combined), create a child theme for it.</li>
</ol>
<p>That&#8217;s how WordPress theme frameworks <em>should</em> work. In Kel&#8217;s case, <a href="http://themeshaper.com/thematic/">Thematic</a> already consist of the first two steps described above when it should only be the first one. So now that she&#8217;s using the <a href="http://themeshaper.com/thematic-power-blog-theme/">Thematic Power Blog</a>, she won&#8217;t be able to customize her theme using a child theme because it&#8217;s already one.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=x4vAt1Jgs3A:U7bEiZCI2IY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=x4vAt1Jgs3A:U7bEiZCI2IY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=x4vAt1Jgs3A:U7bEiZCI2IY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=x4vAt1Jgs3A:U7bEiZCI2IY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=x4vAt1Jgs3A:U7bEiZCI2IY:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=x4vAt1Jgs3A:U7bEiZCI2IY:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=x4vAt1Jgs3A:U7bEiZCI2IY:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ptahdunbar/~4/x4vAt1Jgs3A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ptahdunbar.com/wordpress/on-using-wordpress-theme-frameworks/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		<feedburner:origLink>http://ptahdunbar.com/wordpress/on-using-wordpress-theme-frameworks/</feedburner:origLink></item>
		<item>
		<title>Does your theme have children?</title>
		<link>http://feedproxy.google.com/~r/ptahdunbar/~3/eHsq0uUC-RA/</link>
		<comments>http://ptahdunbar.com/wordpress/does-your-theme-have-children/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 03:13:17 +0000</pubDate>
		<dc:creator>Ptah Dunbar</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[droppin' knowledge on WordPress]]></category>

		<guid isPermaLink="false">http://ptahdunbar.com/?p=722</guid>
		<description><![CDATA[When working with WordPress theme frameworks or any parent theme, sometimes you might want to figure out whether a child theme is active or not. Here&#8217;s a quick function that&#8217;ll do exactly that:
function has_kids() {
	if (STYLESHEETPATH !== TEMPLATEPATH) return true;
	return false;
}

if ( has_kids() ) {
	// do stuff
}
This function works whether you call it from a [...]]]></description>
			<content:encoded><![CDATA[<p>When working with WordPress theme frameworks or any parent theme, sometimes you might want to figure out whether a child theme is active or not. Here&#8217;s a quick function that&#8217;ll do exactly that:</p>
<pre>function has_kids() {
	if (STYLESHEETPATH !== TEMPLATEPATH) return true;
	return false;
}

if ( has_kids() ) {
	// do stuff
}</pre>
<p>This function works whether you call it from a child theme or parent.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=eHsq0uUC-RA:p5CYFOAsKPE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=eHsq0uUC-RA:p5CYFOAsKPE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=eHsq0uUC-RA:p5CYFOAsKPE:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=eHsq0uUC-RA:p5CYFOAsKPE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=eHsq0uUC-RA:p5CYFOAsKPE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=eHsq0uUC-RA:p5CYFOAsKPE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=eHsq0uUC-RA:p5CYFOAsKPE:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ptahdunbar/~4/eHsq0uUC-RA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ptahdunbar.com/wordpress/does-your-theme-have-children/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://ptahdunbar.com/wordpress/does-your-theme-have-children/</feedburner:origLink></item>
		<item>
		<title>Roll Your Own.gs</title>
		<link>http://feedproxy.google.com/~r/ptahdunbar/~3/8HfUDOIpbEc/</link>
		<comments>http://ptahdunbar.com/projects/roll-your-own-gs/#comments</comments>
		<pubDate>Sat, 04 Apr 2009 17:25:07 +0000</pubDate>
		<dc:creator>Ptah Dunbar</dc:creator>
				<category><![CDATA[My Projects]]></category>

		<guid isPermaLink="false">http://ptahdunbar.com/?p=714</guid>
		<description><![CDATA[So I&#8217;m working on this top secret (shesh!) app for WP Framework. And during that process, I had to create my own custom CSS Framework.
Unlike all the other CSS Frameworks out there, this framework allows you to define your own columns, widths, and gutters (margins). Thus, rollyourown.gs was born.
It&#8217;s simple, and it works. Once I get [...]]]></description>
			<content:encoded><![CDATA[<p>So I&#8217;m working on this <em>top secret (shesh!)</em> app for <a title="You already know. The ultimate WordPress Theme Framework!" href="http://wpframework.com">WP Framework</a>. And during that process, I had to create my own custom <a href="http://en.wikipedia.org/wiki/CSS_framework">CSS Framework</a>.</p>
<p><a href="http://www.google.com/search?q=css+frameworks">Unlike all the other CSS Frameworks out there</a>, this framework allows you to define your own <strong>columns</strong>, <strong>widths</strong>, and <strong>gutters</strong> (margins). Thus, <a title="Roll Your Own Grid System" href="http://rollyourown.gs/">rollyourown.gs</a> was born.</p>
<p>It&#8217;s simple, and it works. Once I get enough time for it, I&#8217;ll give it a proper face and add some more features to it. Until then, have fun with it.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=8HfUDOIpbEc:TcjrwT1YP_g:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=8HfUDOIpbEc:TcjrwT1YP_g:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=8HfUDOIpbEc:TcjrwT1YP_g:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=8HfUDOIpbEc:TcjrwT1YP_g:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=8HfUDOIpbEc:TcjrwT1YP_g:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=8HfUDOIpbEc:TcjrwT1YP_g:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=8HfUDOIpbEc:TcjrwT1YP_g:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ptahdunbar/~4/8HfUDOIpbEc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ptahdunbar.com/projects/roll-your-own-gs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ptahdunbar.com/projects/roll-your-own-gs/</feedburner:origLink></item>
		<item>
		<title>Page Specific Loading</title>
		<link>http://feedproxy.google.com/~r/ptahdunbar/~3/X1MX51UCfEU/</link>
		<comments>http://ptahdunbar.com/wordpress/page-specific-loading/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 02:29:38 +0000</pubDate>
		<dc:creator>Ptah Dunbar</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://ptahdunbar.com/?p=712</guid>
		<description><![CDATA[Vladimir Prelovac just posted some neat tips for plugin developers over on mashable. Here&#8217;s one that I really think needs more attention:
#8
WordPress plugins can sometimes be a real resource hog. To make sure your plugin isn’t, you need to localize the usage of resources, by loading them only when you need them.
You can use the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.prelovac.com/vladimir/">Vladimir Prelovac</a> just posted some neat tips for plugin developers over on <a href="http://mashable.com/2009/03/25/wordpress-plugin-developer-tips/">mashable</a>. Here&#8217;s one that I really think needs more attention:</p>
<blockquote><p><em>#8</em><br />
WordPress plugins can sometimes be a real resource hog. To make sure your plugin isn’t, you need to localize the usage of resources, by loading them only when you need them.</p>
<p>You can use the following example to execute certain code (like declare additional actions and filters) only when WordPress is loading plugins.php page (list of installed plugins in the backend):</p>
<pre>$local_pages=array(’plugins.php’); // define pages we want the plugin to be activated on

if (in_array($pagenow, $local_pages))
{
// do stuff here
}</pre>
<p>Similar to this, you should pay attention to load JavaScript files only when you need them.</p></blockquote>
<p>All too often I find plugins, like <a href="http://www.deliciousdays.com/cforms-plugin">contact forms</a> being loaded on <em>every single page</em>. It&#8217;s not that hard to figure out where the user likes to put their contact form, or whatever your plugin does. And while these tips were geared for plugin developers, theme authors should take this advice too as theming becomes more advance and not just an new stylesheet addition.</p>
<p>I&#8217;m looking forward to hearing more things like this on the next <a href="http://www.wptavern.com/">WP Weekly</a> episode where Jeff interviews him.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=X1MX51UCfEU:mVIdSMBPG8A:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=X1MX51UCfEU:mVIdSMBPG8A:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=X1MX51UCfEU:mVIdSMBPG8A:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=X1MX51UCfEU:mVIdSMBPG8A:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=X1MX51UCfEU:mVIdSMBPG8A:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=X1MX51UCfEU:mVIdSMBPG8A:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=X1MX51UCfEU:mVIdSMBPG8A:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ptahdunbar/~4/X1MX51UCfEU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ptahdunbar.com/wordpress/page-specific-loading/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://ptahdunbar.com/wordpress/page-specific-loading/</feedburner:origLink></item>
		<item>
		<title>The Beginning.</title>
		<link>http://feedproxy.google.com/~r/ptahdunbar/~3/ha8p-8HL8Q4/</link>
		<comments>http://ptahdunbar.com/design-by-craftsmen/the-beginning/#comments</comments>
		<pubDate>Sat, 21 Mar 2009 05:02:36 +0000</pubDate>
		<dc:creator>Ptah Dunbar</dc:creator>
				<category><![CDATA[Design By Craftsmen]]></category>

		<guid isPermaLink="false">http://ptahdunbar.com/?p=497</guid>
		<description><![CDATA[If you didn&#8217;t already know, I started my first company, Design by Craftsmen earlier this year. Since February, I&#8217;ve been working at DBC full-time and I have to say, there&#8217;s been some highs and there&#8217;s been some lows but overall, it&#8217;s been phenomenal!
Before I get ahead of myself, I&#8217;m pretty sure you&#8217;re wondering what exactly [...]]]></description>
			<content:encoded><![CDATA[<p>If you didn&#8217;t already know, I started my first company, Design by Craftsmen <a href="http://ptahdunbar.com/personal/my-goals-for-2009/">earlier this year</a>. Since February, I&#8217;ve been working at DBC full-time and I have to say, there&#8217;s been some highs and there&#8217;s been some lows but overall, it&#8217;s been phenomenal!</p>
<p>Before I get ahead of myself, I&#8217;m pretty sure you&#8217;re wondering what exactly <em>is</em> Design by Craftsmen? Well in a nutshell, DBC is a web creative studio specializing in custom WordPress solutions. I examine the way a company currently does business and use the Web to make their work flow and process more innovative, intuitive and efficient, using the power of WordPress and WP Framework.</p>
<p>Currently, Design by Craftsmen has been working with entrepreneurs, startups and small businesses locally and several nationally, but once the website is up, the target audience will expand internationally. More on the DBC website in another post perhaps.</p>
<p>One of the goals I&#8217;ve been working on for DBC is improving my work flow on dealing with clients. Here&#8217;s a typical workflow outlining the process involved for creating a website:</p>
<ol>
<li>Client needs website</li>
<li>DBC sends them a questionnaire document so they can get their ideas onto paper</li>
<li>Either 1) Client fills out questionnaire and sends it back or 2) We have a meeting and fill it out for them (still debating on this route)</li>
<li>Either 1) DBC evaluates the questionnaire to see if we can deliver a solution for them or 2) If not, we&#8217;ll see if we can forward them to one of our partners.</li>
<li>If we can provide the client a solution, DBC sends the client a creative brief document containing all the project details.</li>
<li>If client agrees to pursue this project with us, they&#8217;ll sign off on the creative brief + a TOS document. DBC will then invoice the client the initial deposit in order to start the work.</li>
<li>Once that&#8217;s completed, the client will gain access to DBC&#8217;s project management app to collaborate, and see the development throughout the life cycle for that particular project.</li>
<li>DBC then starts working on the first deliverables of the project.</li>
<li>This part varies depending on the type of project. But overall, we&#8217;ll be communicating back and forth showing revisions etc.</li>
<li>Once half the deliverables have been completed (this milestone will be known to the client), DBC will invoice the client before the second phase starts.</li>
<li>Step 8 through 9 will repeat but for the second phase of the project. And so forth.</li>
<li>Once DBC is completed with the final phase and the client approves of the work, DBC sends them the last invoice and the deliverables  are given to the client.</li>
<li>The project is completed.</li>
<li>Follow up</li>
</ol>
<p>Now that&#8217;s just a rough overview of our workflow. Things will changed depending on the type of project/client/situation but it&#8217;s a solid workflow that I&#8217;ve been perfecting over the years and it has a pretty high success rate. Working like this also ties well into the <a href="http://agilemanifesto.org/">agile</a> workflow which is something I&#8217;ve been growing into.</p>
<p>As you can see, there are about three documents that DBC has going into each project.</p>
<ol class="fat">
<li><strong>Questionnaire</strong><br />
The purpose of this document is to get all their project details onto paper so we can figure out what their looking for and evaluate if that&#8217;s something we do. If so, we&#8217;ll figure out how it&#8217;s going to work along with an estimate quote (the Creative Brief doc). If we can&#8217;t do it, we&#8217;ll send them to one of our partners if they can best fill the roll.</li>
<li><strong>Creative Brief</strong><br />
This document outlines all the deliverables for the project, project goals and itemizes our services so they know what their paying for. The creative brief is sort of the reference, goto document that DBC or the client can refer to if something&#8217;s not clear, or if things get a little blurry down the line.</li>
<li><strong>Terms of Service</strong><br />
Finally, the TOS. This document simply contains all the legal jargon to project DBC&#8217;s <em>assets</em>, if you know what I mean. That&#8217;s all really.</li>
</ol>
<h3>Financing</h3>
<p>As you saw throughout the client to DBC workflow, we allow the client to make payments overtime. For the most part, it&#8217;s typically a three step: 50%, 25%, 25% payment. I&#8217;ve found that this works best for both parties.</p>
<h3>Services</h3>
<p>So in terms of services, here are some of the standard services we provide:</p>
<ul>
<li>Design to HTML conversion</li>
<li>Design or HTML to WordPress</li>
<li>Custom WordPress Theme development</li>
<li>Custom WordPress Plugin development</li>
<li>Basic small website (static)</li>
<li>Large website (not the proper name, but this is what the client needs 40% of the time)</li>
<li>Website redesign</li>
<li>Small custom web application</li>
<li>E-Commerce website</li>
</ul>
<p>That&#8217;s roughly what we do. Other services like logo design, copywriting, hosting and site maintenance are also what DBC provides, but are already included in some packages. Part of the initial work I had to done last month was to figure out all of the base prices for these services. That process involved creating a sample project 3 times for each service, and timing myself to get a good estimate on how long it takes.</p>
<h3>Partners</h3>
<p>If you were reading carefully, I keep referring to DBC as  &#8220;we&#8221; and &#8220;our&#8221; throughout this post. That&#8217;s because I&#8217;ve partnered with two amazingly talented folks, <a href="http://twitter.com/mauriciobowers">Maricio Bowers</a>, a web designer here in Atlanta and <a href="http://www.evandenbaum.com/">Evan Denbaum</a>,  an amazing copywriter based in California. So that makes DBC 3 strong. I&#8217;m looking to build this team to include another web designer. So if your a designer looking for work, <a title="Let's talk." href="http://ptahdunbar.com/contact">contact me</a> asap!</p>
<p>Partnering with DBC simply means that we&#8217;ll be able to list the services you provide (e.g. web design if your a web designer) through us. DBC will contract that type of work through to you when needed. And as an incentive you&#8217;ll be entitled to a nifty 20% discount on any of the services DBC provides if you&#8217;d like to use us. I think that&#8217;s a sweet deal.</p>
<h3>Business Models</h3>
<p>Apart from the services DBC already currently provides, I&#8217;ve been brainstorming a few ways we could create passive incomes to fill in the gaps when we aren&#8217;t doing client work. I&#8217;m still working out some technicalities, but we&#8217;ll be pushing <em>something</em> out in the coming months.</p>
<h3>Working hours</h3>
<p>I&#8217;ve decided that working hours are 9-5, Monday through Thursday, and 9-12 on Fridays. I wanted to try out the <a href="http://www.alistapart.com/articles/fourdayweek">4 day work week</a> model, but that just isn&#8217;t realistic for my situation. So Fridays I&#8217;ll work just in the morning, and I&#8217;m off the rest of the day. Now the only thing I need to do is follow through with this! I tend to work around 56 hours a week <em>on average</em>. <a href="http://www.the6week.com/node/19">They say</a> it takes about a month to develop a new habit, so hopefully I&#8217;ll have this work-life balance back on track pretty soon.</p>
<p>Overall, that&#8217;s where I&#8217;m at with DBC. Getting the DesignbyCraftsmen.com website up and online is one of my top priorities right now. But before hand, I need to fill it with some quality portfolio pieces. I&#8217;ve got around 4 or so in the works so things are trucking along.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=ha8p-8HL8Q4:OF9kE9OAfUk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=ha8p-8HL8Q4:OF9kE9OAfUk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=ha8p-8HL8Q4:OF9kE9OAfUk:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=ha8p-8HL8Q4:OF9kE9OAfUk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=ha8p-8HL8Q4:OF9kE9OAfUk:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=ha8p-8HL8Q4:OF9kE9OAfUk:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=ha8p-8HL8Q4:OF9kE9OAfUk:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ptahdunbar/~4/ha8p-8HL8Q4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ptahdunbar.com/design-by-craftsmen/the-beginning/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://ptahdunbar.com/design-by-craftsmen/the-beginning/</feedburner:origLink></item>
		<item>
		<title>I’m pleased to announce the new release of WP Framework 0.3</title>
		<link>http://feedproxy.google.com/~r/ptahdunbar/~3/rig9ISKjZjk/</link>
		<comments>http://ptahdunbar.com/projects/wp-framework/im-pleased-to-announce-the-new-release-of-wp-framework-30/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 15:35:18 +0000</pubDate>
		<dc:creator>Ptah Dunbar</dc:creator>
				<category><![CDATA[WP Framework]]></category>

		<guid isPermaLink="false">http://ptahdunbar.com/?p=472</guid>
		<description><![CDATA[I just released the latest version of WP Framework today. This release was essential for laying the groundwork for future features and innovations to come. And now that WP Framework is somewhat mature enough, I plan on dedicating more of my time towards actually building WordPress themes on top of the framework. They should serve [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://wpframework.com/versions/03-release/">I just released the latest version of WP Framework today</a>. This release was essential for laying the groundwork for future features and innovations to come. And now that WP Framework is somewhat mature enough, I plan on dedicating more of my time towards actually building WordPress themes on top of the framework. They should serve as a way to learn how to best take advantage of the framework and show you best practices.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=rig9ISKjZjk:rEBemIXAkKU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=rig9ISKjZjk:rEBemIXAkKU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=rig9ISKjZjk:rEBemIXAkKU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=rig9ISKjZjk:rEBemIXAkKU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=rig9ISKjZjk:rEBemIXAkKU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/ptahdunbar?a=rig9ISKjZjk:rEBemIXAkKU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/ptahdunbar?i=rig9ISKjZjk:rEBemIXAkKU:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ptahdunbar/~4/rig9ISKjZjk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ptahdunbar.com/projects/wp-framework/im-pleased-to-announce-the-new-release-of-wp-framework-30/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ptahdunbar.com/projects/wp-framework/im-pleased-to-announce-the-new-release-of-wp-framework-30/</feedburner:origLink></item>
	</channel>
</rss>
