Show excerpt in recent posts widget

Hi all,

I’ve been trying to get my recent posts widget to show an excerpt, instead of the date.
I know there are about a million topics on this already, but I can’t seem to make it work. I’ve added the code mentioned in the article I linked in my child theme’s functions.php file, I’m using the shortcode mentioned and still my recent posts only display title and date.

Hope you can help me out!

[https://theme.co/apex/forum/t/add-excerpt-to-recent-post/8590]
(https://theme.co/apex/forum/t/add-excerpt-to-recent-post/8590)

Hi there,

This code should work:

function x_shortcode_recent_posts_v2code( $atts ) {
  extract( shortcode_atts( array(
    'id'           => '',
    'class'        => '',
    'style'        => '',
    'type'         => 'post',
    'count'        => '',
    'category'     => '',
    'offset'       => '',
    'orientation'  => '',
    'show_excerpt' => 'true',
    'no_sticky'    => '',
    'no_image'     => '',
    'fade'         => ''
  ), $atts, 'x_recent_posts' ) );

  $allowed_post_types = apply_filters( 'cs_recent_posts_post_types', array( 'post' => 'post' ) );
  $type = ( isset( $allowed_post_types[$type] ) ) ? $allowed_post_types[$type] : 'post';

  $id            = ( $id           != ''     ) ? 'id="' . esc_attr( $id ) . '"' : '';
  $class         = ( $class        != ''     ) ? 'x-recent-posts cf ' . esc_attr( $class ) : 'x-recent-posts cf';
  $style         = ( $style        != ''     ) ? 'style="' . $style . '"' : '';
  $count         = ( $count        != ''     ) ? $count : 3;
  $category      = ( $category     != ''     ) ? $category : '';
  $category_type = ( $type         == 'post' ) ? 'category_name' : 'portfolio-category';
  $offset        = ( $offset       != ''     ) ? $offset : 0;
  $orientation   = ( $orientation  != ''     ) ? ' ' . $orientation : ' horizontal';
   $show_excerpt  = ( $show_excerpt == 'true' );
  $no_sticky     = ( $no_sticky    == 'true' );
  $no_image      = ( $no_image     == 'true' ) ? $no_image : '';
  $fade          = ( $fade         == 'true' ) ? $fade : 'false';

  $js_params = array(
    'fade' => ( $fade == 'true' )
  );

  $data = cs_generate_data_attributes( 'recent_posts', $js_params );

  $output = "<div {$id} class=\"{$class}{$orientation}\" {$style} {$data} data-fade=\"{$fade}\" >";

    $q = new WP_Query( array(
      'orderby'             => 'date',
      'post_type'           => "{$type}",
      'posts_per_page'      => "{$count}",
      'offset'              => "{$offset}",
      "{$category_type}"    => "{$category}",
      'ignore_sticky_posts' => $no_sticky
    ) );

    if ( $q->have_posts() ) : while ( $q->have_posts() ) : $q->the_post();

      if ( $no_image == 'true' ) {
        $image_output       = '';
        $image_output_class = 'no-image';
      } else {
        $image              = wp_get_attachment_image_src( get_post_thumbnail_id(), 'entry-cropped' );
        $bg_image           = ( $image[0] != '' ) ? ' style="background-image: url(' . $image[0] . ');"' : '';
        $image_output       = '<div class="x-recent-posts-img"' . $bg_image . '></div>';
        $image_output_class = 'with-image';
      }

       $excerpt = ( $show_excerpt ) ? '<div class="x-recent-posts-excerpt"><p>' . preg_replace('/<a.*?more-link.*?<\/a>/', '', cs_get_excerpt_for_social() ) . '</p></div>' : '';

      $output .= '<a class="x-recent-post' . $count . ' ' . $image_output_class . '" href="' . get_permalink( get_the_ID() ) . '" title="' . esc_attr( sprintf( csi18n('shortcodes.recent-posts-permalink'), the_title_attribute( 'echo=0' ) ) ) . '">'
                 . '<article id="post-' . get_the_ID() . '" class="' . implode( ' ', get_post_class() ) . '">'
                   . '<div class="entry-wrap">'
                     . $image_output
                     . '<div class="x-recent-posts-content">'
                       . '<h3 class="h-recent-posts">' . get_the_title() . '</h3>'
                        . $excerpt
                     . '</div>'
                   . '</div>'
                 . '</article>'
               . '</a>';

    endwhile; endif; wp_reset_postdata();

  $output .= '</div>';

  return $output;
}

add_action('wp_head', 'change_recent_posts_to_v2');
function change_recent_posts_to_v2() {
  remove_shortcode( 'x_recent_posts' );
  add_shortcode( 'x_recent_posts', 'x_shortcode_recent_posts_v2code' );
}

Hope this helps.

March 2021 Update: The above code example has been adjusted to account for a change to a function name.

2 Likes

Hi Jade,

Unfortunately it doesn’t :frowning:

Even when I add the shortcode as mentioned at the bottom of the code you sent me: ‘x_recent_posts’, ‘x_shortcode_recent_posts_v2code’ it still only displays Title and Date.

I’m sorry to bother you with this so much, but since we are displaying events in the recent posts it is very important to us that we display the except (which mentions the date of the event) and not the date the post was created.

I’ve tried working with the plugin that everyone mentions, but didn’t like the way it looks, so I really hope we can work this out!

Hope you can help!

Hi,

The date that is showing is your excerpt.

I checked your posts and I can see you have added date as Excerpt.

You can remove it or add excerpt manually.

Thanks

Hi Paul,

Oh yes! It must have updated after I cried for help!
Sorry for bothering you, it must have been delayed somewhere; this is exactly what I wanted so I’m all good now.

Thanks!

Glad to know that :slight_smile:

Is there a way to show the excerpt if it exists, otherwise use the first N words from the wp body?

Hello There,

Excerpts were usually dynamically generated from the very first 55 words of the post content. If the post content is wrapped with a shortcode like Cornerstone formatting shortcode, no shortcode will be generated and that is why there is a need to insert a manual excerpt. If there is no manual excerpt, no excerpts will be displayed. Excerpts are optional hand-crafted summaries of your content that can be used in your theme. Learn more about manual excerpts here.

Hope this helps.

This topic was automatically closed 10 days after the last reply. New replies are no longer allowed.