<?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>Jeff Gran</title>
	<atom:link href="http://jeffgran.com/feed" rel="self" type="application/rss+xml" />
	<link>http://jeffgran.com</link>
	<description>Artist, Designer, Developer</description>
	<lastBuildDate>Wed, 12 May 2010 02:02:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>University of Denver</title>
		<link>http://jeffgran.com/247/blog/university-of-denver</link>
		<comments>http://jeffgran.com/247/blog/university-of-denver#comments</comments>
		<pubDate>Wed, 16 Sep 2009 05:24:21 +0000</pubDate>
		<dc:creator>Jeff Gran</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[announcement]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=247</guid>
		<description><![CDATA[Yesterday was my first day of classes at the University of Denver.  I&#8217;m entering into the Information and Communications Technology program.  I&#8217;m excited to start learning, and it&#8217;s interesting (and validating my decision) that I&#8217;m already learning things that I never even knew I needed to know.
Next quarter will be more about specific [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-248" title="DU Logo" src="http://jeffgran.com/img/du_logo-180x180.gif" alt="DU Logo" width="180" height="180" />Yesterday was my first day of classes at the University of Denver.  I&#8217;m entering into the Information and Communications Technology program.  I&#8217;m excited to start learning, and it&#8217;s interesting (and validating my decision) that I&#8217;m already learning things that I never even knew I needed to know.</p>
<p>Next quarter will be more about specific techniques (javascript, for example), but so far this quarter is focused on things like the Software Development Life Cycle, Requirements and Use Case gathering, object oriented analysis and design, etc.</p>
<p>Someone wise once said that any newcomer into any field or discipline will always want to learn the fancy tricks and techniques first, when what they really need to start with are the fundamentals.  So, here&#8217;s to fundamentals.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffgran.com/247/blog/university-of-denver/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web Experiments #1: Ajax Convo</title>
		<link>http://jeffgran.com/239/blog/web-experiments-1-ajax-convo</link>
		<comments>http://jeffgran.com/239/blog/web-experiments-1-ajax-convo#comments</comments>
		<pubDate>Sat, 05 Sep 2009 03:02:05 +0000</pubDate>
		<dc:creator>Jeff Gran</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Web Experiments]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=239</guid>
		<description><![CDATA[
1) I&#8217;m learning object-oriented design, design patterns, object-oriented PHP, and object-oriented JavaScript right now.  I wanted to do some experimenting with building systems using these concepts, so I came up with the idea of doing a series of &#8220;Web Experiments&#8221; where I take an idea for some kind of web application and make a [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-243 alignleft" title="ac" src="http://jeffgran.com/img/ac.jpg" alt="Ajax Convo" width="200" height="200" /></p>
<p>1) I&#8217;m learning object-oriented design, design patterns, object-oriented PHP, and object-oriented JavaScript right now.  I wanted to do some experimenting with building systems using these concepts, so I came up with the idea of doing a series of &#8220;Web Experiments&#8221; where I take an idea for some kind of web application and make a demo of it, for fun and learning.</p>
<p>2) I think ajax is the future of the web.  Somebody somewhere wrote &#8220;full page refreshes are so last year&#8221;, or something to that effect.  I sometimes find myself clicking a link or a tab somewhere out there on the web, mentally crossing my fingers in hopes that it won&#8217;t send me to a new page.  I think more and more people are going to expect slicker interfaces in web sites and web applications, and ajax is the way to get that accomplished.</p>
<p>3) I really like the comment/reply interface on Facebook.  There&#8217;s a series of boxes, each with a comment, and the last box is minimized and says &#8220;Write a comment&#8230;&#8221;.  When you click on it, it expands to look exactly like the other comments, with your picture there, just like it will look once it&#8217;s posted.  You type your brilliant quip, and when you click the button, the comment &#8220;melts&#8221; right into the page, and the next would-be comment appears below..  I think it&#8217;s lovely.</p>
<p>With these three things in mind, I started building my own little &#8220;comment thread&#8221; app. </p>
<p>Features:</p>
<ul>
<li>Add, edit, and remove comments from the &#8220;thread&#8221;.</li>
<li>No page refreshes &#8211; all done with ajax (jQuery)</li>
<li>Comments are stored in a tab-separated text file.</li>
<li>Shift-enter for a line break within a comment.</li>
</ul>
<p>I&#8217;ve also built a class structure that I believe will help me expand the project going forward.  The planned additions/expansions are:</p>
<ul>
<li>MySQL Database support (will be able to switch between text file and MySQL with a single setting)</li>
<li>Rewrite the JavaScript without using jQuery just for fun and practice, and to prove that I can.</li>
<li>Multiple &#8220;threads&#8221; of comments</li>
<li>Only load the latest 10 comments or so, and load more twitter-style.</li>
<li>More to each message, like time/date of post, &#8220;last edited at&#8230;&#8221;, etc.</li>
<li>Maybe a simple user system. I loathe to make people &#8220;sign up&#8221; for things though.</li>
</ul>
<p>If you&#8217;re interested, you can download the files <a title="Ajax Convo Zip File" href="http://jeffgran.com/stuff/ac.zip">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffgran.com/239/blog/web-experiments-1-ajax-convo/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Book Review: PHP Solutions</title>
		<link>http://jeffgran.com/230/blog/book-review-php-solutions</link>
		<comments>http://jeffgran.com/230/blog/book-review-php-solutions#comments</comments>
		<pubDate>Tue, 01 Sep 2009 00:54:20 +0000</pubDate>
		<dc:creator>Jeff Gran</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[book review]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=230</guid>
		<description><![CDATA[In my quest to expand my knowledge of the web industry, I knew I needed to understand more PHP.  PHP is one of the (if not the) most popular languages used on the web today.  I had been exposed to it a little, and I have experience with other C-ish syntax languages, but I needed [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-231" title="php_solutions" src="http://jeffgran.com/img/php_solutions.jpg" alt="PHP Solutions: Dynamic Web Design Made Easy" width="200" height="240" />In my quest to expand my knowledge of the web industry, I knew I needed to understand more PHP.  PHP is one of the (if not <em>the</em>) most popular languages used on the web today.  I had been exposed to it a little, and I have experience with other C-ish syntax languages, but I needed to brush up on the fundamentals and the unique qualities of PHP.</p>
<p>I chose <em>PHP Solutions: Dynamic Web Design Made Easy</em> because I wanted to have some real-world projects to play with as I learned the language, as opposed to just the dry information.  The book delivered in that respect.  As per the name, the book focuses on specific needs and solutions for those needs using PHP and MySQL.  I got to see how PHP works with forms and databases, and how these techniques could be applied in a simple database-driven blog, for example.</p>
<p>However, probably the most useful part of the book for me were the tutorials on getting the Apache server, PHP and MySQL running on my local machine so that I could just jump into a code editor and start playing around.  I actually ended up skipping to these two chapters (one for Apache/PHP and one for MySQL) and then put the book down for a month or so before I picked it back up and finished reading it.</p>
<p>I started out by following along with the solutions and the code samples, typing them in and trying it out as I was reading, but soon realized that this was unnecessary.  I finished reading the better part of the book by simply reading and understand the code examples.  Whether this is a good thing or bad is up for debate.  It means the writing was clear, but also that the content was less challenging.</p>
<p>Besides the setup chapters mentioned above, the other most useful takeaway I had from this book was all the little things about the language that I mentioned above.  Things like &#8220;the truth according to PHP&#8221; (&#8221;false&#8221; evaluates to true because of type coercion), how the $_POST and $_GET superglobal arrays work, and other little things that really help put it all together in my head.</p>
<p>Another very useful aspect to the way the solutions in the book are constructed is the focus on security and thoroughness.  Some books leave out details, only hinting at it with phrases like &#8220;in a real application, we&#8217;d check this or that&#8221;, but in this book we are treated to some very useful (and usually very simple) techniques to make sure the code we&#8217;re building is secure and bulletproof.</p>
<p>All in all, I&#8217;m glad I now have the information I gained from this book, but I&#8217;m not sure it was exactly what I was looking for.  As with other introductory-level books, I found myself a bit annoyed by the &#8220;if that last part made your head explode, don&#8217;t worry, just copy the code and know that it works&#8221; -type attitude.  My head didn&#8217;t explode &#8211; on the contrary, that was one part where my brain actually felt that tingle of a concept falling into place.  Most of the book was spent thinking to myself, &#8220;yeah, I get it.  OK.  What&#8217;s next?&#8221;  I think I would recommend this book to others, but only if you&#8217;re newer to programming in general, and have very little or no PHP experience.  For me, with quite a bit of general programming, and some hands-on PHP experience from working with WordPress themes, it just felt a little bit too slow, but it did fill in some crucial gaps in my knowledge.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffgran.com/230/blog/book-review-php-solutions/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress: Sort Posts by Multiple Fields</title>
		<link>http://jeffgran.com/218/blog/wordpress-sort-posts-by-multiple-fields</link>
		<comments>http://jeffgran.com/218/blog/wordpress-sort-posts-by-multiple-fields#comments</comments>
		<pubDate>Tue, 21 Jul 2009 21:05:16 +0000</pubDate>
		<dc:creator>Jeff Gran</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=218</guid>
		<description><![CDATA[I was recently creating a star-rating system for a client, and we were sorting the reviews (or &#8220;posts&#8221;) by the number of stars.  The problem that came up was that with a 5 star system, and increments of half-stars, you will necessarily end up with many of the ratings being equal.  We wanted [...]]]></description>
			<content:encoded><![CDATA[<p>I was recently creating a star-rating system for a client, and we were sorting the reviews (or &#8220;posts&#8221;) by the number of stars.  The problem that came up was that with a 5 star system, and increments of half-stars, you will necessarily end up with many of the ratings being equal.  We wanted to be able to control the exact order the reviews were shown in the case of a tie.  Here&#8217;s how I did it.</p>
<h3>Adding a &#8220;Priority&#8221; Custom Field</h3>
<p>The first step was to add a custom field called &#8220;priority&#8221;, which would act as the tie-breaker.  Basically, if two posts have the same star rating, we&#8217;ll check the priority and see which one is higher, and that one will be displayed first.  I was using the <a title="Flutter WordPress Plugin Homepage" href="http://flutter.freshout.us/" target="_blank">Flutter plugin</a>, so adding another custom field was as simple as clicking a few buttons in the admin panel.</p>
<h3>Custom Query</h3>
<p>Sorting by a single field is relatively easy.  You would create a custom query for the posts by using something like this (to sort alphabetically):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="color: #ccc;">query_posts<span style="color: grey;">&#40;</span><span style="color: #ff8080;">&quot;orderby=title&amp;order=ASC&quot;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span></pre></div></div>

<p>Using Flutter&#8217;s syntax for sorting by its custom fields, we&#8217;d use:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="color: #ccc;">query_posts<span style="color: grey;">&#40;</span><span style="color: #ff8080;">&quot;customorderby=x_stars-overall-rating&amp;order=DESC&quot;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span></pre></div></div>

<h3>Refining the Order with usort()</h3>
<p>But you can&#8217;t sort by more than one field using the above methods.  That&#8217;s where usort comes in.  PHP has <a title="PHP Manual: usort" href="http://us2.php.net/manual/en/function.usort.php" target="_blank">a function called usort()</a> which sorts an array based on a custom function which &#8220;compares&#8221; the two array items in any way you like.  So all we need to do is run our array of posts through a function which does the more complex comparison using both the &#8220;stars&#8221; field and then the &#8220;priority&#8221; field for tie-breakers.</p>
<p>First, we insert this in the category listing page (or whichever page you&#8217;re working on) to run the custom sort function:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="color: #ccc;"><span style="color: cyan;">usort</span><span style="color: grey;">&#40;</span><span style="color: #ffc080;">$wp_query</span><span style="color: grey;">-&gt;</span><span style="color: magenta;">posts</span><span style="color: grey;">,</span> <span style="color: #ff8080;">'review_tie_breaker'</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span></pre></div></div>

<p>The first argument in the function is the array of posts created by the default query in WordPress.  The second argument is the name of our custom sort function, which is shown below:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre class="php" style="color: #ccc;"><span style="color: #ffff00;">function</span> review_tie_breaker<span style="color: grey;">&#40;</span><span style="color: #ffc080;">$a</span><span style="color: grey;">,</span> <span style="color: #ffc080;">$b</span><span style="color: grey;">&#41;</span> <span style="color: grey;">&#123;</span>
   <span style="color: #80ff80">// get the star value for each </span>
   <span style="color: #ffc080;">$a_stars</span> <span style="color: grey;">=</span> get_post_meta<span style="color: grey;">&#40;</span><span style="color: #ffc080;">$a</span><span style="color: grey;">-&gt;</span><span style="color: magenta;">ID</span><span style="color: grey;">,</span> <span style="color: #ff8080;">'stars-overall-rating'</span><span style="color: grey;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
   <span style="color: #ffc080;">$b_stars</span> <span style="color: grey;">=</span> get_post_meta<span style="color: grey;">&#40;</span><span style="color: #ffc080;">$b</span><span style="color: grey;">-&gt;</span><span style="color: magenta;">ID</span><span style="color: grey;">,</span> <span style="color: #ff8080;">'stars-overall-rating'</span><span style="color: grey;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
   <span style="color: #80ff80">// if it's not a tie, return which has more stars</span>
   <span style="color: #4080ff;">if</span> <span style="color: grey;">&#40;</span><span style="color: #ffc080;">$a_stars</span> <span style="color: grey;">!=</span> <span style="color: #ffc080;">$b_stars</span><span style="color: grey;">&#41;</span> <span style="color: grey;">&#123;</span>
      <span style="color: #4080ff;">return</span> <span style="color: grey;">&#40;</span><span style="color: grey;">&#40;</span>float<span style="color: grey;">&#41;</span><span style="color: #ffc080;">$a_stars</span> <span style="color: grey;">&gt;</span> <span style="color: grey;">&#40;</span>float<span style="color: grey;">&#41;</span><span style="color: #ffc080;">$b_stars</span><span style="color: grey;">&#41;</span> ? <span style="color: grey;">-</span><span style="color: #cc66cc;">1</span> <span style="color: grey;">:</span> <span style="color: #cc66cc;">1</span><span style="color: grey;">;</span>
   <span style="color: grey;">&#125;</span>
   <span style="color: #80ff80">// else, if they are tied, go to the priority tiebreaker...</span>
&nbsp;
   <span style="color: #80ff80">// get the priority value for each</span>
   <span style="color: #ffc080;">$a_priority</span> <span style="color: grey;">=</span> get_post_meta<span style="color: grey;">&#40;</span><span style="color: #ffc080;">$a</span><span style="color: grey;">-&gt;</span><span style="color: magenta;">ID</span><span style="color: grey;">,</span> <span style="color: #ff8080;">'rating-priority'</span><span style="color: grey;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
   <span style="color: #ffc080;">$b_priority</span> <span style="color: grey;">=</span> get_post_meta<span style="color: grey;">&#40;</span><span style="color: #ffc080;">$b</span><span style="color: grey;">-&gt;</span><span style="color: magenta;">ID</span><span style="color: grey;">,</span> <span style="color: #ff8080;">'rating-priority'</span><span style="color: grey;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
&nbsp;
   <span style="color: #80ff80">// if a priority value has not been entered, default to 0</span>
   <span style="color: #ffc080;">$a_priority</span> <span style="color: grey;">=</span> <span style="color: grey;">&#40;</span><span style="color: #ffc080;">$a_priority</span> <span style="color: grey;">==</span> <span style="color: #ff8080;">''</span><span style="color: grey;">&#41;</span> ? <span style="color: #cc66cc;">0</span> <span style="color: grey;">:</span> <span style="color: grey;">&#40;</span>int<span style="color: grey;">&#41;</span><span style="color: #ffc080;">$a_priority</span><span style="color: grey;">;</span>
   <span style="color: #ffc080;">$b_priority</span> <span style="color: grey;">=</span> <span style="color: grey;">&#40;</span><span style="color: #ffc080;">$b_priority</span> <span style="color: grey;">==</span> <span style="color: #ff8080;">''</span><span style="color: grey;">&#41;</span> ? <span style="color: #cc66cc;">0</span> <span style="color: grey;">:</span> <span style="color: grey;">&#40;</span>int<span style="color: grey;">&#41;</span><span style="color: #ffc080;">$b_priority</span><span style="color: grey;">;</span>
&nbsp;
   <span style="color: #80ff80">// if the priority is also equal, just return as a tie</span>
   <span style="color: #4080ff;">if</span> <span style="color: grey;">&#40;</span><span style="color: #ffc080;">$a_priority</span> <span style="color: grey;">==</span> <span style="color: #ffc080;">$b_priority</span><span style="color: grey;">&#41;</span> <span style="color: grey;">&#123;</span>
      <span style="color: #4080ff;">return</span> <span style="color: #cc66cc;">0</span><span style="color: grey;">;</span>
   <span style="color: grey;">&#125;</span>
   <span style="color: #80ff80">// if not, we return the priority comparison</span>
   <span style="color: #4080ff;">return</span> <span style="color: grey;">&#40;</span><span style="color: #ffc080;">$a_priority</span> <span style="color: grey;">&lt;</span> <span style="color: #ffc080;">$b_priority</span><span style="color: grey;">&#41;</span> ? <span style="color: grey;">-</span><span style="color: #cc66cc;">1</span> <span style="color: grey;">:</span> <span style="color: #cc66cc;">1</span><span style="color: grey;">;</span>
<span style="color: grey;">&#125;</span></pre></td></tr></table></div>

<h3>How the Tie-Breaker Function Works</h3>
<p>The way the custom sort function works is by comparing two elements of the array ($a and $b, above), and deciding which one is &#8220;greater than&#8221; the other.  If $a is greater than $b, we should return a value of 1.  If the opposite is true, we return -1.  If they are tied, we return 0.  The above function uses ternary operators to compare first the star ratings and then the priority values.  If the stars are not tied, it just returns which has the higher star rating, and never gets to the tie-breaker phase.  But if they are equal, we then compare the second criteria.</p>
<p>There is also a check to make sure the &#8220;priority&#8221; field has a value.  This is so that the user is not forced to input a value for every single review, just the ones that need to be tweaked.  Using this system, all that is required to bump a review up above another review with an equal star-rating is to insert a &#8220;-1&#8243; in the priority box.</p>
<p>I used this for a star rating system, but it could be used for any number of applications.  For example, if you wanted to order your posts by author, but for each author make sure they are in chronological order.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffgran.com/218/blog/wordpress-sort-posts-by-multiple-fields/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>WordPress: Tabbed Sidebar Widgets with jQuery</title>
		<link>http://jeffgran.com/180/blog/wordpress-tabbed-sidebar-widgets-with-jquery</link>
		<comments>http://jeffgran.com/180/blog/wordpress-tabbed-sidebar-widgets-with-jquery#comments</comments>
		<pubDate>Wed, 01 Jul 2009 22:33:13 +0000</pubDate>
		<dc:creator>Jeff Gran</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=180</guid>
		<description><![CDATA[Tabs are a great way to show more information in less space, assuming the initially-hidden tabs are non-essential information.  Recently a client asked me to put a few Wordpress widgets into a single tabbed container in the sidebar.  Here's how I did it.]]></description>
			<content:encoded><![CDATA[<p>Tabs are a great way to show more information in less space, assuming the initially-hidden tabs are non-essential information.  Recently a client asked me to put a few Wordpress widgets into a single tabbed container in the sidebar.  Here&#8217;s how I did it.</p>
<h3>The Problem</h3>
<p>There&#8217;s no reason to re-invent the wheel, and there are already several tabs implementations written as jQuery plugins, including the <a title="jQuery UI Tabs" href="http://jqueryui.com/demos/tabs/">jQuery UI tabs widget</a>. The problem with these is that most (if not all) of them require the markup to be set up in a different way than we have available with our WordPress-outputted sidebar markup.</p>
<p>To illustrate, WordPress by default outputs the sidebar with markup that is structured something like this:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="html4strict" style="color: #ccc;"><span style="color: #aaa;">&lt;<span style="color: #ffff00;">div</span> <span style="color: cyan;">id</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;sidebar-1&quot;</span>&gt;</span>
  <span style="color: #aaa;">&lt;<span style="color: #ffff00;">ul</span> <span style="color: cyan;">class</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;sidebar-list&quot;</span>&gt;</span>
    <span style="color: #aaa;">&lt;<span style="color: #ffff00;">li</span> <span style="color: cyan;">id</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;widget-1&quot;</span> <span style="color: cyan;">class</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;widget widget-class-1&quot;</span>&gt;</span>
      <span style="color: #aaa;">&lt;<span style="color: #ffff00;">h2</span>&gt;</span>Widget 1 Title<span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">h2</span>&gt;</span>
      <span style="color: #aaa;">&lt;<span style="color: #ffff00;">p</span>&gt;</span>...content...<span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">p</span>&gt;</span>
    <span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">li</span>&gt;</span>
    <span style="color: #aaa;">&lt;<span style="color: #ffff00;">li</span> <span style="color: cyan;">id</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;widget-2&quot;</span> <span style="color: cyan;">class</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;widget widget-class-2&quot;</span>&gt;</span>
      <span style="color: #aaa;">&lt;<span style="color: #ffff00;">h2</span>&gt;</span>Widget 2 Title<span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">h2</span>&gt;</span>
      <span style="color: #aaa;">&lt;<span style="color: #ffff00;">p</span>&gt;</span>...content2...<span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">p</span>&gt;</span>
    <span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">li</span>&gt;</span>
  <span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">ul</span>&gt;</span>
<span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">div</span>&gt;</span></pre></td></tr></table></div>

<p>The various jQuery tabs plugins all require the markup to be strutured like this (notice the titles moved to the additional list at the top, with anchor tags corresponding to the ids of the respective widgets:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="html4strict" style="color: #ccc;"><span style="color: #aaa;">&lt;<span style="color: #ffff00;">div</span> <span style="color: cyan;">id</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;sidebar-1&quot;</span>&gt;</span>
  <span style="color: #aaa;">&lt;<span style="color: #ffff00;">ul</span>&gt;</span>
    <span style="color: #aaa;">&lt;<span style="color: #ffff00;">li</span>&gt;&lt;<span style="color: #ffff00;">a</span> <span style="color: cyan;">href</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;#widget-1&quot;</span>&gt;</span>Widget 1 Title<span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">a</span>&gt;&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">li</span>&gt;</span>
    <span style="color: #aaa;">&lt;<span style="color: #ffff00;">li</span>&gt;&lt;<span style="color: #ffff00;">a</span> <span style="color: cyan;">href</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;#widget-2&quot;</span>&gt;</span>Widget 2 Title<span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">a</span>&gt;&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">li</span>&gt;</span>
  <span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">ul</span>&gt;</span>
  <span style="color: #aaa;">&lt;<span style="color: #ffff00;">ul</span> <span style="color: cyan;">class</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;sidebar-list&quot;</span>&gt;</span>
    <span style="color: #aaa;">&lt;<span style="color: #ffff00;">li</span> <span style="color: cyan;">id</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;widget-1&quot;</span> <span style="color: cyan;">class</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;widget widget-class-1&quot;</span>&gt;</span>
      <span style="color: #aaa;">&lt;<span style="color: #ffff00;">p</span>&gt;</span>...content...<span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">p</span>&gt;</span>
    <span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">li</span>&gt;</span>
    <span style="color: #aaa;">&lt;<span style="color: #ffff00;">li</span> <span style="color: cyan;">id</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;widget-2&quot;</span> <span style="color: cyan;">class</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;widget widget-class-2&quot;</span>&gt;</span>
      <span style="color: #aaa;">&lt;<span style="color: #ffff00;">p</span>&gt;</span>...content2...<span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">p</span>&gt;</span>
    <span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">li</span>&gt;</span>
  <span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">ul</span>&gt;</span>
<span style="color: #aaa;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">div</span>&gt;</span></pre></td></tr></table></div>

<h3>The Solution</h3>
<p>While it would be possible to alter the PHP code to output the list above the widgets (although, I looked into this solution and was not able to find a hook that would allow it without altering the core), we can just use some custom jQuery to dynamically add the list before invoking the tabs plugin.  This method also has the advantage that it makes our tabs more unobtrusive.  If javascript is disabled, the page will look exactly as it would with the standard sidebar widgets, but if javascript is available, we&#8217;ll fix the markup and add the tabs all at once with our jQuery code.</p>
<h3>The Code</h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="javascript" style="color: #ccc;">$<span style="color: grey;">&#40;</span>document<span style="color: grey;">&#41;</span>.<span style="color: magenta;">ready</span><span style="color: grey;">&#40;</span><span style="color: #ffff00;">function</span><span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span> <span style="color: grey;">&#123;</span>
   <span style="color: #80ff80">// first, we select the sidebar</span>
   $<span style="color: grey;">&#40;</span><span style="color: #ff8080;">'#sidebar-1 .sidebar-list'</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">each</span><span style="color: grey;">&#40;</span><span style="color: #ffff00;">function</span><span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span> <span style="color: grey;">&#123;</span>
      <span style="color: #80ff80">// each child of the sidebar element will be a widget, and will become a tab</span>
      <span style="color: #ffff00;">var</span> widgets <span style="color: grey;">=</span> $<span style="color: grey;">&#40;</span><span style="color: #4080ff;">this</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">children</span><span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
&nbsp;
      <span style="color: #80ff80">// we'll build the list of titles, starting with the opening tag</span>
      <span style="color: #ffff00;">var</span> titleList <span style="color: grey;">=</span> <span style="color: #ff8080;">'&lt;ul&gt;'</span><span style="color: grey;">;</span>
&nbsp;
      <span style="color: #80ff80">//for each widget in the sidebar:</span>
      widgets.<span style="color: magenta;">each</span><span style="color: grey;">&#40;</span><span style="color: #ffff00;">function</span><span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span> <span style="color: grey;">&#123;</span>
&nbsp;
         <span style="color: #80ff80">// save the title of the widget</span>
         <span style="color: #ffff00;">var</span> widgetTitle <span style="color: grey;">=</span> $<span style="color: grey;">&#40;</span><span style="color: #4080ff;">this</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">children</span><span style="color: grey;">&#40;</span><span style="color: #ff8080;">'h2'</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">text</span><span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
         <span style="color: #80ff80">// then hide it since it will be displayed in the tab</span>
         $<span style="color: grey;">&#40;</span><span style="color: #4080ff;">this</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">children</span><span style="color: grey;">&#40;</span><span style="color: #ff8080;">'h2'</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">hide</span><span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
&nbsp;
         <span style="color: #80ff80">// create a new list item for the tab, linking to this widget's id</span>
         <span style="color: #ffff00;">var</span> listItem <span style="color: grey;">=</span> <span style="color: #ff8080;">'&lt;li&gt;&lt;a href=&quot;#'</span><span style="color: grey;">+</span>$<span style="color: grey;">&#40;</span><span style="color: #4080ff;">this</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">attr</span><span style="color: grey;">&#40;</span><span style="color: #ff8080;">'id'</span><span style="color: grey;">&#41;</span><span style="color: grey;">+</span><span style="color: #ff8080;">'&quot;&gt;'</span><span style="color: grey;">+</span>widgetTitle<span style="color: grey;">+</span><span style="color: #ff8080;">'&lt;/a&gt;&lt;/li&gt;'</span><span style="color: grey;">;</span>
         <span style="color: #80ff80">// add the list item to the list we're building</span>
         titleList <span style="color: grey;">+=</span> listItem<span style="color: grey;">;</span>
      <span style="color: grey;">&#125;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
      <span style="color: #80ff80">// close the list now that we're done going through each widget</span>
      titleList <span style="color: grey;">+=</span> <span style="color: #ff8080;">'&lt;/ul&gt;'</span><span style="color: grey;">;</span>
&nbsp;
      <span style="color: #80ff80">// add the title list to the beginning of the sidebar</span>
      $<span style="color: grey;">&#40;</span><span style="color: #4080ff;">this</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">before</span><span style="color: grey;">&#40;</span>titleList<span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
   <span style="color: grey;">&#125;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
&nbsp;
   <span style="color: #80ff80">// apply the tabs plugin</span>
   $<span style="color: grey;">&#40;</span><span style="color: #ff8080;">'#sidebar-1'</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">tabs</span><span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
<span style="color: grey;">&#125;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span></pre></td></tr></table></div>

<h3>Explanation</h3>
<p>The comments in the code should make the solution pretty self-explanatory.  This will take all the widgets in the selected sidebar and create tabs for them.</p>
<p>There are some things you&#8217;ll have to be careful about if you use this code.  First, you&#8217;ll have to change the selection for the sidebar div (line 3 above, as well as in the second-to-last line) to match yours.  This assumes you <em>have</em> your sidebar list wrapped in a div (required by the tabs plugin), so if you don&#8217;t, you will need to add that, either in the theme itself or with jQuery( using .wrap() ). Also, in the two places you see &#8216;h2&#8242;, this is assuming that the titles of the widgets are in &lt;h2&gt; tags.  You may need to select a different tag if your theme displays the widget titles differently.</p>
<p>Also note that this will create tabs for <em>all</em> the widgets in the sidebar.  Making it only apply to specific widgets is possible, but a bit more complicated.  Luckily, with WordPress 2.8, the sidebars/widgets interface is much improved.  One solution would be to create multiple &#8217;sidebars&#8217; that stacked on top of each other in the sidebar area of your theme, and apply the above tab-ifying code to one or more of them individually.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffgran.com/180/blog/wordpress-tabbed-sidebar-widgets-with-jquery/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Book Review: Javascript: The Missing Manual</title>
		<link>http://jeffgran.com/161/blog/book-review-javascript-the-missing-manual</link>
		<comments>http://jeffgran.com/161/blog/book-review-javascript-the-missing-manual#comments</comments>
		<pubDate>Sat, 13 Jun 2009 01:30:57 +0000</pubDate>
		<dc:creator>Jeff Gran</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[book review]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=161</guid>
		<description><![CDATA[In my ongoing efforts to realize my dreams of becoming a true web ninja, I recently read Javascript: The Missing Manual by David Sawyer MacFarland.  I had read his previous book in the Missing Manuals series on CSS, and had both enjoyed it and learned a lot from it.
I did find this book interesting and [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-166" title="js_mm_cover" src="http://jeffgran.com/img/js_mm_cover.png" alt="js_mm_cover" width="145" height="190" />In my ongoing efforts to realize my dreams of becoming a true web ninja, I recently read <a title="Javascript: The Missing Manual" href="http://www.amazon.com/gp/product/0596515898"><em>Javascript: The Missing Manual</em></a> by <a title="David Sawyer MacFarland" href="http://www.sawmac.com">David Sawyer MacFarland</a>.  I had read his previous book in the Missing Manuals series on CSS, and had both enjoyed it and learned a lot from it.</p>
<p>I did find this book interesting and informative as well, but I say that with caveats, which I&#8217;ll explain.</p>
<p>First, I&#8217;m not sure that I was exactly the intended audience for the book.  I am pretty well-versed in programming concepts in general, and what I was looking for was an introduction to the language of javascript and when and how to use it effectively in my web sites.  In contrast, this book seemed to be geared a little more towards pure designers who are scared of programming. A few times during my reading I had to roll my eyes at another &#8220;If this is making your head hurt, just type it in and know that it works.&#8221;  Personally, I want to know how everything works and I&#8217;m not interested in blindly typing in code to &#8220;make it work.&#8221;  I can do that by searching google and cutting and pasting.  I bought a book because I wanted to get deep, to learn the ins and outs of how it all works behind the scenes.  I wanted a book because I&#8217;m on my way to becoming a full-on pro, and this book at times seemed more geared towards hobbyists, or designers who just wanted to dip their toes into javascript.</p>
<p>Second, this is really a book on jQuery.  I don&#8217;t have a problem with that, but it needs to be said.  The first section of the book goes over the syntax of plain old javascript, including function declarations, string manipulation with built-in functions and regular expressions, math functions and operators, variable typing, etc.  Then the author quickly moves on to the use of libraries to speed development, and specifically to jQuery.  I&#8217;ll say here that I have very ambiguous feelings regarding the need to learn the &#8220;hard way&#8221; of doing things when using a library to do it for you will normally suffice.  That&#8217;s a debate in itself, and I don&#8217;t want to get into all the pros and cons, but again, it should be said that you won&#8217;t be learning the traditional way of working with the DOM here, you&#8217;ll be learning to use jQuery selectors.</p>
<p>Now for the good parts.  Like the CSS book in the series, I found the information to be explained in a very readable and understandable tone.  The book is well-paced &#8212; several times I would have an &#8220;aha &#8211; that&#8217;s cool how that works!&#8221; moment, followed by a &#8220;but wait, what if you wanted to do it this way?&#8221;, and without fail the next paragraph would address my question.  Sometimes it would answer right there, and sometimes it would say &#8220;we&#8217;ll show you how to do this with more flexibility in the next section&#8230;&#8221; so I&#8217;d know it was coming.  This ability to anticipate the reader&#8217;s thinking is probably the best part of these books.</p>
<p>Also, the tutorials were again very helpful and well laid-out.  Another thing I&#8217;d like to point out is that the tutorials are not just re-hashes of the information in the preceding chapter.  There is additional learning value in the tutorials that build on what you learn by reading the chapter.  So you get the explanations of how things are designed to work, and then you get to play with a real-world example and the book shows you how to solve the additional problems that inevitably come up.  Code examples are thoroughly explained (sometimes too thoroughly &#8212; I found myself skipping sections saying to myself, &#8220;yeah, I get it already&#8221; &#8212; but that&#8217;s definitely better than the opposite).</p>
<p>After going through all the basic functionality of jQuery itself, the book unfortunately devolves into several chapters showing how to use specific jQuery plugins for specific purposes: image gallery, slideshow, tabs, etc.  While these are certainly useful, no additional concepts or ideas were presented, just lists of the specific variables and possible values for customizing the plugins.  This part of the book seemed like fluff to me and could have been condensed into a few short pages of charts.  It&#8217;s not that the information wasn&#8217;t useful, just that after learning so many interesting and, to me, revolutionary concepts, reading paragraphs about using &#8220;slow&#8221; if you want it to move slow, and &#8220;fast&#8221; if you want it to move fast seemed like a step backwards.</p>
<p>The last section of the book is dedicated to AJAX.  Here the quality of information improves again, but again with caveats.  You won&#8217;t learn the details of setting up the XMLHTTPRequest object, but you&#8217;ll learn what is and then how jQuery saves you the trouble of knowing.</p>
<p>In one way this final section about AJAX serves as a microcosm to the whole book.  It&#8217;s a great introduction, it gets you familiar with the general concepts and shows you how to get started right away, but it left me hungry for more, deeper knowledge.  And perhaps that&#8217;s the way it should be.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffgran.com/161/blog/book-review-javascript-the-missing-manual/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Site Upgrades: Wordpress 2.8!</title>
		<link>http://jeffgran.com/163/blog/site-upgrades-wordpress-28</link>
		<comments>http://jeffgran.com/163/blog/site-upgrades-wordpress-28#comments</comments>
		<pubDate>Sat, 13 Jun 2009 00:17:34 +0000</pubDate>
		<dc:creator>Jeff Gran</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[announcement]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=163</guid>
		<description><![CDATA[WordPress 2.8 was released on Wednesday, and I've upgraded my site.]]></description>
			<content:encoded><![CDATA[<p>WordPress 2.8 <a title="WordPress 2.8 Jazzes Themes and Widgets" href="http://wordpress.org/development/2009/06/wordpress-28/">was released</a> on Wednesday, and I&#8217;ve upgraded my site.  I&#8217;m looking forward to playing with the new widgets API.  Hmm&#8230; what kind of widgets will I make?</p>
<p>I also upgraded to the latest <a title="Pods: Wordpress CMS Plugin" href="http://pods.uproot.us/">Pods</a> release (1.6.5), which will allow some nifty behind-the-scenes magic to happen.</p>
<p>That&#8217;s all.  Carry on.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffgran.com/163/blog/site-upgrades-wordpress-28/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Javascript vs. jQuery vs. the DOM</title>
		<link>http://jeffgran.com/156/blog/javascript-jquery-vs-the-dom</link>
		<comments>http://jeffgran.com/156/blog/javascript-jquery-vs-the-dom#comments</comments>
		<pubDate>Wed, 03 Jun 2009 23:28:40 +0000</pubDate>
		<dc:creator>Jeff Gran</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=156</guid>
		<description><![CDATA[When I first started learning about Javascript, it took me a little while before I could wrap my head around the distinctions and relationships between Javascript, jQuery and the DOM.  So I thought I would lay out what I've learned so that it might help someone where I was.]]></description>
			<content:encoded><![CDATA[<p>When I first started learning about Javascript, it took me a little while before I could wrap my head around the distinctions and relationships between Javascript, jQuery and the DOM.  So I thought I would lay out what I&#8217;ve learned so that it might help someone where I was.</p>
<h3>Javascript</h3>
<p>Javascript is a programming language.  It comes standard with most modern web browsers.  It is also the same language that is used in Flash (where it&#8217;s called ActionScript), and can be used to write scripts in Photoshop, Illustrator, etc.  In the context of a web browser, it is often used to manipulate the DOM (see below).</p>
<h3>jQuery</h3>
<p>jQuery is a Javascript library, meaning that it is essentially a collection of functions written in Javascript that can be used to make the programmer&#8217;s job easier.  Common tasks that take more lines of code with traditional Javascript can be executed with calls to the jQuery functions.  There are several other Javascript libraries out there that fill the same need.  For one reason or another, jQuery seems to be the most popular library of the day.</p>
<h3>The DOM</h3>
<p>The Document Object Model (DOM), is just that &#8211; a model for representing and interacting with an XML, XHTML, or HTML document.  Our HTML documents are created by typing tags in plain text, and the DOM is a way to access the tags and the structure of the &#8220;tag tree&#8221;.  For example, instead of using regular expressions to find the text that represents a tag with a specific ID attribute, we can ask the DOM which of its tags has that ID.  Javascript is not part of the DOM or vice-versa, but Javascript in the browser does include some intelligence about the DOM &#8211; for example, the getElementById() function.  One of the main advantages of jQuery is the extra intelligence it has regarding the DOM.  With it, you access and create DOM elements (tags) by using the many selectors and traversing operations it offers.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffgran.com/156/blog/javascript-jquery-vs-the-dom/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>UPS saves the day</title>
		<link>http://jeffgran.com/150/blog/ups-saves-the-day</link>
		<comments>http://jeffgran.com/150/blog/ups-saves-the-day#comments</comments>
		<pubDate>Fri, 22 May 2009 06:15:35 +0000</pubDate>
		<dc:creator>Jeff Gran</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[life]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=150</guid>
		<description><![CDATA[No, not that UPS.
A while back I bought a way-more-wattage-than-I-need uninterruptible power supply.  It&#8217;s a big box (almost the size of my desktop computer) with fancy lights and readouts that regulates the electricity coming out of it and into my computer, like a surge protector on steroids.  More importantly, it stores the electricity [...]]]></description>
			<content:encoded><![CDATA[<p>No, not that UPS.</p>
<p>A while back I bought a way-more-wattage-than-I-need uninterruptible power supply.  It&#8217;s a big box (almost the size of my desktop computer) with fancy lights and readouts that regulates the electricity coming out of it and into my computer, like a surge protector on steroids.  More importantly, it stores the electricity and can keep my computer running when the power goes out.</p>
<p>I actually got it for the first purpose above (the building I live in is very old, and I was getting power surges even when I was behind a surge protector), but the second came in very handy yesterday.  There was a thunderstorm here in Denver, and I found it a bit surreal when all of a sudden I heard the familiar click and the power was out, I was sitting in the pitch dark, but I was still looking at a bright screen on my laptop running Photoshop.</p>
<p>I couldn&#8217;t help but grin.  Neither rain nor sleet nor power outtages will keep me from my work. <img src='http://jeffgran.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://jeffgran.com/150/blog/ups-saves-the-day/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Wordpress: Using a custom home page</title>
		<link>http://jeffgran.com/139/blog/wordpress-custom-home-page</link>
		<comments>http://jeffgran.com/139/blog/wordpress-custom-home-page#comments</comments>
		<pubDate>Tue, 19 May 2009 19:25:13 +0000</pubDate>
		<dc:creator>Jeff Gran</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=139</guid>
		<description><![CDATA[WordPress hs a simple checkbox in the Admin->Settings panel that lets you set a certain file to be the "static" home page instead of the default listing of the latest posts.

I'm going to show you how (and why) I did NOT use that feature to create my customized home page.]]></description>
			<content:encoded><![CDATA[<p>WordPress hs a simple checkbox in the Admin-&gt;Settings panel that lets you set a certain file to be the &#8220;static&#8221; home page instead of the default listing of the latest posts.</p>
<p>I&#8217;m going to show you how (and why) I did NOT use that feature to create my customized home page.</p>
<p>Here&#8217;s what I wanted:</p>
<ol>
<li>A unique page for the home page, including a few of the latest posts (displayed differently than on the main blog page)</li>
<li>The main blog page to be located at &#8220;url.com/blog&#8221;, showing the default latest posts  (assuming permalinks are turned on)</li>
<li>All other dynamic archive pages shown by month, tag, category, etc., should be shown using the same template as the main blog page, without creating any duplicate files</li>
</ol>
<p>Here&#8217;s how I did it:</p>
<h3>home.php</h3>
<p>Instead of using the admin interface to designate a specific file for your home page, you can use WordPress&#8217;s built-in <a title="Template Hierarchy" href="http://codex.wordpress.org/Template_Hierarchy">template hierarchy</a>.  This method has the advantage that if you&#8217;re building this theme for the public, it will automatically behave how you want it to, instead of having to instruct the user to alter their settings.</p>
<p>To do this simply design your home page&#8217;s php/html/css, and name it home.php.  That&#8217;s it &#8211;  &#8220;home.php&#8221; takes precedence over &#8220;index.php&#8221;.</p>
<h3>Custom loop</h3>
<p>WordPress shows blog posts in what they call &#8220;The Loop&#8221;.  The Loop works by doing the following:</p>
<ol>
<li>The query &#8212; gets a set of posts based on what page we&#8217;re viewing.  Usually this is automatic, using the URL (e.g. &#8220;?p=138&#8243; or &#8220;/category/news&#8221;).</li>
<li>&#8220;if(have_posts()):&#8221; &#8212; just like it looks, it makes sure the query got at least one post.</li>
<li>&#8220;while(have_posts()):&#8221; &#8212; keep doing the loop until we don&#8217;t have any more posts.</li>
<li>&#8220;the_post();&#8221; &#8212; this basically &#8220;loads up&#8221; the current post in the loop so that all the <a title="Template Tags" href="http://codex.wordpress.org/Template_Tags">template tags</a> associated with the post will reference this specific post from this specific query.</li>
<li>Then comes the markup output for each post.</li>
<li>&#8220;endwhile; endif;&#8221; &#8212; the end of the loop.</li>
</ol>
<p>So, in order to customize the Loop, there are two main things we can do.  One is to make a unique query, and the other is to create a unique layout structure inside the loop.</p>
<p>For my home page, I wanted only the 2 most recent posts rather than the number set in the admin panel that would be used for the main blog page.  I added a simple counter and put this code in the appropriate spot in home.php:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="color: #ccc;"><span style="color: #ffc080;">$i</span> <span style="color: grey;">=</span> <span style="color: #cc66cc;">0</span><span style="color: grey;">;</span>
<span style="color: #4080ff;">if</span><span style="color: grey;">&#40;</span>have_posts<span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span><span style="color: grey;">&#41;</span> <span style="color: grey;">:</span> <span style="color: #4080ff;">while</span><span style="color: grey;">&#40;</span>have_posts<span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span> <span style="color: grey;">&amp;&amp;</span> <span style="color: #ffc080;">$i</span><span style="color: grey;">&lt;</span><span style="color: #cc66cc;">2</span><span style="color: grey;">&#41;</span> <span style="color: grey;">:</span> the_post<span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
   <span style="color: #80ff80">// html output, template tags, etc go here</span>
   <span style="color: #ffc080;">$i</span><span style="color: grey;">++;</span>
<span style="color: #4080ff;">endwhile</span><span style="color: grey;">;</span> <span style="color: #4080ff;">endif</span><span style="color: grey;">;</span></pre></td></tr></table></div>

<h3>index.php</h3>
<p>In the aforementioned template hierarchy, index.php is the default template for all blog pages, and in the absence of home.php it would be the home page as well.  So I used index.php to put my main, default loop.  But how do we get index.php to show up at &#8220;url.com/blog&#8221;?</p>
<p>This is the part that I have never seen anywhere else, and what prompted me to write this post.  What I did was use index.php for its special status in the template hierarchy, and ALSO used the same file as a Page Template.  To use index.php as a template, just add the magic keyword/comment at the top, like this:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="color: #ccc;"><span style="color: grey;">&lt;?php</span> <span style="color: #80ff80">/*
Template Name: blog
 */</span></pre></td></tr></table></div>

<p>Now, create a blank Page in the admin panel titled Blog, and assign the &#8216;blog&#8217; page template to it.  The title will still be used to display the title on the page, and assigning the &#8216;blog&#8217; template to it makes it use index.php as the page template.</p>
<h3>Custom query</h3>
<p>So now the url for the blog is right, but it&#8217;s displaying the blank page created in the admin instead of the default loop of latest blog posts.  To remedy that, we put a conditional test at the top, and if this is the blog page, we &#8220;reset&#8221; the query so that it contains all the posts.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="color: #ccc;"><span style="color: #4080ff;">if</span><span style="color: grey;">&#40;</span>is_page<span style="color: grey;">&#40;</span><span style="color: #ff8080;">'blog'</span><span style="color: grey;">&#41;</span><span style="color: grey;">&#41;</span> <span style="color: grey;">&#123;</span>
   query_posts<span style="color: grey;">&#40;</span><span style="color: #ff8080;">&quot;&quot;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
<span style="color: grey;">&#125;</span></pre></td></tr></table></div>

<p>The &#8220;query_posts&#8221; function creates the query, as mentioned above.  Passing an empty string as the argument makes sure we get all the posts.  We put this above the start of the Loop, to override the automatic query that is just returning the one &#8216;post&#8217;, in this case being the blank Blog page.</p>
<h3>Fixing the pagination</h3>
<p>There&#8217;s one other quirky problem we have to deal with now.  The flaw is in the empty query.  It works, but when you get to multiple pages worth of posts, the paging will not work right.  When we click the &#8220;next page&#8221; or &#8220;page 2&#8243; link, the page number we&#8217;re going gets passed to the database as part of the query.  When we override the query with a blank one, we also override the page information, so we always end up on page 1.  To fix this, we have to find add a little test to find out the proper page, and add that in to our custom query.  After adding the paging fix, our custom query looks like this:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="php" style="color: #ccc;"><span style="color: #4080ff;">if</span><span style="color: grey;">&#40;</span>is_page<span style="color: grey;">&#40;</span><span style="color: #ff8080;">'blog'</span><span style="color: grey;">&#41;</span><span style="color: grey;">&#41;</span> <span style="color: grey;">&#123;</span>
   <span style="color: #4080ff;">if</span> <span style="color: grey;">&#40;</span>get_query_var<span style="color: grey;">&#40;</span><span style="color: #ff8080;">'paged'</span><span style="color: grey;">&#41;</span><span style="color: grey;">&#41;</span>
      <span style="color: #ffc080;">$paged</span> <span style="color: grey;">=</span> get_query_var<span style="color: grey;">&#40;</span><span style="color: #ff8080;">'paged'</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
   <span style="color: #4080ff;">else</span> <span style="color: #ffc080;">$paged</span> <span style="color: grey;">=</span> <span style="color: #cc66cc;">1</span><span style="color: grey;">;</span>
   query_posts<span style="color: grey;">&#40;</span><span style="color: #ff8080;">&quot;paged=<span style="color: #ffa080;">$paged</span>&quot;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
<span style="color: grey;">&#125;</span></pre></td></tr></table></div>

<p>&#8220;get_query_var(&#8217;paged&#8217;)&#8221; gets the paging information from the original query that we&#8217;re about to override.  If it&#8217;s there, we use it, and if not, we assume we&#8217;re on page one.  Now you can write a spiffy Loop below this and it will be used for all blog post listings, including the default one at &#8220;/blog&#8221;</p>
<p>I hope this was helpful to someone!</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffgran.com/139/blog/wordpress-custom-home-page/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
