WP Pro – Design, Development and Professional WordPress Hosting for Serious Bloggers - Just another WordPress weblog


  • Anatomy of a Magazine Style Premium WordPress Theme – Part 1 "The Loop"

  • Let me say it for the millionth time “content is king” and we all know that, don’t we?

    featured wordpress posts

    Since content is the most important part of a site, your WordPress powered theme must emphasis on content presentation. Most cookie cutter themes come with a post list that runs based on the time your posts were published, in other words a chronological list of posts irrespective of its importance. Let’s face it, not all posts are created equal. Some posts are special, some are important and then some not quite so. Why then should all posts get the same treatment?

    Magazine styled themes do a fine job of addressing this by introducing the featured posts option. Posts of a certain category got “top of the page” real-estate, which helps the site highlight the more important content.

    Creating such category specific presentation on demand requires both PHP script manipulation within the WordPress Loop and some changes to the CSS stylesheet. In continuing with the series on dissecting magazine style themes, we will attempt three hacks that will allow you to do the following:

    1. Create a featured post that is displayed at the very top of the page, followed by regular posts; all of which happens taking into consideration the pagination aspects of the site so as to not repeat the featured post on every paginated page.
    2. Create a simple featured and non-featured posts distinction using minimal PHP hack, keeping it simple enough so as to not worry about pagination.
    3. Create asides to highlight useful bits of information without hogging potentially critical presentation real-estate, or in other words, creating non-intrusive side posts without using a plugin.

    What is The Loop?

    The loop as the name suggests is a conditionally repeating statement that dynamically generates a string of posts within a WordPress theme. Essentially, this is the heart of the theme, no theme is without it and it controls what and where a post is presented.

    What does it look like and where can I find it?

    Typically, the Loop in one of our themes has the following format; all WP themes will have the loop in one form or the other (the meta portion is optional):

    <?php get_header(); ?>
    <?php while(have_posts()) : the_post(); ?>
    <div class="post" id="post-<?php the_ID(); ?>">
    <h1><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" rel="bookmark"><?php the_title();
    ?></a></h1>
    <div class="meta">Posted on <?php the_time('F jS, Y') ?> under <?php the_category(', ') ?> <?php if (function_exists('the_tags')) { ?><?php the_tags('', ', ', ''); ?><?php } ?></div>
    <?php the_content('Read the rest of this entry »'); ?>
    <div class="meta">Published by <?php the_author() ?> // <?php comments_popup_link('Comment now »', '1 Comment »', '% Comments »', 'commentslink'); ?></div>
    <?php endwhile; ?>
    <?php get_sidebar(); ?>
    <?php get_footer(); ?>
    
    The loop can be found within the index.php file (in 99 percent of the themes – K2 based themes have a file called theloop.php specifically for the loop code)

    How do you create a magazine style featured post?

    Ah, the interesting part. Typically, the featured post is nothing more than a post within a chosen category, and is presented differently from the rest of the posts using a different CSS styling. For the sake of simplicity, we will use a category called “Featured” and manipulate the loop to present only one post from that category at the very top of the posts list in the home page (index).

    Without going into the details, we’ll dive right into the index.php file and change the code, explanation of the changes follows this code:

    <?php get_header(); ?>
    <?php if ( $paged < 2 ) { // Do stuff specific to firstpage?>
    <?php $my_query = newWP_Query('category_name=Featured&showposts=1'); while ($my_query->have_posts()) :$my_query->the_post(); $do_not_duplicate = $post->ID; ?>
    <div class="featurepost" id="post-<?phpthe_ID(); ?>">
    <h1><a href="<?php the_permalink()?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h1>
    <div class="meta">Posted on <?phpthe_time('F jS, Y') ?> under <?php the_category(', ') ?> <?php if (function_exists('the_tags')) { ?><?php the_tags('', ', ', ''); ?><?php } ?></div>
    <?php the_content ('Read the rest of this entry»'); ?>
    <div class="meta">Published by <?phpthe_author() ?> // <?php comments_popup_link('Comment now »', '1 Comment »', '% Comments »', 'commentslink'); ?></div>
    </div>
    <?php endwhile; ?>
    <?php if (have_posts()) : while (have_posts()) :the_post(); if( $post->ID == $do_not_duplicate ) continue;update_post_caches($posts); ?>
    <div class="post" id="post-<?phpthe_ID(); ?>">
    <h2><a href="<?php the_permalink()?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h2>
    <div class="meta">Posted on <?phpthe_time('F jS, Y') ?> under <?php the_category(', ') ?> <?php if (function_exists('the_tags')) { ?><?php the_tags('', ', ', ''); ?><?php } ?></div>
    <?php the_excerpt ('Read the rest of this entry»'); ?>
    <div class="meta">Published by <?phpthe_author() ?> // <?php comments_popup_link('Comment now »', '1 Comment »', '% Comments »', 'commentslink'); ?></div>
    </div>
    <?php endwhile; endif; ?>
    <?php } else { // Do stuff specific to non-first page?>
    <?php if (have_posts()) : while (have_posts()) :the_post(); if( $post->ID == $do_not_duplicate ) continue;update_post_caches($posts); ?>
    <div class="post" id="post-<?phpthe_ID(); ?>">
    <h2><a href="<?php the_permalink()?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h2>
    <div class="meta">Posted on <?phpthe_time('F jS, Y') ?> under <?php the_category(', ') ?> <?php if (function_exists('the_tags')) { ?><?php the_tags('', ', ', ''); ?><?php } ?></div>
    <?php the_excerpt ('Read the rest of this entry»'); ?>
    <div class="meta">Published by <?phpthe_author() ?> // <?php comments_popup_link('Comment now »', '1 Comment »', '% Comments »', 'commentslink'); ?></div>
    </div>
    <?php endwhile; endif; ?>
    <?php } ?>
    <?php get_sidebar(); ?>
    <?php get_footer(); ?>
    
    You can download a copy of this file in text format, it’s better than copying it from this post. With no style applied, this loop in conjunction with your exiting header.php, sidebar.php and footer.php will look something like this. Note how we included in line 2 a simple “if” tag to control the pagination aspect and to prevent the featured post from repeating on the top of each paginated page. By setting the conditional tag to $paged < 2, we are essentially restricting the featured post from appearing from paginated pages 2 and greater, in other words, the post will appear only in page 1.

    In this example, this loop generates a post from the chosen category “Featured” and only one post is displayed, you can change this setting in line 3 (’category_name=Featured&showposts=1′) by changing the showposts=1 to the number of posts you want displayed. In line 10, the first loop terminates with the endwhile; tag.

    The second loop starts in line 11 and ends in line 18, this loop generates regular posts in chronological order (with the exception of the featured post displayed earlier). We have now defined everything needed to create the loops for the home page (page 1), but we are only half way through.

    At this point, most themes have the option for pagination or other functions built-in to navigate to previous posts. To define how those posts will be presented in paged pages (2, 3,.. and so on) we’ll add an “else” tag to close the “if” < 2 page tag (in line 19) and start our third and final loop code in line 20. Essentially the rest of the code is standard flair.

    Also note that only the featured category will display full posts (line 07), the regular posts will only display excerpts (lines 15 and 24).

    My content is best served chronologically. However I need to be able to make a subtle distinction between regular posts and featured posts. How can I do that?

    The alternative to the aforementioned technique is to add some conditional tags and styling within the loop to separate posts based on its importance. An example of one such loop can be seen on this very site, note how the featured posts are presented in full length while the regular posts are shown as excerpts although the flow of posts are still chronological. The loop code (as included in the index.php) is as follows:

    <?php get_header(); ?>
    <?php while(have_posts()) : the_post(); ?>
    <div class="post" id="post-<?php the_ID(); ?>">
    <h1><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" rel="bookmark"><?php the_title();  ?></a></h1>
    <div class="meta">Posted on <?php the_time('F jS, Y') ?> under <?php the_category(', ') ?> <?php if (function_exists('the_tags')) { ?><?php the_tags('', ', ', ''); ?><?php } ?></div>
    <?php if (in_category(#)) : ?>
    <?php the_content('Read the rest of this entry »'); ?>
    <?php else : ?>
    <?php the_excerpt ('Read the rest of this entry »'); ?>
    <?php endif; ?>
    <div class="meta">Published by <?php the_author() ?> // <?php comments_popup_link('Comment now »', '1 Comment »', '% Comments »', 'commentslink'); ?></div>
    <?php endwhile; ?>
    <?php get_sidebar(); ?>
    <?php get_footer(); ?>
    
    Again, you could download a copy of this file in text format or view the demo. Note in line 6, the # sign in (in_category(#)) must be replaced by the category number of the post you want to make the “featured” category.

    Asides anyone?

    To add to this mix, popular sites like Photomatt and WLTC extensively use asides. We know it’s has not been adopted into magazine style themes yet, but it is potentially one the most useful hacks you can add to your theme. Just to keep things simple, we will use the loop we created earlier as an example code and add the asides.

    <?php get_header(); ?>
    <?php while(have_posts()) : the_post(); ?>
    <div class="post" id="post-<?php the_ID(); ?>">
    <?php if (in_category(#2)) : ?>
    <div class="asides_entry">
    <ul>
    <li><?php echo wptexturize($post->post_content); ?> · <?php comments_popup_link('(0)', '(1)', '(%)'); ?></li>
    </ul>
    </div>
    <?php else : ?>
    <h1><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" rel="bookmark"><?php the_title();
    ?></a></h1>
    <div class="meta">Posted on <?php the_time('F jS, Y') ?> under <?php the_category(', ') ?> <?php if (function_exists('the_tags')) { ?><?php the_tags('', ', ', ''); ?><?php } ?></div>
    <?php if (in_category(#)) : ?>
    <?php the_content('Read the rest of this entry »'); ?>
    <?php else : ?>
    <?php the_excerpt ('Read the rest of this entry »'); ?>
    <?php endif; ?>
    <div class="meta">Published by <?php the_author() ?> // <?php comments_popup_link('Comment now »', '1 Comment »', '% Comments »', 'commentslink'); ?></div>
    <?php endif; ?>
    <?php endwhile; ?>
    <?php get_sidebar(); ?>
    <?php get_footer(); ?>
    
    The addition of lines 4 though 10 and line 19 will make posts in a chosen asides category display within a unordered list. You could download a copy of this file in text format or view the demo, note that posts 2 and 3 in our demo are listed within a bulleted list with no heading. We use headings on this site, but most asides do not display any headings.

    Now for some styling

    One more step and we are done. In order to style the various options, we will have to create and style the following divs and classes:

    In the first example (featured and non-featured), define:

    • .featurepost (to style featured posts)
    • .post (to style regular posts)

    The second example has only one distinctions between the featured and the non-featured post, that is the length of the posts (full and excerpt), so the styling will remain common for both.

    The third example (asides), we need to define the following:

    • .asides_entry
    • .asides_entry ul
    • .asides_entry ul li

    What I did here was adopt a stylesheet by David Herreman with some personalization to style our demo theme; you can see it in action here or download the original CSS from David’s site if interested.

    Next up, we will build cool tabbed interfaces for your sidebar using DOMtab, tabber and other free JavaScripts.

    So there you have it. Happy hacking and share these ideas with all. Enjoy!

    References: Codex, David Herreman, MandarinMusing, Solostream, wpSnap and a whole bunch of premium theme demo’s
  • 01.11.2008 - 1:31 pm - (23) - Design, How to, Resources, Techniques, Tips

  • Anatomy of a Magazine Style Premium WordPress Theme – Prelude

  • Let’s face it, WordPress is not just a Blogging ware like some might want you to believe, when used correctly, the full potential of the worlds best CMS can power sites big and small alike. The recent trend among high content-high traffic sites are the switch to magazine styled (mostly paid premium) themes to aid in maximizing content exposure. Most all new magazine styled themes worth your time is premium or paid, yet it requires customization and effort from the user to ensure the layout and content stays homogeneous. Is you already run a well established site with custom theme design and need to add functionalities similar to magazine styled premium themes without switching or paying for a new theme, you are at the right place.
    pressword theme screenshot

    How are magazine themes different from regular themes?

    Although structurally most themes have either 2 or 3 columns, the similarity ends there. Magazine styled themes are content centric and less bloggy, they offer a platform to easily manipulate data, simplify data access and presentation, and make navigation easy.

    What are we attempting to do?

    We will not attempt to (re)create a magazine styled theme out of your existing theme, however, we will dissect some magazine themes and learn all the aspects that you can easily add to improve your site’s features and enhance user experience. We will focus on the following three components of the theme.
    • Content Presentation – Featured, non-featured, category and asides posts
    • Sidebar – DOMtab and tabber JavaScript module
    • Navigation – CSS and JavaScript menu
    Some of this work will involve JavaScript usage/applications, not to fear, they are all relatively simple, free to download and use and easy to adopt into any theme.

    When will the guide be available?

    Over the next few days, we will present the “How To” guide in 3 (or more) parts, each focusing on one of the aforementioned components. So stay tuned.
  • 01.04.2008 - 9:54 pm - (20) - Design, How to, Techniques, Tips


Copyright © WP Pro – Design, Development and Professional WordPress Hosting for Serious Bloggers - CSS | XHTML | Login | Return to Top ↑