52

I'm creating a new blog using Jekyll.

On the main page, there will be a list of my 10 most recent posts.

The entries on this list will include a title, the post date, and an excerpt, most likely the first paragraph.

I'm only familiar with using Jekyll for basic templates, so I can either put only a variable in the page, or include the entire post.

Is there a way to somehow avoid using post.content in the paginator, and only include up to a certain point in the post, which I define (e.g. ``{% endexcerpt %}`?

corazza
  • 31,222
  • 37
  • 115
  • 186

5 Answers5

96

Something like {{ post.content | strip_html | truncatewords: 50 }} produces a more consistent excerpt. It gets the first 50 words and strips any formatting.

JMH
  • 1,289
  • 1
  • 10
  • 19
  • Agreed. This is much better. I used to use excerpt and it would give all kinds of quirks about where it breaks (seemingly only on the first paragraph). – adrianmcli Jun 13 '15 at 21:54
  • 1
    How would you deal with links though? For example, if you have content like this "This is a post. And a [link](www.link.com)", then the snippet you posted would display the entire raw text rather than being intelligent about it and showing link simply as text. – Karolis Ramanauskas Mar 24 '17 at 09:46
  • 6
    Got the answer, use {{ post.content | markdownify | strip_html | truncatewords: 50 }} – Karolis Ramanauskas Mar 24 '17 at 10:01
  • How to get post.content but without post.title? I don't want title in post excerpt. – Ferit Jul 15 '17 at 11:50
  • 2
    Hi, I found that this sentence could only be used in English, When I want to write a Chinese article, how can I use this function? Thanks! – taylor Aug 27 '17 at 09:20
  • You can use `truncate: 50` for the first 50 characters. I'm not sure how well this works with Chinese or other Utf-8 sequences without an example, though. `post.excerpt` should probably be improved at some point, I'd personally much rather use a plugin to do that, than stringing together a bunch of liquid filters. https://shopify.github.io/liquid/filters/truncate/ – JMH Aug 30 '17 at 11:20
  • `truncate: 50` truncates the first 50 characters but it is not consistent. For my Chinese posts I usually use this generic method, and provide an override if the formatting doesn't work out well by default. – Teng L Aug 11 '19 at 18:21
59

Sure, you can use {{ post.excerpt }} in place of {{ post.content }}.

You can also manually override the automatically generated excerpts if you don't like them.

Full documentation on how to do this here: http://jekyllrb.com/docs/posts/#post-excerpts

Adam Grant
  • 12,477
  • 10
  • 58
  • 65
Brian Willis
  • 22,768
  • 9
  • 46
  • 50
  • 4
    Remember to use `` in the actual post to tell Jekyll where it should 'cut' the post for the excerpt content or set excerpt_separator globally in your `_config.yml`. – eQ19 Jun 08 '16 at 04:23
4

To get a custom length excerpt for each post, you can add a excerpt_separator variable in front matter of your post. If you set this variable to <!--end_excerpt-->, then post.excerpt will include all content before <!--end_excerpt-->.

---
excerpt_separator: <!--end_excerpt-->
---

This is included in excerpts.

This is also included in excerpts.

<!--end_excerpt-->

But this is not.

To save yourself the effort of adding excerpt_separator to front matter of each post, you can simply set it in _config.yml.

mrpandey
  • 627
  • 2
  • 9
  • 17
4

Use

 {{ post.content | markdownify | strip_html | truncatewords: 50 }}

instead of {{ post.excerpt }} or {{ post.content }}.

This will give consistent length blocks of unformatted text with no raw markdown content in them. Tidy.


Thanks to this comment by @karolis-ramanauskas for the answer, I've made it a proper answer so it can get better visibility.

Tim Abell
  • 11,186
  • 8
  • 79
  • 110
0

What worked for me was: add this to the config.yml : excerpt_separator: "<!--more-->" #global excerpt separator for the blog posts and remember to restart the jekyll local server. All changes to config.yml requires a restart to take effect

Sentry.co
  • 5,355
  • 43
  • 38