2017-10-13 63 views
3

我有一些标签为foo的文章,我想从我的首页中排除这些文章。Jekyll从分页中排除标签

我试图把这个代码放到头版的模板:

<div class="posts"> 
    {% for post in paginator.posts %} 
    {% unless post.tags and post.tags contains "foo" %} 

    {% endunless %} 
    {% endfor %} 
</div> 

然而这导致分页是不正确。

下面是一些例子帖子:

+-------+--------+-----+ 
| Index | Post | Tag | 
+-------+--------+-----+ 
|  1 | Red | foo | 
|  2 | Blue |  | 
|  3 | White |  | 
|  4 | Pink | foo | 
|  5 | Orange |  | 
|  6 | Yellow | foo | 
|  7 | Beige | foo | 
|  8 | Purple |  | 
|  9 | Black | foo | 
+-------+--------+-----+ 

实际输出:

  1. 第1页:2, 3, 5
  2. 第2页:8

我会升迈克:

  1. 第1页:2, 3, 5, 8

正如你可以看到它正在分裂的职位为5和然后我的代码过滤它们块 - 我想之前应用过滤计算分页。

+0

使用paginator生成的其他页面会发生什么情况,它们是否应避免包含具有该标记的帖子? – marcanuy

+0

是的,我不希望他们显示在任何地方使用paginator。 –

+0

一些线索/想法:http://www.seanbuscay.com/blog/jekyll-teaser-pager-and-read-more/,https://gist.github.com/yanping/1652964 – VonC

回答

2

它不能没有黑客的分页程序插件来完成,所以在这里我们去:

  1. Gemfile

  2. 删除gem jekyll-paginate设置_config.yml所需的配置变量:

    paginate: 2 
    paginate_path: "/blog/page:num/" 
    
  3. 创建_plugins目录

  4. 副本pager.rbpagination.rb在网页_plugins/

    cd _plugins 
    wget https://github.com/jekyll/jekyll-paginate/blob/master/lib/jekyll-paginate/pager.rb 
    wget https://github.com/jekyll/jekyll-paginate/blob/master/lib/jekyll-paginate/pagination.rb 
    
  5. 显示帖子在文档

    <!-- This loops through the paginated posts --> 
    {% for post in paginator.posts %} 
        <h1><a href="{{ post.url }}">{{ post.title }}</a></h1> 
        <p class="author"> 
    <span class="date">{{ post.date }}</span> 
        </p> 
        <div class="content"> 
    {{ post.content }} 
        </div> 
    {% endfor %} 
    
    <h1> Paginator</h1> 
    <!-- Pagination links --> 
    <div class="pagination"> 
        {% if paginator.previous_page %} 
    <a href="{{ paginator.previous_page_path }}" class="previous">Previous</a> 
        {% else %} 
    <span class="previous">Previous</span> 
        {% endif %} 
        <span class="page_number ">Page: {{ paginator.page }} of {{ paginator.total_pages }}</span> 
        {% if paginator.next_page %} 
    <a href="{{ paginator.next_page_path }}" class="next">Next</a> 
        {% else %} 
    <span class="next ">Next</span> 
        {% endif %} 
    </div> 
    
  6. 使用在pagination.rb建议代码修改paginate功能来过滤包含您的帖子标记foo,目前all_posts变量包含用于计算分页的所有帖子数据,所以我们需要d删除包含标签与个位:

     all_posts = all_posts.select do |elem| 
         !elem.data['tags'].include? 'foo' 
         end 
    

    然后,该功能将类似于:

     def paginate(site, page) 
         all_posts = site.site_payload['site']['posts'].reject { |post| post['hidden'] } 
         all_posts = all_posts.select do |elem| 
         !elem.data['tags'].include? 'foo' 
         end 
         pages = Pager.calculate_pages(all_posts, site.config['paginate'].to_i) 
         (1..pages).each do |num_page| 
         pager = Pager.new(site, num_page, all_posts, pages) 
         if num_page > 1 
          newpage = Page.new(site, site.source, page.dir, page.name) 
          newpage.pager = pager 
          newpage.dir = Pager.paginate_path(site, num_page) 
          site.pages << newpage 
         else 
          page.pager = pager 
         end 
         end 
        end 
    

然后第1页会显示所需的岗位,只有不包含的那些foo标签:2,3,5,8,

+0

我不认为这处理分页,这是我正在寻找。 –

+0

不,这并不意味着要处理分页。据我所知,它说在第一页中合并非foo的帖子,在第2页中合并foo的帖子。 – marcanuy

+0

你误解了@marcanuy这个问题。我不想让foo的帖子在任何地方显示,但我想分页保持不间断。 –

0

[更新回答]

解决方案1.新集合

您报告说,paginator对象上的where命令无法正常工作/重新计算分页。因此,我会建议将所有'foo'帖子保存在一个单独的集合中。这解决了您的原始问题,但如果您想显示在​​另一个页面上合并的所有帖子,则会产生新问题。如果你不想这样,这是最优雅的解决方案。

解决方案2.使用JavaScript页面

忘掉分页程序对象,并通过建立你自己的Javascript分页(或infinte滚动),解决这个问题,因为pagination is a SEO issue反正...

注:我创建了一个资源Jekyll without plugins。我也会在这里添加Javascript分页。

+0

谢谢@JoostS,但这并不能完全解决问题。虽然这会从页面中删除页面,但它不会重新计算分页。 –

+0

谢谢,我更新了答案。 – JoostS