mirror of
https://github.com/discourse/discourse.git
synced 2024-11-30 00:43:43 +08:00
de9a031073
* FEATURE: use canonical links in posts.rss feed Previously we used non canonical links in posts.rss These links get crawled frequently by crawlers when discovering new content forcing crawlers to hop to non canonical pages just to end up visiting canonical pages This uses up expensive crawl time and adds load on Discourse sites Old links were of the form: `https://DOMAIN/t/SLUG/43/21` New links are of the form `https://DOMAIN/t/SLUG/43?page=2#post_21` This also adds a post_id identified element to crawler view that was missing. Note, to avoid very expensive N+1 queries required to figure out the page a post is on during rss generation, we cache that information. There is a smart "cache breaker" which ensures worst case scenario is a "page drift" - meaning we would publicize a post is on page 11 when it is actually on page 10 due to post deletions. Cache holds for up to 12 hours. Change only impacts public post RSS feeds (`/posts.rss`)
155 lines
7.4 KiB
Plaintext
155 lines
7.4 KiB
Plaintext
<% if @topic_view %>
|
|
<div id="topic-title">
|
|
<h1>
|
|
<%= render_topic_title(@topic_view.topic) %>
|
|
</h1>
|
|
|
|
<% if @breadcrumbs.present? %>
|
|
<div class="topic-category" itemscope itemtype="http://schema.org/BreadcrumbList">
|
|
<% @breadcrumbs.each_with_index do |c, i| %>
|
|
<span itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
|
|
<a href="<%= Discourse.base_url %><%= c[:url] %>" class="badge-wrapper bullet" itemprop="item">
|
|
<span class='badge-category-bg' style='background-color: #<%= c[:color] %>'></span>
|
|
<span class='badge-category clear-badge'>
|
|
<span class='category-name' itemprop='name'><%= c[:name] %></span>
|
|
</span>
|
|
</a>
|
|
<meta itemprop="position" content="<%= i + 1 %>" />
|
|
</span>
|
|
<% end %>
|
|
</div>
|
|
<% end %>
|
|
|
|
<% if @tags.present? %>
|
|
<div class="topic-category">
|
|
<div class='discourse-tags list-tags'>
|
|
<% @tags.each_with_index do |tag, i| %>
|
|
<a href='<%= "#{Discourse.base_url}/tag/#{tag.name}" %>' class='discourse-tag' rel="tag"><%= tag.name -%></a><% if i < @tags.size - 1 %>, <% end %>
|
|
<% end %>
|
|
</div>
|
|
</div>
|
|
<% end %>
|
|
</div>
|
|
|
|
<%= server_plugin_outlet "topic_header" %>
|
|
|
|
<%- if include_crawler_content? %>
|
|
|
|
<% @topic_view.posts.each_with_index do |post, idx| %>
|
|
<% if (u = post.user) %>
|
|
<div id='post_<%= post.post_number %>' itemscope itemtype='http://schema.org/DiscussionForumPosting' class='topic-body crawler-post'>
|
|
<div class='crawler-post-meta'>
|
|
<div itemprop='publisher' itemscope itemtype="http://schema.org/Organization">
|
|
<meta itemprop='name' content='<%= SiteSetting.company_name.presence || SiteSetting.title %>'>
|
|
<% if application_logo_url.present? %>
|
|
<div itemprop='logo' itemscope itemtype="http://schema.org/ImageObject">
|
|
<meta itemprop='url' content='<%= application_logo_url %>'>
|
|
</div>
|
|
<% end %>
|
|
</div>
|
|
<span class="creator" itemprop="author" itemscope itemtype="http://schema.org/Person">
|
|
<a itemprop="url" href='<%= Discourse.base_url %>/u/<%= u.username %>'><span itemprop='name'><%= u.username %></span></a>
|
|
<%= "(#{u.name})" if (SiteSetting.display_name_on_posts && SiteSetting.enable_names? && !u.name.blank?) %>
|
|
<%
|
|
post_custom_fields = @topic_view.post_custom_fields[post.id] || {}
|
|
who_username = post_custom_fields["action_code_who"] || ""
|
|
small_action_href = post_custom_fields["action_code_path"] || ""
|
|
if post.action_code
|
|
%>
|
|
<%= t("js.action_codes.#{post.action_code}", when: "", who: who_username, href: small_action_href).html_safe %>
|
|
<% end %>
|
|
</span>
|
|
|
|
<link itemprop="mainEntityOfPage" href="<%= post.topic.url %>">
|
|
|
|
<% if post.image_url %>
|
|
<link itemprop="image" href="<%= post.image_url %>">
|
|
<% end %>
|
|
|
|
<span class="crawler-post-infos">
|
|
<time itemprop='datePublished' datetime='<%= post.created_at.to_formatted_s(:iso8601) %>' class='post-time'>
|
|
<%= l post.created_at, format: :long %>
|
|
</time>
|
|
<% if post.version > 1 %>
|
|
<meta itemprop='dateModified' content='<%= post.last_version_at.to_formatted_s(:iso8601) %>'>
|
|
<% else %>
|
|
<meta itemprop='dateModified' content='<%= post.created_at.to_formatted_s(:iso8601) %>'>
|
|
<% end %>
|
|
<span itemprop='position'>#<%= post.post_number %></span>
|
|
</span>
|
|
</div>
|
|
<div class='post' itemprop='articleBody'>
|
|
<%= post.hidden ? t('flagging.user_must_edit').html_safe : post.cooked.html_safe %>
|
|
</div>
|
|
|
|
<meta itemprop='headline' content='<%= @topic_view.title %>'>
|
|
<% if idx == 0 %>
|
|
<meta itemprop='keywords' content='<%= @tags.map(&:name).join(', ') %>'>
|
|
<% end %>
|
|
|
|
<div itemprop="interactionStatistic" itemscope itemtype="http://schema.org/InteractionCounter">
|
|
<meta itemprop="interactionType" content="http://schema.org/LikeAction"/>
|
|
<meta itemprop="userInteractionCount" content="<%= post.like_count %>" />
|
|
<span class='post-likes'><%= post.like_count > 0 ? t('post.has_likes', count: post.like_count) : '' %></span>
|
|
</div>
|
|
|
|
<div itemprop="interactionStatistic" itemscope itemtype="http://schema.org/InteractionCounter">
|
|
<meta itemprop="interactionType" content="http://schema.org/CommentAction"/>
|
|
<meta itemprop="userInteractionCount" content="<%= post.reply_count %>" />
|
|
</div>
|
|
|
|
<% if @topic_view.link_counts[post.id] && @topic_view.link_counts[post.id].filter { |l| l[:reflection] }.length > 0 %>
|
|
<div class='crawler-linkback-list' itemscope itemtype='http://schema.org/ItemList'>
|
|
<% @topic_view.link_counts[post.id].each_with_index do |link, i| %>
|
|
<% if link[:reflection] && link[:title].present? %>
|
|
<div itemprop='itemListElement' itemscope itemtype='http://schema.org/ListItem'>
|
|
<a href="<%=link[:url]%>" itemscope itemtype='http://schema.org/DiscussionForumPosting' itemprop='item'>
|
|
<meta itemprop='url' content='<%=link[:url]%>'>
|
|
<span itemprop='name'><%=link[:title]%></span>
|
|
</a>
|
|
<meta itemprop='position' content='<%= i+1 %>'>
|
|
</div>
|
|
<% end %>
|
|
<% end %>
|
|
</div>
|
|
<% end %>
|
|
</div>
|
|
<% end %>
|
|
<% end %>
|
|
|
|
<% if @topic_view.prev_page || @topic_view.next_page %>
|
|
<div role='navigation' itemscope itemtype='http://schema.org/SiteNavigationElement' class="topic-body crawler-post">
|
|
<% if @topic_view.prev_page %>
|
|
<span itemprop='name'><%= link_to t(:prev_page), @topic_view.prev_page_path, rel: 'prev', itemprop: 'url' %></span>
|
|
<% end %>
|
|
<% if @topic_view.next_page %>
|
|
<span itemprop='name'><b><%= link_to t(:next_page), @topic_view.next_page_path, rel: 'next', itemprop: 'url' %></b></span>
|
|
<% end %>
|
|
</div>
|
|
<% end %>
|
|
|
|
<% end %>
|
|
|
|
<% content_for :head do %>
|
|
<%= auto_discovery_link_tag(@topic_view, {action: :feed, slug: @topic_view.topic.slug, topic_id: @topic_view.topic.id}, rel: 'alternate nofollow', title: t('rss_posts_in_topic', topic: @topic_view.title), type: 'application/rss+xml') %>
|
|
<%= raw crawlable_meta_data(title: @topic_view.title, description: @topic_view.summary(strip_images: true), image: @topic_view.image_url, read_time: @topic_view.read_time, like_count: @topic_view.like_count, ignore_canonical: true, published_time: @topic_view.published_time) %>
|
|
|
|
<% if @topic_view.prev_page || @topic_view.next_page %>
|
|
<% if @topic_view.prev_page %>
|
|
<link rel="prev" href="<%= @topic_view.prev_page_path -%>">
|
|
<% end %>
|
|
<% if @topic_view.next_page %>
|
|
<link rel="next" href="<%= @topic_view.next_page_path -%>">
|
|
<% end %>
|
|
<% end %>
|
|
<% end %>
|
|
|
|
<% content_for(:title) { @title || "#{gsub_emoji_to_unicode(@topic_view.page_title)} - #{SiteSetting.title}" } %>
|
|
|
|
<% if @topic_view.print %>
|
|
<% content_for :after_body do %>
|
|
<%= preload_script('print-page') %>
|
|
<% end %>
|
|
<% end %>
|
|
<% end %>
|