Skip to content

Categories:

Why I Run #2


View Larger Map

This was the turnaround for my run today.  Despite the need to get home, I wanted to keep going forward.  Despite the burning pain in my Achilles tendons, weak from lack of exercise and a new style of shoe, I wanted to keep going forward.

The fact is, if time wasn’t a factor, I would have kept running, exploring a never-ending web of streets and mystery until I got so far away that I collapsed in exhaustion.

Now I know how my infant son feels as he learns to walk.

So instead of going forth into the great beyond, I turned around and blew through a negative split on my way back home.  It’s days like today I wish I was faster, or stronger — anything that would allow me to pack in one more extra mile into the scant time I have to work out.

I’ve been exploring ways to answer the question, “Why do I run?”  Today’s answer: I run to explore the world.

No matter my route, I try and add one new twist — tackling a new street, using the opposite sidewalk, embarking at different times of the day. It’s too easy to do the same thing twice, and there are way too many avenues for exploration to not shake up one’s route as much as possible.

Programming variety into my routine was easier in my old job.  For several years, I was an IT consultant whose job took him on the road five days a week for five straight years. It was also at the beginning of that job where I picked up my running passion.

The job came with several privileges, but the one I enjoyed the most was being assigned to some scenic locations, all of which I was lucky enough to run within.  I would fly in on a Monday morning, then return home on the Thursday red-eye.  And no work week went by without at scheduling a minimum-1-hour run.  Even if it meant I had to make up the hours by working all night, I made sure to explore my each of my temporary homes.

I still get goosebumps thinking about some of those sights.  Getting lost in on woodland trails of Colorado’s Cherry Creek State Park.  Sprinting to the end of the San Francisco municipal pier, stopping to stretch in the bright sunrise, and pausing to watch triathletes train in the same waters as sea lions.  Jogging on along the mosaic sidewalks of downtown Belo Horizonte (“Beautiful Horizon” in Portuguese) each Sunday morning, soaking in the eerie silence resulting from the native population still in chruch.  Running from one side of tiny Waterbury, VT to the other, followed by weekly dreams of settling down in New England.  And the adrenaline rush from dodging angry commuters on Michigan Avenue.

These days, I don’t travel much anymore, so my exploring is mostly limited to my hometown of McKinney, TX.  Although nowhere near as exotic as past locals, McKinney still offers something new to me everyday.  It’ll take me awhile to run all of its streets, especially since the population is booming and they keep adding new ones.  But that doesn’t mean I’ll stop trying.

Posted in Personal.

Tagged with .


Why I Run #1

I ran down Silverado, as I normally do every other morning, working on a routine 40-minute loop.  Although a mess of a road to navigate due to sidewalks that alternate sides, I liked running down that street because it was off the beaten path.  Quiet and peaceful, and not terribly overrun with office commuters and parents dropping off kids at school.

I approached my usual left-hand turn on Brookstone Dr., and the calm was shattered by the wail of police sirens in the distance.  As I made the turn, the police car was right next to me, also turning into the neighborhood.  It was so loud that I had to stop running, cover my ears, and turn away, it was so uncomfortable.  For a fleeting moment, I wondered, “Are they here for me?  Did I do something wrong?”

Mercifully, the officer turned off his siren. I uncovered my ears, looked ahead once more, and continued my loop.  However, just a few hundred feet ahead of me was one of the saddest sights I’ve ever encountered: in the middle of the intersection was a 10-year-old boy, crumpled and motionless, circled by hysterical adults.  The policemen were already out of their car, attending to the boy and directing the rubberneckers to move along.  More sirens trailed in the distance, likely the fire department and EMS response.

It took a moment for the scene to truly register.  My running subconsciously slowed, until I was stopped and completely unaware I had done so.  It finally dawned on me that this was a real boy, and then the crying started.  It was a painful cry — not only because of this poor child’s circumstances, but because of my own son: I couldn’t stop thinking about Zachary and how I wanted to run straight to his school, hug him, and never ever let him go.

After several minutes of fighting through my sadness, I went ahead with my run.  There wasn’t anything I could do, considering there were tons of people already on the scene.  But mostly, I just couldn’t bear to look — the longer I was there, the more I wanted to vomit, the more I wanted to find the driver, shake them by the shoulders, and scream, “What the fuck were you thinking?!”

I kept running, and for twenty minutes I couldn’t stop crying.  Weeks of accumulated stress, illness, and lack of regular exercise combined to reach an internal boiling point, which thanks to the fuel provided by that poor boy’s accident.  And I didn’t want to talk about it to anyone.  Then a Twitter follower inquire about it, and the floodgates of emotion opened.

I had to get it out, and I’m glad I did, as I’m your  typical dude who bottles up his feelings until they explode, and this wasn’t something worth bottling up.  I think it was guilt: about being powerless to help, and at having left a scene where my only contribution would have been to stare.

But believe it or not, it was just a regular bout of parental guilt.  I felt that if my own son were to have gotten hurt like that, even if it was not my fault in any fashion, I’d still never be able to forgive myself.

So what does this have to do with running, besides the coincidence I witnessed this while in the act?

After the DRC Half in November, which turned out to be a “failure” of a race for me (I got hurt ⅔ of the way through), I limped home in the lowest of moods.  This was the third major race in a row where something completely derailed me, and my always-supportive wife was now newly-frustrated.  Jenn wanted to know, “If you keep having miserable races, then why do you run?”

A great question.  And one I wasn’t able to answer.

For the next three months, I’ve pondered that question on each and every run.  I’ve come close, but it wasn’t until after seeing that poor child that I have answer for her.

I run because I want to live a long and healthy life.

And I want that long and healthy life, so I can witness every moment of the miracles that are my wife’s and son’s lives.

Posted in Personal.

Tagged with .


The Yellow Group (2009 Dallas White Rock Half-Marthon)

Members of the 2009 Yellow Half Group -- or the Pink Group, as we called ourselves after Angie's diagnosis. l. to r. Josie, Susan, Laurie, Dana, Mary, Gib, Nick, Chelsea, myself, and Susan

I turned left onto the Katy Trail. Mile 10 out of 13.1. I didn’t need my Garmin to tell me I was running a tad bit behind, less of the pace than my expectations. Even so, I was close enough to my goal that this 2009 White Rock Half-Marathon was under my control.

I transitioned from pavement to the crumb rubber track, then I felt a twinge in my hamstring. That fucking left hamstring! I told that gimpy muscle in no uncertain terms that it wasn’t invited today. Yet here it was, crashing my party. I breathed deep and closed my eyes. Forefinger pinched to thumbs, as if I were about to meditate. Taking a moment to find my center, I re-focused on the road ahead. Go away, I repeated in my mind, go away.

The tightness faded. All that lie between mile 10 and glory was a simple 5K.


Last year before the 2008 full marathon, I was nervous. Despite all of my training, proper nutrition, a string of kick-ass long runs the weeks before, and the support of countless teammates, I was nervous. And that black energy accompanied me along the course and led to bad things: dropping Gu packs, becoming overheated, losing my focus and obsessing on the ghosts of failed races past. It’d been months since I had a good race, and I couldn’t stop thinking it would be even longer as the day wore on.

For six miles, between the 13.1 mark and the beginning of the “Dolly Partons”, those twin hills of no return, a hot southern wind beat into my face. I could feel sweat just linger on my skin, unable to evaporate in the high humidity. After I summited within the Lakewood neighborhood, I felt relieved and thought the worst was over. Then my legs locked up, slamming like switchblades into stiff, unyielding trunks that refuse to bend. Unable to break my body’s siege on itself, I limped to the end, barely beating my worst marathon time ever.

Adding insult to injury was my deflated pride: I was a coach of the Luke’s Locker Yellow Group, with a dozen marathons and half-marathons under my belt. My athletes dominated the day, and I brought in the rear. In fact, I crossed the finish line so late that none of my teammates was still around. Only my poor, very pregnant wife was there to witness me in one of my worst moments. Even though she was there, I felt alone and wanted to crawl under a rock.

I ended up being seriously hurt because of the heat and subsequent cramping. I was forced to skip the Yellow Group’s team celebration that night. Even if my legs worked, I was too much of a basket case to be around people. Several days would pass before I didn’t feel like crying. Non-runners may be hard-pressed to understand how emotional the marathon experience can be. To have invested twenty-six weeks of workouts and still fall short of your goals is nothing short of devastating, even if in the long run it’s just a blip in the path to greater glory.


My coworker Steve snapped this action shot right before I hit the split after Mile 6. Hook 'em!

The Katy Trail began to narrow, and as a result it turned into an obstacle course. Although I was still running, I was darting about a sea of those who had checked out. Walkers, standers, local joggers illegally on the course and running the wrong way.

I had dialed it back slightly, in a effort to ward off my hamstring. Yet in the previous six miles, you could have set your watch to my pace, as consistent as it was. I thought back to the Matilda hill, where for one ascending mile I got faster! I recalled my start, which was the most-relaxed I had felt coming into any race. And then there was Turtle Creek, where I hit a gear so smooth that I didn’t feel like I was running — I was flying.

In other words, this race was in the bag.


Two nights after the 2008 marathon was the Luke’s Locker group celebration. By that point, I had gotten my shit together and needed to be around runners once again. All of my athletes were there and we swapped tales of war from the previous Sunday. I told them my story, and more than one person confided that they could very much relate. Every runner has their days, they said. And I thought, why is it mine are always on race Sundays?

Before the night was done, our head coach Patton addressed the crowd. It’s been over a year, so I don’t remember his exact words. But I do recall Patton doing what he does best: emphasizing our collective accomplishments and inspiring us to run farther & faster. The list of what runners had achieved that season was seemingly limitless: first marathons, personal records, world travel, and endless self-esteem. Everyone of us had proven that nothing was impossible without effort and belief, Patton said.

Those who know me best know that strong effort is second-nature to me. It was the belief portion was still in the toilet.


Without glasses, I am blind as a bat, so I had trouble seeing the finish line ahead. But I knew it was getting close as the crowd grew thicker, louder, and intense.

The Katy Trail left the buildings of Uptown and now the sky was wide open. The American Airlines Center, standing at the final mile, was straight ahead. I let out a sharp laugh. Then suddenly I wanted to cry. After over a year of frustration, a good race was now under my belt. No matter what happened at the DRC Half in November, the Tour des Fleurs in September, or last year’s 2008 White Rock Marathon, I had a good race. How good was about to be determined.

I was running somewhat crocodile, so I corrected my posture and prepared to cross the finish line strong. I burst across the timing mat in a flash, shut down my Garmin, and came to a screeching halt. I probably shouldn’t have done that, as I became light-headed. Cutting through the crowd, I frantically begged a spectator standing on a short wall to make way for me. I sat and held my head in my hands, reminding myself to breathe. I caught a glimpse of my pink wristband emblazoned with the words “TEAM ANGIE”.

Angie was one of my teammates, but she wasn’t racing today. She was at home, recovering from surgeries and preparing for a round of chemotheraphy, all being done to ward off the breast cancer she was diagnosed with mid-season. She was the only woman I knew firsthand having to deal with this, and it wasn’t fair. But I had told myself before the race that I had to finish strong to honor her experience. She likely didn’t care one way or the other, but it was important inspiration for me.

The dizziness passed, and I eventually got up to fetch my finisher’s shirt and medal.

Remembering that some of my teammates had expected paces that fell close to mine, I kept an eye out for others. The first I bumped into was Mary, who was right behind me at the finish. She was tired, but also a beaming beauty bursting with confidence and pride. It turned out that she had just completed a PR. I felt like a proud father, having been her coach.

Mary asked me how I did, and I was surprised to realize I hadn’t looked! I peeked at my Garmin and smiled.

My fastest race ever at the 2009 White Rock Half-Marathon

 

2 hours, 7 minutes, 16 seconds. A new personal record by nearly five minutes.

Not just a good race, but the greatest.


Patton was done with his speech, and the celebration was beginning to wrap up. Before I could walk out the door, Pepsi, one of my Yellow Group teammates, said to wait. She disappeared for a moment, then returned to present me with two gifts from everyone in the Yellow Group.The first gift was a gift certificate for a well-deserved sports massage. Very practical and very welcome!

Label from the bottle given to me by the Yellow Group, surrounded by signatures

The second was a bottle of wine. Pepsi excitedly explained how it was a custom label, and that everyone in the Yellow Group had signed it. The label read:

Thank you for inspiring & leading us through this journey to the finish line!
Luke’s Yellow Group
White Rock Marathon 2008

I read the message, then started to catalog the names. As my mental list of signatures increased in length, I began to well up. The emotions of Sunday were just below the surface, and while I had been throwing quite the pity party the past two days, now I was overwhelming happy and inspired. Knowing that my teammates cared so much about me as a coach and friend was the perfect way to remind me that the journey was more important than the destination. Instantly, I stopped feeling sorry for myself.

I then resolved to leave behind 2008 and make the 2009 racing season my personal best. As an incentive, I told myself that this bottle of wine would remain corked until I followed through on that resolution.


That night after my best race ever, I shared a pasta dinner with my wife Jenn and baby boy Zachary. The little man had just gotten the hang of eating the stuff a few days earlier, and every so often he enjoyed painting his face — and the walls — with tomato sauce.

Before we dug in, I reached into the wine rack and retrieved a certain bottle of red. For months, it had sat there, patiently awaiting its destiny. Before opening the flask, I examined those signatures one last time. I thought about each of my 2008 Yellow Group teammates and how fortunate I was to have shared the trails with them. Many of them had returned this year to build upon their previous successes. Some weren’t there, whether it be due to sickness or injury, and I paused to wish them good health going into the new year, especially Angie.

The time for reflecting on the past was done. It was time to celebrate this day. And the time for opening this bottle of wine had come.

I popped the cork, filled our goblets, and joined my family at the table. Jenn sipped and exclaimed, “That’s good!” It is good, I thought.

In fact, it was great!

Posted in Personal.

Tagged with , , , , .


WordCamp Dallas 2009: Creating Local WordPress Installs

At last year’s WordCamp Dallas, I provided a short demonstration on creating local installations of WordPress.  By local, I mean having WordPress run on your computer vs. a web server. In my particular instance, this was done using MAMP on a MacBook Pro, but in theory it can be done on any computer that’s capable of meeting the minimum WordPress requirements.

There are several advantages to this, including but not limited to:

  • Testing the latest versions of WordPress before applying them to your live site
  • Running a development environment, from which you might apply changes to production
  • Having a portable WordPress install on a USB stick, which you can then take from client to client

All of the sessions were broadcast live and recorded.  And thanks to the volunteer work of Dave Curlee in both editing and hosting, I now have that video to show you! (Thanks, Dave)

At some point in the future, I plan to turn my presentation into a comprhensive, one-stop-shop page on this site for installing WordPress locally, as there is no one best way to do it and you might benefit from seeing alternatives.

Without further ado, here is my slidedeck: Creating Local WordPress Installs

And here is my presentation.  Any feedback is appreciated:

Posted in WordPress.

Tagged with , , .


Raising Cane’s Rocks My Lame Ass

Awhile back, I waxed poetically about the manna from heaven that is Cane’s Sauce.  This was picked up by the Raising Cane’s Twitter account, and I was later rewarded with some free chicken fingers (which I graciously accepted).

The free food came in the form of a gift card, which they mailed me.  When they asked to whom they should address it, I said, “Spamboy”.  I assumed this raised at least one eyebrow, although it didn’t stop them from making my day:

Posted in Personal.

Tagged with , .


SQL Trace Plugin for WordPress

WordPress LogoThe only plugin I’ve ever written and published, this ditty will show you all of the MySQL statements being fired whenever you save a post.

It was created as a small research project for a WordPress user who was wondering just how many queries were being fired.  Perhaps someday it will evolve to something a bit more robust (and complicated).  But for now, here it is — for what it is.

Download the Current Version: SQL Trace Plugin for WordPress v0.1

Posted in WordPress.

Tagged with .


Wedding Photos

While cleaning out a dusty CD-ROM I found in my work desk, I discovered these memories that I wanted to share: Jenn and I’s wedding photos.

To explain why some of the photos look different, we were married in Las Vegas and honeymooned several months later in the Bahamas.  Since our resort offered a wedding ceremony and photos as part of our package, we reaffirmed our vows by the seaside and had some more photographs taken.

And before you ask any snarky questions: yes, we are still this happy five years later. :)

Posted in Personal.

Tagged with , .


DFW WordPress Google Wave

Google Wave LogoAs I and many other local WordPressians are just now getting their feet wet with Google Wave, I thought I would create a public Wave that served as a whiteboard for DFW-area WordPress and social media discussion:

DFW WordPress Google Wave (requires Google Wave account to view & participate)

Update 2009-11-20: using the Wavr plugin, I’ve embedded the Wave below. If you cannot see it, ensure you are logged into your Google Wave account.

Posted in WordPress.

Tagged with , , .


Building a WordPress Site: Plugins

The reinvention of my site offered me a clean slate in many ways.  In this post, I’m going to delve into functionality driven by plugins. In total, I am using 17 plugins to drive both the front and back ends of my site.

I figured the easiest way to discuss them is by grouping them by their general functionality.

Administrative Plugins

To me, an administrative plugin is one that drives day-to-day operations in the blog’s back-end.

  • Akismet: delivered with all WordPress installs, it remains the easiest anti-spam solution for my needs.
  • Maintenance Mode: it allowed me to put up a “Coming Soon” page to keep visitors busy while I performed the steps for site relaunch.
  • WordPress.com Stats: some people are stat whores, digesting them down to the n<sup>th</sup> degree. While I think that Woopra is the best of class, I don’t have enough visitors to warrant paying for one of their packages.  This plug meets my simple statistical needs for free.
  • Contact Form 7: previously a user of the Contact Form ][ plugin, I’ve moved onto Contact Form 7, with an eye towards future expansion of forms on my site.
  • FeedBurner FeedSmith: I cannot remember what motivated me to use FeedBurner, but I continue to use it so I don’t lose my current subscribers.  FeedBurner’s tracking features might be handy someday, so it’s not a huge pain to continue going forth with it.
  • Subscribe To Comments: the one plugin I can’t live without, Subscribe to Comments is an important tool to encourage conversations 0n your content.  Without it, your readers aren’t as obligated to visit your Posts more than once.

Social Media Plugins

These plugins assist with getting the word out whenever I have published new content.  Because these plugins involves web services outside of my site, I’m occasionally at the mercy of Facebook or Twitter when attempting to cross-posts to their sites.

  • Wordbook: it notifies my Facebook Wall for each new post.  At one time, this was better than just linking your RSS feed to your Wall, as comments were directed to my site instead of my Wall.  Over time, Wordbook’s behavior — or Facebook — has changed, and comments are once again ending up exclusively on my Wall.  Is it too much to ask that all comments be kept in one, tidy place?
  • Twitter Tools: this notifies Twitter, and it used to work without issues.  However, the most-recent version (2.0) has been quite buggy of late, enough so that I had to downgrade to 1.6 in order for it to work.  Since it’s currently more work than it’s worth to debug, I’ve moved on to spending my time posting instead of fixing Twitter Tools.

Convenience Plugins

These plugins provide minor site tweaks with huge return.  In other words, my site would function just fine without them, but man! Am I glad they are there!

  • Top Level Categories: you can find many contrasting opinions on how to structure your permalinks.  As you know, WordPress will add the path “category/” before posts within a category (Example: http://spamboy.com/category/wordpress).  I personally peffer that all of my posts fall under the root site URL, which this plugin allows me to accomplish.  That same URL now reads as http://spamboy.com/wordpress without the “category/” text in the middle.  This is important for my site’s future, as I plan to take up several simultaneous projects, each of which will be a series of posts under its own category.
  • WPtouch iPhone Theme: I occasionally like to read my site’s posts and comments from my iPhone.  This amazing plugin enables an iPhone-specific theme that is not only robust but also gorgeous to look at.

Book of Spam/Stories Plugins

Now this is where things get interesting!  These plugins are essential cogs in my site’s functionality, which is to display not only my regular blog content, but also serialized Stories with references to common Characters and Locations.

  • Custom Taxonomies: one of the most-useful plugins I’ve ever employed, its wizard helped me create the two custom Taxonomies: Characters and Locations.  Once I completed the wizard, each of these Taxonomies appeared in their proper place under my Pages menu in the Dashboard.  For details on how I use these Taxonomies, see my previous post in this series.
  • Media Tags: I wanted to display images associated to the Characters and Locations on each of their Term pages.  While I still needed a custom function to handle this (see Custom Plugins below), this plugin allowed me to categorize my images so they could be selected for display.  This was accomplished by tagging my images, as if I were adding Tags to a Post.
  • Redirection: using the Media Tags plugin creates one side effect: a like-named Taxonomy Page located at at http://spamboy.com/media-tags/.  I didn’t want people to ever visit that Page, so configuring Redirection with that URL ensures noone accidentally visits it.
  • RSS Includes Pages: since my Stories are composed of Pages, they would never end up in my RSS feed.  RSS Include Pages changes that with one simple activation.
  • Page Excerpt: because Pages are now appearing in my RSS feeds, I use this plugin to enable the Excerpt field (on the Edit Page screen) and control what excerpt displays to my subscribers.  I’ve never understood why WordPress hides this field for Pages, but I’ve used this plugin for quite some to get around that limitation.
  • My Page Order: suggested by fellow, hyperlocal WordPresser Randy Hoyt, I use this plugin to order my Story Parts and take advantage of the delivered Page Order field.  My Page Order uses a simple drag-and-drop interface to facilitate this, allowing me to keep Parts correctly sorted even if written out of sequence.

Custom Plugins

Finally, I hit the point where other people’s plugins couldn’t solve all of my needs.  Because of this need for custom site-specific functionality, I created one single plugin to handle this.

  • Book of Spam: I went with a plugin — versus adding functions to my theme — so my code would be portable in case of a theme switch.  I also didn’t want to accidentally overwrite my functions in case of a theme upgrade.  At some point, if and/or when this site matures, I might take this plugin and offer it to the public for their use.  Specific functionality I added includes:
    • Featured Story: a series of functions to drive the prominent display of a featured Story on the Stories Page.
    • Lists of Characters and Locations: for both Story Parents and their Parts, the sidebar will list links of the Characters and Locations that play starring roles.  Each then links to the proper custom Taxonomy Term Page.  Look here for an example.
    • Story navigation: these functions display “previous” and “next” links where applicable, allowing users to easily flip between Story Parts.  You can see an example of these links here.
    • Custom Taxonomy image display: on the custom Taxonomy Pages for Characters and Locations, these functions will display thumbnails for any Character or Location featured on at least one published Story.  Then when viewing the Page for the custom Term itself, a larger image will be displayed — specifcally, any image whose Media Tags match the custom Term’s slug and also tagged with the word “default.”  For example, when viewing my Character Page, it is displaying an image with the Tags “spamboy” and “default.”  Anytime I ever want to change the image being displayed on that Page, I just untag the one image and apply the “default” Tag to another.
    • First Occurence of Term Replacement: to facilitate cross-site links, I created a function which takes the Post Body, searches it for whole-word occurences of Character and Location slugs, and replaces the first occurence of each with  link to said Character or Location.  I had hoped to code this as a CSS hover instead of a link, but I wanted to get something going quickly while I later readdress making things prettier.
    • Permit XHTML in Taxonomy descriptions: a simple WordPress filter allowing me to include links and images within the Taxonomy and Term descriptions.  Without this filter, any attempt to add HTML would lead to its eventual stripping out upon save.
    • Miscellaneous theme overrides: various changes I made to the Carrington theme to suit my tastes.  Changes include: display of comments links, minor sidebar widget enhancements, etc.

Coming Soon

In the final two posts of this series, I’ll delve into the migraiton plan that supported the go-live for my new site.  I’ll also touch upon how I plan to enhance my site once it’s been stable for a lengthy period of time.

<sup>superscripted!</sup>

Posted in WordPress.


Building a WordPress Site: Categories, Tags, Pages, and Permalinks

The relaunch of my blog has brought about radical changes in how I view Categories and Tags.  It also changed my approach to Pages (static content outside the timeline of my blog) and Permalinks (the designed URL for each of my Pages and Posts).  In this Post, I will discuss Categories & Tags and explain why I chose to change my approach towards both.

A Little Background

My old site presented content in two forms:

  • Stories
  • The Book of Spam

Stories allowed me to tell self-contained tales in multiple parts, allowing for literary constructs such as cliffhangers, epilogues, and prologues.  Each Story constituted of several parts as Posts linked to a parent Page, the latter of which served as an introduction to the overall Story.

One example was a story named “Enter the Spamboy” presented in four parts.  This meant I had a WordPress Page at the URL:

http://spamboy.com/stories/enter-the-spamboy/

…and the four parts used that URL as the base for their own, as follows:

http://spamboy.com/stories/enter-the-spamboy/enter-the-spamboy-part-1/
http://spamboy.com/stories/enter-the-spamboy/enter-the-spamboy-part-2/
http://spamboy.com/stories/enter-the-spamboy/enter-the-spamboy-part-3/
http://spamboy.com/stories/enter-the-spamboy/enter-the-spamboy-part-4/

To establish this link between Story Parts and the Story Parent, each Story Part used a WordPress custom field to hold the unique ID of the Story Parent.  So if the Story Parent’s Page ID was 17, then each Story Part has a custom field named “story” whose value was “17″.

Besides Stories, The Book of Spam was an alternate way to present these Story Parts all at once.  Each Story had the potential to overlap with others.  The Book of Spam took all Story Parts and displayed them in chronological order.  For example, Part 1 of Story A might occur between Parts 3 and 4 of Story B. The examples would appear in this order within The Book of Spam:

  1. Story B, Part 3
  2. Story A, Part 1
  3. Story B, Part 4

This was accomplished by creating a root Page for TBoS:

http://spamboy.com/book-of-spam/ (Note: there is a reason this is not a hot link; see below)

…then assigning it a custom Page Template coded and added to my blog theme.  This custom Page Template’s code retrieved the Story Parts in chronological order and display them grouped into chapters.  Ordering Story Parts by chronology was accomplished by use of custom fields once again.  Each Story Part stored the chronology in a string format.  WordPress functions were used to enforce pagination, helping simulate the experience of flipping through the pages of a book.  Here are some samples of how the URLs appeared in The Book of Spam:

  • Table of Contents: http://spamboy.com/book-of-spam/
  • Preface: http://spamboy.com/book-of-spam/preface/
  • Chapter: http://spamboy.com/book-of-spam/part-ii/chapter-20/
  • Specific Page in Chapter: http://spamboy.com/book-of-spam/part-ii/chapter-20/page/5/

To supplement Stories and The Book of Spam, I maintained Pages which listed the Characters and Locations that appeared in both.  Viewing these Pages provided you with a quick biography of each subject, plus a list of links to the Stories they starred in.  Once again, custom fields came to my rescue, allowing me to link Characters/Locations by adding their Page IDs to the Story Parts.

If all the above sounds complicated, it’s because it was. And such complexity was killing both my site and my creativity.

Why the Big Change

Well, several reasons:

  • Keeping my blog code and design up to date took valuable time away from actually writing posts
  • The rigidity of my design — being so focused on Stories — kept me from exploring other subjects more suitable to a blog format

I asked myself what I wanted to make of my new site, which led to the following short list of goals:

  1. Whatever I do, it needs to make writing as easy as possible
  2. I wanted to keep the concept of Stories
  3. I also wanted to preserve having Characters and Locations, but find a easier way to manage them and their associations to Stories
  4. The Book of Spam would be tabled for future consideration.  The time spent implementing this would delay go-live for my new design and pursing Goal #1: writing!
  5. I wanted the flexibility to post about other subjects I enjoy, such as WordPress and my artwork

How I Did It

It’s easiest for me to explain by diving into my blog design element-by-element, starting with…

Categories

On my old site, I used Categories to drive both the Stories and The Book of Spam.  For Stories, each Story Part would be assigned the Category “Stories”.

In addition, each Story Part would also be assigned a Category that coresponded to a chapter in The Book of Spam.  There was a parent Category (“Book of Spam”) with child Categories for Chapters (“Chapter 23″).

As a result, each Story Part would have multiple Categories, at least one of which was nested.  This required clever coding on my part to make everything display correctly, as WordPress doesn’t like mixing these Category structures.

On the new site, I’ve ended the use of Categories by Stories.  Instead, I have just two Categories used solely for my non-Story-related Posts

  • Personal: a bucket for personal thoughts and observations
  • WordPress: a subject-specific Category, since I plan to write more WordPress-specific content in the future — starting with this writeup of my blog design.  :)

In the future, I may use Categories to drive timeline-based content for future projects.  For example, I am already contemplating posting some of my artwork, and I would likely create an “Artwork” Category to contain all art-related musings.

Tags

On my old site, I had more than 200 Tags.  Now I have zero.  At some point, I plan to start using Tags.  However, I much perfer to focus on writing Posts than wasting time trying to put them into buckets of Tags.  Once I’ve generated enough of a body of work, I’ll go back and tag my previous Posts.

Pages

Use of Pages has expanded on my new site.  I have your standard About and Contact Pages.

Stories are a different matter.  As I mentioned above, Categories are no longer used to drive Stories.  Also, Stories no longer consist of a lone WordPress Page linked to by multiple WordPress Posts.  Instead, each Story is 100% composed of Pages — one parent Page with multiple child Pages.  This means anything that Story Part previously a Post is now a Page.

This structure makes more sense than my previous method, as mixing Pages and Posts is a mess in WordPress — it’s just not meant to be done.  And the work I did trying to make that work led to me composing unnecessary code to fix a problem I created.  By using all Pages, this allows me to leverage delivered WordPress behavior such as Page Order and Page-specific functions.

Finally, I have two Pages created to support my custom Taxonomies.  More on that below.

Permalinks

In years of reading about WordPress and best practices for Permalinks, I’ve come to realize I swim against the flow.  I’ve always used the custom Permalink structure “/%category%/%postname%/” and continue to use it here.  I’ve just always liked the look of it, as it reminds me of nested folders on my desktop machine.  It also works better on my new site, as I am no longer using nested Categories.  At some point, I might change to a “/%category%/%post_id%/” structure, just to ensure that I don’t run into a duplicate permalink issue within the same Category.

I even went so far as to remove the word “category” from the URL base.  So instead of “http://spamboy.com/category/wordpress/”, I now have “http://spamboy.com/wordpress/”, which I think better represents my aim for sorting my Posts into easily-accessible project-like URLs.  Some have said this leads to an SEO hit, but frankly, my dear…you fill in the rest.

Custom Taxonomies

A part of WordPress since the 2.3 days, custom Taxonomies are starting to get onto people’s radars thanks to their power and flexibility.  Thanks to the information within Justin Tadlock’s excellent tutorials, I’ve shifted to using custom Taxonomies to support my Characters and Locations.

Instead of assigning Characters and Locations to my Stories using custom fields, they are now presented as lists in my Edit Page screen.  And instead of needing to know the Page IDs of the Character/Locations to include in the custom fields, I instead just mark one or more checkboxes, and everything gets saved using the taxonomy model.  I can even create a new Character/Location while editing my Stories — no need to switch over to another screen to add either.

There are significant advantages to using custom Taxonomies for this purpose:

  • Character and Locations are natural uses of Taxonomies
  • The interface is simple and intuitive, and I didn’t have to build it myself
  • Using Taxonomies allows me to use delivered WordPress Taxonomy functions in my theme files

All of this was accomplished by creating two custom Taxonomies, whose slugs are:

  • characters
  • locations

When you create a custom Taxonomy in WordPress, you have to define the context under which it will be available: either Pages, Posts, or Links.  I chose Pages, as the Characters and Locations are featured in Stories only, whose Story Parts are WordPress Pages (not Posts).

Everytime I edit a Page, I am given the option to pick Characters or Locations, just by defining the custom Taxonomy.  In turn, these Taxonomies are not available for use when editing Posts. WordPress also provides screens for Taxonomy maintenance, just like the Edit Tags screen in your Dashboard.

WordPress Pages are automatically generated for each custom Taxonomy Tag.  Once again, this is automatic with no extra action required on my behalf.  In turn, these Pages are available the second I create the new Tag.  For example, if I added a new Character named “Cletus”, you could go immediately to his Page (http://spamboy.com/characters/cletus/) and see information about that lovable slack-jawed yokel.

You can see this in action now by viewing my own Character biography at:

http://spamboy.com/characters/spamboy/

My picture and the text below it are what’s stored in the Tag’s Description field.  All I did was modify my WordPress theme to display that Description when viewing a custom Taxonomy’s Tag Page.

Wrapup

As you can see, alot of work went into designing my website — not the look-and-feel, but its structure.  This in turn guided the development of the custom code that drives it.  If anyone has any questions about the above, please let me know.  Thanks again to Justin Tadlock for his tutorials!

In my next post in this series, I plan to walk you through the Plugins I am using.

Posted in WordPress.