WordPress: function to format teaser different from body

On many sites that I develop I want to show articles that contains both a teaser  text and a body text, and I want to be able to format the teaser different than the body. So…I made a function to accomplish this.

What the function does is that it wraps everything in the post before the “read more”-tag in a div with the class "post-teaser", and everything else in a div with the class "post-body". Then it’s a piece of cake to add som styles to those divs with CSS.

I like it and use it a lot. And here it is:

 * This is a nifty little finction that makes is possible to
 * format teaser and body differently
 * It will output:
 * - teaser/text before the read-more-thingie wrapped in div.post-teaser
 * - body/text after the read-more-thingie wrapped in div.post-body
 * - ..but only if each one exists. so you can get teaser + body, or only teaser, or only body
 * @author Pär Thernström
function ma_teaser_and_body($post_id = NULL) {

 global $post, $more;
 $post_org = $post;
 $more_org = $more;

 if (!$post_id) {
 $post_id = $post->ID;

 $post = get_post($post_id);

 // Get teaser/text before the "read me"
 $content = $post->post_content;
 if ( preg_match('/<!--more(.*?)?-->/', $content, $matches) ) {
 // more-tag exists
 $more = 0;
 the_content("", true);
 $teaser = ob_get_clean();
 } else {
 $teaser = "";

 // Get the content/text after "read me"
 $more = 1;
 the_content(NULL, true);
 $body = ob_get_clean();
 if ($teaser) {
 $teaser = "<div class='post-teaser'>$teaser</div>";

 if ($body) {
 $body = "<div class='post-body'>$body</div>";

 $post = $post_org;
 $more = $more_org;
 echo $teaser . $body;


27 mar 2011: Updated code a bit due to a problem that occured when no more-tag existed in post.