Widgets in the loop if active

Think about what is happening.

You run the_post(); which sets $post to the first post in the Loop, but you don’t use that post if your sidebar is active. Then the Loop continues and $post gets set to the second post in the Loop. You’ve lost your first post.

I don’t see why that first sidebar needs to be inside the Loop. You only need to be inside the have_posts part to run the code when “the loop is active”. Something like this is what it seems you are going for:

if (have_posts()) { 
  $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; 
  $i=1;

  if ( is_active_sidebar('post_widget_area') && $i==1 ) { 
    dynamic_sidebar('post_widget_area'); 
  }

  while (have_posts()) { 
    the_post();            
    the_title();
    the_excerpt(); 

    if($i==3) {
      get_sidebar('bottom'); 
    }
    $i++; 
  } 

  if($i<4) {
    get_sidebar('bottom'); 
  } 

}

Sorry. I had to edit that code into something readable just to tell what was happening at all.

While I did not make this change in the code, you don’t need $i. $wp_query->current_post has the same information already, though it starts with 0 not 1.