In his excellent series on WordPress Theme SEO, Nathan Rice describes a method to include META tags in WordPress themes rather than relying on plugins. Since I recently updated the Slaptijack theme to include META descriptions and keywords, I thought I would detail the process. If you are interested in improving the SEO aspects of your WordPress theme, I recommend checking out Nathan's article series on the subject.

The first thing I did was create a new function in my theme's functions.php file. As you can see below, this code is taken directly from Nathan's META Keywords post. I used trim to remove the trailing ',' from the string of keywords.

function csv_tags() {
  $posttags = get_the_tags();
  foreach((array)$posttags as $tag) {
    $csv_tags .= $tag->name . ',';
  $csv_tags = trim($csv_tags, ',');
  echo '<meta name="keywords" content="' . $csv_tags . '" />';

Next I added the following code into my theme's header.php file:

<?php if ( is_single() || is_page() ) : if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
  <meta name="description" content="<?php the_excerpt_rss(); ?>" />
  <?php csv_tags(); ?>
<?php endwhile; endif; elseif ( is_home() ) : ?>
  <meta name="description" content="<?php bloginfo('description'); ?>" />
<?php elseif ( is_category() && category_description() ) : ?>
  <meta name="description" content="<?php echo trim(strip_tags(category_description())); ?>" />
<?php endif; ?>

Again, this is a modified version of what Nathan did in his META descriptions post. I added an extra check for category pages that prints the category description. The most important thing to remember here is that the the_excerpt_rss() template tag is only available inside The Loop. We make this available in our header via the while ( have_posts() ) : the_post(); endwhile; construct. This only happens on pages and posts, so there is not a lot of extra database overhead added by doing this.