<?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 &#187; PHP</title>
	<atom:link href="http://jeffgran.com/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://jeffgran.com</link>
	<description>Artist, Designer, Developer</description>
	<lastBuildDate>Wed, 09 Nov 2011 15:59:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>WordPress: Sort Posts by Multiple Fields (Part II)</title>
		<link>http://jeffgran.com/262/blog/wordpress-sort-posts-by-multiple-fields-part-ii</link>
		<comments>http://jeffgran.com/262/blog/wordpress-sort-posts-by-multiple-fields-part-ii#comments</comments>
		<pubDate>Sun, 17 Jul 2011 23:17:39 +0000</pubDate>
		<dc:creator>Jeff Gran</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=262</guid>
		<description><![CDATA[Here's a fast and easy way to sort your posts by multiple fields, using the posts_orderby filter hook and a simple function.]]></description>
			<content:encoded><![CDATA[<h3>The Sequel!</h3>
<p>Because my previous post (<a href="http://jeffgran.com/218/blog/wordpress-sort-posts-by-multiple-fields" title="WordPress: Sort Posts by Multiple Fields">WordPress: Sort Posts by Multiple Fields</a>) was one of my most popular posts, and because I have realized since then that the solution it proposes is an inadequate one, I felt the need to write an update.  I don&#8217;t want to be spreading bad information, and for a blog with any significant number of posts, that solution is untenable.</p>
<p>As <a href="http://jeffgran.com/218/blog/wordpress-sort-posts-by-multiple-fields#comment-254" title="WordPress: Sort Posts by Multiple Fields">progzy</a> points out, sorting by multiple fields can be accomplished using the `posts_orderby` filter hook, which uses MySQL directly to sort the posts, instead of getting all the posts from the database into a gigantic array, and then sorting them with php code. Here&#8217;s how to do it.</p>
<h3>Writing an orderby Function</h3>
<p>You&#8217;ll need to write a function that returns a SQL fragment represented as a string, and then connect it to the filter hook. The SQL fragment is the `ORDER BY` segment of the SQL query that gets your posts from the database. See <a href="http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html">the MySQL Documentation on sorting</a> for more info on this.</p>
<p>Here&#8217;s an example of a custom sorting function:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="color: #ccc;"><span style="color: #ffff00;">function</span> order_by_multiple<span style="color: grey;">&#40;</span> <span style="color: #ffc080;">$orderby</span><span style="color: grey;">&#41;</span> <span style="color: grey;">&#123;</span>
  <span style="color: #4080ff;">return</span> <span style="color: #ff8080;">&quot;post_date ASC, post_title DESC&quot;</span><span style="color: grey;">;</span>
<span style="color: grey;">&#125;</span></pre></div></div>

<p>The above would sort the posts by date in ascending order first, and secondarily by title in descending (reverse) order. </p>
<h3>Only Sort on a certain page</h3>
<p>You can also make this much more complex, if you want to. One important way is by using the different &#8220;<a href="http://codex.wordpress.org/Conditional_Tags">Conditional Tags</a>&#8221; WordPress provides. Here&#8217;s an example that only applies the custom sort on the home page:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="color: #ccc;"><span style="color: #ffff00;">function</span> order_by_multiple<span style="color: grey;">&#40;</span> <span style="color: #ffc080;">$orderby</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><span style="color: grey;">!</span>is_home<span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span><span style="color: grey;">&#41;</span> <span style="color: grey;">&#123;</span>
    <span style="color: #4080ff;">return</span> <span style="color: #ff8080;">&quot;post_date ASC, post_title DESC&quot;</span><span style="color: grey;">;</span>
  <span style="color: grey;">&#125;</span>
<span style="color: grey;">&#125;</span></pre></div></div>

<h3>Hook up the sort function</h3>
<p>Then, once you have your ordering function written, you just need to hook it into the WordPress code like this:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="color: #ccc;">add_filter<span style="color: grey;">&#40;</span><span style="color: #ff8080;">&quot;posts_orderby&quot;</span><span style="color: grey;">,</span> <span style="color: #ff8080;">&quot;order_by_multiple&quot;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span></pre></div></div>

<p>Make the second string argument there match your function name, of course (it doesn&#8217;t have to be the same name as mine, it can be anything). And you can have more than one function hook into the same hook. They will be executed in the same order they are added. In that case, the `$orderby` argument that&#8217;s coming into the function is the existing SQL fragment. So you could add to it, remove something from it, etc.</p>
<h3>Use Debug Query to help figure out what to return</h3>
<p>So the question is, how do you know what to put in your SQL fragment string? If you know your SQL well, you might be able to figure it out by intuition/trial-and-error. For the rest of us, there is a very helpful WordPress Plugin called <a href="http://wordpress.org/extend/plugins/debug-queries/">Debug Queries</a> which will print out all of the MySQL queries that are run for every page you visit (only for logged-in admins, of course. It&#8217;s just a debugging tool for use while developing).</p>
<p>If you install it, it will print out many queries per page. You have to look for the one that&#8217;s querying for posts. In my testing, mine looks like this:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="color: #ccc;"><span style="color: #4080ff;">SELECT</span> SQL_CALC_FOUND_ROWS wp_posts<span style="color: grey;">.*</span> <span style="color: #4080ff;">FROM</span> wp_posts <span style="color: grey;">&#40;</span><span style="color: grey;">...</span><span style="color: grey;">&#41;</span></pre></div></div>

<p>The important part is the `FROM wp_posts`. That means you&#8217;re selecting rows from the posts table. So if you have plugins or metadata that you&#8217;re selecting on, you will see them in that query, and it may help you figure out what incantation you need to put in that `orderby` string.</p>
<p>If you need to sort by category, tag, custom meta-data, etc. as one of your sort values, you may need to alter your MySQL query even more, perhaps <a href="http://codex.wordpress.org/Custom_Queries">using other hooks</a> (very similar to the `posts_orderby` hook), such as `posts_join`, `posts_where`, etc. Each of these modify different parts of the query.</p>
<p>Beyond that, if you still need help figuring out how to get the exact set of posts in the right order, you may need to read up on MySQL in general and learn how to manipulate the queries in more detail. Good Luck!</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffgran.com/262/blog/wordpress-sort-posts-by-multiple-fields-part-ii/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[Blog]]></category>
		<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 demo [...]]]></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[Blog]]></category>
		<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; (&#8220;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[Blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=218</guid>
		<description><![CDATA[UPDATE: I have written a new post about how to better accomplish this task: WordPress: Sort Posts by Multiple Fields (Part II) Please see the above link for a much more efficient way to sort by multiple fields. I was recently creating a star-rating system for a client, and we were sorting the reviews (or [...]]]></description>
			<content:encoded><![CDATA[<h3>UPDATE: I have written a new post about how to better accomplish this task: <a href="http://jeffgran.com/262/blog/wordpress-sort-posts-by-multiple-fields-part-ii">WordPress: Sort Posts by Multiple Fields (Part II)</a></h3>
<p>Please see the above link for a much more efficient way to sort by multiple fields.</p>
<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: #0000ff;">'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: #0000ff;">'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: #0000ff;">'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: #0000ff;">'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: #0000ff;">'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: #0000ff;">''</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: #0000ff;">''</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>16</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[Blog]]></category>
		<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: #ffff00;">&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: #0000ff;">'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: #0000ff;">'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: #0000ff;">'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: #0000ff;">'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: #006699; font-weight: bold;">$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(&#8216;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>10</slash:comments>
		</item>
		<item>
		<title>WordPress: Custom Links Display</title>
		<link>http://jeffgran.com/38/blog/wordpress-custom-links-display</link>
		<comments>http://jeffgran.com/38/blog/wordpress-custom-links-display#comments</comments>
		<pubDate>Fri, 24 Apr 2009 09:53:36 +0000</pubDate>
		<dc:creator>Jeff Gran</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=38</guid>
		<description><![CDATA[I&#8217;ve been working with WordPress for a couple of days now, and I&#8217;m thoroughly impressed by its elegant design. I&#8217;ve always been a fan of modular, extensible, customizable systems, and WordPress does not disappoint. The great thing about the architecture they&#8217;ve built is that if one level of control can&#8217;t do what you need, there [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working with WordPress for a couple of days now, and I&#8217;m thoroughly impressed by its elegant design. I&#8217;ve always been a fan of modular, extensible, customizable systems, and WordPress does not disappoint. The great thing about the architecture they&#8217;ve built is that if one level of control can&#8217;t do what you need, there is always another successive level to delve into.</p>
<p>My point will be made more easily with an example:  I wanted to show the links on my &#8220;Links&#8221; page in boxes, with linked title and images, and a short description, all controlled by CSS classes.</p>
<p>WordPress offers a &#8220;template tag&#8221; (that is, PHP function) for theme creators to display the list of links added via the admin panel.  You can put it anywhere in your templates (for example, in the sidebar) and it will automatically keep the list up-to-date:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="color: #ccc;">wp_list_bookmarks<span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span></pre></td></tr></table></div>

<p>That function generates an unordered list of link categories, with sub-lists of each link, complete with CSS styles assigned so that you can add a custom style.  But, say you (like me) don&#8217;t want the categories, just the links please.  And can I have it show the images associated with the links as well?</p>
<p>To this end, the WordPress developers have included a large range of optional arguments for the function above, so you can include or exclude categories, decide whether to format the list as an unordered list (&lt;ul&gt;) or other custom HTML tag, whether to show the images and descriptions, etc:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="color: #ccc;">wp_list_bookmarks<span style="color: grey;">&#40;</span><span style="color: #0000ff;">'categorize=0&amp;title_li=&amp;show_images=1&amp;show_description=1'</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span></pre></td></tr></table></div>

<p>Pretty good, but what if I want even more control (I usually do <img src='http://jeffgran.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  )?  The next-deepest level of under-the-hood-ness allows you to get the list of links, store it in an array, and then loop through the array using a simple PHP foreach loop that outputs the link data in whatever custom format you need.  It&#8217;s easier than it sounds.  Here&#8217;s the final code I used for my links page:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="php" style="color: #ccc;"><span style="color: #ffff00;">&lt;?php</span>
<span style="color: #ffc080;">$myLinks</span> <span style="color: grey;">=</span> get_bookmarks<span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
<span style="color: #4080ff;">foreach</span><span style="color: grey;">&#40;</span><span style="color: #ffc080;">$myLinks</span> <span style="color: #4080ff;">as</span> <span style="color: #ffc080;">$myLink</span><span style="color: grey;">&#41;</span> <span style="color: grey;">&#123;</span>
<span style="color: grey;">?&gt;</span>
   &lt;div class=&quot;linkBox&quot;&gt;
      &lt;a href=&quot;<span style="color: #ffff00;">&lt;?php</span> <span style="color: #4080ff;">echo</span><span style="color: grey;">&#40;</span><span style="color: #ffc080;">$myLink</span><span style="color: grey;">-&gt;</span><span style="color: magenta;">link_url</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span> <span style="color: grey;">?&gt;</span>&quot;&gt;&lt;img src=&quot;<span style="color: #ffff00;">&lt;?php</span> <span style="color: #4080ff;">echo</span><span style="color: grey;">&#40;</span><span style="color: #ffc080;">$myLink</span><span style="color: grey;">-&gt;</span><span style="color: magenta;">link_image</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span> <span style="color: grey;">?&gt;</span>&quot; /&gt;&lt;/a&gt;
      &lt;h3&gt;&lt;a href=&quot;<span style="color: #ffff00;">&lt;?php</span> <span style="color: #4080ff;">echo</span><span style="color: grey;">&#40;</span><span style="color: #ffc080;">$myLink</span><span style="color: grey;">-&gt;</span><span style="color: magenta;">link_url</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span> <span style="color: grey;">?&gt;</span>&quot;&gt;<span style="color: #ffff00;">&lt;?php</span> <span style="color: #4080ff;">echo</span><span style="color: grey;">&#40;</span><span style="color: #ffc080;">$myLink</span><span style="color: grey;">-&gt;</span><span style="color: magenta;">link_name</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span> <span style="color: grey;">?&gt;</span>&lt;/a&gt;&lt;/h3&gt;
      &lt;p&gt;<span style="color: #ffff00;">&lt;?php</span> <span style="color: #4080ff;">echo</span><span style="color: grey;">&#40;</span><span style="color: #ffc080;">$myLink</span><span style="color: grey;">-&gt;</span><span style="color: magenta;">link_description</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span> <span style="color: grey;">?&gt;</span>&lt;/p&gt;
   &lt;/div&gt;
<span style="color: #ffff00;">&lt;?php</span> <span style="color: grey;">&#125;</span> <span style="color: grey;">?&gt;</span></pre></td></tr></table></div>

<p>And of course, if needed there are more levels below this one.  You could do a loop within a loop, for example, to format each category of links with its own category heading, different colors or styles, etc.</p>
<p>Ahhh, the power! <img src='http://jeffgran.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://jeffgran.com/38/blog/wordpress-custom-links-display/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

