Writing Copy with Crunch

Lauren Bacon | July 3rd, 2009

One of our wonderful client-friends (we have a lot of those, which is part of what makes our work here so much fun) sent me an email this week with the curiosity-piquing subject line, “Where’s the lettuce?” — it contained a link to this article about the “missing ingredient” in a lot of email marketing.

We spend a lot of time talking about the beef of email marketing: perfectly clean copy, clear calls-to-action, highly scannable designs, solid coding, and the right offer. But there’s more to a great burger than a great patty.

A recent Crate & Barrel email included in our Email Design Look Book provides the answer to the missing ingredient. The May 1 email promoted knives with a minimalistic design that used silhouette photography of the knives and simple blocks of product information. The design is nice and clean, but what makes it exceptional is the ribbon of lettuce used as the bottom border of the primary message block. Smith-Harmon designer Ellen Bolotin, who brought the email to our attention, says that “the lettuce on the bottom just makes me laugh.”

That’s what so many emails are missing — a little, cool crunch-a-little lettuce. Most emails are all business, all beef. While effective, there’s something a little boring and joyless about them.

Many people view their inboxes as stressful places, so delivering a little unexpected delight is well worth the effort — and likely to make opening your email feel less like a chore.

I couldn’t agree more. I spend a lot of my time reading emails, tweets, Facebook status messages, website copy, and fundraising letters — and the ones I remember definitely include content that is not strictly necessary, but that adds enormous flavour, personality and charm. When you take an all-business approach to copywriting (and design, for that matter), you miss an opportunity to connect with your community through humour, delight, and serendipity.

Here are just a few of my personal favourite lettuce-delivery vehicles online:

  • John Richards, the morning DJ at KEXP.org (the Seattle-based radio station that keeps me at least somewhat in the loop, musically), sends out a daily email to his listeners with his playlist, upcoming live shows in the Seattle area, and several extras ranging from a Link of the Day to a news story filed under the heading, “The End is Near”. (Here’s a recent entry in the latter category: “Andrew Mizsak, clean your room! Father calls cops on adult son, member of the Bedford school board, for refusing his chores.”)
  • BC Business magazine has made an intriguing shift in the past year or two, and here’s one sign of why I care much more about them than ever before: Digital editor John Buchner kicks off the publication’s Twitter feed every morning with a daily haiku. Like this one: “June’s last slanted sun / And sharp air, she breathes, and her / heels click on the road. [Good Monday morning.]”
  • Years ago, SF Gate columnist Mark Morford crafted a daily email newsletter called “The Morning Fix,” which was a favourite of mine. It included a rotating series of delightful diversions, such as the daily Mullet Haiku (contributed by readers) and a word-of-the-day feature that was notable mostly for its hysterically funny usage examples, most of which were send-ups of then-VPOTUS Dick Cheney.
  • BUST magazine used to have a fun feature in their e-newsletters — sadly, it’s gone now — called “Shebonics”, where they’d insert a quote from a famous woman, usually on the subject of feminism or female empowerment. (Sample: “I used to think Hollywood was a very disorganized place run by very evil people. Now I think it’s a really disorganized place run by a lot of evil people and a few really great ones who somehow found their way in there. I still would never live there.” Sarah Polley in Interview)

Quirky, personal, funny, or just odd — so long as it’s not competing with the “beef” part of your message (or perhaps “protein” would be more inclusive?), I recommend spicing up your writing with an extra or two. In a medium that struggles to avoid being impersonal, your copywriting is one of the things that can really help you stand out from the crowd and connect with your readers at a gut, emotional level. It seems to me the key is to give yourself permission to share something unusual about yourself; obviously it needs to be something you’re comfortable sharing, but you need to push past the inner voice telling you that nobody cares (or that people will think you’re weird), and remember that your quirks just make you more lovable. And don’t we all just want to be loved?

SEO friendly drop-down menus for Joomla

Chantel | July 2nd, 2009

On my search for a css-list-based SEO friendly drop-down menu that works in older versions of Joomla, specifically Joomla 1.0 I came across this great module called Extended Menu.  It is meant to extend the functionality of the mainmenu module which is a default Joomla module that comes with the Joomla installation.  This module is great because you can use son of suckerfish, suckerfish, mountaintop corners, csstree templates, dtree,  or start from scratch and do-it-yourself.

Below is a step-by-step demonstration on how to get these menus working.

  1. Download the module here
  2. Login to Joomla and go to Installers > Modulesstep 2
    From here you can browse your computer and upload the module you just downloaded from step 1.
  3. Always, always set up a test template and page to play with.  You don’t want your visitors viewing your menu installation in progress across your entire website!
    • Create a copy of an existing template (root > templates > template name) and re-name it to whatever you wish.
    • Create a copy of an existing content item (content > all content items) and rename the content item so you can find it easily.
      step 3b
    • Create a menu item for the new content item you have just created (menu > mainmenu) by clicking on ‘New’.  In this example we will use “Link - Content Item”, click “Next”, follow the on-screen instructions and then click on “Save”.
    • You will need to temporarily publish the menu item you have created by clicking on the Published Icon (should appear as an x for unpublished, and a box with a check mark for published).  Once you have published this menu item, open a new tab in your browser and navigate to the page you have created.
    • Now you will need to apply the template you created earlier (site > template manager > site templates).  Find your template in the list, click the radio button beside it and click on “Assign” in the top right.  You can select multiple pages by pressing command and clicking on the name so be careful not to deselect any pages that may have previously been selected.
      Picture3
    • Now you can un-publish the page you created so it will not show up on your live website.  Repeat step 4D by clicking on the box with a green arrow under the “Published” column.
  4. Now you need to assign the new module to a new position so that we can call it in our template (site > template manager > module positions).  In one of the empty boxes type in a name for your new position.  In this example I have used topnewmenu.
  5. Back to the fun part – coding!  Open up root > templates > template name > index.php
    step 5
    You will need to add <?php mosLoadModules( ‘topnewmenu’ ); ?> to where you would like your dropdown navigation to appear.  It is always a good idea to put a wrapper around this.  In this example I have used id=”nav”.
  6. Now we need to style it! You can do this from scratch or you can download one of the many options listed here.  I would suggest using son-of-suckerfish horizontal menu.
  7. Once you have downloaded the appropriate files, you will need to upload them to your template folder you created earlier in this demonstration (root > templates > template name).
  8. Now all that is left is to style the css (root > templates > template name > css > menu.css) and you have a SEO friendly css-list-based dropdown navigation for Joomla!

New launch: BC Centre for Disease Control

Lauren Bacon | June 26th, 2009

BC Centre for Disease Control screen captureWe’re delighted to announce that the BC Centre for Disease Control has launched their new website. The BCCDC provides a wide range of services for British Columbians that extend far beyond the “hazmat” image many people have when they think about disease control. They offer STI testing clinics that are open to the public, critical information about diseases and conditions from Anthrax to Zoster, and leading-edge research and statistics on a remarkable breadth of topics.

The new website takes an enormous amount of information and makes it remarkably accessible and easy to navigate; and although we would love to take credit for that, it was Analytic Design Group who provided information architecture consulting on this project — and they did a fabulous job indeed. We provided the graphic design for the new site, which needs to balance the BCCDC’s position as a source of authoritative scientific information with its role in public outreach. Our design approach was therefore guided by the client’s vision of helping to make British Columbia the healthiest place on earth; you won’t see any glaring red or other “emergency” symbols (although we did work in a space for emergency alerts that can appear across the entire site at a moment’s notice), but rather a warm, welcoming, and accessible look and feel that reflects the BCCDC’s collaborative approach to public health.

We would also be remiss if we didn’t credit the technical team at the Provincial Health Services Authority, who really outdid themselves on this particular project. This was a major team effort and we are grateful to have played our part!

Generic caching function for Drupal 6

Chris | June 24th, 2009

One of the pieces of the Drupal performance puzzle is caching. After weeding out a couple of very demanding sql queries in a busy Drupal site, we decided to make more use of Drupal’s caching mechanisms to cut down some of the database load.

Back in 2007, Lullabot’s Jeff Eaton wrote a blog post about caching including a sample implementation for a caching function. This function was almost exactly what we wanted, but we wanted something more generic—a function that we could use in multiple places in the same module or template.php file without modification.

But in order to use one function to populate and retrieve different cache entries, we needed a way to call an arbitrary function from inside the caching function. Fortunately, PHP supports variable functions. This meant that we could pass the name and parameters of an arbitrary function to our caching function and, when necessary, populate the cache with the output from that function (alternatively, we could also have used the call_user_func() function or, like Drupal’s own theme() function, the func_get_args() function).

/**
 * This function returns the cached value for a given cache entry. If the entry does not exist, or if
 * the entry is empty, this function executes the passed function, caches the result and returns it.
 *
 * RENAME THIS FUNCTION FOR USE IN YOUR THEME OR MODULE'S NAMESPACE!
 *
 * @param string $cache_entry The full name of the cache entry--remember the namespace!
 * @param array $function An array with two keys:
 *			string $function['name'] The name of the function
 *			string $function['parameters'] A comma-separated list of parameters
 * @param string $table The name of the cache table to use (see cache_set())
 * @param CACHE_PERMANENT|CACHE_TEMPORARY|unix timestamp $expire Expiry period for this cache entry
 * @param boolean $reset If true, regenerate cache entry; if false, check first
 * @return string|array|object $cache_data The contents of the relevant row in the cache table
 * @see http://api.drupal.org/api/function/cache_set/6
 * @see http://api.drupal.org/api/function/cache_get/6
 */
function theme_name_theme_cache($cache_entry, $function, $table = 'cache', $expire = CACHE_PERMANENT, $reset = FALSE) {
  static $cache_data; // Establish the $cache_data variable for this page load...
  if(!isset($cache_data) || $reset) { // If the variable is not set, or if a cache reset has been requested...
  	if(!$reset &amp;&amp; ($cache = cache_get($cache_entry)) &amp;&amp; !empty($cache-&gt;data)) { // If $cache-&gt;data is set and reset not requested...
  		$cache_data = $cache-&gt;data; // Store the current value of $cache-&gt;data...
  	} else { // If we need to (re) generate the cache...
  		$function_name = $function['name']; // Get the function name to call..
  		$function_parameters = $function['parameters']; // Get the parameters for the function...
  		$cache_data = $function_name($function_parameters); // Set cache data to the return value of the function...
  		cache_set($cache_entry, $cache_data, $table, $expire); // Cache the resulting value...
  	}
  }
  return $cache_data; // Return the cached value...
} // theme_name_theme_cache()

In the above code sample, we pass an array ‘$function’ with two keys, ‘name’ and ‘parameters’ to the function. If the cache is not already populated, we determine the cacheable value with the following line:

$cache_data = $function_name($function_parameters);

We might use this function like this (for illustration purposes only!):

$cache_entry = 'theme_name:website_link';
$function = array(
	'name' => 'l',
	'parameters' => '"Drupal Website", "http://www.drupal.org/"'
);
$table = 'cache';
$expire = time() + (360*24*7);
$output = theme_name_theme_cache($cache_entry, $function, $table, $expire);

This would result in $output being set to the output of the call to Drupal’s l() function, and the cache entry ‘theme_name:website_link’ in the ‘cache’ table being set (or updated) to that value, with an expiry time one week in the future.

Of course the use of a function like this—like the use of the cache in general—should be limited to queries or calculations that are very resource intensive. The example above would actually add overhead compared to simply calling l() directly.

Facebook Pages Vs. Groups

Emira Mears | June 24th, 2009

In preparing an upcoming presentation for a client I found myself leafing through notes and google searches to get an exhaustive list of the different between Facebook Pages and Groups (I know the general difference, but wanted to make sure I was 100% prepared to answer all the ins outs of each, and always like to check in on the latest happenings at evolving beast that is Facebook). Here are two great posts that outline the differences between the two, if you’ve found yourself wondering which is best for you organization/cause/business:

  • Search Engine Journal’s post includes a comparison table that is handy dandy. I would point out, however, that while it is true you can “message all members” with both as they say, there is a notable difference between messaging your Page’s fans vs. your Group members. With the former, the message goes out in the form of an “update” which can be easily ignored by users (if I’m any indication, they can in fact be routinely ignored). The latter, offers direct inbox sending options, though only for groups under 1,200 members (or perhaps 5,000 I’ve found conflicting info on that number).
  • Advergirl’s post lists out the pros and cons of each, playing champion and devil’s advocate for both options.

The summary seems to be that for a long standing, more engaged approach with a community you want a Page, not a Group, but check out the comparisons and decide for yourself.

(As a side note, you can turn an existing Facebook Group into a Page, but you need to be the admin contact for the original group, and you need to contact Facebook directly to do it. No sense of what the ETA on turn around time for that is).

Strange permissions on Coda file uploads

Colin Calnan | June 24th, 2009

I’ve been working with Coda now for a few weeks and it’s been going pretty smoothly. There are a few bugs in the software, or they may even be feature requests :) When creating a file locally and subsequently uploading it to the server the file permissions are set to 700. This was causing all sorts of weirdness on a Drupal site that I’m currently theming. This is definitely a bug, however it’s pretty easy to overcome. In “Preferences -> Transfers” there is an option to “Set permissions on upload”. Set this to 644. This is the recommended permission for files in your theme folder in Drupal. You should now have no more problems when uploading files. If you’ve already uploaded files, it’s pretty easy to change via the command line using the chmod command:

chmod 644 filename.php

coda-pref-screen

coda-file-perms

Vertical Response: Free Newsletters for Non-Profits

Anna | June 23rd, 2009

Vertical Response is free for 501(c)(3) equivalent organizations, which is pretty amazing deal in the world of newsletter software.  Apply by emailing proof of your 501(c)(3) equivalency to nonprofits@verticalresponse.com and you will start getting 10,000 credits applied to your account per month.

We work with a bunch of different newsletter software providers, including Constant Contact, Emma, MailChimp and Vertical Response.  More and more, newsletter software providers are allowing us to create custom templates—where we design a beautiful html newsletter and upload it to a client’s newsletter software.  Then, areas of the templates are editable by the client, allowing clients to produce eye-catching newsletters without having to know HTML.  Vertical Response doesn’t have a custom template function, but recently we discovered a work-around:

1.    Design a template in Dreamweaver and copy the HTML code
2.    Create an “Email Canvas” newsletter in Vertical Response
3.    Once inside the WYWIWYG, click on the second tab, Edit Source
4.    Delete the existing HTML and replace it with the HTML code for your template
5.    Click back on the “Edit Graphical” tab

Et voila! Vertical Response provides a graphical representation of the template that can be edited.  For the client, the user experience has its quirks.  Unlike MailChimp, where you can configure styles that can be applied to text via a drop-down menu, you’ll have to copy styles from existing text. Also, we found that sometimes deleting two characters would inadvertently delete a whole column.  But if you remember to have your fingers poised on control + z and save frequently, this was just a small nuisance. Idiosyncrasies aside, this implementation of Vertical Response allows a non-profit client to set up and start sending really great newsletters for only the cost of creating a template.

Holding Out For A Hero

Melanie Mena | June 22nd, 2009

In February I had the absolute pleasure of attending the Managing Design Projects Conference organized by Adaptive Path. Scott Berkun gave the keynote and he said something that really resonated with me, “There is a lack of heroes in the project management world,” (although I do consider Scott to be a PM Hero, have you read his book, Making Things Happen?).

What he was alluding to is the fact that there are PMs working in all kinds of industries; at web design studios, at marketing firms, in healthcare, and the list goes on. In short, we’re everywhere. However non-construction-related Project Management is an emerging field, there are few role models to learn from and few resources out there for us PMs who don’t have to worry about scheduling the drywall installation after the plumbing contractors are finished. This thought was echoed  throughout the day. some of the comments I heard, “I feel like I’m working in a vacuum,” “We need a PM community,” “Learning on the job is great but I’d love to have some concrete examples or resources to learn from.”

Now, things seem to be changing. Communities are forming and expanding, more PMs are speaking up and sharing their expertise and with that in mind I wanted to share with you some of my favourite PM resources. The resources I’ve included are good if you’re a Project Manager or a Something Else who does a lot of PM work or are interested in learning more about PM. Perhaps you could become a Project Management Hero.

Here goes:
- Scott Berkun’s website, essays, blog and book. Also, if you ever have the opportunity to attend one of Scott’s speaking engagements - do it!
- PMClinic listserv, also known as Patoomba: it’s a website, it’s a listserv all with a PM focus. Each week a new situation is presented to the group and we have the chance to give our two cents on it.
- No Secret blog, the author of this blog is a regular contributor to the PMClinic list and started his own blog that’s filled with (almost) daily CCrits (sounds like “Secret” stands for “Content Critical”).
- Herding Chickens: When I was studying project management the PM assigned to teach us all about Human Resources recommended this book. It was the first PM book I read cover to cover. It’s a fantastic guidebook filled with real life examples and lots of document templates.

Ofcourse there are other PM resources out there, like the PM Hut, Project Connections and pmStudent (a site I just found out about a couple of weeks ago), but the list above has the resources I go back to regularly. What about you, do you have any PM resources that you find helpful?

As a side note, I have a certificate in Project Management from UBC but I haven’t pursued a PMP designation. If you have questions about the program I attended or about PMP, please do feel free to get in touch with me. I love chatting with other PMs about ideas and experiences and am happy to share mine.

Theming multiple value CCK fields in Views

Colin Calnan | June 22nd, 2009

I’m working on a site right now that has a Publications content type, which in turn has a multiple value CCK text field for Author. If more than one author was input I needed them to display as a comma separated list in a view. How do you go about modifying this? My first stop was the theming info link in Views, and that helped me narrow it down to a template file to use, views-view-field.tpl.php(). But that file didn’t allow me to modify the individual fields without getting a whole load of other HTML in the bargain.

< ?php
// $Id: views-view-field.tpl.php,v 1.1 2008/05/16 22:22:32 merlinofchaos Exp $
 /**
  * This template is used to print a single field in a view. It is not
  * actually used in default Views, as this is registered as a theme
  * function which has better performance. For single overrides, the
  * template is perfectly okay.
  *
  * Variables available:
  * - $view: The view object
  * - $field: The field handler object that can process the input
  * - $row: The raw SQL result that can be used
  * - $output: The processed output that will normally be used.
  *
  * When fetching output from the $row, this construct should be used:
  * $data = $row->{$field->field_alias}
  *
  * The above will guarantee that you'll always get the correct data,
  * regardless of any changes in the aliasing that might happen if
  * the view is modified.
  */
?>
< ?php print $output; ?>

Using the brilliant “Theme developer” extension of the Devel module I was able to pin point the theme function - theme_content_view_multiple_field that would allow me to modify the actual value of the field without the wrapper div’s etc (I’m not getting into the views divitis argument.

Here’s a quick snippet of code to place in your template.php file of your theme to allow you to modify multiple value fields:

function custom_theme_content_view_multiple_field($items, $field, $values) {
  $output = '';
  switch($field['field_name']) {
    // If this is the author field then we need to comma separate the authors
    case 'field_author':
      $output .= '<div class="field-item">'. implode(', ', $items) .'</div>';
      break;
 
    default:
      foreach ($items as $item) {
        if (!empty($item) || $item == '0') {
	  $output .= '<div class="field-item">'. $item .'</div>';
	}
      }
      break;
  }
  return $output;
}

I used a switch statement because I have a lot of other multiple fields that need to be themed in different ways and it’s nicer than a whole load of if statements. Also switch provides a default state if a condition isn’t met.

Deaths Due to Reading Email while Crossing the Street are on the Rise

Anna | June 12th, 2009

I’m walking down the stairs, leaving our office at Tides Renewal Centre and I’m behind this other dude in a suit and we are both shuffling along because we are checking our Blackberries while walking downstairs. This strikes me as stupid, but forms the basis of a polite exchange of Crackberry jokes.

Spilling out onto sun drenched Hastings Street, I wonder what will become of us? Like lemmings, we march forward into the centre of a hornets’ nest—the downtown east side on a hot Thursday. How many obstacles will we encounter as we type and walk? I squint and strain to the read the tiny print on my Blackberry’s browser while walking under Woodward’s scaffolding, oblivious to cement being poured above. I stop and open a text message—poised in the middle of an active construction site—to read the message my sweetie has no doubt composed on his iPhone while driving 110 kilometres per hour on the highway.

I flip back to my browser window and type “ban reading email while crossing the street.”

If you want to cross a street in New York City or Buffalo, a New York state senator says, you should be fined $100 if you do so while in a state of “iPod oblivion.” (A Ban on iPods While Crossing)

I’m fascinated by regulations against Darwinian self-elimination.  Helmet laws, seatbelt laws, no talking on cell phone laws—all these regulations enacted to prevent us from doing something stupid.  Or hurting other people while doing stupid things.

Part of me wonders whether these laws are just the result of poor manners?  We’ve developed these technologies and adopted them like beloved children, adored with a sudden fierceness.  We haven’t had much time to establish etiquette for their use.  Our passion interferes with our judgement.  Wouldn’t it be polite if people put their toys away and walked smiling down the street, tipping their hats to each other and marveling about the lovely June weather instead?

An old colleague of mine once took me aside and pleaded,  “It’s imperative that you share your ideas about what is appropriate use of the Blackberry with your co-workers.  We can’t have people checking their emails absentmindedly while we are in meetings.”  Where is our iPhone Miss Manners?  Who will save us from being decapitated while walking down the street or giving all our friends the impression we aren’t interested in what they have to say because we are texting instead of listening?

Sent from my BlackBerry device on the Rogers Wireless Network

trcstairs

 


t. 604.684.2498 | f. 604.721.4007 | e. turningheads [at] raisedeyebrow.com