<?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>Oomph</title>
	<atom:link href="http://www.thinkoomph.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thinkoomph.com</link>
	<description>web development, web strategy, and web design studio</description>
	<lastBuildDate>Thu, 17 May 2012 15:52:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Announcing the Opening of Oomph Boston</title>
		<link>http://www.thinkoomph.com/thinking/2012-05/announcing-oomph-boston/</link>
		<comments>http://www.thinkoomph.com/thinking/2012-05/announcing-oomph-boston/#comments</comments>
		<pubDate>Wed, 16 May 2012 01:12:01 +0000</pubDate>
		<dc:creator>Erica</dc:creator>
				<category><![CDATA[Good Thinking]]></category>
		<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.thinkoomph.com/?p=2265</guid>
		<description><![CDATA[If you look closely, you can actually see the superhero capes on the backs of our developers. We think they’re that amazing &#8211; and so do our clients. Being amazing (read: staying ever-ahead of the web strategy and development curve) is a commitment we’ve made to our clients, and to ourselves. As part of that [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.thinkoomph.com/thinking/2012-05/announcing-oomph-boston/shutterstock_98363417/" rel="attachment wp-att-2270"><img class="alignnone size-medium wp-image-2270" title="Harvard Square" src="http://www.thinkoomph.com/wp-content/uploads/2012/05/shutterstock_98363417-520x346.jpg" alt="" width="520" height="346" /><br />
</a>If you look closely, you can actually see the superhero capes on the backs of our developers. We think they’re that amazing &#8211; and so do our clients. Being amazing (read: staying ever-ahead of the web strategy and development curve) is a commitment we’ve made to our clients, and to ourselves. As part of that commitment, we recognize how important it is to physically place ourselves at the center of the action, too, when it comes to the industry.</p>
<p><strong>We’re excited to announce the opening of Oomph Boston, located in the heart of Harvard Square.</strong> One Mifflin Place in Cambridge is already buzzing with a team of talent headed by new Creative Director Patrick Richardson.</p>
<p>This second location &#8211; an extension of our home office in Providence &#8211; allows us to be closer to many of our core clients, like NESN and Boston College. Plus, with so many distinguished colleges and universities in our new backyard, our Boston office gives us access to the brightest minds in the field as we grow our company. Today, the energy happening around web development is intensifying wicked fast, and Boston is one of the hubs leading the charge. By basing a team in Boston, we’ve been able to readily share knowledge and demonstrate leadership in the WordPress, Drupal and PHP communities in and around the region.</p>
<blockquote><p>Our new presence in Boston is very exciting. We are fortunate to be growing and expanding, and this milestone is one we&#8217;ve been anxiously awaiting. The Boston tech scene is hot and Oomph is ready to dive right in!</p></blockquote>
<p style="text-align: right;"><em>- Chris Murray, President</em></p>
<p>As we expand our space, we plan to expand our team as well. Oomph is <a title="WordPress.com VIP Developer Jobs" href="/join/">currently hiring outstanding developers</a> (read: superheroes) to join our team and continue to make the exclamation point in our logo well earned.</p>
<p><a title="WordPress VIP Developer Jobs" href="/join/">Developers Wanted</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkoomph.com/thinking/2012-05/announcing-oomph-boston/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress.com VIP Developer Training in Napa Valley</title>
		<link>http://www.thinkoomph.com/thinking/2012-05/wordpress-vip-developer-training-in-napa-valley/</link>
		<comments>http://www.thinkoomph.com/thinking/2012-05/wordpress-vip-developer-training-in-napa-valley/#comments</comments>
		<pubDate>Thu, 10 May 2012 21:42:45 +0000</pubDate>
		<dc:creator>sword</dc:creator>
				<category><![CDATA[Content Management Systems]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[Good Thinking]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[WordPress Tips]]></category>

		<guid isPermaLink="false">http://www.thinkoomph.com/?p=2244</guid>
		<description><![CDATA[This spring, I had the privilege to attend WordPress.com VIP’s Intensive VIP Developer Training Workshop in Napa Valley. The event was hosted by Automattic, the company behind WordPress.com, and took place at The Carneros Inn, a beautiful and intimate resort situated in the heart of the winegrowing region. Representatives from big media, development shops, and [...]]]></description>
			<content:encoded><![CDATA[<p>This spring, I had the privilege to attend <a title="WordPress.com VIP Training" href="http://vip.wordpress.com/2012/04/12/vip-intensive-developer-workshop-recap/">WordPress.com VIP’s Intensive VIP Developer Training Workshop in Napa Valley</a>. The event was hosted by Automattic, the company behind WordPress.com, and took place at <a href="http://www.thecarnerosinn.com/thecarnerosinn/">The Carneros Inn</a>, a beautiful and intimate resort situated in the heart of the winegrowing region. Representatives from big media, development shops, and freelancers descended on this idyllic setting for two and a half days of presentations, networking events and training all concentrated on working within the enterprise-centric <a href="http://vip.wordpress.com/">WordPress.com VIP</a> platform. In short, a developer’s dream come true.</p>
<p><img class="size-medium wp-image-2247" title="wordpress-vip-workshop-group-1024x682" src="http://www.thinkoomph.com/wp-content/uploads/2012/05/wordpress-vip-workshop-group-1024x682-520x346.jpg" alt="" width="520" height="346" /></p>
<div style="text-align: center;"><em>Class of 2012. Courtesy of Adam Tow.</em></div>
<p>Upon arriving, I checked in and had a few hours to stroll the grounds and mingle with other attendees &#8211; quickly realizing I was among some of the brightest minds in the WordPress community. Throughout the afternoon, developers from companies such as Time Magazine, Dow Jones, O’Reilly Media and NBC Sports began filtering onto the property.</p>
<p><span class="Apple-style-span" style="line-height: 18px;"><img class="alignright size-full wp-image-2250" style="border-style: initial; border-color: initial; margin-top: 4px; margin-right: 0px; margin-bottom: 4px; margin-left: 15px; outline-style: none; outline-width: initial; outline-color: initial; float: right; display: inline; border-width: 0px; padding: 0px;" title="5432_wordpressmon_0107f-300x199" src="http://www.thinkoomph.com/wp-content/uploads/2012/05/5432_wordpressmon_0107f-300x199.jpg" alt="" width="300" height="199" /></span></p>
<p>The event officially kicked-off a few hours later with <a href="http://matt.wordpress.com/">Matt Mullenweg</a>’s inspirational keynote address, which left me with the overwhelming awareness that I was involved in something very special. Over the last few years, WordPress has achieved an impressive following and some serious momentum. The platform has evolved from blog management to content management, and it’s quickly gaining traction with developers as an application framework. What was once a simple blogging platform now powers <a href="http://yoast.com/wordpress-stats/">16% of the Internet</a>. Tony Schneider, CEO of Automattic, followed Matt’s address with this <a title="WordPress Adoption Chart" href="http://en.wordpress.com/stats/">real-time map</a> illustrating some of the remarkable usage statistics related to WordPress, and then he concluded with his exciting vision for the future of the platform.<br />
The next two days were all about the training. Topics included caching, taxonomies, A/B testing, coding standards, advanced theming, the rewrite API, and other intensive subjects relevant to working with VIP. These sessions were augmented by interactive examples presented on a Debian server virtual machine that allowed everyone to hack along and directly attack the code with the very people who helped create it. Mo Janda introduced a</p>
<p><img class="alignleft size-full wp-image-2251" title="5432_wordpresstues_0192f-300x199" src="http://www.thinkoomph.com/wp-content/uploads/2012/05/5432_wordpresstues_0192f-300x199.jpg" alt="" width="300" height="199" /></p>
<p>tool called the <a title="WordPress VIP Code Audit" href="http://wordpress.org/extend/plugins/vip-scanner/">VIP Code Scanner</a>, which I highly recommend to anyone working on the platform and looking for a useful way to audit their code. Michael Fields of The Theme Team shared his expertise, including advice on leveraging The <a title="WordPress Starter Theme" href="http://themeshaper.com/2012/02/13/introducing-the-underscores-theme/">_s Starter Theme</a> that gives theme designers a “1000-hour head start.” During one of my favorite talks &#8211; Mike Adams’ session on XML-RPC &#8211; the Automattic Social Team made an announcement revealing the new <a title="WordPress API" href="http://developer.wordpress.com/">RESTful API</a> now available on <a title="WordPress VIP Hosting" href="http://WordPress.com/">WordPress.com</a>.</p>
<p>Direct access to the Automatticians along with members of the VIP community created both a great social dynamic and an opportunity to learn new strategies and discuss concepts utilized by other developers. The relaxing atmosphere of wine country, the rigorous daily seminars and the nightly networking opportunities together resulted in an amazing educational event. The intimate and interactive setting contributed greatly to making the experience wholly satisfying. I would like to extend a special thanks to my employer, Oomph, for making my attendance at this incredible training possible. I can only hope my growth as a developer on the highly-successful VIP platform will consist of more equally gratifying opportunities in the future.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkoomph.com/thinking/2012-05/wordpress-vip-developer-training-in-napa-valley/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Caching, Scaling, and What I&#8217;ve Learned Programming for WordPress.com VIP</title>
		<link>http://www.thinkoomph.com/thinking/2012-02/caching-scaling-and-wordpress-com-vip/</link>
		<comments>http://www.thinkoomph.com/thinking/2012-02/caching-scaling-and-wordpress-com-vip/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 18:16:15 +0000</pubDate>
		<dc:creator>Erick Hitter</dc:creator>
				<category><![CDATA[Content Management Systems]]></category>
		<category><![CDATA[Good Thinking]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[Boston WordPress meetup]]></category>
		<category><![CDATA[Caching]]></category>
		<category><![CDATA[Fragment Caching]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Scaling]]></category>

		<guid isPermaLink="false">http://www.thinkoomph.com/?p=2163</guid>
		<description><![CDATA[Back in November, I presented a talk at the Boston WordPress Meetup entitled Caching, Scaling, and What I&#8217;ve Learned Programming for WordPress.com VIP. Our experience with WordPress.com VIP provides unique insight into what it takes to operate high-traffic WordPress sites, but what we&#8217;ve learned is also applicable to WordPress-powered sites in general. After providing a [...]]]></description>
			<content:encoded><![CDATA[<p>Back in November, I presented a talk at the <a title="Boston WordPress Meetup" href="http://meetup.bostonwp.org/" target="_blank">Boston WordPress Meetup</a> entitled <em>Caching, Scaling, and What I&#8217;ve Learned Programming for WordPress.com VIP</em>. Our experience with <a title="WordPress.com VIP" href="http://vip.wordpress.com/" target="_blank">WordPress.com VIP</a> provides unique insight into what it takes to operate high-traffic WordPress sites, but what we&#8217;ve learned is also applicable to WordPress-powered sites in general.</p>
<p>After providing a brief overview of different caching methods, I spoke in depth about using fragment caching to improve performance and provided numerous examples taken from client projects. Fragment caching is the practice of abstracting elements of a site, such recent posts or navigation menus, and saving them for reuse. It could be that a specific element is complex to generate, or that it appears on numerous pages across a site; in either case, avoiding the need to recreate these elements can provide significant performance benefits.</p>
<p>The slides I used and video of presentation are embed below.</p>
<div id="__ss_10382714" style="width: 530px;"><iframe src="http://www.slideshare.net/slideshow/embed_code/10382714" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="530" height="443"></iframe></div>
<p><iframe src="http://blip.tv/play/hZtngujvawI.html?p=1" frameborder="0" width="530" height="364"></iframe><object style="display: none;" width="530" height="364" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://a.blip.tv/api.swf#hZtngujvawI" /><embed style="display: none;" width="530" height="364" type="application/x-shockwave-flash" src="http://a.blip.tv/api.swf#hZtngujvawI" /></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkoomph.com/thinking/2012-02/caching-scaling-and-wordpress-com-vip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hiring: Creative Director in Boston or Providence</title>
		<link>http://www.thinkoomph.com/thinking/2012-01/hiring-creative-director/</link>
		<comments>http://www.thinkoomph.com/thinking/2012-01/hiring-creative-director/#comments</comments>
		<pubDate>Sun, 15 Jan 2012 17:02:38 +0000</pubDate>
		<dc:creator>Christopher Murray</dc:creator>
				<category><![CDATA[Design & Creative]]></category>
		<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.thinkoomph.com/?p=2121</guid>
		<description><![CDATA[Oomph is on the lookout for a talented Creative Director to join our team full-time in either the Providence, RI or Cambridge, MA office. We had a terrific 2011 and we are searching for someone to lead the creative team through our next stage of growth. Key responsibilities will include active contributions to Oomph’s brand, [...]]]></description>
			<content:encoded><![CDATA[<p>Oomph is on the lookout for a talented <a title="Creative Director" href="http://www.thinkoomph.com/company/jobs/creative-director/">Creative Director</a> to join our team full-time in either the <a title="Digital agency office in Boston and Providence" href="/company/">Providence, RI or Cambridge, MA office</a>. We had a terrific 2011 and we are searching for someone to lead the creative team through our next stage of growth.</p>
<p>Key responsibilities will include active contributions to Oomph’s brand, marketing, and creative culture, instilling engaging design as a core philosophy across the entire company, and developing creative approaches for all aspects of client engagements.</p>
<p>An ideal candidate will have experience leading small creative teams in an agency environment, a desire to work on creative solutions for sites and apps with massive audiences, and a passion and drive to create “wow” design and deliverables.</p>
<p>Interested? <a title="Digital Agency Creative Director in Boston, MA" href="http://www.thinkoomph.com/company/jobs/creative-director/">Learn more about the position</a>.</p>
<h5>All Open Positions at Oomph:</h5>
<p><a title="Creative Director" href="http://www.thinkoomph.com/company/jobs/creative-director/">Creative Director</a></p>
<p><a title="PHP &amp; MySQL Developer" href="http://www.thinkoomph.com/company/jobs/php-mysql-developer/">PHP/MySQL Developer</a></p>
<p><a title="WordPress Developer" href="http://www.thinkoomph.com/company/jobs/wordpress-developer/">WordPress Developer</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkoomph.com/thinking/2012-01/hiring-creative-director/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruminations on the WordPress Taxonomy System</title>
		<link>http://www.thinkoomph.com/thinking/2012-01/ruminations-on-the-wordpress-taxonomy-system/</link>
		<comments>http://www.thinkoomph.com/thinking/2012-01/ruminations-on-the-wordpress-taxonomy-system/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 17:56:29 +0000</pubDate>
		<dc:creator>Ben Doherty</dc:creator>
				<category><![CDATA[Content Management Systems]]></category>
		<category><![CDATA[Good Thinking]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[WordPress Tips]]></category>

		<guid isPermaLink="false">http://www.thinkoomph.com/?p=1997</guid>
		<description><![CDATA[One of our most recent projects was to create a WordPress theme that offered versions in six different languages (two of which were UK vs. US English dialects.) The main feature of this theme was to be easily able to switch between languages, translating not only static screen elements, but also dynamic elements that come [...]]]></description>
			<content:encoded><![CDATA[<p>One of our most recent projects was to create a WordPress theme that offered versions in six different languages (two of which were UK vs. US English dialects.) The main feature of this theme was to be easily able to switch between languages, translating not only static screen elements, but also dynamic elements that come from the database. Oomph developed a theme that offers all the functionality necessary for these requirements, but in the development process, a flaw in the WordPress taxonomy system was revealed. The succinct definition of this problem is this:</p>
<p><strong>Identical terms that appear in two different taxonomies are still the same term.</strong></p>
<p>Yet, <strong>They are treated by the WordPress interface as if they are not.</strong></p>
<h3>The Problem</h3>
<p>For a simple example, suppose we had two taxonomies, <em>fruits</em> and <em>colors</em>. In the <em>fruits</em> taxonomy, we had the following terms:</p>
<pre>Apple
Orange
Banana</pre>
<p>And in <em>colors</em>, the following:</p>
<pre>Red
Orange
Yellow</pre>
<p>&nbsp;</p>
<p>Suppose we wanted to change all of the <em>colors</em> to use lower-case instead:</p>
<pre>red
orange
yellow</pre>
<p>We now see that the change to the term &#8220;Orange&#8221; is also reflected in the <em>fruits</em> taxonomy:</p>
<pre>Apple
<strong>orange</strong>
Banana</pre>
<p>This is obviously not what we want. Conceptually, Orange the <em>fruit</em> and Orange the <em>color</em> are distinct entities, but to WordPress, they <strong>are</strong> the same thing. </p>
<h3>The Project</h3>
<p>The problem above was fully fleshed out while developing one of our most recent and most challenging projects. This project required us to be able to translate everything seen on the screen for an end-user into 5 distinct languages: English, French, Italian, German and Dutch; as well as into 2 variants of English, UK and US, for a total of 6 different translations for each string seen by the user. Besides regular translateable strings that were coded into the theme using the WordPress <a href="http://codex.wordpress.org/I18n_for_WordPress_Developers">I8n API</a>, we also had to manage translations for certain taxonomies, such as <code>category</code>. </p>
<p>Since these strings would be coming from the database, employing the WordPress I18n API for translating these strings via .PO/.MO files would not have been the correct way of approaching this problem, as then we would have been passing variable values into the <code>__()</code> suite of functions. This poses a problem since the scripts we use to generate the .POT files to be translated would not know which string is actually in need of translation. </p>
<p>Another down-side of having used PO files for translating these strings would be that there would be no separation of language category taxonomies, which means that per-language category terms would have to mirror each of the other ones at all times, and there would be no opportunity for using a foreign-language term that does not appear in either the base (untranslated) taxonomy.</p>
<p>In order to achieve translated taxonomies, we first created a taxonomy, &#8220;languages&#8221; that would store each of the languages that were used within our system, with the terms:</p>
<p class="aside">The <code>-language</code> suffix on these term slugs was a necessity because of slug collisions with another taxonomy.</p>
<pre>   en-uk-language - English (UK)
   en-us-language - English (US)
   fr-fr-language - French
   nl-nl-language - Dutch
   de-de-language - German
   it-it-language - Italian</pre>
<p>The terms from this taxonomy were in turn used to define a taxonomy for each one of the taxonomies we needed to translate:</p>
<pre>   category_en-uk-language
   category_fr-fr-language
   ...</pre>
<p>And so forth. For each term used in one of these translated taxonomies, the helpful &#8220;description&#8221; field is used to link it back to its untranslated base:</p>
<p class="aside">As an aside, the hijacking of the &#8220;description&#8221; field as a substitute for proper Taxonomy metadata is a time-honored WordPress hack that is used by many themes. The alternative would be to store taxonomy metadata in the <code>options</code> table, but this method does not scale as well, since it bloats the options table and would require two database reads to pull meta data out for every term. Another alternative for dealing with this issue would be to use a custom table, but this sort of thing is simply not allowed in the WordPress.com/Wordpress.com VIP environment, adds extra complexity, and would still require extra database reads to pull the taxonomy meta data.</p>
<p><img class="size-full wp-image-1998" src="http://www.thinkoomph.com/wp-content/uploads/2011/12/Screen-Shot-2011-12-12-at-10.07.07-A.png" alt="" width="530" height="331" /></p>
<p>In (US) English, we might have a category structure akin to the following:</p>
<pre>Job Market
-- Pay
Advice
-- Insight
-- Resumés
</pre>
<p>Which in French, for example, would look like:</p>
<pre>Marche de l'emploi
-- Salaires
Conseils
-- Aperçu
-- CV's
</pre>
<p>But also might have slight differences for UK English vs. our base theme language of US English:</p>
<pre>Job Market
-- Salaries
Advice
-- Insight
-- CV's
</pre>
<p>Looking at our category structure above, we see that both UK English and US English are using &#8220;Job Market&#8221; as a category, but UK English and French both use the term &#8220;CV&#8217;s&#8221; instead of the US English &#8220;Resumés.&#8221;</p>
<p>Suppose we wanted to change the UK English category to read &#8220;Job market&#8221; instead, with the second word in lower-case. We would make this change using the edit terms screen in the WordPress back-end. Now we look at the US English version of &#8220;category&#8221;:</p>
<pre>Job <strong>market</strong>
-- Salaries
Advice
-- Insight
-- Resumés</pre>
<p><strong>Whoah!</strong> Back the truck up! That change also got applied to the &#8220;Job Market&#8221; term in the US English category. What happened here?! It seems that even though the &#8220;Job Market&#8221; category appears twice in separate category taxonomies, changes to one will affect the other. We&#8217;d encounter the same problem if we tried to change French &#8220;CV&#8217;s&#8221; into &#8220;CVs&#8221;, without an apostrophe: the change will also propagate to the UK English category name. This is definitely not what we want.</p>
<h3>Problem Details</h3>
<p>The complication here arises from the WordPress taxonomy data schema. There are two tables in the WordPress schema that are responsible for storing taxonomy data:</p>
<p><code>wp_terms</code></p>
<p>and</p>
<p><code>wp_term_taxonomy</code></p>
<p class="aside">A third table, <code>wp_term_relationships</code> links taxonomy terms with the posts to which they are attached, but I don&#8217;t necessarily consider it part of the taxonomy data storage system.</p>
<p>The fields of interest are:</p>
<pre>
wp_term_taxonomy.taxonomy
wp_term_taxonomy.parent
wp_term_taxonomy.description
wp_terms.name
wp_terms.slug

  and finally, the relating field: 

wp_term_taxonomy.term_id = wp_terms.term_id
</pre>
<p>This is a &#8220;normalized&#8221; schema, in the sense that objects that are ostensibly the same appear only once: a distinct term will only ever appear once in the <code>wp_terms</code> table, keyed by its slug.</p>
<p>Here is where we get to the core of the above-stated problem:</p>
<p><strong>Identical terms that appear in two different taxonomies are still the same term.</strong></p>
<p>Yet, <strong>They are treated by the WordPress interface as if they are not.</strong></p>
<p>This is because WordPress is doing everything it can to keep the <code>terms</code>/<code>term_taxonomy</code> tables normalized. If we have a term, &#8220;Job Market&#8221;, and it appears in both UK English Category and US English Category, then any changes to one will necessarily be made to the other, since they are sharing the same entry in <code>wp_terms</code>.</p>
<p>Why is this a problem? For me, it boils down to the following issues:</p>
<ol>
<li>Terms in two different taxonomies are very rarely conceptually the same thing, even if they have the same text.</li>
<li>The WordPress administrative interface implies that a term in two or more taxonomies are NOT the same thing (they appear in different locations, after all.)</li>
<li>From a database engineering standpoint, it&#8217;s an extra, unnecessary table in the schema.</li>
</ol>
<p><strong>Why is it designed this way?</strong> As with many quirks in today&#8217;s software, it boils down to &#8220;legacy code.&#8221; WordPress grew organically over time, and certain decisions were made at the time in order to add features, that seemed reasonable at the time, given the problem being solved at the time, that did not fully predict future implications. WordPress was originally devised as blogging software, but is more and more being used for general CMS purposes. As a general-purpose CMS, complex taxonomy schemas such as the one we used for this recent project would be required for storing data into distinct buckets, which might have complex and overlapping domains. But suppose we <em>could</em> fix this? What could we do to address this issue, and maybe even simplify code and user experience in the process?</p>
<h3>wp_taxonomy</h3>
<p>The <code>wp_taxonomy</code> table is my proposed solution to this problem. It would consolidate all of the information in <code>wp_terms</code> with <code>wp_term_taxonomy</code>:</p>
<pre>taxonomy_id
taxonomy
name
slug
description
parent
count
term_group</pre>
<p>Notice that here there&#8217;s only <strong>two more fields</strong> in this table than in <code>wp_term_taxonomy</code>, one of which is the oh-so-mysterious-and-little-used <code>term_group</code> from <code>wp_terms</code>. Since linking to a separate terms table is no longer required, we can completely <em>drop</em> term_id, and then add the two relevant fields from the terms table, <strong>name</strong> and <strong>slug</strong>. Uniqueness on this table would then be enforced on the pair (taxonomy,slug). A schema like this would result in one less database table, one less field, and a lot more flexibility, since each taxonomy would now create a <strong>unique</strong> bucket of terms.</p>
<p>How much work would it take to adapt the API to use this proposed schema? It&#8217;s hard to say. A brief run-through of the functions that touch the database in <code>wp-include/taxonomy.php</code> shows that at least the following functions would need to be changed:</p>
<pre>get_object_in_term()
WP_Tax_Query::get_sql()
WP_Tax_Query::transform_query()
get_term()
get_term_by()
get_terms()
term_exists()
wp_delete_object_term_relationships()  <em>(Likely obviated entirely by proposed schema)</em>
wp_delete_term()
wp_get_object_terms()
wp_insert_term()
wp_set_object_terms()
wp_unique_term_slug()
wp_update_term()
wp_update_term_count_now()
clean_term_cache()
_pad_term_counts()
_update_post_term_count()</pre>
<p>This is most definitely <strong>not</strong> a complete list of all the functions that would require updating in order to work with this proposed schema. There are also all of the functions that hook into the various term-related actions and filters, as well as all of the back-end wp-admin code that would need modification. The above represents only the <strong>minimal</strong> set of core taxonomy API functions that would need updating, but I think it&#8217;s a good start.</p>
<h3>If only it were so easy!</h3>
<p>In an ideal world, where WordPress wasn&#8217;t already the beast that it has grown to be, with millions of sites depending on it, including many of the big players, (<a href="http://wordpress.org/news/2011/08/state-of-the-word/">14.7% percent of the top million sites!</a>) such a change might be a reasonable undertaking. But WordPress is a giant system with a huge community (some of which I&#8217;m sure will have something to say about my proposal!) and a monstrous ecosystem. While my proposed changes would (I believe) generally result in simpler code and a more predictable taxonomy system, it&#8217;s simply not feasible to make such a drastic change to core without a completely separate code fork.</p>
<p>As millions upon millions of sites are built upon WordPress these days, making dramatic changes to the database schema is a daunting task that would likely break thousands of sites, even if the API managed to stay the same. This is because there is still plenty of theme code out there that reaches directly into the two extant taxonomy data tables, and this would be the code that would most definitely be broken by any change. Perhaps a forked version of WordPress would be needed as a proof-of-concept, but even then, we&#8217;re looking at a development cycle that would span years to get such a major initiative off the ground.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkoomph.com/thinking/2012-01/ruminations-on-the-wordpress-taxonomy-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal 6, 7, or 8 – What you need to know as a site owner</title>
		<link>http://www.thinkoomph.com/thinking/2011-12/drupal-6-7-or-8-what-you-need-to-know-as-a-site-owner/</link>
		<comments>http://www.thinkoomph.com/thinking/2011-12/drupal-6-7-or-8-what-you-need-to-know-as-a-site-owner/#comments</comments>
		<pubDate>Fri, 16 Dec 2011 20:21:39 +0000</pubDate>
		<dc:creator>Robert Aubin</dc:creator>
				<category><![CDATA[Content Management Systems]]></category>
		<category><![CDATA[Good Thinking]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Drupal 7]]></category>

		<guid isPermaLink="false">http://www.thinkoomph.com/?p=2026</guid>
		<description><![CDATA[Maybe your site is already built on Drupal and you’re considering an upgrade. Maybe you are considering Drupal for the first time. You’ve done some research and hit your first wall – What version of Drupal should you consider? You’re not alone. Visiting Drupal.org, the choice looks simple. Drupal 7. There are banners and buttons and [...]]]></description>
			<content:encoded><![CDATA[<p>Maybe your site is already built on Drupal and you’re considering an upgrade. Maybe you are considering Drupal for the first time. You’ve done some research and hit your first wall – What version of Drupal should you consider?</p>
<p>You’re <a href="http://drupal.org/node/1138306">not alone</a>. Visiting <a href="http://drupal.org">Drupal.org</a>, the choice looks simple. Drupal 7. There are banners and buttons and headlines that all direct you to choose version 7 for your site. But wait – you were on a message board, or Google, or somewhere and saw someone mention version 8.</p>
<p>Well, why would you choose version 7 if 8 is right around the corner? Even the <a href="http://drupal.org/project/drupal">download page for Drupal 6 and 7</a> directs people to the Drupal 8 initiatives group page. Talk about confusing for anyone up against this decision.</p>
<p>The fact is, Drupal 8 is a long way off – <a href="http://buytaert.net/how-i-think-about-drupal-release-date-planning">at least 18 months, actually</a>. Version 8 is in development, yes, but there’s a long road ahead before a release will be available for your web site. Drupal 7, which had it’s first release in January 2011, <a href="http://buytaert.net/the-gartner-hype-cycle-and-drupal">hasn’t even reached its adoption peak</a> yet and that’s because of a number of reasons:</p>
<ul>
<li>Many of the contributed modules that are available for Drupal 6 still aren’t ready for Drupal 7</li>
<li>The architecture changed in Drupal 7 and some functionality provided by contributed modules has been included in core Drupal. Some related modules may not work with Drupal 7.</li>
<li>It is easier and more cost effective to develop for Drupal 6 because there are established development recipes for common feature requests</li>
<li>Drupal 6 is still supported and works great</li>
<li><a href="http://www.bivingsreport.com/2011/5-frustrating-things-about-drupal-7/">Some argue</a> there’s a <a href="http://drupal.stackexchange.com/questions/13651/what-are-the-gotchas-for-a-drupal-6-developer-learning-drupal-7">steeper developer learning curve</a> for Drupal 7 over Drupal 6</li>
</ul>
<p>So, with Drupal 8 not even an option at this point (despite what rumors are floating around the internet), why on Earth would you choose an older version of Drupal?</p>
<h2>For new sites, use Drupal 7</h2>
<p>You should consider choosing Drupal 6 if there’s a key piece of functionality you need that isn’t available for Drupal 7, and it would cost more to build it than to use something already available for Drupal 6 (of course it’d be great if you could help port it to Drupal 7 and contribute it to the community!).</p>
<p>If you’re building your first Drupal site and you’ve already mapped out the site requirements and everything you need can be accomplished with Drupal 7, there’s no question – you should use Drupal 7. You’ll have the most up-to-date version of Drupal that is available and you won’t have to think about major upgrades for quite a while, probably years.</p>
<h2>What it means to upgrade</h2>
<p>If you have an existing Drupal 6 site and want to upgrade to Drupal 7, this part’s for you.</p>
<p>It’s important to know, up front, what you’re getting into when upgrading. Upgrading between major Drupal versions is more complicated than the incremental maintenance updates to modules and Drupal core that you probably already do. The underlying data structures change and in most cases there’s some development effort required to make your existing site&#8217;s theme compatible with the new version.</p>
<p>Depending on the level of customization on your existing site, this can take <strong>a long time</strong>. Not only that, but if some data doesn’t update smoothly it may need to be migrated by hand. Have a qualified development team do an assessment of your current site to determine how difficult an upgrade will be.</p>
<p>Does your current D6 site let you upload files or images using <span class="caps">CCK</span>’s <a href="http://drupal.org/project/filefield">filefield module</a>? What about other fields like user references or node references? This is a great example of the difficulties inherent in major version changes. Unless you download and install <a href="http://drupal.org/project/cck"><span class="caps">CCK</span>’s Drupal 7 dev branch</a>, which you’ll later remove, to <a href="http://drupal.org/node/1144136">migrate</a> this old field data to D7, you’ll have content with missing field data. Depending on what modules are enabled on your site, you may have to overcome these types of upgrade challenges for each of them.</p>
<h2>Is it time for a new look?</h2>
<p>If you’re already planning to update the look of your site, it could be the perfect opportunity to upgrade your Drupal 6 site to Drupal 7. Even if you’re not planning on adding new bells and whistles to your site, a redesign will require a new site theme to be developed. Depending on the complexity of your existing site it might make more sense to develop the new theme for Drupal 7’s framework instead of Drupal 6. Just check with your development team to make sure that all of your existing functionality will carry over after the upgrade.</p>
<h2>Conclusion</h2>
<p>New Drupal sites should be built with Drupal 7, unless a piece of custom functionality makes it cost prohibitive. Site owners wanting to upgrade from D6 to D7 in preparation for Drupal 8 might want to wait – Drupal 6 hasn’t gone stale quite yet. Finally, site owners that are ready for a design refresh should consider Drupal 7, but get an expert assessment to find out if it makes sense to upgrade.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkoomph.com/thinking/2011-12/drupal-6-7-or-8-what-you-need-to-know-as-a-site-owner/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Make Large WordPress Import Files Manageable</title>
		<link>http://www.thinkoomph.com/thinking/2011-12/make-large-wordpress-import-files-manageable/</link>
		<comments>http://www.thinkoomph.com/thinking/2011-12/make-large-wordpress-import-files-manageable/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 21:29:22 +0000</pubDate>
		<dc:creator>Ben Doherty</dc:creator>
				<category><![CDATA[Good Thinking]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[WordPress Tips]]></category>
		<category><![CDATA[Content Import]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.thinkoomph.com/?p=1925</guid>
		<description><![CDATA[WordPress Import files can often be ungainly and hard to work with due to the various limitations that are necessarily attached to the WordPress import tool, like the PHP max_upload_size, max_post_size or max_memory_limit variables, or a limit built into the web server itself. Sometimes it&#8217;s easier to work with smaller files, whether it be for [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress Import files can often be ungainly and hard to work with due to the various limitations that are necessarily attached to the WordPress import tool, like the PHP <code>max_upload_size</code>, <code>max_post_size</code> or <code>max_memory_limit</code> variables, or a limit built into the web server itself.</p>
<p>Sometimes it&#8217;s easier to work with smaller files, whether it be for testing or importing small batches. I recently encountered that need, and my previous solution involved copying and pasting chunks of the XML WXR file from once place to another. This became impractical when I faced a nearly 200MB file that would cause my text editor to choke.</p>
<p>To address this, I developed the following set of shell scripts to work with these WXR files and break it into pages of posts in separate files. It requires an XSLT 2.0 processor. XSLT 2.0 is required because of the use of the <em>xsl:result-document</em> element. I used <a href="http://www.saxonica.com/welcome/welcome.xml" target="_blank">Saxonica&#8217;s Saxon</a> Java class wrapper which provides a handy command-line interface to the Saxon libraries.</p>
<h3>The xsl stylesheet</h3>
<p>The goal of this stylesheet is to break apart the WXR file&#8217;s <code>item</code> elements (each of which represents a single WordPress post) into multiple files, while still preserving the WordPress meta data in each output file.</p>
<pre class="brush: xml; title: ; wrap-lines: false; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;
&lt;xsl:stylesheet version=&quot;2.0&quot;
		xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;&gt;

&lt;xsl:param name=&quot;size&quot; /&gt;
&lt;xsl:param name=&quot;page&quot; /&gt;
&lt;xsl:param name=&quot;output&quot; /&gt;

&lt;xsl:template match=&quot;/rss&quot;&gt;
	&lt;xsl:result-document method=&quot;xml&quot; href=&quot;{$output}_{$page * $size}-{($page + 1) * $size - 1}.xml&quot;&gt;
			&lt;rss version=&quot;2.0&quot; xmlns:excerpt=&quot;http://wordpress.org/export/1.1/excerpt/&quot; xmlns:content=&quot;http://purl.org/rss/1.0/modules/content/&quot; xmlns:wfw=&quot;http://wellformedweb.org/CommentAPI/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:wp=&quot;http://wordpress.org/export/1.1/&quot;&gt;

			&lt;channel&gt;
				&lt;xsl:for-each select=&quot;channel/*[local-name() != 'item']&quot;&gt;
					&lt;xsl:copy-of select=&quot;.&quot; /&gt;

				&lt;/xsl:for-each&gt;

				&lt;xsl:for-each select=&quot;channel/item&quot;&gt;
					&lt;xsl:if test=&quot;position() &amp;lt; ($page + 1) * $size and position() &amp;gt;= $page * $size&quot;&gt;
						&lt;xsl:copy-of select=&quot;.&quot; /&gt;
					&lt;/xsl:if&gt;
				&lt;/xsl:for-each&gt;
			&lt;/channel&gt;
		&lt;/rss&gt;
	&lt;/xsl:result-document&gt;
&lt;/xsl:template&gt; 

&lt;/xsl:stylesheet&gt;
</pre>
<p>This stylesheet takes three parameters: <code>page</code>, the page number;  <code>size</code>, the page size in number of &#8220;item&#8221; elements; and <code>output</code>, the prefix filename for the resuling output files. It will emit a file with the name <code>$output_$start-$end.xml</code>. You may note that this stylesheet can only handle one page of posts at a time due to the lack of for or while loops in the XSLT language (at least without <a href="http://www.ibm.com/developerworks/xml/library/x-tiploop/index.html" target="_blank">language-paradigm-breaking hackery</a>.) This also enables the output to be controlled fully from the calling program, which for this purpose will just be the shell.</p>
<h3>Using the XSLT Stylesheet</h3>
<p>The basic functionality of this stylesheet allows me to create a new WXR import file with a range of posts contained in the original. In this example, I&#8217;m copying the first 2,000 posts from the import file. After it completes, the posts will be saved into <code>file_0-1999.xml</code>. </p>
<pre class="brush: bash; title: ; wrap-lines: false; notranslate">
$ java -Xmx512m -jar ~/saxonhe9-2-0-5j/saxon9he.jar -xsl:split.xsl articles.xml page=0 size=2000
</pre>
<p>I keep my Saxon JAR file in <code>~/saxonhe9-2-0-5j/saxon9he.jar</code>, but you&#8217;ll likely have it somewhere else.</p>
<p>The <code>-Xmx512m</code> parameter tells the Java VM to set the maximum stack size to 512 MB. You may need to adjust this parameter according to the size of your input file.</p>
<h3>Doin&#8217; it all!</h3>
<p>Now that we have the basic tool for pulling a single page out of our source XML file, we can use a little bit of shell scripting to get all of the posts into separate files.</p>
<pre class="brush: bash; highlight: [29]; title: ; wrap-lines: false; notranslate">
#!/bin/bash

# filename: required
file=$1

# output file prefix: required
outfile=$2

if [ &quot;$file&quot; = &quot;&quot; ] || [ ! -f $file ] || [ &quot;$outfile&quot; = &quot;&quot; ]; then
   echo &quot;Usage: $0 filename outfile [pagesize] [start] [limit]&quot;
   exit 1
fi

# page size: defaults to 2000
[ &quot;$3&quot; != &quot;&quot; ] &amp;&amp; pagesize=$3 || pagesize=2000

# start post: defaults to 0 (first post)
[ &quot;$4&quot; != &quot;&quot; ] &amp;&amp; start=$4 || start=0

# limit: defaults to # of posts in input file
[ &quot;$5&quot; != &quot;&quot; ] &amp;&amp; limit=$5 || limit=`grep '&lt;item&gt;' $file | wc -l`

echo &quot;Splitting $file into&quot; `echo &quot;($limit-$start)/$pagesize&quot; | bc` &quot;pages of size $pagesize between posts $start and $limit&quot;;

i=$start

while [ &quot;$i&quot; -le &quot;$limit&quot; ]; do
	echo &quot;Generating page $((i/pagesize)): posts $((i)) through $((i+pagesize))..&quot;;
	java -Xmx2000m -jar ~/saxonhe9-2-0-5j/saxon9he.jar -xsl:split.xsl $file page=$((i/pagesize)) size=$pagesize output=$outfile
	i=$((i+pagesize))
done
</pre>
<p>Save the above as split.sh, and the XSLT file as split.xsl in the same directory. Also, be sure to ensure the path to your Saxon JAR file is correct on line 29. Pulling this all together, we can take a large WXR input file and slice and dice it as we see fit:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
[Meerkat ~/Oomph/]$ sh split.sh Articles.xml Articles 1500
Splitting Articles.xml into 16 pages of size 1500 between posts 0 and    24065
Generating page 0: posts 0 through 1500..
Generating page 1: posts 1500 through 3000..
Generating page 2: posts 3000 through 4500..
Generating page 3: posts 4500 through 6000..
Generating page 4: posts 6000 through 7500..
...
</pre>
<p>We now have 16 files of 1500 articles each, stored as</p>
<p>Articles_0-1499.xml<br />
Articles_1500-2999.xml<br />
Articles_3000-4499.xml</p>
<p>&#8230; And so forth.</p>
<p>Now you can import each of these files individually without choking your WordPress importer! I hope that some of you will find this useful. Keep in mind that the XSL stylesheet above could easily be adapted to work with other large XML data files, too. It would be just a matter of changing the element selectors that you wish to break apart.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkoomph.com/thinking/2011-12/make-large-wordpress-import-files-manageable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to Use the WordPress WYSIWYG Editor</title>
		<link>http://www.thinkoomph.com/thinking/2011-11/how-to-use-the-wordpress-wysiwyg-editor/</link>
		<comments>http://www.thinkoomph.com/thinking/2011-11/how-to-use-the-wordpress-wysiwyg-editor/#comments</comments>
		<pubDate>Tue, 01 Nov 2011 16:19:44 +0000</pubDate>
		<dc:creator>J Hogue</dc:creator>
				<category><![CDATA[Content Management Systems]]></category>
		<category><![CDATA[Good Thinking]]></category>
		<category><![CDATA[WordPress Tips]]></category>
		<category><![CDATA[customization]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.thinkoomph.com/?p=1944</guid>
		<description><![CDATA[For the amount of users out in the world using WordPress, it is amazing to me that there is no great tutorial to point our clients to about the WordPress Editor window. This post hopes to rectify that.

The Editor window changes and updates just like the rest of WordPress, but has remained pretty consistent for the past few major versions. We'll be sure to update this post with the newest tools as they are released.]]></description>
			<content:encoded><![CDATA[<p>For the amount of users out in the world using WordPress, it is amazing to me that there is no great tutorial to point our clients to about the WordPress Editor window. This post hopes to rectify that.</p>
<p>The Editor window changes and updates just like the rest of WordPress, but has remained pretty consistent for the past few major versions. We&#8217;ll be sure to update this post with the newest tools as they are released.</p>
<h2>First: Whizzy what?</h2>
<p>WordPress uses a javascript plug in called <a href="http://www.tinymce.com/" target="_blank">TinyMCE</a> for its <acronym title="What You See is What You Get">WYSIWYG</acronym> editor. WYSIWYG is an acronym for &#8220;What you see is what you get&#8221; and its the best way to craft content before saving your post. The editor is pretty powerful, with many buttons and options for writing content. Most of the options are familiar ideas, similar to options in a Word Processor – bold, italic, bulleted list style, etc&#8230; When designers like myself start to throw out terms like &#8220;H1&#8243; and &#8220;blockquote&#8221;, though, most people&#8217;s eyes glaze over, but that is how these options are stored as HTML elements. Luckily, the Editor does the grunt work for you.</p>
<h2>Second: Some definitions and pictures</h2>
<p>The &#8220;WordPress Editor&#8221; window is the main focus of any page that produces content in the WordPress admin section. Most people are familiar with it for posts, and it looks like this:</p>
<p><img class="alignnone size-full wp-image-1962" title="WordPress-Editor-window" src="http://www.thinkoomph.com/wp-content/uploads/2011/10/WordPress-Editor-window.jpg" alt="" width="580" height="395" /></p>
<p>A good theme will have some styles set up so that content in this window more closely resembles how it will look in your theme – colors, font, heading styles, etc&#8230; This helps you craft content that will look great before you even hit the &#8220;Save Draft&#8221; button and preview it.</p>
<h3>No Kitchen Sink</h3>
<p>When you fist use WordPress, the &#8220;kitchen sink&#8221; is off. So the Editor window will most likely look like this, with the following options:</p>
<p><img class="alignnone size-full wp-image-1966" title="no-kitchen-sink" src="http://www.thinkoomph.com/wp-content/uploads/2011/10/no-kitchen-sink.jpg" alt="" width="520" height="260" /></p>
<p>The options explained:</p>
<p><strong>Upload/Insert:</strong> This area is a container for all of the media options. Sometimes, plug-ins like the Next Gen Media gallery or Poll Daddy will insert an icon in this area for accessing shortcodes for those items. Clicking on any of these will usually open a modal window above the content for managing photos and the like.</p>
<p><strong>Content View Switcher:</strong> The Editor window can function as a Visual Editor (WYSIWYG), or as an HTML editor for those more adventurous. This post will concentrate on options in the Visual Editor.</p>
<p><strong>Bold:</strong> Highlighted text will become bold when this is clicked. In HTML, this uses a &lt;strong&gt; tag.</p>
<p><strong>Italic:</strong> Highlighted text will become italic when this is clicked. In HTML, this uses the &lt;em&gt; tag. Can be used in combination with the bold button.</p>
<p><strong>Strikethrough:</strong> Highlighted text will appear struck, with a line through the center.In HTML, this uses the &lt;del&gt; tag. Used to indicate text for deletion or removal, or to indicate that a change in the text has taken place.</p>
<p><strong>Bulleted List:</strong> Highlighted text will be formatted like a bulleted list. Depending on your theme&#8217;s style, the bullets may be round or square. Lists can be nested – a bulleted list may have a numbered list inside of it. In HTML, this uses a set of &lt;ul&gt; and &lt;li&gt; tags for the &#8220;unordered list&#8221; and the &#8220;list items&#8221;.</p>
<p><strong>Numbered List:</strong> Similar to above, but with numbers. In HTML, this uses the &lt;ol&gt; (ordered list) tag in combination with the &lt;li&gt; list item.</p>
<p><strong>Blockquote:</strong> Highlighted text will be indicated as a blockquote, which typically means that a whole passage has been quoted form another source. The style of it will vary from theme to theme, but most of the time italic text is used, it is indented, and may have quotes around it automatically. The HTML element is &lt;blockquote&gt;.</p>
<p><strong>Left, Center and Right Align:</strong> These buttons will align highlighted text. Most themes align text to the left by default and this is how an author can break out of that mold. An author need not highlight a whole paragraph, as this style will be applied from one full return to another. In HTML, since there are no native tags for alignment, TinyMCE adds a &lt;p&gt; tag around the paragraph with a &#8220;style=align: right;&#8221; applied to it.</p>
<p><strong>Link (chain icon):</strong> The link icon is available for clicking only when text is highlighted. Highlighting text and clicking this button will open a small modal window where an author can enter in the destination URL, choose whether or not to open in a new window, or choose to link to another page on their own site. In HTML, the tag used is &lt;a href=&#8221;http://example.com&#8221;&gt;Link Text&lt;/a&gt;.</p>
<p><strong>Unlink (broken chain):</strong> To remove a link, an author can highlight the whole link or simply place the cursor within the link and click this button.</p>
<p><strong>The &#8220;More&#8221; break:</strong> WordPress has an option of adding this physical break to the post – breaking it into two sections, the teaser and the body. If your theme displays the entire post by default on category landing pages, the &#8220;more&#8221; break is a way to show only some of the content, forcing users to click a &#8220;Read More&#8221; link to see the rest of the body of the post. Upon clicking the &#8220;Read More&#8221; link, the user will be brought directly to an anchor in the text where the post continues, so they do not have to read the same teaser again.</p>
<p>If your theme&#8217;s landing pages use excerpts instead, this &#8220;more&#8221; break may not have the intended effect.</p>
<p><strong>Spell Check:</strong> This button is a drop down that will change the preferred language of the editor&#8217;s spell check dictionary.</p>
<p><strong>Full Screen:</strong> Toggles a full screen view of the editor so authors can concentrate on composing their post. Useful, but the buttons for styling your post will be limited in this view to bold, italic, bullets, numbers, blockquote, insert media, insert link, unlink and help. Learn the &#8220;Hotkeys&#8221; to access more style options (see the Help modal window for a list of Hotkeys and how to use them).</p>
<p>And finally, <strong>Toggle Kitchen Sink</strong>: This button simply makes another row of options available for styling your post. Those options are explained next.</p>
<h3>Kitchen Sink!</h3>
<p>With the kitchen sink option on (and WordPress remembers if you prefer it on), a whole slew of additional options are present.</p>
<p><img class="alignnone size-full wp-image-1965" title="kitchen-sink" src="http://www.thinkoomph.com/wp-content/uploads/2011/10/kitchen-sink.jpg" alt="" width="520" height="260" /></p>
<p><strong>Style drop down:</strong> (graphic below) Within this drop down are styles intended for block-level elements – paragraph, address, preformatted, heading 1, heading 2, etc&#8230;</p>
<p>The best way to think about inline vs. block-level may be this: A bold tag is inline, because you can bold a portion of a sentence; A Heading 1 is block-level because it will effect all the text in a block, from one hard return to another.</p>
<p><strong>Underline:</strong> Highlighted text will have an underline applied to it. In HTML, the tag is &lt;ins&gt; (for insert). Your theme may apply an underline to links, so be sure to use this tag when appropriate, and don&#8217;t fool your readers into thinking something might be clickable when it is not.</p>
<p><strong>Justify:</strong> Another alignment option. This one is by itself because authors should use it carefully. Not all browsers support the justify feature, and since browsers do not hyphenate text, this style may create &#8220;holes&#8221; in your paragraphs when spacing between words need to be very large.</p>
<p><strong>Text color:</strong> Highlighted text will turn a variety of colors by using this button. When clicked, a standard palette of colors will appear for you to choose from, and a limitless palette is shown when the &#8220;More Colors&#8221; option is clicked.</p>
<p><strong>Paste as Text:</strong> <span style="color: #ff0000;">THIS BUTTON IS AWESOME!</span> Very useful for authors who cut and paste text from other sources. Ever copy text from another website, and all the styles come with it? Soon you have a mish mash of styles in your post. You can get frustrated scraping the style tags in HTML view, or you can paste with this button to begin with. When clicked, a new modal pops up with its own text area. Text pasted into this area is converted to &#8220;plain text&#8221;&#8230; nothing but the facts, ma&#8217;am. This allows for much easier styling and integration into your content.</p>
<p><strong><a name="pastefromword"></a>Paste from Word:</strong> <span style="color: #ff0000;">THIS BUTTON IS ALSO AWESOME!</span> Ever cut and paste content from Microsoft Word, and all the sudden your post looks funny? That&#8217;s because a bunch of styles – and, frankly, gobbledy gook – comes along with the content from Word. To paste the text in as plain text, click this button and paste your content into that window first. This option is better if you know the content is coming from Word than the <strong>Paste as Text</strong> button, as it specifically removes tags that Microsoft Word generates.</p>
<p><strong>Remove Formatting:</strong> Highlighted text will have styles removed. While this icon is an eraser, it must be noted that it does not always remove every style. It does a better job removing styles that the editor has added in already. It does not consistently remove styles from text that has been cut and pasted from other sources.</p>
<p><strong>Insert Special:</strong> This drop down list helps to insert special characters that are hard to access unless you know the special keystrokes.</p>
<p><strong>Remove / Add Indent:</strong> A highlighted block-level element will be indented or un-indented with these buttons. Since there is no HTML element for this, TinyMCE adds a &#8220;style= margin-left: 30px&#8221; to the element. 30px is the default indent increment.</p>
<p><strong>Redo / Undo:</strong> Simply keeps track of changes and allows the author to undo or redo a set of changes. I&#8217;m honestly not sure how many changes it will keep in memory before they get lost.</p>
<p><strong>Help:</strong> A simple modal with Basic and Advanced tips will pop up when this is clicked. The most interesting to me is the table of &#8220;Hotkeys&#8221; available to authors. Did you know <em>command 1</em> will make a selection take on the Heading 1 style?</p>
<h3>And one more</h3>
<p>The last thing I want to review is the contents of the Style drop down.</p>
<p><img title="Heading-drop-down" src="http://www.thinkoomph.com/wp-content/uploads/2011/10/Heading-drop-down.jpg" alt="" width="520" height="260" /></p>
<p>As briefly mentioned before, the style drop down menu contains a bunch of standard block-level elements. This means that a whole paragraph will get the style, not just a selection of portion of a paragraph. The styles are:</p>
<p><strong>Paragraph:</strong> Used by default, but useful if you have chosen another style but want to switch it back to the default paragraph style In HTML, this is the &lt;p&gt;&#8230;&lt;/p&gt; set of tags.</p>
<p><strong>Address:</strong> An interesting tag, address is usually italic for some reason. I wonder if blocks using this tag have special weight with search engines, but very little data is available to back up that hunch. Personally, I rarely use it.</p>
<p><strong>Preformatted:</strong> The &lt;pre&gt; tag is a tough cookie. It is intended to display text with white-space preserved, meaning that breaks in the text will be exactly as written. To me, this means trouble, as if there are no breaks in the text inside of this tag, then there are no breaks on the front-end as well, and that can lead to some goofy looking posts. A good theme will take into account the intention of a &lt;pre&gt; tag, but ensure that the display will not break the layout. Again, rarely used&#8230; most people use it to display chunks of code.</p>
<p><strong>Heading 1, 2, 3, etc&#8230;</strong> These are great and every author needs to know how to use them. The concept is simple – headline styles, with more size or boldness given to the lower numbers. But search engines use these tags to determine where the important phrases are in the content as well (and in the page in general) so they should be used not only because they help organize your story, but because they also give your content extra weight.</p>
<h2>That&#8217;s all folks!</h2>
<p>Thanks for reading, and I hope this helps. There is a lot of options packed into this little Editor window, so take advantage of the array of style options WordPress gives the author. Happy blogging!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkoomph.com/thinking/2011-11/how-to-use-the-wordpress-wysiwyg-editor/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Coding for Constant Contact</title>
		<link>http://www.thinkoomph.com/thinking/2011-09/coding-for-constant-contact/</link>
		<comments>http://www.thinkoomph.com/thinking/2011-09/coding-for-constant-contact/#comments</comments>
		<pubDate>Fri, 02 Sep 2011 22:47:18 +0000</pubDate>
		<dc:creator>J Hogue</dc:creator>
				<category><![CDATA[Design & Creative]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[Email Marketing]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.thinkoomph.com/?p=1904</guid>
		<description><![CDATA[I recently had to create some templates for Constant Contact and I thought, “Hey, this should be easy. I can't do anything tricky, so, keep the design simple, use a tried-and-true table for the layout, and viola, beautiful emails”. How naive I was... ]]></description>
			<content:encoded><![CDATA[<p>As designers get used to all the new whizz bang inherit in HTML5 and CSS3, every now and then we get pulled back into the world of basic HTML rendering <em>a là</em> 1993 when we have to design e-newsletters for desktop and web-based Mail clients.</p>
<p>I recently had to create some templates for <a href="http://www.constantcontact.com" target="_blank">Constant Contact</a> and I thought, <strong>“Hey, this should be easy. Can&#8217;t do anything tricky, so, keep the design simple, use a tried-and-true table for the layout, and viola, beautiful emails”</strong>. While you can&#8217;t do anything tricky, it&#8217;s true, there is so much more to consider, and it&#8217;s all pretty annoying if you are used to designing for the web. I enjoy designing for IE6 slightly better than designing email templates.</p>
<p>With that frustration in mind, here are some tips I ran across that might be useful for you, but will be very useful for me as I know I will forget them all just in time to design a new set of templates:</p>
<h3>Design Specifically – Everything needs a class</h3>
<p>The most annoying aspect of Constant Contact for a web designer who liked their code to be clean and nested is the fact that IDs are NOT supported, and neither are styles on HTML elements. So, the CSS selector <code>body p</code> is a no-no. Not even a rule that uses an explicit <code>h1</code>. Instead, you must define a <code>.header1</code> class and apply it to an <code>h1</code>, like this: <code>&lt;h1 class="header1"&gt;</code>.</p>
<p>Ridiculous? Maybe&#8230; but here&#8217;s why. When Constant Contact assembles your email, it takes all these rules and spells them out explicitly right in the element. So while you may define a normal style, it uses it as a reference and spits out an inline style tag on the element itself. So this:</p>
<pre class="brush: xml; light: true; title: ; wrap-lines: true; notranslate">
.header1 { font-weight: bold; font-size: 20px; color: #333333; } &amp;lt;h1 class=&quot;header1&quot;&amp;gt;A Sample Header&amp;lt;/h1&amp;gt;</pre>
<p>Becomes:</p>
<pre class="brush: xml; light: true; title: ; wrap-lines: true; notranslate">
&amp;lt;h1 size=&quot;20&quot; color=&quot;#333333&quot; style=&quot;font-weight: bold; font-size: 20px; color: #333333;&quot;&amp;gt;A Sample Header&amp;lt;/h1&amp;gt;</pre>
<p>It does this so it can cover the widest array of email clients out there. And it would be maddening for us to try and code this way with all those inline styles. So while the idea of using a stylesheet is like the web, the way Constant Contact uses the stylesheet is not like the web at all.</p>
<h3>Design like it&#8217;s 1993</h3>
<p>We all know <acronym title="Keep it Simple, Stupid!">KISS</acronym>, but when I say simple, I mean <em>REAL</em> simple&#8230; 1993, beginnings-of-the-internet simple. Take the <code>&lt;center&gt;</code> tag, for example. The good ole <code>margin: 0 auto;</code> won&#8217;t work consistently enough, so break out the dusty <code>&lt;center&gt;</code> tag instead.</p>
<p>Use tables for layout. I know, I know, that&#8217;s <em>SO</em> 1993, but I&#8217;m serious&#8230; trying to consistently float divs and clear floats will drive you mad.</p>
<p>Also, forget bit-saving CSS shorthand. You&#8217;re better off using the full six-character hex values for colors when you normally might use three. Four values for padding and margin seems to be well supported, but use the long-form tags for font-size, font-weight, font-family, and <del>background properties</del>. <ins>Actually, forget background images all together. Many email clients won&#8217;t load them.</ins></p>
<h3>When using images, style the container like its text</h3>
<p>This one may not be very intuitive, but let me explain. I&#8217;ve got an image, and it&#8217;s important – it&#8217;s the logo. I know some email clients won&#8217;t load the image by default (looking at you, Gmail), so when the image doesn&#8217;t load, I want the contents of the alt tag to display instead, and <em>I want it to look good</em>.</p>
<p>To do this, I simply made sure the container that the image is placed inside has some fallback styles for text. So while the alt text disappears when the image loads, if the user never loads the image, it still looks nice and we don&#8217;t lose important information, like the name of the company. Here&#8217;s what I&#8217;m talking about:</p>
<div id="attachment_1908" class="wp-caption alignnone" style="width: 530px"><img class="size-medium wp-image-1908" title="without-images" src="http://www.thinkoomph.com/wp-content/uploads/2011/09/without-images-520x249.png" alt="" width="520" height="249" /><p class="wp-caption-text">Before images load...</p></div>
<div id="attachment_1907" class="wp-caption alignnone" style="width: 530px"><img class="size-medium wp-image-1907" title="with-images" src="http://www.thinkoomph.com/wp-content/uploads/2011/09/with-images-520x249.png" alt="" width="520" height="249" /><p class="wp-caption-text">With images loaded.</p></div>
<h3>Use Anchor (Jump) links Carefully</h3>
<p>This one particularly bugged me, and took a little time to figure out. The client wanted a Table of Contents with simple anchor links to make the email jump down to the proper element. I knew that support for hrefs that jump down to an element with an ID would be spotty, but a simple <code>&lt;a name="anchor"&gt;</code> would work, right?</p>
<p>Silly me, what was I thinking?</p>
<p>Besides the fact that even these basic elements have spotty support (<a href="http://www.campaignmonitor.com/blog/post/3322/the-trouble-with-anchor-links-in-email-newsletters/" target="_blank">see this article from Campaign Monitor</a>), there is also a problem of styling and the way Constant Contact handles empty HTML elements.</p>
<p>In order to appease the greatest number of email clients, my code for anchors links was <code>&lt;a name="anchorname" id="anchorname"&gt;&lt;/a&gt;</code>. But there was a simple problem with that. Since it was empty, Constant Contact turned it into a self-closing xHTML element, which looks like this in the source of the email: <code>&lt;a name="anchorname" id="anchorname" /&gt;</code>. The problem is, most email clients won&#8217;t recognize an anchor tag that self-closes, so my email had open anchors everywhere, which turned my text default link blue.</p>
<p>The solution is god-awful, and I would never allow my web pages to look like this, but this is what I had to do for it to work and look good. I had to add a style class to handle these links, because even though there is no HREF declaration, email clients will still treat it like a link and turn it default link blue. :</p>
<pre class="brush: xml; light: true; title: ; wrap-lines: true; notranslate">
&lt;h3 class=&quot;header3&quot;&gt;&lt;a name=&quot;anchorname&quot; id=&quot;anchorname&quot; class=&quot;anchor&quot;&gt;Headline Text&lt;/a&gt;&lt;/h3&gt;
</pre>
<h3>Send us Your Tricks!</h3>
<p>Designing emails is frustrating enough&#8230; and this list is by no means exhaustive. What issues have you encountered? Send them over here and we&#8217;ll keep them compiled for you!</p>
<h2>In Conclusion</h2>
<p>I hope you never have to design email templates, because they really can be frustrating. All the efficiencies you&#8217;ve learned while designing for the web get thrown out the window. Still, email is an effective (and cost effective) form of communication, so it won&#8217;t go away. It can only get easier as older mail browsers are slowly phased out, but the fight to eradicate IE6 is nothing compared to the fight to eradicate Outlook (<a href="http://www.campaignmonitor.com/css/" target="_blank">Outlook has no support for simple styles like padding and float</a>).</p>
<p>In short, stay sane, stay calm, and use Google to help you figure out the baffling problems of designing email templates. Keep the design simple and the message short.</p>
<p>And good luck&#8230; you&#8217;ll need it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkoomph.com/thinking/2011-09/coding-for-constant-contact/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oomph &amp; WordCamp Boston &#8211; Organizers, Sponsors, Speakers</title>
		<link>http://www.thinkoomph.com/thinking/2011-07/oomph-wordcamp-boston-organizers-sponsors-speakers/</link>
		<comments>http://www.thinkoomph.com/thinking/2011-07/oomph-wordcamp-boston-organizers-sponsors-speakers/#comments</comments>
		<pubDate>Wed, 13 Jul 2011 15:48:17 +0000</pubDate>
		<dc:creator>Christopher Murray</dc:creator>
				<category><![CDATA[Content Management Systems]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[Good Thinking]]></category>
		<category><![CDATA[Infrastructure & Hosting]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://www.thinkoomph.com/?p=1823</guid>
		<description><![CDATA[WordCamp Boston is just around the corner &#8211; July 23 &#038; 24 at Boston University &#8211; and Oomph is proud to be playing a big part in the gathering. For the second year in a row, our very own Erick Hitter has been working hard behind the scenes as one of the core organizers, contributing [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://2011.boston.wordcamp.org/">WordCamp Boston</a> is just around the corner &#8211; July 23 &#038; 24 at Boston University &#8211; and Oomph is proud to be playing a big part in the gathering.</p>
<p><a href="http://2011.boston.wordcamp.org/" style="padding-right:30px;"><img title="I'm Sponsoring WordCamp Boston 2011!" src="http://2011.boston.wordcamp.org/files/2011/05/sponsoring.png" alt="" width="150" height="150" /></a><a href="http://2011.boston.wordcamp.org/" style="padding-right:30px;"><img title="I'm Attending WordCamp Boston 2011!" src="http://2011.boston.wordcamp.org/files/2011/05/attending.png" alt="" width="150" height="150" /></a><a href="http://2011.boston.wordcamp.org/"><img title="I'm Speaking At WordCamp Boston 2011!" src="http://2011.boston.wordcamp.org/files/2011/05/speaking.png" alt="" width="150" height="150" /></a></p>
<p>For the second year in a row, our very own <a href="http://www.thinkoomph.com/thinking/author/erick-hitter/">Erick Hitter</a> has been working hard behind the scenes as one of the <a href="http://2011.boston.wordcamp.org/organizers/">core organizers</a>, contributing to the event website and pulling together a top-notch list of corporate sponsors. We&#8217;re proud to say that we made Erick&#8217;s job a little easier this year by getting Oomph on the <a href="http://2011.boston.wordcamp.org/sponsor/oomph/">corporate sponsor list</a>.</p>
<p>I am also very excited to be speaking this year. At 3:30 on Saturday I&#8217;ll be leading a talk on the WordPress VIP platform:</p>
<p><strong><a href="http://2011.boston.wordcamp.org/2011/07/12/enterprise-publishing-on-wordpress-com-vip/">Enterprise Publishing on WordPress.com VIP</a></p>
<p>This talk is designed for publishers, in-house developers, and consultants interested in learning about the WordPress.com VIP platform.</p>
<p>We will provide an overview of where WordPress.com VIP fits within the overall WordPress ecosystem and what types of publishers are well suited for the platform. We’ll cover the key benefits for publishers and developers, compare a typical self-hosted WordPress implementation to one on WordPress.com VIP, and take a surface-level look at some of the technical nuances for running a site in this incredibly flexible yet controlled environment.</p>
<p>Whether you are considering a migration to WordPress, exploring a switch to enterprise-level hosting, or just curious to learn more about what this VIP thing is all about, this talk should be a valuable resource.<br />
</strong><br />
Please stop by and say hi and keep an eye out for other attendees from the <a href="http://www.thinkoomph.com/company/m">Oomph team</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinkoomph.com/thinking/2011-07/oomph-wordcamp-boston-organizers-sponsors-speakers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

